From 4401407c7c9a6c0ce2fabfe3b13f6f7c6aa23c5a Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 26 Aug 2018 16:38:27 +0800 Subject: [PATCH 01/74] remove eof from elm mustache template for better code format (#879) --- .../src/main/resources/elm/aliasDecoder.mustache | 2 +- .../src/main/resources/elm/aliasEncoder.mustache | 2 +- samples/client/petstore/elm/.openapi-generator/VERSION | 2 +- samples/client/petstore/elm/src/Data/ApiResponse.elm | 1 - samples/client/petstore/elm/src/Data/Category.elm | 1 - samples/client/petstore/elm/src/Data/Order_.elm | 1 - samples/client/petstore/elm/src/Data/Pet.elm | 1 - samples/client/petstore/elm/src/Data/Tag.elm | 1 - samples/client/petstore/elm/src/Data/User.elm | 1 - 9 files changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache index 8a37eef1084..48154f0d4f1 100644 --- a/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache @@ -4,4 +4,4 @@ {{#allVars}} {{^discriminatorValue}} |> {{>fieldDecoder}} {{/discriminatorValue}} -{{/allVars}} +{{/allVars}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/aliasEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/aliasEncoder.mustache index 662453c3cec..7889f1f0355 100644 --- a/modules/openapi-generator/src/main/resources/elm/aliasEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/aliasEncoder.mustache @@ -4,4 +4,4 @@ {{#allVars}} {{#-first}}[{{/-first}}{{^-first}},{{/-first}} {{>fieldEncoder}} {{/allVars}} - ] + ] \ No newline at end of file diff --git a/samples/client/petstore/elm/.openapi-generator/VERSION b/samples/client/petstore/elm/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/elm/.openapi-generator/VERSION +++ b/samples/client/petstore/elm/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/elm/src/Data/ApiResponse.elm b/samples/client/petstore/elm/src/Data/ApiResponse.elm index ce052917546..c7400283086 100644 --- a/samples/client/petstore/elm/src/Data/ApiResponse.elm +++ b/samples/client/petstore/elm/src/Data/ApiResponse.elm @@ -44,4 +44,3 @@ apiResponseEncoder model = , ( "message", withDefault Encode.null (map Encode.string model.message) ) ] - diff --git a/samples/client/petstore/elm/src/Data/Category.elm b/samples/client/petstore/elm/src/Data/Category.elm index 8cac70ea451..b2baddd929f 100644 --- a/samples/client/petstore/elm/src/Data/Category.elm +++ b/samples/client/petstore/elm/src/Data/Category.elm @@ -41,4 +41,3 @@ categoryEncoder model = , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm/src/Data/Order_.elm b/samples/client/petstore/elm/src/Data/Order_.elm index c343084f39d..58559b874be 100644 --- a/samples/client/petstore/elm/src/Data/Order_.elm +++ b/samples/client/petstore/elm/src/Data/Order_.elm @@ -62,7 +62,6 @@ orderEncoder model = ] - statusDecoder : Decoder Status statusDecoder = Decode.string diff --git a/samples/client/petstore/elm/src/Data/Pet.elm b/samples/client/petstore/elm/src/Data/Pet.elm index 7f15ea44168..cdb4296712e 100644 --- a/samples/client/petstore/elm/src/Data/Pet.elm +++ b/samples/client/petstore/elm/src/Data/Pet.elm @@ -63,7 +63,6 @@ petEncoder model = ] - statusDecoder : Decoder Status statusDecoder = Decode.string diff --git a/samples/client/petstore/elm/src/Data/Tag.elm b/samples/client/petstore/elm/src/Data/Tag.elm index 74f6de18287..79d0fa2da27 100644 --- a/samples/client/petstore/elm/src/Data/Tag.elm +++ b/samples/client/petstore/elm/src/Data/Tag.elm @@ -41,4 +41,3 @@ tagEncoder model = , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm/src/Data/User.elm b/samples/client/petstore/elm/src/Data/User.elm index 851f3a51022..657f6fb6600 100644 --- a/samples/client/petstore/elm/src/Data/User.elm +++ b/samples/client/petstore/elm/src/Data/User.elm @@ -59,4 +59,3 @@ userEncoder model = , ( "userStatus", withDefault Encode.null (map Encode.int model.userStatus) ) ] - From 15cec0ae09c0db94095797aa7147160a3fe7eba3 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Sun, 26 Aug 2018 15:26:09 +0500 Subject: [PATCH 02/74] [Slim] Add PHP CodeSniffer to check coding style (#897) * [Slim] Add PHP CodeSniffer package * [Slim] Add phpcsStandard generator option We follow PSR-2 coding style guide in PHP generators. It might be convenient for users to specify own coding standard without modifying templates. That's why I've added this option. At first, I thought to add option validation and accept only standards from predefined list. But this option also can be a full path to the standard's root directory, I've changed my mind. User should use this option with caution. Ref to all PHP CodeSniffer CLI options: https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage * [Slim] Extend readme with PHP CodeSniffer docs * [Slim] Format templates to meet PSR-2 * [Slim] Refresh samples --- .../languages/PhpSlimServerCodegen.java | 16 +++ .../AbstractApiController.mustache | 7 +- .../resources/php-slim-server/README.mustache | 4 +- .../php-slim-server/SlimRouter.mustache | 14 ++- .../resources/php-slim-server/api.mustache | 13 +- .../php-slim-server/api_test.mustache | 23 ++-- .../php-slim-server/composer.mustache | 6 +- .../resources/php-slim-server/model.mustache | 6 +- .../php-slim-server/model_test.mustache | 28 +++-- .../options/PhpSlimServerOptionsProvider.java | 3 + .../slim/PhpSlimServerOptionsTest.java | 2 + .../petstore-security-test/php-slim/README.md | 4 +- .../php-slim/composer.json | 6 +- .../php-slim/lib/AbstractApiController.php | 7 +- .../php-slim/lib/Api/FakeApi.php | 9 +- .../php-slim/lib/Model/ModelReturn.php | 6 +- .../php-slim/lib/SlimRouter.php | 14 ++- .../php-slim/test/Api/FakeApiTest.php | 23 ++-- .../php-slim/test/Model/ModelReturnTest.php | 27 +++-- samples/server/petstore/php-slim/README.md | 4 +- .../server/petstore/php-slim/composer.json | 6 +- .../php-slim/lib/AbstractApiController.php | 7 +- .../php-slim/lib/Api/AnotherFakeApi.php | 9 +- .../petstore/php-slim/lib/Api/FakeApi.php | 48 ++++---- .../lib/Api/FakeClassnameTags123Api.php | 9 +- .../petstore/php-slim/lib/Api/PetApi.php | 39 +++--- .../petstore/php-slim/lib/Api/StoreApi.php | 19 +-- .../petstore/php-slim/lib/Api/UserApi.php | 35 +++--- .../lib/Model/AdditionalPropertiesClass.php | 8 +- .../petstore/php-slim/lib/Model/Animal.php | 8 +- .../php-slim/lib/Model/AnimalFarm.php | 4 +- .../php-slim/lib/Model/ApiResponse.php | 10 +- .../lib/Model/ArrayOfArrayOfNumberOnly.php | 6 +- .../php-slim/lib/Model/ArrayOfNumberOnly.php | 6 +- .../petstore/php-slim/lib/Model/ArrayTest.php | 10 +- .../php-slim/lib/Model/Capitalization.php | 16 +-- .../petstore/php-slim/lib/Model/Cat.php | 10 +- .../petstore/php-slim/lib/Model/Category.php | 8 +- .../php-slim/lib/Model/ClassModel.php | 6 +- .../petstore/php-slim/lib/Model/Client.php | 6 +- .../petstore/php-slim/lib/Model/Dog.php | 10 +- .../php-slim/lib/Model/EnumArrays.php | 8 +- .../petstore/php-slim/lib/Model/EnumClass.php | 4 +- .../petstore/php-slim/lib/Model/EnumTest.php | 14 +-- .../petstore/php-slim/lib/Model/File.php | 6 +- .../lib/Model/FileSchemaTestClass.php | 8 +- .../php-slim/lib/Model/FormatTest.php | 30 ++--- .../php-slim/lib/Model/HasOnlyReadOnly.php | 8 +- .../petstore/php-slim/lib/Model/MapTest.php | 12 +- ...PropertiesAndAdditionalPropertiesClass.php | 10 +- .../php-slim/lib/Model/Model200Response.php | 8 +- .../petstore/php-slim/lib/Model/ModelList.php | 6 +- .../php-slim/lib/Model/ModelReturn.php | 6 +- .../petstore/php-slim/lib/Model/Name.php | 12 +- .../php-slim/lib/Model/NumberOnly.php | 6 +- .../petstore/php-slim/lib/Model/Order.php | 16 +-- .../php-slim/lib/Model/OuterComposite.php | 10 +- .../petstore/php-slim/lib/Model/OuterEnum.php | 4 +- .../petstore/php-slim/lib/Model/Pet.php | 16 +-- .../php-slim/lib/Model/ReadOnlyFirst.php | 8 +- .../php-slim/lib/Model/SpecialModelName.php | 6 +- .../php-slim/lib/Model/StringBooleanMap.php | 4 +- .../petstore/php-slim/lib/Model/Tag.php | 8 +- .../petstore/php-slim/lib/Model/User.php | 20 ++-- .../petstore/php-slim/lib/SlimRouter.php | 113 ++++++++++++------ .../php-slim/test/Api/AnotherFakeApiTest.php | 27 +++-- .../php-slim/test/Api/FakeApiTest.php | 63 +++++----- .../test/Api/FakeClassnameTags123ApiTest.php | 23 ++-- .../petstore/php-slim/test/Api/PetApiTest.php | 55 ++++----- .../php-slim/test/Api/StoreApiTest.php | 35 +++--- .../php-slim/test/Api/UserApiTest.php | 51 ++++---- .../Model/AdditionalPropertiesClassTest.php | 31 ++--- .../php-slim/test/Model/AnimalFarmTest.php | 23 ++-- .../php-slim/test/Model/AnimalTest.php | 31 ++--- .../php-slim/test/Model/ApiResponseTest.php | 35 +++--- .../Model/ArrayOfArrayOfNumberOnlyTest.php | 27 +++-- .../test/Model/ArrayOfNumberOnlyTest.php | 27 +++-- .../php-slim/test/Model/ArrayTestTest.php | 35 +++--- .../test/Model/CapitalizationTest.php | 47 ++++---- .../petstore/php-slim/test/Model/CatTest.php | 35 +++--- .../php-slim/test/Model/CategoryTest.php | 31 ++--- .../php-slim/test/Model/ClassModelTest.php | 27 +++-- .../php-slim/test/Model/ClientTest.php | 27 +++-- .../petstore/php-slim/test/Model/DogTest.php | 35 +++--- .../php-slim/test/Model/EnumArraysTest.php | 31 ++--- .../php-slim/test/Model/EnumClassTest.php | 23 ++-- .../php-slim/test/Model/EnumTestTest.php | 43 +++---- .../test/Model/FileSchemaTestClassTest.php | 31 ++--- .../petstore/php-slim/test/Model/FileTest.php | 27 +++-- .../php-slim/test/Model/FormatTestTest.php | 75 ++++++------ .../test/Model/HasOnlyReadOnlyTest.php | 31 ++--- .../php-slim/test/Model/MapTestTest.php | 39 +++--- ...ertiesAndAdditionalPropertiesClassTest.php | 35 +++--- .../test/Model/Model200ResponseTest.php | 31 ++--- .../php-slim/test/Model/ModelListTest.php | 27 +++-- .../php-slim/test/Model/ModelReturnTest.php | 27 +++-- .../petstore/php-slim/test/Model/NameTest.php | 39 +++--- .../php-slim/test/Model/NumberOnlyTest.php | 27 +++-- .../php-slim/test/Model/OrderTest.php | 47 ++++---- .../test/Model/OuterCompositeTest.php | 35 +++--- .../php-slim/test/Model/OuterEnumTest.php | 23 ++-- .../petstore/php-slim/test/Model/PetTest.php | 47 ++++---- .../php-slim/test/Model/ReadOnlyFirstTest.php | 31 ++--- .../test/Model/SpecialModelNameTest.php | 27 +++-- .../test/Model/StringBooleanMapTest.php | 23 ++-- .../petstore/php-slim/test/Model/TagTest.php | 31 ++--- .../petstore/php-slim/test/Model/UserTest.php | 55 ++++----- 107 files changed, 1231 insertions(+), 1084 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 69c6bc6d677..ea3549c7af2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -35,8 +35,11 @@ import java.util.Map; public class PhpSlimServerCodegen extends AbstractPhpCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(PhpSlimServerCodegen.class); + public static final String PHPCS_STANDARD = "phpcsStandard"; + protected String groupId = "org.openapitools"; protected String artifactId = "openapi-server"; + protected String phpcsStandard = "PSR12"; public PhpSlimServerCodegen() { super(); @@ -70,6 +73,9 @@ public class PhpSlimServerCodegen extends AbstractPhpCodegen { break; } } + + cliOptions.add(new CliOption(PHPCS_STANDARD, "PHP CodeSniffer option. Accepts name or path of the coding standard to use.") + .defaultValue("PSR12")); } @Override @@ -109,6 +115,12 @@ public class PhpSlimServerCodegen extends AbstractPhpCodegen { public void processOpts() { super.processOpts(); + if (additionalProperties.containsKey(PHPCS_STANDARD)) { + this.setPhpcsStandard((String) additionalProperties.get(PHPCS_STANDARD)); + } else { + additionalProperties.put(PHPCS_STANDARD, phpcsStandard); + } + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("composer.mustache", "", "composer.json")); supportingFiles.add(new SupportingFile("index.mustache", "", "index.php")); @@ -148,4 +160,8 @@ public class PhpSlimServerCodegen extends AbstractPhpCodegen { return objs; } + public void setPhpcsStandard(String phpcsStandard) { + this.phpcsStandard = phpcsStandard; + } + } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache index c058491dd4e..4ba2ef121cb 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache @@ -44,7 +44,8 @@ namespace {{invokerPackage}}; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -abstract class AbstractApiController { +abstract class AbstractApiController +{ /** * @var \Interop\Container\ContainerInterface Slim app container instance @@ -56,8 +57,8 @@ abstract class AbstractApiController { * * @param \Interop\Container\ContainerInterface $container Slim app container instance */ - public function __construct($container) { + public function __construct($container) + { $this->container = $container; } - } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache index c8375231584..4dde7f075d8 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache @@ -30,15 +30,17 @@ $ php -S localhost:8888 -t php-slim-server ## Run tests -This package uses PHPUnit 4.8 for unit testing. +This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check source code against user defined coding standard(`phpcsStandard` generator config option). [Test folder]({{testBasePath}}) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phpcs` | PHP CodeSniffer | All files {{#generateApiDocs}} ## API Endpoints diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/SlimRouter.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/SlimRouter.mustache index 11eb61d5ac8..18ee144e6d5 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/SlimRouter.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/SlimRouter.mustache @@ -10,7 +10,7 @@ * @link https://github.com/openapitools/openapi-generator */ -/**{{#apiInfo}}{{#appName}} +/**{{#apiInfo}}{{#appName}} * {{{appName}}} * {{/appName}} @@ -51,7 +51,8 @@ use Tuupola\Middleware\HttpBasicAuthentication; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class SlimRouter { +class SlimRouter +{ /** * @var $slimApp Slim\App instance @@ -64,7 +65,8 @@ class SlimRouter { * @param ContainerInterface|array $container Either a ContainerInterface or an associative array of app settings * @throws InvalidArgumentException when no container is provided that implements ContainerInterface */ - public function __construct($container = []) { + public function __construct($container = []) + { $app = new App($container); $basicAuth = new HttpBasicAuthentication([ @@ -80,7 +82,8 @@ class SlimRouter { {{#operations}} {{#operation}} $app->{{httpMethod}}( - '{{{basePathWithoutHost}}}{{{path}}}', {{classname}}::class . ':{{operationId}}' + '{{{basePathWithoutHost}}}{{{path}}}', + {{classname}}::class . ':{{operationId}}' {{#hasAuthMethods}} {{#authMethods}} {{#isBasic}} @@ -101,7 +104,8 @@ class SlimRouter { * Returns Slim Framework instance * @return App */ - public function getSlimApp() { + public function getSlimApp() + { return $this->slimApp; } } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache index 84e2b6a1acd..1bc94ad3cdb 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache @@ -46,14 +46,19 @@ use {{invokerPackage}}\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class {{classname}} extends AbstractApiController { - +class {{classname}} extends AbstractApiController +{ {{#operations}} {{#operation}} + /** * {{httpMethod}} {{operationId}} + {{#summary}} * Summary: {{summary}} + {{/summary}} + {{#notes}} * Notes: {{notes}} + {{/notes}} {{#hasProduces}} * Output-Formats: [{{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/produces}}] {{/hasProduces}} @@ -62,7 +67,8 @@ class {{classname}} extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function {{operationId}}($request, $response, $args) { + public function {{operationId}}($request, $response, $args) + { {{#hasHeaderParams}} $headers = $request->getHeaders(); {{#headerParams}} @@ -96,7 +102,6 @@ class {{classname}} extends AbstractApiController { $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); return $response; } - {{#hasMore}}{{/hasMore}} {{/operation}} {{/operations}} } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/api_test.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/api_test.mustache index ecc80a622c7..234cbb5a636 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/api_test.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/api_test.mustache @@ -45,34 +45,35 @@ use {{apiPackage}}\{{classname}}; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \{{modelPackage}}\{{classname}} */ -{{#operations}}class {{classname}}Test extends \PHPUnit_Framework_TestCase { +{{#operations}}class {{classname}}Test extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } {{#operation}} @@ -82,8 +83,8 @@ use {{apiPackage}}\{{classname}}; * {{{summary}}}. * @covers ::{{{operationId}}} */ - public function test{{operationIdCamelCase}}() { - + public function test{{operationIdCamelCase}}() + { } {{/operation}} } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache index a27e79ec42f..a260f3cb8a0 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache @@ -6,7 +6,8 @@ "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "squizlabs/php_codesniffer": "^3.0" }, "autoload": { "psr-4": { "{{escapedInvokerPackage}}\\": "{{srcBasePath}}/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard={{phpcsStandard}}" } } \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/model.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/model.mustache index 94fd28ef53f..a1f40f818fb 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/model.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/model.mustache @@ -7,12 +7,12 @@ namespace {{modelPackage}}; /** * {{classname}} */ -class {{classname}} { - +class {{classname}} +{ {{#vars}} + /** @var {{dataType}} ${{name}} {{#description}}{{description}}{{/description}}*/ private ${{name}}; - {{/vars}} } {{/model}}{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/model_test.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/model_test.mustache index cc559bd1c6b..ea2518ef742 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/model_test.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/model_test.mustache @@ -47,40 +47,42 @@ use {{modelPackage}}\{{classname}}; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \{{modelPackage}}\{{classname}} */ -class {{classname}}Test extends \PHPUnit_Framework_TestCase { +class {{classname}}Test extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "{{classname}}" */ - public function test{{classname}}() { + public function test{{classname}}() + { $test{{classname}} = new {{classname}}(); } {{#vars}} @@ -88,9 +90,9 @@ class {{classname}}Test extends \PHPUnit_Framework_TestCase { /** * Test attribute "{{name}}" */ - public function testProperty{{nameInCamelCase}}() { - + public function testProperty{{nameInCamelCase}}() + { } {{/vars}} } -{{/model}}{{/models}} +{{/model}}{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpSlimServerOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpSlimServerOptionsProvider.java index c170e2ff577..39186e7b051 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpSlimServerOptionsProvider.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpSlimServerOptionsProvider.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.options; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.languages.AbstractPhpCodegen; +import org.openapitools.codegen.languages.PhpSlimServerCodegen; import com.google.common.collect.ImmutableMap; @@ -38,6 +39,7 @@ public class PhpSlimServerOptionsProvider implements OptionsProvider { public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true"; public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false"; public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true"; + public static final String PHPCS_STANDARD_VALUE = "PSR12"; @Override public String getLanguage() { @@ -60,6 +62,7 @@ public class PhpSlimServerOptionsProvider implements OptionsProvider { .put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE) .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(CodegenConstants.PREPEND_FORM_OR_BODY_PARAMETERS, PREPEND_FORM_OR_BODY_PARAMETERS_VALUE) + .put(PhpSlimServerCodegen.PHPCS_STANDARD, PHPCS_STANDARD_VALUE) .build(); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/slim/PhpSlimServerOptionsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/slim/PhpSlimServerOptionsTest.java index 25cd43077aa..57a87adaf3f 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/slim/PhpSlimServerOptionsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/slim/PhpSlimServerOptionsTest.java @@ -63,6 +63,8 @@ public class PhpSlimServerOptionsTest extends AbstractOptionsTest { times = 1; clientCodegen.setSortParamsByRequiredFlag(Boolean.valueOf(PhpSlimServerOptionsProvider.SORT_PARAMS_VALUE)); times = 1; + clientCodegen.setPhpcsStandard(PhpSlimServerOptionsProvider.PHPCS_STANDARD_VALUE); + times = 1; }}; } } diff --git a/samples/server/petstore-security-test/php-slim/README.md b/samples/server/petstore-security-test/php-slim/README.md index 337746cd020..caf887a56d5 100644 --- a/samples/server/petstore-security-test/php-slim/README.md +++ b/samples/server/petstore-security-test/php-slim/README.md @@ -30,15 +30,17 @@ $ php -S localhost:8888 -t php-slim-server ## Run tests -This package uses PHPUnit 4.8 for unit testing. +This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check source code against user defined coding standard(`phpcsStandard` generator config option). [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phpcs` | PHP CodeSniffer | All files ## API Endpoints diff --git a/samples/server/petstore-security-test/php-slim/composer.json b/samples/server/petstore-security-test/php-slim/composer.json index ca199179020..166250643b9 100644 --- a/samples/server/petstore-security-test/php-slim/composer.json +++ b/samples/server/petstore-security-test/php-slim/composer.json @@ -6,7 +6,8 @@ "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "squizlabs/php_codesniffer": "^3.0" }, "autoload": { "psr-4": { "OpenAPIServer\\": "lib/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12" } } \ No newline at end of file diff --git a/samples/server/petstore-security-test/php-slim/lib/AbstractApiController.php b/samples/server/petstore-security-test/php-slim/lib/AbstractApiController.php index 03b525eb3ee..9d6b899e2d3 100644 --- a/samples/server/petstore-security-test/php-slim/lib/AbstractApiController.php +++ b/samples/server/petstore-security-test/php-slim/lib/AbstractApiController.php @@ -36,7 +36,8 @@ namespace OpenAPIServer; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -abstract class AbstractApiController { +abstract class AbstractApiController +{ /** * @var \Interop\Container\ContainerInterface Slim app container instance @@ -48,8 +49,8 @@ abstract class AbstractApiController { * * @param \Interop\Container\ContainerInterface $container Slim app container instance */ - public function __construct($container) { + public function __construct($container) + { $this->container = $container; } - } diff --git a/samples/server/petstore-security-test/php-slim/lib/Api/FakeApi.php b/samples/server/petstore-security-test/php-slim/lib/Api/FakeApi.php index 464145051c8..e5f473ac0a3 100644 --- a/samples/server/petstore-security-test/php-slim/lib/Api/FakeApi.php +++ b/samples/server/petstore-security-test/php-slim/lib/Api/FakeApi.php @@ -38,8 +38,9 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class FakeApi extends AbstractApiController { - +class FakeApi extends AbstractApiController +{ + /** * PUT testCodeInjectEndRnNR * Summary: To test code injection *_/ ' \" =end -- \\r\\n \\n \\r @@ -49,10 +50,10 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testCodeInjectEndRnNR($request, $response, $args) { + public function testCodeInjectEndRnNR($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing testCodeInjectEndRnNR as a PUT method ?'); return $response; } - } diff --git a/samples/server/petstore-security-test/php-slim/lib/Model/ModelReturn.php b/samples/server/petstore-security-test/php-slim/lib/Model/ModelReturn.php index f070d4efccd..8cf6a29ab8e 100644 --- a/samples/server/petstore-security-test/php-slim/lib/Model/ModelReturn.php +++ b/samples/server/petstore-security-test/php-slim/lib/Model/ModelReturn.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ModelReturn */ -class ModelReturn { - +class ModelReturn +{ + /** @var int $return property description *_/ ' \" =end -- \\r\\n \\n \\r*/ private $return; - } diff --git a/samples/server/petstore-security-test/php-slim/lib/SlimRouter.php b/samples/server/petstore-security-test/php-slim/lib/SlimRouter.php index 794b6192388..0b7509aab71 100644 --- a/samples/server/petstore-security-test/php-slim/lib/SlimRouter.php +++ b/samples/server/petstore-security-test/php-slim/lib/SlimRouter.php @@ -10,7 +10,7 @@ * @link https://github.com/openapitools/openapi-generator */ -/** +/** * OpenAPI Petstore *_/ ' \" =end -- \\r\\n \\n \\r * * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- @@ -42,7 +42,8 @@ use Tuupola\Middleware\HttpBasicAuthentication; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class SlimRouter { +class SlimRouter +{ /** * @var $slimApp Slim\App instance @@ -55,7 +56,8 @@ class SlimRouter { * @param ContainerInterface|array $container Either a ContainerInterface or an associative array of app settings * @throws InvalidArgumentException when no container is provided that implements ContainerInterface */ - public function __construct($container = []) { + public function __construct($container = []) + { $app = new App($container); $basicAuth = new HttpBasicAuthentication([ @@ -68,7 +70,8 @@ class SlimRouter { ]); $app->PUT( - '/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r/fake', FakeApi::class . ':testCodeInjectEndRnNR' + '/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r/fake', + FakeApi::class . ':testCodeInjectEndRnNR' ); $this->slimApp = $app; @@ -78,7 +81,8 @@ class SlimRouter { * Returns Slim Framework instance * @return App */ - public function getSlimApp() { + public function getSlimApp() + { return $this->slimApp; } } diff --git a/samples/server/petstore-security-test/php-slim/test/Api/FakeApiTest.php b/samples/server/petstore-security-test/php-slim/test/Api/FakeApiTest.php index 3205216ec96..de4df30629f 100644 --- a/samples/server/petstore-security-test/php-slim/test/Api/FakeApiTest.php +++ b/samples/server/petstore-security-test/php-slim/test/Api/FakeApiTest.php @@ -37,34 +37,35 @@ use OpenAPIServer\Api\FakeApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\FakeApi */ -class FakeApiTest extends \PHPUnit_Framework_TestCase { +class FakeApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -73,7 +74,7 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r. * @covers ::testCodeInjectEndRnNR */ - public function testTestCodeInjectEndRnNR() { - + public function testTestCodeInjectEndRnNR() + { } } diff --git a/samples/server/petstore-security-test/php-slim/test/Model/ModelReturnTest.php b/samples/server/petstore-security-test/php-slim/test/Model/ModelReturnTest.php index d535c902fc2..036a63c111d 100644 --- a/samples/server/petstore-security-test/php-slim/test/Model/ModelReturnTest.php +++ b/samples/server/petstore-security-test/php-slim/test/Model/ModelReturnTest.php @@ -37,48 +37,49 @@ use OpenAPIServer\Model\ModelReturn; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ModelReturn */ -class ModelReturnTest extends \PHPUnit_Framework_TestCase { +class ModelReturnTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ModelReturn" */ - public function testModelReturn() { + public function testModelReturn() + { $testModelReturn = new ModelReturn(); } /** * Test attribute "return" */ - public function testPropertyReturn() { - + public function testPropertyReturn() + { } } - diff --git a/samples/server/petstore/php-slim/README.md b/samples/server/petstore/php-slim/README.md index 85f8dfa9803..bc52802744f 100644 --- a/samples/server/petstore/php-slim/README.md +++ b/samples/server/petstore/php-slim/README.md @@ -30,15 +30,17 @@ $ php -S localhost:8888 -t php-slim-server ## Run tests -This package uses PHPUnit 4.8 for unit testing. +This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check source code against user defined coding standard(`phpcsStandard` generator config option). [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phpcs` | PHP CodeSniffer | All files ## API Endpoints diff --git a/samples/server/petstore/php-slim/composer.json b/samples/server/petstore/php-slim/composer.json index ca199179020..166250643b9 100644 --- a/samples/server/petstore/php-slim/composer.json +++ b/samples/server/petstore/php-slim/composer.json @@ -6,7 +6,8 @@ "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "squizlabs/php_codesniffer": "^3.0" }, "autoload": { "psr-4": { "OpenAPIServer\\": "lib/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12" } } \ No newline at end of file diff --git a/samples/server/petstore/php-slim/lib/AbstractApiController.php b/samples/server/petstore/php-slim/lib/AbstractApiController.php index 7f1ee414191..9f20afc8770 100644 --- a/samples/server/petstore/php-slim/lib/AbstractApiController.php +++ b/samples/server/petstore/php-slim/lib/AbstractApiController.php @@ -35,7 +35,8 @@ namespace OpenAPIServer; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -abstract class AbstractApiController { +abstract class AbstractApiController +{ /** * @var \Interop\Container\ContainerInterface Slim app container instance @@ -47,8 +48,8 @@ abstract class AbstractApiController { * * @param \Interop\Container\ContainerInterface $container Slim app container instance */ - public function __construct($container) { + public function __construct($container) + { $this->container = $container; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php b/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php index ff108200b53..80b1a67e427 100644 --- a/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php +++ b/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php @@ -37,8 +37,9 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class AnotherFakeApi extends AbstractApiController { - +class AnotherFakeApi extends AbstractApiController +{ + /** * PATCH call123TestSpecialTags * Summary: To test special tags @@ -49,10 +50,10 @@ class AnotherFakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function call123TestSpecialTags($request, $response, $args) { + public function call123TestSpecialTags($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing call123TestSpecialTags as a PATCH method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/FakeApi.php b/samples/server/petstore/php-slim/lib/Api/FakeApi.php index 2f8fee13498..3d69b510d03 100644 --- a/samples/server/petstore/php-slim/lib/Api/FakeApi.php +++ b/samples/server/petstore/php-slim/lib/Api/FakeApi.php @@ -37,11 +37,11 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class FakeApi extends AbstractApiController { - +class FakeApi extends AbstractApiController +{ + /** * POST fakeOuterBooleanSerialize - * Summary: * Notes: Test serialization of outer boolean types * Output-Formats: [*_/_*] * @@ -49,7 +49,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function fakeOuterBooleanSerialize($request, $response, $args) { + public function fakeOuterBooleanSerialize($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing fakeOuterBooleanSerialize as a POST method ?'); return $response; @@ -57,7 +58,6 @@ class FakeApi extends AbstractApiController { /** * POST fakeOuterCompositeSerialize - * Summary: * Notes: Test serialization of object with outer number type * Output-Formats: [*_/_*] * @@ -65,7 +65,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function fakeOuterCompositeSerialize($request, $response, $args) { + public function fakeOuterCompositeSerialize($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing fakeOuterCompositeSerialize as a POST method ?'); return $response; @@ -73,7 +74,6 @@ class FakeApi extends AbstractApiController { /** * POST fakeOuterNumberSerialize - * Summary: * Notes: Test serialization of outer number types * Output-Formats: [*_/_*] * @@ -81,7 +81,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function fakeOuterNumberSerialize($request, $response, $args) { + public function fakeOuterNumberSerialize($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing fakeOuterNumberSerialize as a POST method ?'); return $response; @@ -89,7 +90,6 @@ class FakeApi extends AbstractApiController { /** * POST fakeOuterStringSerialize - * Summary: * Notes: Test serialization of outer string types * Output-Formats: [*_/_*] * @@ -97,7 +97,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function fakeOuterStringSerialize($request, $response, $args) { + public function fakeOuterStringSerialize($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing fakeOuterStringSerialize as a POST method ?'); return $response; @@ -105,14 +106,14 @@ class FakeApi extends AbstractApiController { /** * PUT testBodyWithFileSchema - * Summary: * Notes: For this test, the body for this request much reference a schema named `File`. * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testBodyWithFileSchema($request, $response, $args) { + public function testBodyWithFileSchema($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing testBodyWithFileSchema as a PUT method ?'); return $response; @@ -120,14 +121,13 @@ class FakeApi extends AbstractApiController { /** * PUT testBodyWithQueryParams - * Summary: - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testBodyWithQueryParams($request, $response, $args) { + public function testBodyWithQueryParams($request, $response, $args) + { $queryParams = $request->getQueryParams(); $query = $request->getQueryParam('query'); $body = $request->getParsedBody(); @@ -145,7 +145,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testClientModel($request, $response, $args) { + public function testClientModel($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing testClientModel as a PATCH method ?'); return $response; @@ -160,7 +161,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testEndpointParameters($request, $response, $args) { + public function testEndpointParameters($request, $response, $args) + { $integer = $request->getParsedBodyParam('integer'); $int32 = $request->getParsedBodyParam('int32'); $int64 = $request->getParsedBodyParam('int64'); @@ -188,7 +190,8 @@ class FakeApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testEnumParameters($request, $response, $args) { + public function testEnumParameters($request, $response, $args) + { $headers = $request->getHeaders(); $enumHeaderStringArray = $request->hasHeader('enum_header_string_array') ? $headers['enum_header_string_array'] : null; $enumHeaderString = $request->hasHeader('enum_header_string') ? $headers['enum_header_string'] : null; @@ -206,13 +209,13 @@ class FakeApi extends AbstractApiController { /** * POST testInlineAdditionalProperties * Summary: test inline additionalProperties - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testInlineAdditionalProperties($request, $response, $args) { + public function testInlineAdditionalProperties($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing testInlineAdditionalProperties as a POST method ?'); return $response; @@ -221,17 +224,16 @@ class FakeApi extends AbstractApiController { /** * GET testJsonFormData * Summary: test json serialization of form data - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testJsonFormData($request, $response, $args) { + public function testJsonFormData($request, $response, $args) + { $param = $request->getParsedBodyParam('param'); $param2 = $request->getParsedBodyParam('param2'); $response->write('How about implementing testJsonFormData as a GET method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php b/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php index e824913c4e3..a245034eaa1 100644 --- a/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php +++ b/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php @@ -37,8 +37,9 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class FakeClassnameTags123Api extends AbstractApiController { - +class FakeClassnameTags123Api extends AbstractApiController +{ + /** * PATCH testClassname * Summary: To test class name in snake case @@ -49,10 +50,10 @@ class FakeClassnameTags123Api extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function testClassname($request, $response, $args) { + public function testClassname($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing testClassname as a PATCH method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/PetApi.php b/samples/server/petstore/php-slim/lib/Api/PetApi.php index 7534dd9e48c..b8ddd815a89 100644 --- a/samples/server/petstore/php-slim/lib/Api/PetApi.php +++ b/samples/server/petstore/php-slim/lib/Api/PetApi.php @@ -37,18 +37,19 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class PetApi extends AbstractApiController { - +class PetApi extends AbstractApiController +{ + /** * POST addPet * Summary: Add a new pet to the store - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function addPet($request, $response, $args) { + public function addPet($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing addPet as a POST method ?'); return $response; @@ -57,13 +58,13 @@ class PetApi extends AbstractApiController { /** * DELETE deletePet * Summary: Deletes a pet - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function deletePet($request, $response, $args) { + public function deletePet($request, $response, $args) + { $headers = $request->getHeaders(); $apiKey = $request->hasHeader('api_key') ? $headers['api_key'] : null; $petId = $args['petId']; @@ -81,7 +82,8 @@ class PetApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function findPetsByStatus($request, $response, $args) { + public function findPetsByStatus($request, $response, $args) + { $queryParams = $request->getQueryParams(); $status = $request->getQueryParam('status'); $response->write('How about implementing findPetsByStatus as a GET method ?'); @@ -98,7 +100,8 @@ class PetApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function findPetsByTags($request, $response, $args) { + public function findPetsByTags($request, $response, $args) + { $queryParams = $request->getQueryParams(); $tags = $request->getQueryParam('tags'); $response->write('How about implementing findPetsByTags as a GET method ?'); @@ -115,7 +118,8 @@ class PetApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function getPetById($request, $response, $args) { + public function getPetById($request, $response, $args) + { $petId = $args['petId']; $response->write('How about implementing getPetById as a GET method ?'); return $response; @@ -124,13 +128,13 @@ class PetApi extends AbstractApiController { /** * PUT updatePet * Summary: Update an existing pet - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function updatePet($request, $response, $args) { + public function updatePet($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing updatePet as a PUT method ?'); return $response; @@ -139,13 +143,13 @@ class PetApi extends AbstractApiController { /** * POST updatePetWithForm * Summary: Updates a pet in the store with form data - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function updatePetWithForm($request, $response, $args) { + public function updatePetWithForm($request, $response, $args) + { $petId = $args['petId']; $name = $request->getParsedBodyParam('name'); $status = $request->getParsedBodyParam('status'); @@ -156,14 +160,14 @@ class PetApi extends AbstractApiController { /** * POST uploadFile * Summary: uploads an image - * Notes: * Output-Formats: [application/json] * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function uploadFile($request, $response, $args) { + public function uploadFile($request, $response, $args) + { $petId = $args['petId']; $additionalMetadata = $request->getParsedBodyParam('additionalMetadata'); $file = (key_exists('file', $request->getUploadedFiles())) ? $request->getUploadedFiles()['file'] : null; @@ -174,19 +178,18 @@ class PetApi extends AbstractApiController { /** * POST uploadFileWithRequiredFile * Summary: uploads an image (required) - * Notes: * Output-Formats: [application/json] * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function uploadFileWithRequiredFile($request, $response, $args) { + public function uploadFileWithRequiredFile($request, $response, $args) + { $petId = $args['petId']; $additionalMetadata = $request->getParsedBodyParam('additionalMetadata'); $requiredFile = (key_exists('requiredFile', $request->getUploadedFiles())) ? $request->getUploadedFiles()['requiredFile'] : null; $response->write('How about implementing uploadFileWithRequiredFile as a POST method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/StoreApi.php b/samples/server/petstore/php-slim/lib/Api/StoreApi.php index 181c66337eb..8fcb48a4114 100644 --- a/samples/server/petstore/php-slim/lib/Api/StoreApi.php +++ b/samples/server/petstore/php-slim/lib/Api/StoreApi.php @@ -37,8 +37,9 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class StoreApi extends AbstractApiController { - +class StoreApi extends AbstractApiController +{ + /** * DELETE deleteOrder * Summary: Delete purchase order by ID @@ -48,7 +49,8 @@ class StoreApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function deleteOrder($request, $response, $args) { + public function deleteOrder($request, $response, $args) + { $orderId = $args['order_id']; $response->write('How about implementing deleteOrder as a DELETE method ?'); return $response; @@ -64,7 +66,8 @@ class StoreApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function getInventory($request, $response, $args) { + public function getInventory($request, $response, $args) + { $response->write('How about implementing getInventory as a GET method ?'); return $response; } @@ -79,7 +82,8 @@ class StoreApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function getOrderById($request, $response, $args) { + public function getOrderById($request, $response, $args) + { $orderId = $args['order_id']; $response->write('How about implementing getOrderById as a GET method ?'); return $response; @@ -88,17 +92,16 @@ class StoreApi extends AbstractApiController { /** * POST placeOrder * Summary: Place an order for a pet - * Notes: * Output-Formats: [application/xml, application/json] * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function placeOrder($request, $response, $args) { + public function placeOrder($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing placeOrder as a POST method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Api/UserApi.php b/samples/server/petstore/php-slim/lib/Api/UserApi.php index 4ba8c652b71..39d48b919f4 100644 --- a/samples/server/petstore/php-slim/lib/Api/UserApi.php +++ b/samples/server/petstore/php-slim/lib/Api/UserApi.php @@ -37,8 +37,9 @@ use OpenAPIServer\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class UserApi extends AbstractApiController { - +class UserApi extends AbstractApiController +{ + /** * POST createUser * Summary: Create user @@ -48,7 +49,8 @@ class UserApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function createUser($request, $response, $args) { + public function createUser($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing createUser as a POST method ?'); return $response; @@ -57,13 +59,13 @@ class UserApi extends AbstractApiController { /** * POST createUsersWithArrayInput * Summary: Creates list of users with given input array - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function createUsersWithArrayInput($request, $response, $args) { + public function createUsersWithArrayInput($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); return $response; @@ -72,13 +74,13 @@ class UserApi extends AbstractApiController { /** * POST createUsersWithListInput * Summary: Creates list of users with given input array - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function createUsersWithListInput($request, $response, $args) { + public function createUsersWithListInput($request, $response, $args) + { $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithListInput as a POST method ?'); return $response; @@ -93,7 +95,8 @@ class UserApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function deleteUser($request, $response, $args) { + public function deleteUser($request, $response, $args) + { $username = $args['username']; $response->write('How about implementing deleteUser as a DELETE method ?'); return $response; @@ -102,14 +105,14 @@ class UserApi extends AbstractApiController { /** * GET getUserByName * Summary: Get user by user name - * Notes: * Output-Formats: [application/xml, application/json] * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function getUserByName($request, $response, $args) { + public function getUserByName($request, $response, $args) + { $username = $args['username']; $response->write('How about implementing getUserByName as a GET method ?'); return $response; @@ -118,14 +121,14 @@ class UserApi extends AbstractApiController { /** * GET loginUser * Summary: Logs user into the system - * Notes: * Output-Formats: [application/xml, application/json] * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function loginUser($request, $response, $args) { + public function loginUser($request, $response, $args) + { $queryParams = $request->getQueryParams(); $username = $request->getQueryParam('username'); $password = $request->getQueryParam('password'); @@ -136,13 +139,13 @@ class UserApi extends AbstractApiController { /** * GET logoutUser * Summary: Logs out current logged in user session - * Notes: * * @param \Psr\Http\Message\ServerRequestInterface $request Request * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function logoutUser($request, $response, $args) { + public function logoutUser($request, $response, $args) + { $response->write('How about implementing logoutUser as a GET method ?'); return $response; } @@ -156,11 +159,11 @@ class UserApi extends AbstractApiController { * @param \Psr\Http\Message\ResponseInterface $response Response * @param array|null $args Path arguments */ - public function updateUser($request, $response, $args) { + public function updateUser($request, $response, $args) + { $username = $args['username']; $body = $request->getParsedBody(); $response->write('How about implementing updateUser as a PUT method ?'); return $response; } - } diff --git a/samples/server/petstore/php-slim/lib/Model/AdditionalPropertiesClass.php b/samples/server/petstore/php-slim/lib/Model/AdditionalPropertiesClass.php index 460fd8573bb..ee96953acb1 100644 --- a/samples/server/petstore/php-slim/lib/Model/AdditionalPropertiesClass.php +++ b/samples/server/petstore/php-slim/lib/Model/AdditionalPropertiesClass.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * AdditionalPropertiesClass */ -class AdditionalPropertiesClass { - +class AdditionalPropertiesClass +{ + /** @var map[string,string] $mapProperty */ private $mapProperty; - + /** @var map[string,map[string,string]] $mapOfMapProperty */ private $mapOfMapProperty; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Animal.php b/samples/server/petstore/php-slim/lib/Model/Animal.php index d4c127fc757..b9bc8ea44b8 100644 --- a/samples/server/petstore/php-slim/lib/Model/Animal.php +++ b/samples/server/petstore/php-slim/lib/Model/Animal.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * Animal */ -class Animal { - +class Animal +{ + /** @var string $className */ private $className; - + /** @var string $color */ private $color; - } diff --git a/samples/server/petstore/php-slim/lib/Model/AnimalFarm.php b/samples/server/petstore/php-slim/lib/Model/AnimalFarm.php index 3d3e6bc0183..36466e01819 100644 --- a/samples/server/petstore/php-slim/lib/Model/AnimalFarm.php +++ b/samples/server/petstore/php-slim/lib/Model/AnimalFarm.php @@ -7,6 +7,6 @@ namespace OpenAPIServer\Model; /** * AnimalFarm */ -class AnimalFarm { - +class AnimalFarm +{ } diff --git a/samples/server/petstore/php-slim/lib/Model/ApiResponse.php b/samples/server/petstore/php-slim/lib/Model/ApiResponse.php index fe48dcd69ce..b6a7390c8bf 100644 --- a/samples/server/petstore/php-slim/lib/Model/ApiResponse.php +++ b/samples/server/petstore/php-slim/lib/Model/ApiResponse.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * ApiResponse */ -class ApiResponse { - +class ApiResponse +{ + /** @var int $code */ private $code; - + /** @var string $type */ private $type; - + /** @var string $message */ private $message; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ArrayOfArrayOfNumberOnly.php b/samples/server/petstore/php-slim/lib/Model/ArrayOfArrayOfNumberOnly.php index 60401112529..1a9159e7ce8 100644 --- a/samples/server/petstore/php-slim/lib/Model/ArrayOfArrayOfNumberOnly.php +++ b/samples/server/petstore/php-slim/lib/Model/ArrayOfArrayOfNumberOnly.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ArrayOfArrayOfNumberOnly */ -class ArrayOfArrayOfNumberOnly { - +class ArrayOfArrayOfNumberOnly +{ + /** @var float[][] $arrayArrayNumber */ private $arrayArrayNumber; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ArrayOfNumberOnly.php b/samples/server/petstore/php-slim/lib/Model/ArrayOfNumberOnly.php index a3b2e76c22c..33a08beb982 100644 --- a/samples/server/petstore/php-slim/lib/Model/ArrayOfNumberOnly.php +++ b/samples/server/petstore/php-slim/lib/Model/ArrayOfNumberOnly.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ArrayOfNumberOnly */ -class ArrayOfNumberOnly { - +class ArrayOfNumberOnly +{ + /** @var float[] $arrayNumber */ private $arrayNumber; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ArrayTest.php b/samples/server/petstore/php-slim/lib/Model/ArrayTest.php index 08e8a8ea03a..dfc5ac6c52c 100644 --- a/samples/server/petstore/php-slim/lib/Model/ArrayTest.php +++ b/samples/server/petstore/php-slim/lib/Model/ArrayTest.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * ArrayTest */ -class ArrayTest { - +class ArrayTest +{ + /** @var string[] $arrayOfString */ private $arrayOfString; - + /** @var int[][] $arrayArrayOfInteger */ private $arrayArrayOfInteger; - + /** @var \OpenAPIServer\Model\ReadOnlyFirst[][] $arrayArrayOfModel */ private $arrayArrayOfModel; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Capitalization.php b/samples/server/petstore/php-slim/lib/Model/Capitalization.php index 8ea348becef..b31affec6a4 100644 --- a/samples/server/petstore/php-slim/lib/Model/Capitalization.php +++ b/samples/server/petstore/php-slim/lib/Model/Capitalization.php @@ -7,24 +7,24 @@ namespace OpenAPIServer\Model; /** * Capitalization */ -class Capitalization { - +class Capitalization +{ + /** @var string $smallCamel */ private $smallCamel; - + /** @var string $capitalCamel */ private $capitalCamel; - + /** @var string $smallSnake */ private $smallSnake; - + /** @var string $capitalSnake */ private $capitalSnake; - + /** @var string $sCAETHFlowPoints */ private $sCAETHFlowPoints; - + /** @var string $aTTNAME Name of the pet*/ private $aTTNAME; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Cat.php b/samples/server/petstore/php-slim/lib/Model/Cat.php index 072c86d1cb8..9a800c02979 100644 --- a/samples/server/petstore/php-slim/lib/Model/Cat.php +++ b/samples/server/petstore/php-slim/lib/Model/Cat.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * Cat */ -class Cat { - +class Cat +{ + /** @var string $className */ private $className; - + /** @var string $color */ private $color; - + /** @var bool $declawed */ private $declawed; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Category.php b/samples/server/petstore/php-slim/lib/Model/Category.php index 92d49af1ba6..9bed27a1f2e 100644 --- a/samples/server/petstore/php-slim/lib/Model/Category.php +++ b/samples/server/petstore/php-slim/lib/Model/Category.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * Category */ -class Category { - +class Category +{ + /** @var int $id */ private $id; - + /** @var string $name */ private $name; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ClassModel.php b/samples/server/petstore/php-slim/lib/Model/ClassModel.php index 831e8afad41..43b08c7016e 100644 --- a/samples/server/petstore/php-slim/lib/Model/ClassModel.php +++ b/samples/server/petstore/php-slim/lib/Model/ClassModel.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ClassModel */ -class ClassModel { - +class ClassModel +{ + /** @var string $class */ private $class; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Client.php b/samples/server/petstore/php-slim/lib/Model/Client.php index 573a7f71b09..95ded593b93 100644 --- a/samples/server/petstore/php-slim/lib/Model/Client.php +++ b/samples/server/petstore/php-slim/lib/Model/Client.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * Client */ -class Client { - +class Client +{ + /** @var string $client */ private $client; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Dog.php b/samples/server/petstore/php-slim/lib/Model/Dog.php index cbb138e2704..2af41c927e4 100644 --- a/samples/server/petstore/php-slim/lib/Model/Dog.php +++ b/samples/server/petstore/php-slim/lib/Model/Dog.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * Dog */ -class Dog { - +class Dog +{ + /** @var string $className */ private $className; - + /** @var string $color */ private $color; - + /** @var string $breed */ private $breed; - } diff --git a/samples/server/petstore/php-slim/lib/Model/EnumArrays.php b/samples/server/petstore/php-slim/lib/Model/EnumArrays.php index 420c603ff94..0683034c18b 100644 --- a/samples/server/petstore/php-slim/lib/Model/EnumArrays.php +++ b/samples/server/petstore/php-slim/lib/Model/EnumArrays.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * EnumArrays */ -class EnumArrays { - +class EnumArrays +{ + /** @var string $justSymbol */ private $justSymbol; - + /** @var string[] $arrayEnum */ private $arrayEnum; - } diff --git a/samples/server/petstore/php-slim/lib/Model/EnumClass.php b/samples/server/petstore/php-slim/lib/Model/EnumClass.php index b6ec1ac9421..61cf77c95ac 100644 --- a/samples/server/petstore/php-slim/lib/Model/EnumClass.php +++ b/samples/server/petstore/php-slim/lib/Model/EnumClass.php @@ -7,6 +7,6 @@ namespace OpenAPIServer\Model; /** * EnumClass */ -class EnumClass { - +class EnumClass +{ } diff --git a/samples/server/petstore/php-slim/lib/Model/EnumTest.php b/samples/server/petstore/php-slim/lib/Model/EnumTest.php index eef0cfb6aa9..b4754610cfd 100644 --- a/samples/server/petstore/php-slim/lib/Model/EnumTest.php +++ b/samples/server/petstore/php-slim/lib/Model/EnumTest.php @@ -7,21 +7,21 @@ namespace OpenAPIServer\Model; /** * EnumTest */ -class EnumTest { - +class EnumTest +{ + /** @var string $enumString */ private $enumString; - + /** @var string $enumStringRequired */ private $enumStringRequired; - + /** @var int $enumInteger */ private $enumInteger; - + /** @var double $enumNumber */ private $enumNumber; - + /** @var \OpenAPIServer\Model\OuterEnum $outerEnum */ private $outerEnum; - } diff --git a/samples/server/petstore/php-slim/lib/Model/File.php b/samples/server/petstore/php-slim/lib/Model/File.php index 8ad71447f84..18f242d8c21 100644 --- a/samples/server/petstore/php-slim/lib/Model/File.php +++ b/samples/server/petstore/php-slim/lib/Model/File.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * File */ -class File { - +class File +{ + /** @var string $sourceURI Test capitalization*/ private $sourceURI; - } diff --git a/samples/server/petstore/php-slim/lib/Model/FileSchemaTestClass.php b/samples/server/petstore/php-slim/lib/Model/FileSchemaTestClass.php index fccee8b9535..972d7a3efce 100644 --- a/samples/server/petstore/php-slim/lib/Model/FileSchemaTestClass.php +++ b/samples/server/petstore/php-slim/lib/Model/FileSchemaTestClass.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * FileSchemaTestClass */ -class FileSchemaTestClass { - +class FileSchemaTestClass +{ + /** @var \OpenAPIServer\Model\File $file */ private $file; - + /** @var \OpenAPIServer\Model\File[] $files */ private $files; - } diff --git a/samples/server/petstore/php-slim/lib/Model/FormatTest.php b/samples/server/petstore/php-slim/lib/Model/FormatTest.php index c04cc766ab0..878781c9d47 100644 --- a/samples/server/petstore/php-slim/lib/Model/FormatTest.php +++ b/samples/server/petstore/php-slim/lib/Model/FormatTest.php @@ -7,45 +7,45 @@ namespace OpenAPIServer\Model; /** * FormatTest */ -class FormatTest { - +class FormatTest +{ + /** @var int $integer */ private $integer; - + /** @var int $int32 */ private $int32; - + /** @var int $int64 */ private $int64; - + /** @var float $number */ private $number; - + /** @var float $float */ private $float; - + /** @var double $double */ private $double; - + /** @var string $string */ private $string; - + /** @var string $byte */ private $byte; - + /** @var \SplFileObject $binary */ private $binary; - + /** @var \DateTime $date */ private $date; - + /** @var \DateTime $dateTime */ private $dateTime; - + /** @var string $uuid */ private $uuid; - + /** @var string $password */ private $password; - } diff --git a/samples/server/petstore/php-slim/lib/Model/HasOnlyReadOnly.php b/samples/server/petstore/php-slim/lib/Model/HasOnlyReadOnly.php index de4638ac296..8403b534080 100644 --- a/samples/server/petstore/php-slim/lib/Model/HasOnlyReadOnly.php +++ b/samples/server/petstore/php-slim/lib/Model/HasOnlyReadOnly.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * HasOnlyReadOnly */ -class HasOnlyReadOnly { - +class HasOnlyReadOnly +{ + /** @var string $bar */ private $bar; - + /** @var string $foo */ private $foo; - } diff --git a/samples/server/petstore/php-slim/lib/Model/MapTest.php b/samples/server/petstore/php-slim/lib/Model/MapTest.php index 58415e379ef..4adc9d60f8c 100644 --- a/samples/server/petstore/php-slim/lib/Model/MapTest.php +++ b/samples/server/petstore/php-slim/lib/Model/MapTest.php @@ -7,18 +7,18 @@ namespace OpenAPIServer\Model; /** * MapTest */ -class MapTest { - +class MapTest +{ + /** @var map[string,map[string,string]] $mapMapOfString */ private $mapMapOfString; - + /** @var map[string,string] $mapOfEnumString */ private $mapOfEnumString; - + /** @var map[string,bool] $directMap */ private $directMap; - + /** @var \OpenAPIServer\Model\StringBooleanMap $indirectMap */ private $indirectMap; - } diff --git a/samples/server/petstore/php-slim/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php b/samples/server/petstore/php-slim/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php index 077a355cc1e..43fb0171408 100644 --- a/samples/server/petstore/php-slim/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php +++ b/samples/server/petstore/php-slim/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * MixedPropertiesAndAdditionalPropertiesClass */ -class MixedPropertiesAndAdditionalPropertiesClass { - +class MixedPropertiesAndAdditionalPropertiesClass +{ + /** @var string $uuid */ private $uuid; - + /** @var \DateTime $dateTime */ private $dateTime; - + /** @var map[string,\OpenAPIServer\Model\Animal] $map */ private $map; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Model200Response.php b/samples/server/petstore/php-slim/lib/Model/Model200Response.php index 404ceaad1b7..8782c6a0f71 100644 --- a/samples/server/petstore/php-slim/lib/Model/Model200Response.php +++ b/samples/server/petstore/php-slim/lib/Model/Model200Response.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * Model200Response */ -class Model200Response { - +class Model200Response +{ + /** @var int $name */ private $name; - + /** @var string $class */ private $class; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ModelList.php b/samples/server/petstore/php-slim/lib/Model/ModelList.php index 8e668357a19..943c0d69a19 100644 --- a/samples/server/petstore/php-slim/lib/Model/ModelList.php +++ b/samples/server/petstore/php-slim/lib/Model/ModelList.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ModelList */ -class ModelList { - +class ModelList +{ + /** @var string $_123list */ private $_123list; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ModelReturn.php b/samples/server/petstore/php-slim/lib/Model/ModelReturn.php index 5373aa2e7b1..fdc6cbcf7a5 100644 --- a/samples/server/petstore/php-slim/lib/Model/ModelReturn.php +++ b/samples/server/petstore/php-slim/lib/Model/ModelReturn.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * ModelReturn */ -class ModelReturn { - +class ModelReturn +{ + /** @var int $return */ private $return; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Name.php b/samples/server/petstore/php-slim/lib/Model/Name.php index 162aa21ebe6..bcf2a71da77 100644 --- a/samples/server/petstore/php-slim/lib/Model/Name.php +++ b/samples/server/petstore/php-slim/lib/Model/Name.php @@ -7,18 +7,18 @@ namespace OpenAPIServer\Model; /** * Name */ -class Name { - +class Name +{ + /** @var int $name */ private $name; - + /** @var int $snakeCase */ private $snakeCase; - + /** @var string $property */ private $property; - + /** @var int $_123number */ private $_123number; - } diff --git a/samples/server/petstore/php-slim/lib/Model/NumberOnly.php b/samples/server/petstore/php-slim/lib/Model/NumberOnly.php index c725eb39fdb..64d9350fc8b 100644 --- a/samples/server/petstore/php-slim/lib/Model/NumberOnly.php +++ b/samples/server/petstore/php-slim/lib/Model/NumberOnly.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * NumberOnly */ -class NumberOnly { - +class NumberOnly +{ + /** @var float $justNumber */ private $justNumber; - } diff --git a/samples/server/petstore/php-slim/lib/Model/Order.php b/samples/server/petstore/php-slim/lib/Model/Order.php index 7295a384c8d..16da9270609 100644 --- a/samples/server/petstore/php-slim/lib/Model/Order.php +++ b/samples/server/petstore/php-slim/lib/Model/Order.php @@ -7,24 +7,24 @@ namespace OpenAPIServer\Model; /** * Order */ -class Order { - +class Order +{ + /** @var int $id */ private $id; - + /** @var int $petId */ private $petId; - + /** @var int $quantity */ private $quantity; - + /** @var \DateTime $shipDate */ private $shipDate; - + /** @var string $status Order Status*/ private $status; - + /** @var bool $complete */ private $complete; - } diff --git a/samples/server/petstore/php-slim/lib/Model/OuterComposite.php b/samples/server/petstore/php-slim/lib/Model/OuterComposite.php index 522683f125a..5521b8aec10 100644 --- a/samples/server/petstore/php-slim/lib/Model/OuterComposite.php +++ b/samples/server/petstore/php-slim/lib/Model/OuterComposite.php @@ -7,15 +7,15 @@ namespace OpenAPIServer\Model; /** * OuterComposite */ -class OuterComposite { - +class OuterComposite +{ + /** @var float $myNumber */ private $myNumber; - + /** @var string $myString */ private $myString; - + /** @var bool $myBoolean */ private $myBoolean; - } diff --git a/samples/server/petstore/php-slim/lib/Model/OuterEnum.php b/samples/server/petstore/php-slim/lib/Model/OuterEnum.php index bd529aca5ee..793e29314aa 100644 --- a/samples/server/petstore/php-slim/lib/Model/OuterEnum.php +++ b/samples/server/petstore/php-slim/lib/Model/OuterEnum.php @@ -7,6 +7,6 @@ namespace OpenAPIServer\Model; /** * OuterEnum */ -class OuterEnum { - +class OuterEnum +{ } diff --git a/samples/server/petstore/php-slim/lib/Model/Pet.php b/samples/server/petstore/php-slim/lib/Model/Pet.php index 6699506e33a..a082a16bb03 100644 --- a/samples/server/petstore/php-slim/lib/Model/Pet.php +++ b/samples/server/petstore/php-slim/lib/Model/Pet.php @@ -7,24 +7,24 @@ namespace OpenAPIServer\Model; /** * Pet */ -class Pet { - +class Pet +{ + /** @var int $id */ private $id; - + /** @var \OpenAPIServer\Model\Category $category */ private $category; - + /** @var string $name */ private $name; - + /** @var string[] $photoUrls */ private $photoUrls; - + /** @var \OpenAPIServer\Model\Tag[] $tags */ private $tags; - + /** @var string $status pet status in the store*/ private $status; - } diff --git a/samples/server/petstore/php-slim/lib/Model/ReadOnlyFirst.php b/samples/server/petstore/php-slim/lib/Model/ReadOnlyFirst.php index 17ae0f6c987..c20d8105c21 100644 --- a/samples/server/petstore/php-slim/lib/Model/ReadOnlyFirst.php +++ b/samples/server/petstore/php-slim/lib/Model/ReadOnlyFirst.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * ReadOnlyFirst */ -class ReadOnlyFirst { - +class ReadOnlyFirst +{ + /** @var string $bar */ private $bar; - + /** @var string $baz */ private $baz; - } diff --git a/samples/server/petstore/php-slim/lib/Model/SpecialModelName.php b/samples/server/petstore/php-slim/lib/Model/SpecialModelName.php index dd1d71ff4b1..1ad7651e54d 100644 --- a/samples/server/petstore/php-slim/lib/Model/SpecialModelName.php +++ b/samples/server/petstore/php-slim/lib/Model/SpecialModelName.php @@ -7,9 +7,9 @@ namespace OpenAPIServer\Model; /** * SpecialModelName */ -class SpecialModelName { - +class SpecialModelName +{ + /** @var int $specialPropertyName */ private $specialPropertyName; - } diff --git a/samples/server/petstore/php-slim/lib/Model/StringBooleanMap.php b/samples/server/petstore/php-slim/lib/Model/StringBooleanMap.php index 1164e1d7070..5d501968961 100644 --- a/samples/server/petstore/php-slim/lib/Model/StringBooleanMap.php +++ b/samples/server/petstore/php-slim/lib/Model/StringBooleanMap.php @@ -7,6 +7,6 @@ namespace OpenAPIServer\Model; /** * StringBooleanMap */ -class StringBooleanMap { - +class StringBooleanMap +{ } diff --git a/samples/server/petstore/php-slim/lib/Model/Tag.php b/samples/server/petstore/php-slim/lib/Model/Tag.php index d4ff6fad5d5..861b2f85034 100644 --- a/samples/server/petstore/php-slim/lib/Model/Tag.php +++ b/samples/server/petstore/php-slim/lib/Model/Tag.php @@ -7,12 +7,12 @@ namespace OpenAPIServer\Model; /** * Tag */ -class Tag { - +class Tag +{ + /** @var int $id */ private $id; - + /** @var string $name */ private $name; - } diff --git a/samples/server/petstore/php-slim/lib/Model/User.php b/samples/server/petstore/php-slim/lib/Model/User.php index c68813e5a54..1696c85a0bd 100644 --- a/samples/server/petstore/php-slim/lib/Model/User.php +++ b/samples/server/petstore/php-slim/lib/Model/User.php @@ -7,30 +7,30 @@ namespace OpenAPIServer\Model; /** * User */ -class User { - +class User +{ + /** @var int $id */ private $id; - + /** @var string $username */ private $username; - + /** @var string $firstName */ private $firstName; - + /** @var string $lastName */ private $lastName; - + /** @var string $email */ private $email; - + /** @var string $password */ private $password; - + /** @var string $phone */ private $phone; - + /** @var int $userStatus User Status*/ private $userStatus; - } diff --git a/samples/server/petstore/php-slim/lib/SlimRouter.php b/samples/server/petstore/php-slim/lib/SlimRouter.php index 296e2964d86..ba105c70599 100644 --- a/samples/server/petstore/php-slim/lib/SlimRouter.php +++ b/samples/server/petstore/php-slim/lib/SlimRouter.php @@ -10,7 +10,7 @@ * @link https://github.com/openapitools/openapi-generator */ -/** +/** * OpenAPI Petstore * * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ @@ -46,7 +46,8 @@ use Tuupola\Middleware\HttpBasicAuthentication; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class SlimRouter { +class SlimRouter +{ /** * @var $slimApp Slim\App instance @@ -59,7 +60,8 @@ class SlimRouter { * @param ContainerInterface|array $container Either a ContainerInterface or an associative array of app settings * @throws InvalidArgumentException when no container is provided that implements ContainerInterface */ - public function __construct($container = []) { + public function __construct($container = []) + { $app = new App($container); $basicAuth = new HttpBasicAuthentication([ @@ -72,108 +74,142 @@ class SlimRouter { ]); $app->PATCH( - '/v2/another-fake/dummy', AnotherFakeApi::class . ':call123TestSpecialTags' + '/v2/another-fake/dummy', + AnotherFakeApi::class . ':call123TestSpecialTags' ); $app->POST( - '/v2/fake/outer/boolean', FakeApi::class . ':fakeOuterBooleanSerialize' + '/v2/fake/outer/boolean', + FakeApi::class . ':fakeOuterBooleanSerialize' ); $app->POST( - '/v2/fake/outer/composite', FakeApi::class . ':fakeOuterCompositeSerialize' + '/v2/fake/outer/composite', + FakeApi::class . ':fakeOuterCompositeSerialize' ); $app->POST( - '/v2/fake/outer/number', FakeApi::class . ':fakeOuterNumberSerialize' + '/v2/fake/outer/number', + FakeApi::class . ':fakeOuterNumberSerialize' ); $app->POST( - '/v2/fake/outer/string', FakeApi::class . ':fakeOuterStringSerialize' + '/v2/fake/outer/string', + FakeApi::class . ':fakeOuterStringSerialize' ); $app->PUT( - '/v2/fake/body-with-file-schema', FakeApi::class . ':testBodyWithFileSchema' + '/v2/fake/body-with-file-schema', + FakeApi::class . ':testBodyWithFileSchema' ); $app->PUT( - '/v2/fake/body-with-query-params', FakeApi::class . ':testBodyWithQueryParams' + '/v2/fake/body-with-query-params', + FakeApi::class . ':testBodyWithQueryParams' ); $app->PATCH( - '/v2/fake', FakeApi::class . ':testClientModel' + '/v2/fake', + FakeApi::class . ':testClientModel' ); $app->POST( - '/v2/fake', FakeApi::class . ':testEndpointParameters' + '/v2/fake', + FakeApi::class . ':testEndpointParameters' )->add( $basicAuth ); $app->GET( - '/v2/fake', FakeApi::class . ':testEnumParameters' + '/v2/fake', + FakeApi::class . ':testEnumParameters' ); $app->POST( - '/v2/fake/inline-additionalProperties', FakeApi::class . ':testInlineAdditionalProperties' + '/v2/fake/inline-additionalProperties', + FakeApi::class . ':testInlineAdditionalProperties' ); $app->GET( - '/v2/fake/jsonFormData', FakeApi::class . ':testJsonFormData' + '/v2/fake/jsonFormData', + FakeApi::class . ':testJsonFormData' ); $app->PATCH( - '/v2/fake_classname_test', FakeClassnameTags123Api::class . ':testClassname' + '/v2/fake_classname_test', + FakeClassnameTags123Api::class . ':testClassname' ); $app->POST( - '/v2/pet', PetApi::class . ':addPet' + '/v2/pet', + PetApi::class . ':addPet' ); $app->GET( - '/v2/pet/findByStatus', PetApi::class . ':findPetsByStatus' + '/v2/pet/findByStatus', + PetApi::class . ':findPetsByStatus' ); $app->GET( - '/v2/pet/findByTags', PetApi::class . ':findPetsByTags' + '/v2/pet/findByTags', + PetApi::class . ':findPetsByTags' ); $app->PUT( - '/v2/pet', PetApi::class . ':updatePet' + '/v2/pet', + PetApi::class . ':updatePet' ); $app->DELETE( - '/v2/pet/{petId}', PetApi::class . ':deletePet' + '/v2/pet/{petId}', + PetApi::class . ':deletePet' ); $app->GET( - '/v2/pet/{petId}', PetApi::class . ':getPetById' + '/v2/pet/{petId}', + PetApi::class . ':getPetById' ); $app->POST( - '/v2/pet/{petId}', PetApi::class . ':updatePetWithForm' + '/v2/pet/{petId}', + PetApi::class . ':updatePetWithForm' ); $app->POST( - '/v2/pet/{petId}/uploadImage', PetApi::class . ':uploadFile' + '/v2/pet/{petId}/uploadImage', + PetApi::class . ':uploadFile' ); $app->POST( - '/v2/fake/{petId}/uploadImageWithRequiredFile', PetApi::class . ':uploadFileWithRequiredFile' + '/v2/fake/{petId}/uploadImageWithRequiredFile', + PetApi::class . ':uploadFileWithRequiredFile' ); $app->GET( - '/v2/store/inventory', StoreApi::class . ':getInventory' + '/v2/store/inventory', + StoreApi::class . ':getInventory' ); $app->POST( - '/v2/store/order', StoreApi::class . ':placeOrder' + '/v2/store/order', + StoreApi::class . ':placeOrder' ); $app->DELETE( - '/v2/store/order/{order_id}', StoreApi::class . ':deleteOrder' + '/v2/store/order/{order_id}', + StoreApi::class . ':deleteOrder' ); $app->GET( - '/v2/store/order/{order_id}', StoreApi::class . ':getOrderById' + '/v2/store/order/{order_id}', + StoreApi::class . ':getOrderById' ); $app->POST( - '/v2/user', UserApi::class . ':createUser' + '/v2/user', + UserApi::class . ':createUser' ); $app->POST( - '/v2/user/createWithArray', UserApi::class . ':createUsersWithArrayInput' + '/v2/user/createWithArray', + UserApi::class . ':createUsersWithArrayInput' ); $app->POST( - '/v2/user/createWithList', UserApi::class . ':createUsersWithListInput' + '/v2/user/createWithList', + UserApi::class . ':createUsersWithListInput' ); $app->GET( - '/v2/user/login', UserApi::class . ':loginUser' + '/v2/user/login', + UserApi::class . ':loginUser' ); $app->GET( - '/v2/user/logout', UserApi::class . ':logoutUser' + '/v2/user/logout', + UserApi::class . ':logoutUser' ); $app->DELETE( - '/v2/user/{username}', UserApi::class . ':deleteUser' + '/v2/user/{username}', + UserApi::class . ':deleteUser' ); $app->GET( - '/v2/user/{username}', UserApi::class . ':getUserByName' + '/v2/user/{username}', + UserApi::class . ':getUserByName' ); $app->PUT( - '/v2/user/{username}', UserApi::class . ':updateUser' + '/v2/user/{username}', + UserApi::class . ':updateUser' ); $this->slimApp = $app; @@ -183,7 +219,8 @@ class SlimRouter { * Returns Slim Framework instance * @return App */ - public function getSlimApp() { + public function getSlimApp() + { return $this->slimApp; } } diff --git a/samples/server/petstore/php-slim/test/Api/AnotherFakeApiTest.php b/samples/server/petstore/php-slim/test/Api/AnotherFakeApiTest.php index 06cd6fe39c2..fc78f599d52 100644 --- a/samples/server/petstore/php-slim/test/Api/AnotherFakeApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/AnotherFakeApiTest.php @@ -36,43 +36,44 @@ use OpenAPIServer\Api\AnotherFakeApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\AnotherFakeApi */ -class AnotherFakeApiTest extends \PHPUnit_Framework_TestCase { +class AnotherFakeApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** - * Test case for testSpecialTags + * Test case for call123TestSpecialTags * * To test special tags. - * @covers ::testSpecialTags + * @covers ::call123TestSpecialTags */ - public function testTestSpecialTags() { - + public function testCall123TestSpecialTags() + { } } diff --git a/samples/server/petstore/php-slim/test/Api/FakeApiTest.php b/samples/server/petstore/php-slim/test/Api/FakeApiTest.php index f020953e05b..c5f07d79f4c 100644 --- a/samples/server/petstore/php-slim/test/Api/FakeApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/FakeApiTest.php @@ -36,34 +36,35 @@ use OpenAPIServer\Api\FakeApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\FakeApi */ -class FakeApiTest extends \PHPUnit_Framework_TestCase { +class FakeApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -72,8 +73,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::fakeOuterBooleanSerialize */ - public function testFakeOuterBooleanSerialize() { - + public function testFakeOuterBooleanSerialize() + { } /** @@ -82,8 +83,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::fakeOuterCompositeSerialize */ - public function testFakeOuterCompositeSerialize() { - + public function testFakeOuterCompositeSerialize() + { } /** @@ -92,8 +93,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::fakeOuterNumberSerialize */ - public function testFakeOuterNumberSerialize() { - + public function testFakeOuterNumberSerialize() + { } /** @@ -102,8 +103,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::fakeOuterStringSerialize */ - public function testFakeOuterStringSerialize() { - + public function testFakeOuterStringSerialize() + { } /** @@ -112,8 +113,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::testBodyWithFileSchema */ - public function testTestBodyWithFileSchema() { - + public function testTestBodyWithFileSchema() + { } /** @@ -122,8 +123,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * . * @covers ::testBodyWithQueryParams */ - public function testTestBodyWithQueryParams() { - + public function testTestBodyWithQueryParams() + { } /** @@ -132,8 +133,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * To test \"client\" model. * @covers ::testClientModel */ - public function testTestClientModel() { - + public function testTestClientModel() + { } /** @@ -142,8 +143,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트. * @covers ::testEndpointParameters */ - public function testTestEndpointParameters() { - + public function testTestEndpointParameters() + { } /** @@ -152,8 +153,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * To test enum parameters. * @covers ::testEnumParameters */ - public function testTestEnumParameters() { - + public function testTestEnumParameters() + { } /** @@ -162,8 +163,8 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * test inline additionalProperties. * @covers ::testInlineAdditionalProperties */ - public function testTestInlineAdditionalProperties() { - + public function testTestInlineAdditionalProperties() + { } /** @@ -172,7 +173,7 @@ class FakeApiTest extends \PHPUnit_Framework_TestCase { * test json serialization of form data. * @covers ::testJsonFormData */ - public function testTestJsonFormData() { - + public function testTestJsonFormData() + { } } diff --git a/samples/server/petstore/php-slim/test/Api/FakeClassnameTags123ApiTest.php b/samples/server/petstore/php-slim/test/Api/FakeClassnameTags123ApiTest.php index de4105136e1..e06689f4289 100644 --- a/samples/server/petstore/php-slim/test/Api/FakeClassnameTags123ApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/FakeClassnameTags123ApiTest.php @@ -36,34 +36,35 @@ use OpenAPIServer\Api\FakeClassnameTags123Api; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\FakeClassnameTags123Api */ -class FakeClassnameTags123ApiTest extends \PHPUnit_Framework_TestCase { +class FakeClassnameTags123ApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -72,7 +73,7 @@ class FakeClassnameTags123ApiTest extends \PHPUnit_Framework_TestCase { * To test class name in snake case. * @covers ::testClassname */ - public function testTestClassname() { - + public function testTestClassname() + { } } diff --git a/samples/server/petstore/php-slim/test/Api/PetApiTest.php b/samples/server/petstore/php-slim/test/Api/PetApiTest.php index 3e5f9eec211..9959ad609dd 100644 --- a/samples/server/petstore/php-slim/test/Api/PetApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/PetApiTest.php @@ -36,34 +36,35 @@ use OpenAPIServer\Api\PetApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\PetApi */ -class PetApiTest extends \PHPUnit_Framework_TestCase { +class PetApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -72,8 +73,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Add a new pet to the store. * @covers ::addPet */ - public function testAddPet() { - + public function testAddPet() + { } /** @@ -82,8 +83,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Deletes a pet. * @covers ::deletePet */ - public function testDeletePet() { - + public function testDeletePet() + { } /** @@ -92,8 +93,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Finds Pets by status. * @covers ::findPetsByStatus */ - public function testFindPetsByStatus() { - + public function testFindPetsByStatus() + { } /** @@ -102,8 +103,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Finds Pets by tags. * @covers ::findPetsByTags */ - public function testFindPetsByTags() { - + public function testFindPetsByTags() + { } /** @@ -112,8 +113,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Find pet by ID. * @covers ::getPetById */ - public function testGetPetById() { - + public function testGetPetById() + { } /** @@ -122,8 +123,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Update an existing pet. * @covers ::updatePet */ - public function testUpdatePet() { - + public function testUpdatePet() + { } /** @@ -132,8 +133,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * Updates a pet in the store with form data. * @covers ::updatePetWithForm */ - public function testUpdatePetWithForm() { - + public function testUpdatePetWithForm() + { } /** @@ -142,8 +143,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * uploads an image. * @covers ::uploadFile */ - public function testUploadFile() { - + public function testUploadFile() + { } /** @@ -152,7 +153,7 @@ class PetApiTest extends \PHPUnit_Framework_TestCase { * uploads an image (required). * @covers ::uploadFileWithRequiredFile */ - public function testUploadFileWithRequiredFile() { - + public function testUploadFileWithRequiredFile() + { } } diff --git a/samples/server/petstore/php-slim/test/Api/StoreApiTest.php b/samples/server/petstore/php-slim/test/Api/StoreApiTest.php index 220bb260c70..f7c02fa1ba0 100644 --- a/samples/server/petstore/php-slim/test/Api/StoreApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/StoreApiTest.php @@ -36,34 +36,35 @@ use OpenAPIServer\Api\StoreApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\StoreApi */ -class StoreApiTest extends \PHPUnit_Framework_TestCase { +class StoreApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -72,8 +73,8 @@ class StoreApiTest extends \PHPUnit_Framework_TestCase { * Delete purchase order by ID. * @covers ::deleteOrder */ - public function testDeleteOrder() { - + public function testDeleteOrder() + { } /** @@ -82,8 +83,8 @@ class StoreApiTest extends \PHPUnit_Framework_TestCase { * Returns pet inventories by status. * @covers ::getInventory */ - public function testGetInventory() { - + public function testGetInventory() + { } /** @@ -92,8 +93,8 @@ class StoreApiTest extends \PHPUnit_Framework_TestCase { * Find purchase order by ID. * @covers ::getOrderById */ - public function testGetOrderById() { - + public function testGetOrderById() + { } /** @@ -102,7 +103,7 @@ class StoreApiTest extends \PHPUnit_Framework_TestCase { * Place an order for a pet. * @covers ::placeOrder */ - public function testPlaceOrder() { - + public function testPlaceOrder() + { } } diff --git a/samples/server/petstore/php-slim/test/Api/UserApiTest.php b/samples/server/petstore/php-slim/test/Api/UserApiTest.php index d4eb4382f22..519c10cd083 100644 --- a/samples/server/petstore/php-slim/test/Api/UserApiTest.php +++ b/samples/server/petstore/php-slim/test/Api/UserApiTest.php @@ -36,34 +36,35 @@ use OpenAPIServer\Api\UserApi; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\UserApi */ -class UserApiTest extends \PHPUnit_Framework_TestCase { +class UserApiTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** @@ -72,8 +73,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Create user. * @covers ::createUser */ - public function testCreateUser() { - + public function testCreateUser() + { } /** @@ -82,8 +83,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Creates list of users with given input array. * @covers ::createUsersWithArrayInput */ - public function testCreateUsersWithArrayInput() { - + public function testCreateUsersWithArrayInput() + { } /** @@ -92,8 +93,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Creates list of users with given input array. * @covers ::createUsersWithListInput */ - public function testCreateUsersWithListInput() { - + public function testCreateUsersWithListInput() + { } /** @@ -102,8 +103,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Delete user. * @covers ::deleteUser */ - public function testDeleteUser() { - + public function testDeleteUser() + { } /** @@ -112,8 +113,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Get user by user name. * @covers ::getUserByName */ - public function testGetUserByName() { - + public function testGetUserByName() + { } /** @@ -122,8 +123,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Logs user into the system. * @covers ::loginUser */ - public function testLoginUser() { - + public function testLoginUser() + { } /** @@ -132,8 +133,8 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Logs out current logged in user session. * @covers ::logoutUser */ - public function testLogoutUser() { - + public function testLogoutUser() + { } /** @@ -142,7 +143,7 @@ class UserApiTest extends \PHPUnit_Framework_TestCase { * Updated user. * @covers ::updateUser */ - public function testUpdateUser() { - + public function testUpdateUser() + { } } diff --git a/samples/server/petstore/php-slim/test/Model/AdditionalPropertiesClassTest.php b/samples/server/petstore/php-slim/test/Model/AdditionalPropertiesClassTest.php index 0dc870c25f1..14d94718ead 100644 --- a/samples/server/petstore/php-slim/test/Model/AdditionalPropertiesClassTest.php +++ b/samples/server/petstore/php-slim/test/Model/AdditionalPropertiesClassTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\AdditionalPropertiesClass; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\AdditionalPropertiesClass */ -class AdditionalPropertiesClassTest extends \PHPUnit_Framework_TestCase { +class AdditionalPropertiesClassTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "AdditionalPropertiesClass" */ - public function testAdditionalPropertiesClass() { + public function testAdditionalPropertiesClass() + { $testAdditionalPropertiesClass = new AdditionalPropertiesClass(); } /** * Test attribute "mapProperty" */ - public function testPropertyMapProperty() { - + public function testPropertyMapProperty() + { } /** * Test attribute "mapOfMapProperty" */ - public function testPropertyMapOfMapProperty() { - + public function testPropertyMapOfMapProperty() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/AnimalFarmTest.php b/samples/server/petstore/php-slim/test/Model/AnimalFarmTest.php index b10de6ebe5c..93e748a8c6e 100644 --- a/samples/server/petstore/php-slim/test/Model/AnimalFarmTest.php +++ b/samples/server/petstore/php-slim/test/Model/AnimalFarmTest.php @@ -36,41 +36,42 @@ use OpenAPIServer\Model\AnimalFarm; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\AnimalFarm */ -class AnimalFarmTest extends \PHPUnit_Framework_TestCase { +class AnimalFarmTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "AnimalFarm" */ - public function testAnimalFarm() { + public function testAnimalFarm() + { $testAnimalFarm = new AnimalFarm(); } } - diff --git a/samples/server/petstore/php-slim/test/Model/AnimalTest.php b/samples/server/petstore/php-slim/test/Model/AnimalTest.php index e2e9955cb78..bd6e2f4b976 100644 --- a/samples/server/petstore/php-slim/test/Model/AnimalTest.php +++ b/samples/server/petstore/php-slim/test/Model/AnimalTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\Animal; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Animal */ -class AnimalTest extends \PHPUnit_Framework_TestCase { +class AnimalTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Animal" */ - public function testAnimal() { + public function testAnimal() + { $testAnimal = new Animal(); } /** * Test attribute "className" */ - public function testPropertyClassName() { - + public function testPropertyClassName() + { } /** * Test attribute "color" */ - public function testPropertyColor() { - + public function testPropertyColor() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ApiResponseTest.php b/samples/server/petstore/php-slim/test/Model/ApiResponseTest.php index de1e64136b8..ac3378cc3bd 100644 --- a/samples/server/petstore/php-slim/test/Model/ApiResponseTest.php +++ b/samples/server/petstore/php-slim/test/Model/ApiResponseTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\ApiResponse; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ApiResponse */ -class ApiResponseTest extends \PHPUnit_Framework_TestCase { +class ApiResponseTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ApiResponse" */ - public function testApiResponse() { + public function testApiResponse() + { $testApiResponse = new ApiResponse(); } /** * Test attribute "code" */ - public function testPropertyCode() { - + public function testPropertyCode() + { } /** * Test attribute "type" */ - public function testPropertyType() { - + public function testPropertyType() + { } /** * Test attribute "message" */ - public function testPropertyMessage() { - + public function testPropertyMessage() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ArrayOfArrayOfNumberOnlyTest.php b/samples/server/petstore/php-slim/test/Model/ArrayOfArrayOfNumberOnlyTest.php index e0e2bded85e..bbc5077b1ca 100644 --- a/samples/server/petstore/php-slim/test/Model/ArrayOfArrayOfNumberOnlyTest.php +++ b/samples/server/petstore/php-slim/test/Model/ArrayOfArrayOfNumberOnlyTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\ArrayOfArrayOfNumberOnly; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ArrayOfArrayOfNumberOnly */ -class ArrayOfArrayOfNumberOnlyTest extends \PHPUnit_Framework_TestCase { +class ArrayOfArrayOfNumberOnlyTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ArrayOfArrayOfNumberOnly" */ - public function testArrayOfArrayOfNumberOnly() { + public function testArrayOfArrayOfNumberOnly() + { $testArrayOfArrayOfNumberOnly = new ArrayOfArrayOfNumberOnly(); } /** * Test attribute "arrayArrayNumber" */ - public function testPropertyArrayArrayNumber() { - + public function testPropertyArrayArrayNumber() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ArrayOfNumberOnlyTest.php b/samples/server/petstore/php-slim/test/Model/ArrayOfNumberOnlyTest.php index 4e6b319009a..ce575e4b926 100644 --- a/samples/server/petstore/php-slim/test/Model/ArrayOfNumberOnlyTest.php +++ b/samples/server/petstore/php-slim/test/Model/ArrayOfNumberOnlyTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\ArrayOfNumberOnly; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ArrayOfNumberOnly */ -class ArrayOfNumberOnlyTest extends \PHPUnit_Framework_TestCase { +class ArrayOfNumberOnlyTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ArrayOfNumberOnly" */ - public function testArrayOfNumberOnly() { + public function testArrayOfNumberOnly() + { $testArrayOfNumberOnly = new ArrayOfNumberOnly(); } /** * Test attribute "arrayNumber" */ - public function testPropertyArrayNumber() { - + public function testPropertyArrayNumber() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ArrayTestTest.php b/samples/server/petstore/php-slim/test/Model/ArrayTestTest.php index b3def0a71b4..236b83b3a85 100644 --- a/samples/server/petstore/php-slim/test/Model/ArrayTestTest.php +++ b/samples/server/petstore/php-slim/test/Model/ArrayTestTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\ArrayTest; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ArrayTest */ -class ArrayTestTest extends \PHPUnit_Framework_TestCase { +class ArrayTestTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ArrayTest" */ - public function testArrayTest() { + public function testArrayTest() + { $testArrayTest = new ArrayTest(); } /** * Test attribute "arrayOfString" */ - public function testPropertyArrayOfString() { - + public function testPropertyArrayOfString() + { } /** * Test attribute "arrayArrayOfInteger" */ - public function testPropertyArrayArrayOfInteger() { - + public function testPropertyArrayArrayOfInteger() + { } /** * Test attribute "arrayArrayOfModel" */ - public function testPropertyArrayArrayOfModel() { - + public function testPropertyArrayArrayOfModel() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/CapitalizationTest.php b/samples/server/petstore/php-slim/test/Model/CapitalizationTest.php index 5e13387834c..bbd0bf6a827 100644 --- a/samples/server/petstore/php-slim/test/Model/CapitalizationTest.php +++ b/samples/server/petstore/php-slim/test/Model/CapitalizationTest.php @@ -36,83 +36,84 @@ use OpenAPIServer\Model\Capitalization; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Capitalization */ -class CapitalizationTest extends \PHPUnit_Framework_TestCase { +class CapitalizationTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Capitalization" */ - public function testCapitalization() { + public function testCapitalization() + { $testCapitalization = new Capitalization(); } /** * Test attribute "smallCamel" */ - public function testPropertySmallCamel() { - + public function testPropertySmallCamel() + { } /** * Test attribute "capitalCamel" */ - public function testPropertyCapitalCamel() { - + public function testPropertyCapitalCamel() + { } /** * Test attribute "smallSnake" */ - public function testPropertySmallSnake() { - + public function testPropertySmallSnake() + { } /** * Test attribute "capitalSnake" */ - public function testPropertyCapitalSnake() { - + public function testPropertyCapitalSnake() + { } /** * Test attribute "sCAETHFlowPoints" */ - public function testPropertySCAETHFlowPoints() { - + public function testPropertySCAETHFlowPoints() + { } /** * Test attribute "aTTNAME" */ - public function testPropertyATTNAME() { - + public function testPropertyATTNAME() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/CatTest.php b/samples/server/petstore/php-slim/test/Model/CatTest.php index 13a542dd77e..b534aecf025 100644 --- a/samples/server/petstore/php-slim/test/Model/CatTest.php +++ b/samples/server/petstore/php-slim/test/Model/CatTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\Cat; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Cat */ -class CatTest extends \PHPUnit_Framework_TestCase { +class CatTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Cat" */ - public function testCat() { + public function testCat() + { $testCat = new Cat(); } /** * Test attribute "className" */ - public function testPropertyClassName() { - + public function testPropertyClassName() + { } /** * Test attribute "color" */ - public function testPropertyColor() { - + public function testPropertyColor() + { } /** * Test attribute "declawed" */ - public function testPropertyDeclawed() { - + public function testPropertyDeclawed() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/CategoryTest.php b/samples/server/petstore/php-slim/test/Model/CategoryTest.php index ade7b72a959..0fb02647384 100644 --- a/samples/server/petstore/php-slim/test/Model/CategoryTest.php +++ b/samples/server/petstore/php-slim/test/Model/CategoryTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\Category; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Category */ -class CategoryTest extends \PHPUnit_Framework_TestCase { +class CategoryTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Category" */ - public function testCategory() { + public function testCategory() + { $testCategory = new Category(); } /** * Test attribute "id" */ - public function testPropertyId() { - + public function testPropertyId() + { } /** * Test attribute "name" */ - public function testPropertyName() { - + public function testPropertyName() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ClassModelTest.php b/samples/server/petstore/php-slim/test/Model/ClassModelTest.php index efcbec71f63..74a06642eb4 100644 --- a/samples/server/petstore/php-slim/test/Model/ClassModelTest.php +++ b/samples/server/petstore/php-slim/test/Model/ClassModelTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\ClassModel; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ClassModel */ -class ClassModelTest extends \PHPUnit_Framework_TestCase { +class ClassModelTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ClassModel" */ - public function testClassModel() { + public function testClassModel() + { $testClassModel = new ClassModel(); } /** * Test attribute "class" */ - public function testPropertyClass() { - + public function testPropertyClass() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ClientTest.php b/samples/server/petstore/php-slim/test/Model/ClientTest.php index c1eba0c3621..56c29cc683f 100644 --- a/samples/server/petstore/php-slim/test/Model/ClientTest.php +++ b/samples/server/petstore/php-slim/test/Model/ClientTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\Client; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Client */ -class ClientTest extends \PHPUnit_Framework_TestCase { +class ClientTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Client" */ - public function testClient() { + public function testClient() + { $testClient = new Client(); } /** * Test attribute "client" */ - public function testPropertyClient() { - + public function testPropertyClient() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/DogTest.php b/samples/server/petstore/php-slim/test/Model/DogTest.php index 0a240c78c3a..93654a68641 100644 --- a/samples/server/petstore/php-slim/test/Model/DogTest.php +++ b/samples/server/petstore/php-slim/test/Model/DogTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\Dog; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Dog */ -class DogTest extends \PHPUnit_Framework_TestCase { +class DogTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Dog" */ - public function testDog() { + public function testDog() + { $testDog = new Dog(); } /** * Test attribute "className" */ - public function testPropertyClassName() { - + public function testPropertyClassName() + { } /** * Test attribute "color" */ - public function testPropertyColor() { - + public function testPropertyColor() + { } /** * Test attribute "breed" */ - public function testPropertyBreed() { - + public function testPropertyBreed() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/EnumArraysTest.php b/samples/server/petstore/php-slim/test/Model/EnumArraysTest.php index 9d11e5cdaca..467139153a2 100644 --- a/samples/server/petstore/php-slim/test/Model/EnumArraysTest.php +++ b/samples/server/petstore/php-slim/test/Model/EnumArraysTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\EnumArrays; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\EnumArrays */ -class EnumArraysTest extends \PHPUnit_Framework_TestCase { +class EnumArraysTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "EnumArrays" */ - public function testEnumArrays() { + public function testEnumArrays() + { $testEnumArrays = new EnumArrays(); } /** * Test attribute "justSymbol" */ - public function testPropertyJustSymbol() { - + public function testPropertyJustSymbol() + { } /** * Test attribute "arrayEnum" */ - public function testPropertyArrayEnum() { - + public function testPropertyArrayEnum() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/EnumClassTest.php b/samples/server/petstore/php-slim/test/Model/EnumClassTest.php index 95ed9693c71..95784e82aed 100644 --- a/samples/server/petstore/php-slim/test/Model/EnumClassTest.php +++ b/samples/server/petstore/php-slim/test/Model/EnumClassTest.php @@ -36,41 +36,42 @@ use OpenAPIServer\Model\EnumClass; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\EnumClass */ -class EnumClassTest extends \PHPUnit_Framework_TestCase { +class EnumClassTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "EnumClass" */ - public function testEnumClass() { + public function testEnumClass() + { $testEnumClass = new EnumClass(); } } - diff --git a/samples/server/petstore/php-slim/test/Model/EnumTestTest.php b/samples/server/petstore/php-slim/test/Model/EnumTestTest.php index fd95271cb1a..dc8ae643280 100644 --- a/samples/server/petstore/php-slim/test/Model/EnumTestTest.php +++ b/samples/server/petstore/php-slim/test/Model/EnumTestTest.php @@ -36,76 +36,77 @@ use OpenAPIServer\Model\EnumTest; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\EnumTest */ -class EnumTestTest extends \PHPUnit_Framework_TestCase { +class EnumTestTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "EnumTest" */ - public function testEnumTest() { + public function testEnumTest() + { $testEnumTest = new EnumTest(); } /** * Test attribute "enumString" */ - public function testPropertyEnumString() { - + public function testPropertyEnumString() + { } /** * Test attribute "enumStringRequired" */ - public function testPropertyEnumStringRequired() { - + public function testPropertyEnumStringRequired() + { } /** * Test attribute "enumInteger" */ - public function testPropertyEnumInteger() { - + public function testPropertyEnumInteger() + { } /** * Test attribute "enumNumber" */ - public function testPropertyEnumNumber() { - + public function testPropertyEnumNumber() + { } /** * Test attribute "outerEnum" */ - public function testPropertyOuterEnum() { - + public function testPropertyOuterEnum() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/FileSchemaTestClassTest.php b/samples/server/petstore/php-slim/test/Model/FileSchemaTestClassTest.php index 7416c0bd6cf..38bc7db0868 100644 --- a/samples/server/petstore/php-slim/test/Model/FileSchemaTestClassTest.php +++ b/samples/server/petstore/php-slim/test/Model/FileSchemaTestClassTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\FileSchemaTestClass; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\FileSchemaTestClass */ -class FileSchemaTestClassTest extends \PHPUnit_Framework_TestCase { +class FileSchemaTestClassTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "FileSchemaTestClass" */ - public function testFileSchemaTestClass() { + public function testFileSchemaTestClass() + { $testFileSchemaTestClass = new FileSchemaTestClass(); } /** * Test attribute "file" */ - public function testPropertyFile() { - + public function testPropertyFile() + { } /** * Test attribute "files" */ - public function testPropertyFiles() { - + public function testPropertyFiles() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/FileTest.php b/samples/server/petstore/php-slim/test/Model/FileTest.php index 01d6820a80b..57129a8c54c 100644 --- a/samples/server/petstore/php-slim/test/Model/FileTest.php +++ b/samples/server/petstore/php-slim/test/Model/FileTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\File; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\File */ -class FileTest extends \PHPUnit_Framework_TestCase { +class FileTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "File" */ - public function testFile() { + public function testFile() + { $testFile = new File(); } /** * Test attribute "sourceURI" */ - public function testPropertySourceURI() { - + public function testPropertySourceURI() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/FormatTestTest.php b/samples/server/petstore/php-slim/test/Model/FormatTestTest.php index ee6f993c3de..90cb8475b1b 100644 --- a/samples/server/petstore/php-slim/test/Model/FormatTestTest.php +++ b/samples/server/petstore/php-slim/test/Model/FormatTestTest.php @@ -36,132 +36,133 @@ use OpenAPIServer\Model\FormatTest; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\FormatTest */ -class FormatTestTest extends \PHPUnit_Framework_TestCase { +class FormatTestTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "FormatTest" */ - public function testFormatTest() { + public function testFormatTest() + { $testFormatTest = new FormatTest(); } /** * Test attribute "integer" */ - public function testPropertyInteger() { - + public function testPropertyInteger() + { } /** * Test attribute "int32" */ - public function testPropertyInt32() { - + public function testPropertyInt32() + { } /** * Test attribute "int64" */ - public function testPropertyInt64() { - + public function testPropertyInt64() + { } /** * Test attribute "number" */ - public function testPropertyNumber() { - + public function testPropertyNumber() + { } /** * Test attribute "float" */ - public function testPropertyFloat() { - + public function testPropertyFloat() + { } /** * Test attribute "double" */ - public function testPropertyDouble() { - + public function testPropertyDouble() + { } /** * Test attribute "string" */ - public function testPropertyString() { - + public function testPropertyString() + { } /** * Test attribute "byte" */ - public function testPropertyByte() { - + public function testPropertyByte() + { } /** * Test attribute "binary" */ - public function testPropertyBinary() { - + public function testPropertyBinary() + { } /** * Test attribute "date" */ - public function testPropertyDate() { - + public function testPropertyDate() + { } /** * Test attribute "dateTime" */ - public function testPropertyDateTime() { - + public function testPropertyDateTime() + { } /** * Test attribute "uuid" */ - public function testPropertyUuid() { - + public function testPropertyUuid() + { } /** * Test attribute "password" */ - public function testPropertyPassword() { - + public function testPropertyPassword() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/HasOnlyReadOnlyTest.php b/samples/server/petstore/php-slim/test/Model/HasOnlyReadOnlyTest.php index 67b16311563..d886b0c9643 100644 --- a/samples/server/petstore/php-slim/test/Model/HasOnlyReadOnlyTest.php +++ b/samples/server/petstore/php-slim/test/Model/HasOnlyReadOnlyTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\HasOnlyReadOnly; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\HasOnlyReadOnly */ -class HasOnlyReadOnlyTest extends \PHPUnit_Framework_TestCase { +class HasOnlyReadOnlyTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "HasOnlyReadOnly" */ - public function testHasOnlyReadOnly() { + public function testHasOnlyReadOnly() + { $testHasOnlyReadOnly = new HasOnlyReadOnly(); } /** * Test attribute "bar" */ - public function testPropertyBar() { - + public function testPropertyBar() + { } /** * Test attribute "foo" */ - public function testPropertyFoo() { - + public function testPropertyFoo() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/MapTestTest.php b/samples/server/petstore/php-slim/test/Model/MapTestTest.php index 47bbd8a3301..d3c0b8e1361 100644 --- a/samples/server/petstore/php-slim/test/Model/MapTestTest.php +++ b/samples/server/petstore/php-slim/test/Model/MapTestTest.php @@ -36,69 +36,70 @@ use OpenAPIServer\Model\MapTest; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\MapTest */ -class MapTestTest extends \PHPUnit_Framework_TestCase { +class MapTestTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "MapTest" */ - public function testMapTest() { + public function testMapTest() + { $testMapTest = new MapTest(); } /** * Test attribute "mapMapOfString" */ - public function testPropertyMapMapOfString() { - + public function testPropertyMapMapOfString() + { } /** * Test attribute "mapOfEnumString" */ - public function testPropertyMapOfEnumString() { - + public function testPropertyMapOfEnumString() + { } /** * Test attribute "directMap" */ - public function testPropertyDirectMap() { - + public function testPropertyDirectMap() + { } /** * Test attribute "indirectMap" */ - public function testPropertyIndirectMap() { - + public function testPropertyIndirectMap() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php b/samples/server/petstore/php-slim/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php index 7356a017be6..5ee64f596d4 100644 --- a/samples/server/petstore/php-slim/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php +++ b/samples/server/petstore/php-slim/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\MixedPropertiesAndAdditionalPropertiesClass; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\MixedPropertiesAndAdditionalPropertiesClass */ -class MixedPropertiesAndAdditionalPropertiesClassTest extends \PHPUnit_Framework_TestCase { +class MixedPropertiesAndAdditionalPropertiesClassTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "MixedPropertiesAndAdditionalPropertiesClass" */ - public function testMixedPropertiesAndAdditionalPropertiesClass() { + public function testMixedPropertiesAndAdditionalPropertiesClass() + { $testMixedPropertiesAndAdditionalPropertiesClass = new MixedPropertiesAndAdditionalPropertiesClass(); } /** * Test attribute "uuid" */ - public function testPropertyUuid() { - + public function testPropertyUuid() + { } /** * Test attribute "dateTime" */ - public function testPropertyDateTime() { - + public function testPropertyDateTime() + { } /** * Test attribute "map" */ - public function testPropertyMap() { - + public function testPropertyMap() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/Model200ResponseTest.php b/samples/server/petstore/php-slim/test/Model/Model200ResponseTest.php index 01301c810bd..36706cf0c2a 100644 --- a/samples/server/petstore/php-slim/test/Model/Model200ResponseTest.php +++ b/samples/server/petstore/php-slim/test/Model/Model200ResponseTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\Model200Response; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Model200Response */ -class Model200ResponseTest extends \PHPUnit_Framework_TestCase { +class Model200ResponseTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Model200Response" */ - public function testModel200Response() { + public function testModel200Response() + { $testModel200Response = new Model200Response(); } /** * Test attribute "name" */ - public function testPropertyName() { - + public function testPropertyName() + { } /** * Test attribute "class" */ - public function testPropertyClass() { - + public function testPropertyClass() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ModelListTest.php b/samples/server/petstore/php-slim/test/Model/ModelListTest.php index 4f8b1713292..c73f1a80e9e 100644 --- a/samples/server/petstore/php-slim/test/Model/ModelListTest.php +++ b/samples/server/petstore/php-slim/test/Model/ModelListTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\ModelList; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ModelList */ -class ModelListTest extends \PHPUnit_Framework_TestCase { +class ModelListTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ModelList" */ - public function testModelList() { + public function testModelList() + { $testModelList = new ModelList(); } /** * Test attribute "_123list" */ - public function testProperty123list() { - + public function testProperty123list() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ModelReturnTest.php b/samples/server/petstore/php-slim/test/Model/ModelReturnTest.php index d087f796c72..1ba2a4eba69 100644 --- a/samples/server/petstore/php-slim/test/Model/ModelReturnTest.php +++ b/samples/server/petstore/php-slim/test/Model/ModelReturnTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\ModelReturn; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ModelReturn */ -class ModelReturnTest extends \PHPUnit_Framework_TestCase { +class ModelReturnTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ModelReturn" */ - public function testModelReturn() { + public function testModelReturn() + { $testModelReturn = new ModelReturn(); } /** * Test attribute "return" */ - public function testPropertyReturn() { - + public function testPropertyReturn() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/NameTest.php b/samples/server/petstore/php-slim/test/Model/NameTest.php index 8e8104c7a24..70558568c0e 100644 --- a/samples/server/petstore/php-slim/test/Model/NameTest.php +++ b/samples/server/petstore/php-slim/test/Model/NameTest.php @@ -36,69 +36,70 @@ use OpenAPIServer\Model\Name; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Name */ -class NameTest extends \PHPUnit_Framework_TestCase { +class NameTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Name" */ - public function testName() { + public function testName() + { $testName = new Name(); } /** * Test attribute "name" */ - public function testPropertyName() { - + public function testPropertyName() + { } /** * Test attribute "snakeCase" */ - public function testPropertySnakeCase() { - + public function testPropertySnakeCase() + { } /** * Test attribute "property" */ - public function testPropertyProperty() { - + public function testPropertyProperty() + { } /** * Test attribute "_123number" */ - public function testProperty123number() { - + public function testProperty123number() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/NumberOnlyTest.php b/samples/server/petstore/php-slim/test/Model/NumberOnlyTest.php index 68320527de8..38f10551023 100644 --- a/samples/server/petstore/php-slim/test/Model/NumberOnlyTest.php +++ b/samples/server/petstore/php-slim/test/Model/NumberOnlyTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\NumberOnly; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\NumberOnly */ -class NumberOnlyTest extends \PHPUnit_Framework_TestCase { +class NumberOnlyTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "NumberOnly" */ - public function testNumberOnly() { + public function testNumberOnly() + { $testNumberOnly = new NumberOnly(); } /** * Test attribute "justNumber" */ - public function testPropertyJustNumber() { - + public function testPropertyJustNumber() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/OrderTest.php b/samples/server/petstore/php-slim/test/Model/OrderTest.php index 615dd0797bc..7542b27a8c6 100644 --- a/samples/server/petstore/php-slim/test/Model/OrderTest.php +++ b/samples/server/petstore/php-slim/test/Model/OrderTest.php @@ -36,83 +36,84 @@ use OpenAPIServer\Model\Order; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Order */ -class OrderTest extends \PHPUnit_Framework_TestCase { +class OrderTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Order" */ - public function testOrder() { + public function testOrder() + { $testOrder = new Order(); } /** * Test attribute "id" */ - public function testPropertyId() { - + public function testPropertyId() + { } /** * Test attribute "petId" */ - public function testPropertyPetId() { - + public function testPropertyPetId() + { } /** * Test attribute "quantity" */ - public function testPropertyQuantity() { - + public function testPropertyQuantity() + { } /** * Test attribute "shipDate" */ - public function testPropertyShipDate() { - + public function testPropertyShipDate() + { } /** * Test attribute "status" */ - public function testPropertyStatus() { - + public function testPropertyStatus() + { } /** * Test attribute "complete" */ - public function testPropertyComplete() { - + public function testPropertyComplete() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/OuterCompositeTest.php b/samples/server/petstore/php-slim/test/Model/OuterCompositeTest.php index ba5c4e87ee2..4afa5838af2 100644 --- a/samples/server/petstore/php-slim/test/Model/OuterCompositeTest.php +++ b/samples/server/petstore/php-slim/test/Model/OuterCompositeTest.php @@ -36,62 +36,63 @@ use OpenAPIServer\Model\OuterComposite; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\OuterComposite */ -class OuterCompositeTest extends \PHPUnit_Framework_TestCase { +class OuterCompositeTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "OuterComposite" */ - public function testOuterComposite() { + public function testOuterComposite() + { $testOuterComposite = new OuterComposite(); } /** * Test attribute "myNumber" */ - public function testPropertyMyNumber() { - + public function testPropertyMyNumber() + { } /** * Test attribute "myString" */ - public function testPropertyMyString() { - + public function testPropertyMyString() + { } /** * Test attribute "myBoolean" */ - public function testPropertyMyBoolean() { - + public function testPropertyMyBoolean() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/OuterEnumTest.php b/samples/server/petstore/php-slim/test/Model/OuterEnumTest.php index 8f4f9ed9f2d..45e7df7fbed 100644 --- a/samples/server/petstore/php-slim/test/Model/OuterEnumTest.php +++ b/samples/server/petstore/php-slim/test/Model/OuterEnumTest.php @@ -36,41 +36,42 @@ use OpenAPIServer\Model\OuterEnum; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\OuterEnum */ -class OuterEnumTest extends \PHPUnit_Framework_TestCase { +class OuterEnumTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "OuterEnum" */ - public function testOuterEnum() { + public function testOuterEnum() + { $testOuterEnum = new OuterEnum(); } } - diff --git a/samples/server/petstore/php-slim/test/Model/PetTest.php b/samples/server/petstore/php-slim/test/Model/PetTest.php index 6f962d1aae2..0bf28bb7040 100644 --- a/samples/server/petstore/php-slim/test/Model/PetTest.php +++ b/samples/server/petstore/php-slim/test/Model/PetTest.php @@ -36,83 +36,84 @@ use OpenAPIServer\Model\Pet; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Pet */ -class PetTest extends \PHPUnit_Framework_TestCase { +class PetTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Pet" */ - public function testPet() { + public function testPet() + { $testPet = new Pet(); } /** * Test attribute "id" */ - public function testPropertyId() { - + public function testPropertyId() + { } /** * Test attribute "category" */ - public function testPropertyCategory() { - + public function testPropertyCategory() + { } /** * Test attribute "name" */ - public function testPropertyName() { - + public function testPropertyName() + { } /** * Test attribute "photoUrls" */ - public function testPropertyPhotoUrls() { - + public function testPropertyPhotoUrls() + { } /** * Test attribute "tags" */ - public function testPropertyTags() { - + public function testPropertyTags() + { } /** * Test attribute "status" */ - public function testPropertyStatus() { - + public function testPropertyStatus() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/ReadOnlyFirstTest.php b/samples/server/petstore/php-slim/test/Model/ReadOnlyFirstTest.php index b26d3317d7f..d47f78d8bb5 100644 --- a/samples/server/petstore/php-slim/test/Model/ReadOnlyFirstTest.php +++ b/samples/server/petstore/php-slim/test/Model/ReadOnlyFirstTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\ReadOnlyFirst; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\ReadOnlyFirst */ -class ReadOnlyFirstTest extends \PHPUnit_Framework_TestCase { +class ReadOnlyFirstTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "ReadOnlyFirst" */ - public function testReadOnlyFirst() { + public function testReadOnlyFirst() + { $testReadOnlyFirst = new ReadOnlyFirst(); } /** * Test attribute "bar" */ - public function testPropertyBar() { - + public function testPropertyBar() + { } /** * Test attribute "baz" */ - public function testPropertyBaz() { - + public function testPropertyBaz() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/SpecialModelNameTest.php b/samples/server/petstore/php-slim/test/Model/SpecialModelNameTest.php index 391d12f8b7e..197e25622de 100644 --- a/samples/server/petstore/php-slim/test/Model/SpecialModelNameTest.php +++ b/samples/server/petstore/php-slim/test/Model/SpecialModelNameTest.php @@ -36,48 +36,49 @@ use OpenAPIServer\Model\SpecialModelName; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\SpecialModelName */ -class SpecialModelNameTest extends \PHPUnit_Framework_TestCase { +class SpecialModelNameTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "SpecialModelName" */ - public function testSpecialModelName() { + public function testSpecialModelName() + { $testSpecialModelName = new SpecialModelName(); } /** * Test attribute "specialPropertyName" */ - public function testPropertySpecialPropertyName() { - + public function testPropertySpecialPropertyName() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/StringBooleanMapTest.php b/samples/server/petstore/php-slim/test/Model/StringBooleanMapTest.php index 600f610a3e6..41fe1a9f8d5 100644 --- a/samples/server/petstore/php-slim/test/Model/StringBooleanMapTest.php +++ b/samples/server/petstore/php-slim/test/Model/StringBooleanMapTest.php @@ -36,41 +36,42 @@ use OpenAPIServer\Model\StringBooleanMap; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\StringBooleanMap */ -class StringBooleanMapTest extends \PHPUnit_Framework_TestCase { +class StringBooleanMapTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "StringBooleanMap" */ - public function testStringBooleanMap() { + public function testStringBooleanMap() + { $testStringBooleanMap = new StringBooleanMap(); } } - diff --git a/samples/server/petstore/php-slim/test/Model/TagTest.php b/samples/server/petstore/php-slim/test/Model/TagTest.php index 3289c8a7794..69f2abeb0b7 100644 --- a/samples/server/petstore/php-slim/test/Model/TagTest.php +++ b/samples/server/petstore/php-slim/test/Model/TagTest.php @@ -36,55 +36,56 @@ use OpenAPIServer\Model\Tag; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\Tag */ -class TagTest extends \PHPUnit_Framework_TestCase { +class TagTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "Tag" */ - public function testTag() { + public function testTag() + { $testTag = new Tag(); } /** * Test attribute "id" */ - public function testPropertyId() { - + public function testPropertyId() + { } /** * Test attribute "name" */ - public function testPropertyName() { - + public function testPropertyName() + { } } - diff --git a/samples/server/petstore/php-slim/test/Model/UserTest.php b/samples/server/petstore/php-slim/test/Model/UserTest.php index 9bd3a0e2c1a..7f40f26f10a 100644 --- a/samples/server/petstore/php-slim/test/Model/UserTest.php +++ b/samples/server/petstore/php-slim/test/Model/UserTest.php @@ -36,97 +36,98 @@ use OpenAPIServer\Model\User; * @link https://github.com/openapitools/openapi-generator * @coversDefaultClass \OpenAPIServer\Model\User */ -class UserTest extends \PHPUnit_Framework_TestCase { +class UserTest extends \PHPUnit_Framework_TestCase +{ /** * Setup before running any test cases */ - public static function setUpBeforeClass() { - + public static function setUpBeforeClass() + { } /** * Setup before running each test case */ - public function setUp() { - + public function setUp() + { } /** * Clean up after running each test case */ - public function tearDown() { - + public function tearDown() + { } /** * Clean up after running all test cases */ - public static function tearDownAfterClass() { - + public static function tearDownAfterClass() + { } /** * Test "User" */ - public function testUser() { + public function testUser() + { $testUser = new User(); } /** * Test attribute "id" */ - public function testPropertyId() { - + public function testPropertyId() + { } /** * Test attribute "username" */ - public function testPropertyUsername() { - + public function testPropertyUsername() + { } /** * Test attribute "firstName" */ - public function testPropertyFirstName() { - + public function testPropertyFirstName() + { } /** * Test attribute "lastName" */ - public function testPropertyLastName() { - + public function testPropertyLastName() + { } /** * Test attribute "email" */ - public function testPropertyEmail() { - + public function testPropertyEmail() + { } /** * Test attribute "password" */ - public function testPropertyPassword() { - + public function testPropertyPassword() + { } /** * Test attribute "phone" */ - public function testPropertyPhone() { - + public function testPropertyPhone() + { } /** * Test attribute "userStatus" */ - public function testPropertyUserStatus() { - + public function testPropertyUserStatus() + { } } - From e75b115244c721124335621dc07b413e0e2733ee Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Sun, 26 Aug 2018 15:42:59 +0500 Subject: [PATCH 03/74] [Slim] Add PHPLint tool to check syntax (#898) * [Slim] Add phplint package to dependencies There is no phplint package for PHP 5.5.0 version, so I have to increase required PHP version to 5.5.9. * [Slim] Update main doc * [Slim] Refresh samples --- .../resources/php-slim-server/README.mustache | 4 +- .../php-slim-server/composer.mustache | 8 +- .../petstore-security-test/php-slim/README.md | 4 +- .../php-slim/composer.json | 8 +- .../php-slim/composer.lock | 435 +++++++++++++--- samples/server/petstore/php-slim/README.md | 4 +- .../server/petstore/php-slim/composer.json | 8 +- .../server/petstore/php-slim/composer.lock | 481 ++++++++++++++---- 8 files changed, 761 insertions(+), 191 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache index c8375231584..380b05e6b42 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache @@ -5,7 +5,7 @@ ## Requirements * Web server with URL rewriting -* PHP 5.5 or newer +* PHP 5.5.9 or newer This package contains `.htaccess` for Apache configuration. If you use another server(Nginx, HHVM, IIS, lighttpd) check out [Web Servers](https://www.slimframework.com/docs/v3/start/web-servers.html) doc. @@ -33,12 +33,14 @@ $ php -S localhost:8888 -t php-slim-server This package uses PHPUnit 4.8 for unit testing. [Test folder]({{testBasePath}}) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phplint` | phplint | All files {{#generateApiDocs}} ## API Endpoints diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache index a27e79ec42f..218d506deeb 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache @@ -1,12 +1,13 @@ { "minimum-stability": "RC", "require": { - "php": ">=5.5", + "php": ">=5.5.9", "slim/slim": "3.*", "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0" }, "autoload": { "psr-4": { "{{escapedInvokerPackage}}\\": "{{srcBasePath}}/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phplint": "phplint ./ --exclude=vendor" } } \ No newline at end of file diff --git a/samples/server/petstore-security-test/php-slim/README.md b/samples/server/petstore-security-test/php-slim/README.md index 337746cd020..93f25935826 100644 --- a/samples/server/petstore-security-test/php-slim/README.md +++ b/samples/server/petstore-security-test/php-slim/README.md @@ -5,7 +5,7 @@ ## Requirements * Web server with URL rewriting -* PHP 5.5 or newer +* PHP 5.5.9 or newer This package contains `.htaccess` for Apache configuration. If you use another server(Nginx, HHVM, IIS, lighttpd) check out [Web Servers](https://www.slimframework.com/docs/v3/start/web-servers.html) doc. @@ -33,12 +33,14 @@ $ php -S localhost:8888 -t php-slim-server This package uses PHPUnit 4.8 for unit testing. [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phplint` | phplint | All files ## API Endpoints diff --git a/samples/server/petstore-security-test/php-slim/composer.json b/samples/server/petstore-security-test/php-slim/composer.json index ca199179020..ac1d39f5f3e 100644 --- a/samples/server/petstore-security-test/php-slim/composer.json +++ b/samples/server/petstore-security-test/php-slim/composer.json @@ -1,12 +1,13 @@ { "minimum-stability": "RC", "require": { - "php": ">=5.5", + "php": ">=5.5.9", "slim/slim": "3.*", "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0" }, "autoload": { "psr-4": { "OpenAPIServer\\": "lib/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phplint": "phplint ./ --exclude=vendor" } } \ No newline at end of file diff --git a/samples/server/petstore-security-test/php-slim/composer.lock b/samples/server/petstore-security-test/php-slim/composer.lock index fcf4c150619..91f98b9ed53 100644 --- a/samples/server/petstore-security-test/php-slim/composer.lock +++ b/samples/server/petstore-security-test/php-slim/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "7abeaa62669cac171aa0692df2e1943b", + "content-hash": "df189d30a7ab9ec76b4d8994a6cfaec9", "packages": [ { "name": "container-interop/container-interop", @@ -37,59 +37,6 @@ "homepage": "https://github.com/container-interop/container-interop", "time": "2017-02-14T19:40:03+00:00" }, - { - "name": "http-interop/http-factory", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory.git", - "reference": "c2587cc0a6f74987fefb5b8074acfd32c69a4b0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory/zipball/c2587cc0a6f74987fefb5b8074acfd32c69a4b0f", - "reference": "c2587cc0a6f74987fefb5b8074acfd32c69a4b0f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Http\\Factory\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "abandoned": "psr/http-factory", - "time": "2017-03-24T14:48:51+00:00" - }, { "name": "nikic/fast-route", "version": "v1.3.0", @@ -235,6 +182,58 @@ ], "time": "2017-02-14T16:28:37+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2018-07-30T21:54:04+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -464,20 +463,20 @@ }, { "name": "tuupola/callable-handler", - "version": "0.3.0", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/tuupola/callable-handler.git", - "reference": "5141efa1e974687a3fa53338811a988198f50662" + "reference": "662744a6a4a52235be5bd73ac04de4375eff3fc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/callable-handler/zipball/5141efa1e974687a3fa53338811a988198f50662", - "reference": "5141efa1e974687a3fa53338811a988198f50662", + "url": "https://api.github.com/repos/tuupola/callable-handler/zipball/662744a6a4a52235be5bd73ac04de4375eff3fc9", + "reference": "662744a6a4a52235be5bd73ac04de4375eff3fc9", "shasum": "" }, "require": { - "php": "^7.0", + "php": "^7.1", "psr/http-server-middleware": "^1.0" }, "require-dev": { @@ -485,7 +484,7 @@ "overtrue/phplint": "^1.0", "phpunit/phpunit": "^6.5", "squizlabs/php_codesniffer": "^3.2", - "tuupola/http-factory": "^0.3.0", + "tuupola/http-factory": "^0.4.0", "zendframework/zend-diactoros": "^1.6" }, "type": "library", @@ -513,29 +512,30 @@ "psr-15", "psr-7" ], - "time": "2018-01-23T04:07:25+00:00" + "time": "2018-08-02T11:15:40+00:00" }, { "name": "tuupola/http-factory", - "version": "0.3.0", + "version": "0.4.2", "source": { "type": "git", "url": "https://github.com/tuupola/http-factory.git", - "reference": "57b2e19ff3f4af0bbee4e31fd282689be351f1ad" + "reference": "c7e2712d5c4f49ddae704ae1f42854f437ddb028" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/http-factory/zipball/57b2e19ff3f4af0bbee4e31fd282689be351f1ad", - "reference": "57b2e19ff3f4af0bbee4e31fd282689be351f1ad", + "url": "https://api.github.com/repos/tuupola/http-factory/zipball/c7e2712d5c4f49ddae704ae1f42854f437ddb028", + "reference": "c7e2712d5c4f49ddae704ae1f42854f437ddb028", "shasum": "" }, "require": { - "http-interop/http-factory": "^0.3.0" + "php": "^7.1", + "psr/http-factory": "^1.0" }, "require-dev": { - "http-interop/http-factory-tests": "^0.3.0", - "overtrue/phplint": "^0.2.1", - "phpunit/phpunit": "^5.7", + "http-interop/http-factory-tests": "^0.5.0", + "overtrue/phplint": "^1.0", + "phpunit/phpunit": "^6.5", "squizlabs/php_codesniffer": "^3.0" }, "type": "library", @@ -563,29 +563,28 @@ "psr-17", "psr-7" ], - "time": "2017-07-15T22:03:15+00:00" + "time": "2018-08-09T09:02:33+00:00" }, { "name": "tuupola/slim-basic-auth", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/tuupola/slim-basic-auth.git", - "reference": "b169fba3113059548e3a2ac4096b1b08616b070e" + "reference": "e4bbd5e9f609cb6e83264e56f79289fea48c8bbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/slim-basic-auth/zipball/b169fba3113059548e3a2ac4096b1b08616b070e", - "reference": "b169fba3113059548e3a2ac4096b1b08616b070e", + "url": "https://api.github.com/repos/tuupola/slim-basic-auth/zipball/e4bbd5e9f609cb6e83264e56f79289fea48c8bbc", + "reference": "e4bbd5e9f609cb6e83264e56f79289fea48c8bbc", "shasum": "" }, "require": { - "http-interop/http-factory": "^0.3.0", "php": "^7.1", "psr/http-message": "^1.0", "psr/http-server-middleware": "^1.0", - "tuupola/callable-handler": "^0.3.0", - "tuupola/http-factory": "^0.3.0" + "tuupola/callable-handler": "^0.3.0|^0.4.0", + "tuupola/http-factory": "^0.4.0" }, "require-dev": { "codedungeon/phpunit-result-printer": "^0.6.0", @@ -621,7 +620,7 @@ "psr-15", "psr-7" ], - "time": "2018-05-06T05:41:44+00:00" + "time": "2018-08-07T08:09:49+00:00" } ], "packages-dev": [ @@ -679,6 +678,59 @@ ], "time": "2017-07-22T11:58:36+00:00" }, + { + "name": "overtrue/phplint", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/overtrue/phplint.git", + "reference": "b8822e30b5bd1412471520901ba148c5417656c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/b8822e30b5bd1412471520901ba148c5417656c8", + "reference": "b8822e30b5bd1412471520901ba148c5417656c8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.5.9", + "symfony/console": "^3.2|^4.0", + "symfony/finder": "^3.0|^4.0", + "symfony/process": "^3.0|^4.0", + "symfony/yaml": "^3.0|^4.0" + }, + "require-dev": { + "jakub-onderka/php-console-highlighter": "^0.3.2" + }, + "bin": [ + "bin/phplint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\PHPLint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "a php syntax check tool.", + "keywords": [ + "check", + "lint", + "phplint", + "syntax" + ], + "time": "2018-06-19T06:30:45+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", @@ -1642,6 +1694,123 @@ "homepage": "https://github.com/sebastianbergmann/version", "time": "2015-06-21T13:59:46+00:00" }, + { + "name": "symfony/console", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, { "name": "symfony/polyfill-ctype", "version": "v1.9.0", @@ -1700,6 +1869,114 @@ ], "time": "2018-08-06T14:22:27+00:00" }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/process", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, { "name": "symfony/yaml", "version": "v3.4.14", @@ -1816,7 +2093,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.5" + "php": ">=5.5.9" }, "platform-dev": [] } diff --git a/samples/server/petstore/php-slim/README.md b/samples/server/petstore/php-slim/README.md index 85f8dfa9803..debfb04bd5c 100644 --- a/samples/server/petstore/php-slim/README.md +++ b/samples/server/petstore/php-slim/README.md @@ -5,7 +5,7 @@ ## Requirements * Web server with URL rewriting -* PHP 5.5 or newer +* PHP 5.5.9 or newer This package contains `.htaccess` for Apache configuration. If you use another server(Nginx, HHVM, IIS, lighttpd) check out [Web Servers](https://www.slimframework.com/docs/v3/start/web-servers.html) doc. @@ -33,12 +33,14 @@ $ php -S localhost:8888 -t php-slim-server This package uses PHPUnit 4.8 for unit testing. [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- `$ composer test` | PHPUnit | All tests `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests +`$ composer run phplint` | phplint | All files ## API Endpoints diff --git a/samples/server/petstore/php-slim/composer.json b/samples/server/petstore/php-slim/composer.json index ca199179020..ac1d39f5f3e 100644 --- a/samples/server/petstore/php-slim/composer.json +++ b/samples/server/petstore/php-slim/composer.json @@ -1,12 +1,13 @@ { "minimum-stability": "RC", "require": { - "php": ">=5.5", + "php": ">=5.5.9", "slim/slim": "3.*", "tuupola/slim-basic-auth": "^3.0.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0" }, "autoload": { "psr-4": { "OpenAPIServer\\": "lib/" } @@ -20,6 +21,7 @@ "@test-models" ], "test-apis": "phpunit --testsuite Apis", - "test-models": "phpunit --testsuite Models" + "test-models": "phpunit --testsuite Models", + "phplint": "phplint ./ --exclude=vendor" } } \ No newline at end of file diff --git a/samples/server/petstore/php-slim/composer.lock b/samples/server/petstore/php-slim/composer.lock index 75bac6e27ba..91f98b9ed53 100644 --- a/samples/server/petstore/php-slim/composer.lock +++ b/samples/server/petstore/php-slim/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "7abeaa62669cac171aa0692df2e1943b", + "content-hash": "df189d30a7ab9ec76b4d8994a6cfaec9", "packages": [ { "name": "container-interop/container-interop", @@ -37,58 +37,6 @@ "homepage": "https://github.com/container-interop/container-interop", "time": "2017-02-14T19:40:03+00:00" }, - { - "name": "http-interop/http-factory", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory.git", - "reference": "c2587cc0a6f74987fefb5b8074acfd32c69a4b0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory/zipball/c2587cc0a6f74987fefb5b8074acfd32c69a4b0f", - "reference": "c2587cc0a6f74987fefb5b8074acfd32c69a4b0f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Interop\\Http\\Factory\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "time": "2017-03-24T14:48:51+00:00" - }, { "name": "nikic/fast-route", "version": "v1.3.0", @@ -234,6 +182,58 @@ ], "time": "2017-02-14T16:28:37+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2018-07-30T21:54:04+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -463,20 +463,20 @@ }, { "name": "tuupola/callable-handler", - "version": "0.3.0", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/tuupola/callable-handler.git", - "reference": "5141efa1e974687a3fa53338811a988198f50662" + "reference": "662744a6a4a52235be5bd73ac04de4375eff3fc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/callable-handler/zipball/5141efa1e974687a3fa53338811a988198f50662", - "reference": "5141efa1e974687a3fa53338811a988198f50662", + "url": "https://api.github.com/repos/tuupola/callable-handler/zipball/662744a6a4a52235be5bd73ac04de4375eff3fc9", + "reference": "662744a6a4a52235be5bd73ac04de4375eff3fc9", "shasum": "" }, "require": { - "php": "^7.0", + "php": "^7.1", "psr/http-server-middleware": "^1.0" }, "require-dev": { @@ -484,7 +484,7 @@ "overtrue/phplint": "^1.0", "phpunit/phpunit": "^6.5", "squizlabs/php_codesniffer": "^3.2", - "tuupola/http-factory": "^0.3.0", + "tuupola/http-factory": "^0.4.0", "zendframework/zend-diactoros": "^1.6" }, "type": "library", @@ -512,29 +512,30 @@ "psr-15", "psr-7" ], - "time": "2018-01-23T04:07:25+00:00" + "time": "2018-08-02T11:15:40+00:00" }, { "name": "tuupola/http-factory", - "version": "0.3.0", + "version": "0.4.2", "source": { "type": "git", "url": "https://github.com/tuupola/http-factory.git", - "reference": "57b2e19ff3f4af0bbee4e31fd282689be351f1ad" + "reference": "c7e2712d5c4f49ddae704ae1f42854f437ddb028" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/http-factory/zipball/57b2e19ff3f4af0bbee4e31fd282689be351f1ad", - "reference": "57b2e19ff3f4af0bbee4e31fd282689be351f1ad", + "url": "https://api.github.com/repos/tuupola/http-factory/zipball/c7e2712d5c4f49ddae704ae1f42854f437ddb028", + "reference": "c7e2712d5c4f49ddae704ae1f42854f437ddb028", "shasum": "" }, "require": { - "http-interop/http-factory": "^0.3.0" + "php": "^7.1", + "psr/http-factory": "^1.0" }, "require-dev": { - "http-interop/http-factory-tests": "^0.3.0", - "overtrue/phplint": "^0.2.1", - "phpunit/phpunit": "^5.7", + "http-interop/http-factory-tests": "^0.5.0", + "overtrue/phplint": "^1.0", + "phpunit/phpunit": "^6.5", "squizlabs/php_codesniffer": "^3.0" }, "type": "library", @@ -562,29 +563,28 @@ "psr-17", "psr-7" ], - "time": "2017-07-15T22:03:15+00:00" + "time": "2018-08-09T09:02:33+00:00" }, { "name": "tuupola/slim-basic-auth", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/tuupola/slim-basic-auth.git", - "reference": "b169fba3113059548e3a2ac4096b1b08616b070e" + "reference": "e4bbd5e9f609cb6e83264e56f79289fea48c8bbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tuupola/slim-basic-auth/zipball/b169fba3113059548e3a2ac4096b1b08616b070e", - "reference": "b169fba3113059548e3a2ac4096b1b08616b070e", + "url": "https://api.github.com/repos/tuupola/slim-basic-auth/zipball/e4bbd5e9f609cb6e83264e56f79289fea48c8bbc", + "reference": "e4bbd5e9f609cb6e83264e56f79289fea48c8bbc", "shasum": "" }, "require": { - "http-interop/http-factory": "^0.3.0", "php": "^7.1", "psr/http-message": "^1.0", "psr/http-server-middleware": "^1.0", - "tuupola/callable-handler": "^0.3.0", - "tuupola/http-factory": "^0.3.0" + "tuupola/callable-handler": "^0.3.0|^0.4.0", + "tuupola/http-factory": "^0.4.0" }, "require-dev": { "codedungeon/phpunit-result-printer": "^0.6.0", @@ -620,7 +620,7 @@ "psr-15", "psr-7" ], - "time": "2018-05-06T05:41:44+00:00" + "time": "2018-08-07T08:09:49+00:00" } ], "packages-dev": [ @@ -678,6 +678,59 @@ ], "time": "2017-07-22T11:58:36+00:00" }, + { + "name": "overtrue/phplint", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/overtrue/phplint.git", + "reference": "b8822e30b5bd1412471520901ba148c5417656c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/b8822e30b5bd1412471520901ba148c5417656c8", + "reference": "b8822e30b5bd1412471520901ba148c5417656c8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.5.9", + "symfony/console": "^3.2|^4.0", + "symfony/finder": "^3.0|^4.0", + "symfony/process": "^3.0|^4.0", + "symfony/yaml": "^3.0|^4.0" + }, + "require-dev": { + "jakub-onderka/php-console-highlighter": "^0.3.2" + }, + "bin": [ + "bin/phplint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\PHPLint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "a php syntax check tool.", + "keywords": [ + "check", + "lint", + "phplint", + "syntax" + ], + "time": "2018-06-19T06:30:45+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", @@ -832,16 +885,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.6", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", "shasum": "" }, "require": { @@ -853,12 +906,12 @@ }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -891,7 +944,7 @@ "spy", "stub" ], - "time": "2018-04-18T13:57:24+00:00" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1642,26 +1695,146 @@ "time": "2015-06-21T13:59:46+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.8.0", + "name": "symfony/console", + "version": "v4.1.3", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + "url": "https://github.com/symfony/console.git", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "suggest": { + "ext-ctype": "For best performance" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1694,20 +1867,128 @@ "polyfill", "portable" ], - "time": "2018-04-30T19:57:29+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { - "name": "symfony/yaml", - "version": "v3.4.13", + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", - "reference": "c5010cc1692ce1fa328b1fb666961eb3d4a85bb0", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/process", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", + "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", "shasum": "" }, "require": { @@ -1753,7 +2034,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-05-03T23:18:14+00:00" + "time": "2018-07-26T11:19:56+00:00" }, { "name": "webmozart/assert", @@ -1812,7 +2093,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.5" + "php": ">=5.5.9" }, "platform-dev": [] } From e3bd47921cc459704d322c6a7f9b78675c3db835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Mon, 27 Aug 2018 09:06:54 +0200 Subject: [PATCH 04/74] [CI] Change the way gradle uploadArchives works (#902) --- .travis.yml | 20 +++++++++++-------- .../build.gradle | 7 +------ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 51d8c4a6b7f..b481fb642e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -118,21 +118,25 @@ after_success: # push to maven repo - if [ $SONATYPE_USERNAME ] && [ -z $TRAVIS_TAG ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then if [ "$TRAVIS_BRANCH" = "master" ]; then - mvn clean deploy -DskipTests=true -B -U -P release --settings CI/settings.xml; - echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; + mvn clean install -DskipTests=true -U; + echo "Finished mvn clean install for $TRAVIS_BRANCH"; pushd .; cd modules/openapi-generator-gradle-plugin; - ./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon; - echo "Finished ./gradlew uploadArchives"; + ./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" uploadArchives --no-daemon; + echo "Finished ./gradlew uploadArchives for $TRAVIS_BRANCH"; popd; + mvn deploy -DskipTests=true -B -U -P release --settings CI/settings.xml; + echo "Finished mvn deploy for $TRAVIS_BRANCH"; elif ([[ "$TRAVIS_BRANCH" =~ ^[0-9]+\.[0-9]+\.x$ ]]) ; then - mvn clean deploy --settings CI/settings.xml; - echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; + mvn clean install -DskipTests=true; + echo "Finished mvn clean install for $TRAVIS_BRANCH"; pushd .; cd modules/openapi-generator-gradle-plugin; - ./gradlew -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon; - echo "Finished ./gradlew uploadArchives"; + ./gradlew uploadArchives --no-daemon; + echo "Finished ./gradlew uploadArchives for $TRAVIS_BRANCH"; popd; + mvn deploy -DskipTests=true --settings CI/settings.xml; + echo "Finished mvn deploy for $TRAVIS_BRANCH"; fi; fi; ## docker: build and push openapi-generator-online to DockerHub diff --git a/modules/openapi-generator-gradle-plugin/build.gradle b/modules/openapi-generator-gradle-plugin/build.gradle index c639b67a162..7ac79fafa0e 100644 --- a/modules/openapi-generator-gradle-plugin/build.gradle +++ b/modules/openapi-generator-gradle-plugin/build.gradle @@ -155,12 +155,7 @@ uploadArchives { // or stored in ~/.gradle/gradle.properties as key=value pairs mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: ossrhUsername, password: ossrhPassword) - } + repository(url: "file:../../target/nexus-staging/deferred/") pom.withXml { def root = asNode() From b505795bf702d96d0f76c35ec546d7c3306d49b0 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Mon, 27 Aug 2018 16:14:35 +0800 Subject: [PATCH 05/74] use JsonIgnoreProperties to fix recursion (#903) --- .../src/main/java/org/openapitools/codegen/CodegenModel.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java index 80ff121c361..8251bb22316 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java @@ -28,6 +28,9 @@ import java.util.Objects; import java.util.Set; import java.util.TreeSet; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties({"parentModel", "interfaceModels"}) public class CodegenModel { public String parent, parentSchema; public List interfaces; From 1ea0a1e856756485def29f80630a58544d863124 Mon Sep 17 00:00:00 2001 From: Jeremie Bresson Date: Mon, 27 Aug 2018 10:51:51 +0200 Subject: [PATCH 06/74] Revert "[CI] Change the way gradle uploadArchives works (#902)" This reverts commit e3bd47921cc459704d322c6a7f9b78675c3db835. --- .travis.yml | 20 ++++++++----------- .../build.gradle | 7 ++++++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index b481fb642e1..51d8c4a6b7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -118,25 +118,21 @@ after_success: # push to maven repo - if [ $SONATYPE_USERNAME ] && [ -z $TRAVIS_TAG ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then if [ "$TRAVIS_BRANCH" = "master" ]; then - mvn clean install -DskipTests=true -U; - echo "Finished mvn clean install for $TRAVIS_BRANCH"; + mvn clean deploy -DskipTests=true -B -U -P release --settings CI/settings.xml; + echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; pushd .; cd modules/openapi-generator-gradle-plugin; - ./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" uploadArchives --no-daemon; - echo "Finished ./gradlew uploadArchives for $TRAVIS_BRANCH"; + ./gradlew -Psigning.keyId="$SIGNING_KEY" -Psigning.password="$SIGNING_PASSPHRASE" -Psigning.secretKeyRingFile="${TRAVIS_BUILD_DIR}/sec.gpg" -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon; + echo "Finished ./gradlew uploadArchives"; popd; - mvn deploy -DskipTests=true -B -U -P release --settings CI/settings.xml; - echo "Finished mvn deploy for $TRAVIS_BRANCH"; elif ([[ "$TRAVIS_BRANCH" =~ ^[0-9]+\.[0-9]+\.x$ ]]) ; then - mvn clean install -DskipTests=true; - echo "Finished mvn clean install for $TRAVIS_BRANCH"; + mvn clean deploy --settings CI/settings.xml; + echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; pushd .; cd modules/openapi-generator-gradle-plugin; - ./gradlew uploadArchives --no-daemon; - echo "Finished ./gradlew uploadArchives for $TRAVIS_BRANCH"; + ./gradlew -PossrhUsername="${SONATYPE_USERNAME}" -PossrhPassword="${SONATYPE_PASSWORD}" uploadArchives --no-daemon; + echo "Finished ./gradlew uploadArchives"; popd; - mvn deploy -DskipTests=true --settings CI/settings.xml; - echo "Finished mvn deploy for $TRAVIS_BRANCH"; fi; fi; ## docker: build and push openapi-generator-online to DockerHub diff --git a/modules/openapi-generator-gradle-plugin/build.gradle b/modules/openapi-generator-gradle-plugin/build.gradle index 7ac79fafa0e..c639b67a162 100644 --- a/modules/openapi-generator-gradle-plugin/build.gradle +++ b/modules/openapi-generator-gradle-plugin/build.gradle @@ -155,7 +155,12 @@ uploadArchives { // or stored in ~/.gradle/gradle.properties as key=value pairs mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - repository(url: "file:../../target/nexus-staging/deferred/") + repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } pom.withXml { def root = asNode() From 5cd5143b80d17cd40a80277c2aa48f13be006ba8 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Mon, 27 Aug 2018 20:46:50 +0800 Subject: [PATCH 07/74] Add test case to detect stack overflow error (#904) * add test case to detect stackoverflow errors * use bash insted of sh --- bin/tests/run-all-test | 33 +++++++++++++ bin/tests/test-debug-supporting-files.sh | 38 +++++++++++++++ .../src/test/resources/3_0/issue_241.yaml | 47 +++++++++++++++++++ shippable.yml | 2 + 4 files changed, 120 insertions(+) create mode 100755 bin/tests/run-all-test create mode 100755 bin/tests/test-debug-supporting-files.sh create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_241.yaml diff --git a/bin/tests/run-all-test b/bin/tests/run-all-test new file mode 100755 index 00000000000..963f0d2ec63 --- /dev/null +++ b/bin/tests/run-all-test @@ -0,0 +1,33 @@ +#!/bin/bash +# this bash script will loop through all the .sh files under bin/tests +# execute the script and check the result (exit code) to see if +# there's any error + +echo "IMPORTANT: this script should be run by the CI (e.g. Shippable) only. There's no need to run this script manually." +echo "Please press CTRL+C to stop or the script will continue in 10 seconds." + +sleep 10 + +successes=0 +failures=0 +for SCRIPT in $(ls -l ./bin/tests/*.sh | grep -v all) +do + if [ -f ${SCRIPT} -a -x ${SCRIPT} ]; then + echo "Running $SCRIPT (output to /dev/null)" + ${SCRIPT} 2>&1 > /dev/null + rc=$? + if [[ ${rc} != 0 ]]; then + >&2 echo "ERROR!! FAILED TO RUN ${SCRIPT}" + ((failures+=1)) + else + ((successes+=1)) + fi + fi +done + +if (( failures > 0 )); then + >&2 echo "[ERROR] ${failures} out of $((failures+successes)) scripts failed." + exit 1 +else + echo "[SUCCESS] ${successes} generators finished." +fi diff --git a/bin/tests/test-debug-supporting-files.sh b/bin/tests/test-debug-supporting-files.sh new file mode 100755 index 00000000000..7360313f5c8 --- /dev/null +++ b/bin/tests/test-debug-supporting-files.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package $@ +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate -t modules/openapi-generator/src/main/resources/python -i modules/openapi-generator/src/test/resources/3_0/issue_241.yaml -g python -o /tmp/test-debug-supporting-files/ -DpackageName=petstore_api -DdebugSupportingFiles=true $@" + +if [[ $(java $JAVA_OPTS -jar $executable $ags 2>&1 | grep "StackOverflowError") ]]; then + echo "There are StackOverflowError. Please check the result." + exit 1 +else + echo "No StackOverflowError found." +fi + diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_241.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_241.yaml new file mode 100644 index 00000000000..982f18a2d6b --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_241.yaml @@ -0,0 +1,47 @@ +openapi: "3.0.0" +info: + description: "test" + version: "1.0.0" + title: "myTest" + contact: + email: "my@mail.com" +servers: +- url: "http://localhost:9998/v1" +tags: +- name: "users" +paths: + /users/create/{username}: + post: + tags: + - "user" + operationId: "createUser" + parameters: + - name: "username" + in: "path" + required: true + schema: + type: "string" + responses: + 200: + description: "The User just created" + content: + application/json: + schema: + $ref: "#/components/schemas/User" +components: + schemas: + User: + allOf: + - $ref: "#/components/schemas/UserDetail" + - type: "object" + description: "The User" + required: + - "userid" + - "username" + UserDetail: + type: "object" + description: "Detail of a User" + properties: + name: + type: "string" + description: "the name of the user" diff --git a/shippable.yml b/shippable.yml index 27c3ccec46e..efb7e072864 100644 --- a/shippable.yml +++ b/shippable.yml @@ -39,3 +39,5 @@ build: - ./bin/run-all-petstore # generate all petstore samples (openapi3) - ./bin/openapi3/run-all-petstore + # generate test scripts + - ./bin/tests/run-all-test From 8689227b3e253277c6ebe6265dd3083043bd6e95 Mon Sep 17 00:00:00 2001 From: Adam Drakeford Date: Mon, 27 Aug 2018 16:54:53 +0100 Subject: [PATCH 08/74] [KOTLIN] Spring Boot Server Generator (#820) * Kotlin Spring initial bootstrap * Basic configuration construction for Kotlin Spring * Wired up with comand line client * Initial kotlin spring boot application generated using gradle kotlin-dsl * Added basic support for generating models * Basic controllers generated without endpoints generated * Basic spring boot app generated with models and controllers * Added fix for type mapping in AbstractKotlinCodegen. Originally it was mapping list o kotlin.Array instead of kotlin.collections.List * Fixed return type mapping * Sorted bash springboot petstore generator script * Implemented toVarName in AbstractKotlinCodegen to better handle some edgecases * Checking for reserved words or numerical starting class names in AbstractKotlinCodegen * Implemented toOperationId in AbstractKotlinCodegen * Fixed types that were not correctly being mapped to primitives (byte / arrayOf / mapOf) * Escaping dollar symbols in function names * Added support for outter enum classes * Added basic support for generating services * Removed option for generated config package. Added option to enable/disable generated global exception handler * Added configuration option to generate gradle. Generated maven pom.xml file as default * Fixed up bash scripts for generating test sample code * Added configurable option for Swagger Annotations * Added configurable option for generating service interfaces and service implementations * Added README generation * Enable optional bean validation * Added kotlin spring sample to CircleCI pom.xml * Removed kotlin spring boot from .gitignore * Minor fixes from PR comments for user submission (#1) * Minor fixes from PR comments for user submission * Puts braces around conditional block bodies with one-liner bodies. * Modifies README.mustache to use artifact id and version supplied by user (or default configuration) * Targets templates under resource directory explicitly to prevent the need to rebuild for evaluation of template-only changes. * [kotlin-spring] Remove comments referencing sbt in bash scripts * List of changes based upon code review: * Additional comments around how we set the title based off the open api spec * Fixed missing `beanValidationCore` template * Put the lambdas into the lambda object as other generators do (Ktor, C#, cpp) * Bump swagger-annotations version to latest pre-2.0 version (1.5.21) * Set kotlin version to 1.2.60 * Updated README to set port based on template * Added more additional properties to build bash scripts * Removed `defaultBasePath.mustache` in place of using {{contextPath}} directly * Log warning for when `serviceImplementation` is set t o true * Updated samples * Generating ConstraintViolation Exception Handler, as Springboot doesnt correctly catch the error and return bad request. Handling other exceptions a litle better * Small fix for date time mappings (plus sample re-gen) * Minor fix in README template, where port was using wrong variable * Fix missing jackson-dataformat-xml dependency * Fix build - needed to re-run kotlin-server-petstore.sh * Fixes after merge with master * Revert "Small fix for date time mappings (plus sample re-gen)" This reverts commit 4152dc78b4813da71c675272ca90fb31a333aea1. * Moved type mappings to Kotlin Spring generator * Regenerated samples * Regenerated samples --- .gitignore | 4 +- CI/pom.xml.circleci | 1 + bin/kotlin-springboot-petstore-server.sh | 35 ++ .../kotlin-springboot-petstore-server.sh | 35 ++ .../kotlin-springboot-petstore-server.bat | 10 + .../kotlin-springboot-petstore-server.bat | 10 + .../languages/AbstractKotlinCodegen.java | 128 ++++- .../languages/KotlinSpringServerCodegen.java | 485 ++++++++++++++++++ .../org.openapitools.codegen.CodegenConfig | 1 + .../main/resources/kotlin-spring/api.mustache | 70 +++ .../beanValidationModel.mustache | 20 + .../kotlin-spring/beanValidationPath.mustache | 20 + .../beanValidationPathParams.mustache | 1 + .../beanValidationQueryParams.mustache | 1 + .../kotlin-spring/bodyParams.mustache | 1 + .../kotlin-spring/dataClass.mustache | 25 + .../kotlin-spring/dataClassOptVar.mustache | 4 + .../kotlin-spring/dataClassReqVar.mustache | 4 + .../kotlin-spring/enumClass.mustache | 9 + .../kotlin-spring/exceptions.mustache | 29 ++ .../kotlin-spring/formParams.mustache | 1 + .../kotlin-spring/headerParams.mustache | 1 + .../libraries/spring-boot/README.mustache | 21 + .../spring-boot/application.mustache | 3 + .../spring-boot/buildGradleKts.mustache | 47 ++ .../libraries/spring-boot/pom.mustache | 109 ++++ .../spring-boot/settingsGradle.mustache | 1 + .../springBootApplication.mustache | 14 + .../resources/kotlin-spring/model.mustache | 18 + .../kotlin-spring/optionalDataType.mustache | 1 + .../kotlin-spring/pathParams.mustache | 1 + .../kotlin-spring/queryParams.mustache | 1 + .../kotlin-spring/returnTypes.mustache | 1 + .../kotlin-spring/returnValue.mustache | 1 + .../resources/kotlin-spring/service.mustache | 13 + .../kotlin-spring/serviceImpl.mustache | 17 + .../spring/KotlinSpringServerCodegenTest.java | 115 +++++ .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../petstore/kotlin-springboot/README.md | 21 + .../kotlin-springboot/build.gradle.kts | 45 ++ .../petstore/kotlin-springboot/pom.xml | 105 ++++ .../kotlin-springboot/settings.gradle | 1 + .../kotlin/org/openapitools/Application.kt | 14 + .../kotlin/org/openapitools/api/Exceptions.kt | 29 ++ .../kotlin/org/openapitools/api/PetApi.kt | 159 ++++++ .../org/openapitools/api/PetApiService.kt | 23 + .../org/openapitools/api/PetApiServiceImpl.kt | 41 ++ .../kotlin/org/openapitools/api/StoreApi.kt | 93 ++++ .../org/openapitools/api/StoreApiService.kt | 14 + .../openapitools/api/StoreApiServiceImpl.kt | 24 + .../kotlin/org/openapitools/api/UserApi.kt | 144 ++++++ .../org/openapitools/api/UserApiService.kt | 22 + .../openapitools/api/UserApiServiceImpl.kt | 40 ++ .../kotlin/org/openapitools/model/Body.kt | 24 + .../kotlin/org/openapitools/model/Body1.kt | 24 + .../kotlin/org/openapitools/model/Category.kt | 24 + .../openapitools/model/ModelApiResponse.kt | 28 + .../kotlin/org/openapitools/model/Order.kt | 55 ++ .../main/kotlin/org/openapitools/model/Pet.kt | 59 +++ .../main/kotlin/org/openapitools/model/Tag.kt | 24 + .../kotlin/org/openapitools/model/User.kt | 48 ++ .../src/main/resources/application.yaml | 3 + .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../petstore/kotlin-springboot/README.md | 21 + .../kotlin-springboot/build.gradle.kts | 45 ++ .../server/petstore/kotlin-springboot/pom.xml | 105 ++++ .../kotlin-springboot/settings.gradle | 1 + .../kotlin/org/openapitools/Application.kt | 14 + .../kotlin/org/openapitools/api/Exceptions.kt | 29 ++ .../kotlin/org/openapitools/api/PetApi.kt | 159 ++++++ .../org/openapitools/api/PetApiService.kt | 23 + .../org/openapitools/api/PetApiServiceImpl.kt | 41 ++ .../kotlin/org/openapitools/api/StoreApi.kt | 92 ++++ .../org/openapitools/api/StoreApiService.kt | 14 + .../openapitools/api/StoreApiServiceImpl.kt | 24 + .../kotlin/org/openapitools/api/UserApi.kt | 140 +++++ .../org/openapitools/api/UserApiService.kt | 22 + .../openapitools/api/UserApiServiceImpl.kt | 40 ++ .../kotlin/org/openapitools/model/Category.kt | 24 + .../openapitools/model/ModelApiResponse.kt | 28 + .../kotlin/org/openapitools/model/Order.kt | 55 ++ .../main/kotlin/org/openapitools/model/Pet.kt | 59 +++ .../main/kotlin/org/openapitools/model/Tag.kt | 24 + .../kotlin/org/openapitools/model/User.kt | 48 ++ .../src/main/resources/application.yaml | 3 + 87 files changed, 3368 insertions(+), 13 deletions(-) create mode 100755 bin/kotlin-springboot-petstore-server.sh create mode 100755 bin/openapi3/kotlin-springboot-petstore-server.sh create mode 100644 bin/windows/kotlin-springboot-petstore-server.bat create mode 100644 bin/windows/openapi3/kotlin-springboot-petstore-server.bat create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationModel.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPath.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPathParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationQueryParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/enumClass.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/exceptions.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/README.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/settingsGradle.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/springBootApplication.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/optionalDataType.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/returnTypes.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/returnValue.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache create mode 100644 modules/openapi-generator/src/main/resources/kotlin-spring/serviceImpl.mustache create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator-ignore create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/README.md create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/pom.xml create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/settings.gradle create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body1.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt create mode 100644 samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml create mode 100644 samples/server/petstore/kotlin-springboot/.openapi-generator-ignore create mode 100644 samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION create mode 100644 samples/server/petstore/kotlin-springboot/README.md create mode 100644 samples/server/petstore/kotlin-springboot/build.gradle.kts create mode 100644 samples/server/petstore/kotlin-springboot/pom.xml create mode 100644 samples/server/petstore/kotlin-springboot/settings.gradle create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt create mode 100644 samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml diff --git a/.gitignore b/.gitignore index 55ef266102f..9fd7f8b7a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -115,14 +115,14 @@ samples/client/petstore/swift/**/SwaggerClientTests/SwaggerClient.xcworkspace/xc samples/client/petstore/swift/**/SwaggerClientTests/Pods/ #samples/client/petstore/swift/**/SwaggerClientTests/Pods/Pods.xcodeproj/xcuserdata #samples/client/petstore/swift/**/SwaggerClientTests/Pods/Pods.xcodeproj/xcshareddata/xcschemes -samples/client/petstore/swift/**/SwaggerClientTests/Podfile.lock +samples/client/petstore/swift/**/SwaggerClientTests/Podfile.lock # Swift3 samples/client/petstore/swift3/**/SwaggerClientTests/SwaggerClient.xcodeproj/xcuserdata samples/client/petstore/swift3/**/SwaggerClientTests/SwaggerClient.xcworkspace/xcuserdata #samples/client/petstore/swift3/**/SwaggerClientTests/Pods/ #samples/client/petstore/swift3/**/SwaggerClientTests/Pods/Pods.xcodeproj/xcuserdata #samples/client/petstore/swift3/**/SwaggerClientTests/Pods/Pods.xcodeproj/xcshareddata/xcschemes -samples/client/petstore/swift3/**/SwaggerClientTests/Podfile.lock +samples/client/petstore/swift3/**/SwaggerClientTests/Podfile.lock # C# *.csproj.user diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index bf2d5323a0a..1d50c1410d8 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -957,6 +957,7 @@ samples/server/petstore/scala-lagom-server samples/server/petstore/scalatra samples/server/petstore/finch + samples/server/petstore/kotlin-springboot diff --git a/bin/kotlin-springboot-petstore-server.sh b/bin/kotlin-springboot-petstore-server.sh new file mode 100755 index 00000000000..7e1c3888c8f --- /dev/null +++ b/bin/kotlin-springboot-petstore-server.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=$(ls -ld "$SCRIPT") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=$(dirname "$SCRIPT")/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=$(dirname "$SCRIPT")/.. + APP_DIR=$(cd "${APP_DIR}"; pwd) +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -t modules/openapi-generator/src/main/resources/kotlin-spring -g kotlin-spring -o samples/server/petstore/kotlin-springboot --additional-properties=library=spring-boot,beanValidations=true,swaggerAnnotations=true,serviceImplementation=true" + +echo "Cleaning previously generated files if any from samples/server/petstore/kotlin-springboot" +rm -rf samples/server/petstore/kotlin-springboot + +echo "Generating Kotling Spring Boot server..." +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/openapi3/kotlin-springboot-petstore-server.sh b/bin/openapi3/kotlin-springboot-petstore-server.sh new file mode 100755 index 00000000000..3ac7b6f68eb --- /dev/null +++ b/bin/openapi3/kotlin-springboot-petstore-server.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=$(ls -ld "$SCRIPT") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=$(dirname "$SCRIPT")/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=$(dirname "$SCRIPT")/.. + APP_DIR=$(cd "${APP_DIR}"; pwd) +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -i modules/openapi-generator/src/test/resources/3_0/petstore.yaml -t modules/openapi-generator/src/main/resources/kotlin-spring -g kotlin-spring -o samples/server/openapi3/petstore/kotlin-springboot --additional-properties=library=spring-boot,beanValidations=true,swaggerAnnotations=true,serviceImplementation=true" + +echo "Cleaning previously generated files if any from samples/server/openapi3/petstore/kotlin-springboot" +rm -rf samples/server/openapi3/petstore/kotlin-springboot + +echo "Generating Kotling Spring Boot server..." +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/windows/kotlin-springboot-petstore-server.bat b/bin/windows/kotlin-springboot-petstore-server.bat new file mode 100644 index 00000000000..6b7e1ad6e77 --- /dev/null +++ b/bin/windows/kotlin-springboot-petstore-server.bat @@ -0,0 +1,10 @@ +set executable=.\modules\openapi-generator-cli\target\openapi-generator-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M +set ags=generate -i modules\openapi-generator\src\test\resources\2_0\petstore.yaml -g kotlin-spring -o samples\server\petstore\kotlin-springboot --additional-properties=library=spring-boot + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/openapi3/kotlin-springboot-petstore-server.bat b/bin/windows/openapi3/kotlin-springboot-petstore-server.bat new file mode 100644 index 00000000000..c86efaee3c8 --- /dev/null +++ b/bin/windows/openapi3/kotlin-springboot-petstore-server.bat @@ -0,0 +1,10 @@ +set executable=.\modules\openapi-generator-cli\target\openapi-generator-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M +set ags=generate -i modules\openapi-generator\src\test\resources\3_0\petstore.yaml -g kotlin-spring -o samples\server\openapi3\petstore\kotlin-springboot --additional-properties=library=spring-boot + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 774c96fe33f..7ec6bc1573f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; +import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenConstants; @@ -28,11 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; +import java.util.*; public abstract class AbstractKotlinCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractKotlinCodegen.class); @@ -55,6 +52,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co languageSpecificPrimitives = new HashSet(Arrays.asList( "kotlin.Byte", + "kotlin.ByteArray", "kotlin.Short", "kotlin.Int", "kotlin.Long", @@ -139,6 +137,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co defaultIncludes = new HashSet(Arrays.asList( "kotlin.Byte", + "kotlin.ByteArray", "kotlin.Short", "kotlin.Int", "kotlin.Long", @@ -159,21 +158,22 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co typeMapping.put("float", "kotlin.Float"); typeMapping.put("long", "kotlin.Long"); typeMapping.put("double", "kotlin.Double"); + typeMapping.put("ByteArray", "kotlin.ByteArray"); typeMapping.put("number", "java.math.BigDecimal"); typeMapping.put("date-time", "java.time.LocalDateTime"); typeMapping.put("date", "java.time.LocalDateTime"); typeMapping.put("file", "java.io.File"); typeMapping.put("array", "kotlin.Array"); - typeMapping.put("list", "kotlin.Array"); + typeMapping.put("list", "kotlin.collections.List"); typeMapping.put("map", "kotlin.collections.Map"); typeMapping.put("object", "kotlin.Any"); typeMapping.put("binary", "kotlin.Array"); typeMapping.put("Date", "java.time.LocalDateTime"); typeMapping.put("DateTime", "java.time.LocalDateTime"); - instantiationTypes.put("array", "arrayOf"); - instantiationTypes.put("list", "arrayOf"); - instantiationTypes.put("map", "mapOf"); + instantiationTypes.put("array", "kotlin.arrayOf"); + instantiationTypes.put("list", "kotlin.arrayOf"); + instantiationTypes.put("map", "kotlin.mapOf"); importMapping = new HashMap(); importMapping.put("BigDecimal", "java.math.BigDecimal"); @@ -473,13 +473,53 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co // Camelize name of nested properties modifiedName = camelize(modifiedName); - if (reservedWords.contains(modifiedName)) { - modifiedName = escapeReservedWord(modifiedName); + // model name cannot use reserved keyword, e.g. return + if (isReservedWord(modifiedName)) { + final String modelName = "Model" + modifiedName; + LOGGER.warn(modifiedName + " (reserved word) cannot be used as model name. Renamed to " + modelName); + return modelName; + } + + // model name starts with number + if (modifiedName.matches("^\\d.*")) { + final String modelName = "Model" + modifiedName; // e.g. 200Response => Model200Response (after camelize) + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + modelName); + return modelName; } return titleCase(modifiedName); } + /** + * Return the operation ID (method name) + * + * @param operationId operation ID + * @return the sanitized method name + */ + @Override + public String toOperationId(String operationId) { + // throw exception if method name is empty + if (StringUtils.isEmpty(operationId)) + throw new RuntimeException("Empty method/operation name (operationId) not allowed"); + + operationId = camelize(sanitizeName(operationId), true); + + // method name cannot use reserved keyword, e.g. return + if (isReservedWord(operationId)) { + String newOperationId = camelize("call_" + operationId, true); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); + return newOperationId; + } + + // operationId starts with a number + if (operationId.matches("^\\d.*")) { + LOGGER.warn(operationId + " (starting with a number) cannot be used as method sname. Renamed to " + camelize("call_" + operationId), true); + operationId = camelize("call_" + operationId, true); + } + + return operationId; + } + @Override public String toModelFilename(String name) { // Should be the same as the model name @@ -577,4 +617,70 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co public boolean isDataTypeString(final String dataType) { return "String".equals(dataType) || "kotlin.String".equals(dataType); } + + @Override + public String toParamName(String name) { + // to avoid conflicts with 'callback' parameter for async call + if ("callback".equals(name)) { + return "paramCallback"; + } + + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toVarName(String name) { + // sanitize name + name = sanitizeName(name, "\\W-[\\$]"); + + if (name.toLowerCase(Locale.ROOT).matches("^_*class$")) { + return "propertyClass"; + } + + if ("_".equals(name)) { + name = "_u"; + } + + // if it's all uppper case, do nothing + if (name.matches("^[A-Z_]*$")) { + return name; + } + + if (startsWithTwoUppercaseLetters(name)) { + name = name.substring(0, 2).toLowerCase(Locale.ROOT) + name.substring(2); + } + + // If name contains special chars -> replace them. + if ((name.chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character))))) { + List allowedCharacters = new ArrayList<>(); + allowedCharacters.add("_"); + allowedCharacters.add("$"); + name = escapeSpecialCharacters(name, allowedCharacters, "_"); + } + + // camelize (lower first character) the variable name + // pet_id => petId + name = camelize(name, true); + + // for reserved word or word starting with number or containing dollar symbol, escape it + if (isReservedWord(name) || name.matches("(^\\d.*)|(.*[$].*)")) { + name = escapeReservedWord(name); + } + + return name; + } + + @Override + public String toRegularExpression(String pattern) { + return escapeText(pattern); + } + + private boolean startsWithTwoUppercaseLetters(String name) { + boolean startsWithTwoUppercaseLetters = false; + if (name.length() > 1) { + startsWithTwoUppercaseLetters = name.substring(0, 2).equals(name.substring(0, 2).toUpperCase(Locale.ROOT)); + } + return startsWithTwoUppercaseLetters; + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java new file mode 100644 index 00000000000..99fc5a18606 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java @@ -0,0 +1,485 @@ +package org.openapitools.codegen.languages; + +import com.google.common.collect.ImmutableMap; +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import io.swagger.v3.oas.models.OpenAPI; +import org.openapitools.codegen.*; +import org.openapitools.codegen.languages.features.BeanValidationFeatures; +import org.openapitools.codegen.utils.URLPathUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.net.URL; +import java.util.*; +import java.util.regex.Matcher; + + +public class KotlinSpringServerCodegen extends AbstractKotlinCodegen + implements BeanValidationFeatures { + + private static Logger LOGGER = + LoggerFactory.getLogger(KotlinSpringServerCodegen.class); + + private static final HashSet VARIABLE_RESERVED_WORDS = + new HashSet(Arrays.asList( + "ApiClient", + "ApiException", + "ApiResponse" + )); + + public static final String TITLE = "title"; + public static final String LAMBDA = "lambda"; + public static final String SERVER_PORT = "serverPort"; + public static final String BASE_PACKAGE = "basePackage"; + public static final String SPRING_BOOT = "spring-boot"; + public static final String EXCEPTION_HANDLER = "exceptionHandler"; + public static final String GRADLE_BUILD_FILE = "gradleBuildFile"; + public static final String SWAGGER_ANNOTATIONS = "swaggerAnnotations"; + public static final String SERVICE_INTERFACE = "serviceInterface"; + public static final String SERVICE_IMPLEMENTATION = "serviceImplementation"; + + private String basePackage; + private String serverPort = "8080"; + private String title = "OpenAPI Kotlin Spring"; + private String resourceFolder = "src/main/resources"; + private boolean useBeanValidation = true; + private boolean exceptionHandler = true; + private boolean gradleBuildFile = true; + private boolean swaggerAnnotations = false; + private boolean serviceInterface = false; + private boolean serviceImplementation = false; + + public KotlinSpringServerCodegen() { + super(); + + reservedWords.addAll(VARIABLE_RESERVED_WORDS); + + outputFolder = "generated-code/kotlin-spring"; + apiTestTemplateFiles.clear(); // TODO: add test template + embeddedTemplateDir = templateDir = "kotlin-spring"; + + artifactId = "openapi-spring"; + basePackage = "org.openapitools"; + apiPackage = "org.openapitools.api"; + modelPackage = "org.openapitools.model"; + + addOption(TITLE, "server title name or client service name", title); + addOption(BASE_PACKAGE, "base package for generated code", basePackage); + addOption(SERVER_PORT, "configuration the port in which the sever is to run on", serverPort); + addOption(CodegenConstants.MODEL_PACKAGE, "model package for generated code", modelPackage); + addOption(CodegenConstants.API_PACKAGE, "api package for generated code", apiPackage); + addSwitch(EXCEPTION_HANDLER, "generate default global exception handlers", exceptionHandler); + addSwitch(GRADLE_BUILD_FILE, "generate a gradle build file using the Kotlin DSL", gradleBuildFile); + addSwitch(SWAGGER_ANNOTATIONS, "generate swagger annotations to go alongside controllers and models", swaggerAnnotations); + addSwitch(SERVICE_INTERFACE, "generate service interfaces to go alongside controllers. In most " + + "cases this option would be used to update an existing project, so not to override implementations. " + + "Useful to help facilitate the generation gap pattern", serviceInterface); + addSwitch(SERVICE_IMPLEMENTATION, "generate stub service implementations that extends service " + + "interfaces. If this is set to true service interfaces will also be generated", serviceImplementation); + addSwitch(USE_BEANVALIDATION, "Use BeanValidation API annotations to validate data types", useBeanValidation); + + supportedLibraries.put(SPRING_BOOT, "Spring-boot Server application."); + setLibrary(SPRING_BOOT); + + CliOption cliOpt = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use"); + cliOpt.setDefault(SPRING_BOOT); + cliOpt.setEnum(supportedLibraries); + cliOptions.add(cliOpt); + } + + public String getResourceFolder() { + return this.resourceFolder; + } + + public void setResourceFolder(String resourceFolder) { + this.resourceFolder = resourceFolder; + } + + public String getBasePackage() { + return this.basePackage; + } + + public void setBasePackage(String basePackage) { + this.basePackage = basePackage; + } + + public String getServerPort() { + return this.serverPort; + } + + public void setServerPort(String serverPort) { + this.serverPort = serverPort; + } + + public boolean getExceptionHandler() { + return this.exceptionHandler; + } + + public void setExceptionHandler(boolean exceptionHandler) { + this.exceptionHandler = exceptionHandler; + } + + public boolean getGradleBuildFile() { + return this.gradleBuildFile; + } + + public void setGradleBuildFile(boolean gradleBuildFile) { + this.gradleBuildFile = gradleBuildFile; + } + + public boolean getSwaggerAnnotations() { + return this.swaggerAnnotations; + } + + public void setSwaggerAnnotations(boolean swaggerAnnotations) { + this.swaggerAnnotations = swaggerAnnotations; + } + + public boolean getServiceInterface() { + return this.serviceInterface; + } + + public void setServiceInterface(boolean serviceInterface) { + this.serviceInterface = serviceInterface; + } + + public boolean getServiceImplementation() { + return this.serviceImplementation; + } + + public void setServiceImplementation(boolean serviceImplementation) { + this.serviceImplementation = serviceImplementation; + } + + public boolean getUseBeanValidation() { + return this.useBeanValidation; + } + + @Override + public void setUseBeanValidation(boolean useBeanValidation) { + this.useBeanValidation = useBeanValidation; + } + + @Override + public CodegenType getTag() { + return CodegenType.SERVER; + } + + @Override + public String getName() { + return "kotlin-spring"; + } + + @Override + public String getHelp() { + return "Generates a Kotlin Spring application."; + } + + @Override + public void processOpts() { + super.processOpts(); + + typeMapping.put("date", "java.time.LocalDate"); + typeMapping.put("date-time", "java.time.OffsetDateTime"); + typeMapping.put("Date", "java.time.LocalDate"); + typeMapping.put("DateTime", "java.time.OffsetDateTime"); + + importMapping.put("Date", "java.time.LocalDate"); + importMapping.put("DateTime", "java.time.OffsetDateTime"); + + // optional jackson mappings for BigDecimal support + importMapping.put("ToStringSerializer", "com.fasterxml.jackson.databind.ser.std.ToStringSerializer"); + importMapping.put("JsonSerialize", "com.fasterxml.jackson.databind.annotation.JsonSerialize"); + + // Swagger import mappings + importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); + importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); + + // Jackson import mappings + importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue"); + importMapping.put("JsonCreator", "com.fasterxml.jackson.annotation.JsonCreator"); + importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); + importMapping.put("JsonSubTypes", "com.fasterxml.jackson.annotation.JsonSubTypes"); + importMapping.put("JsonTypeInfo", "com.fasterxml.jackson.annotation.JsonTypeInfo"); + // import JsonCreator if JsonProperty is imported + // used later in recursive import in postProcessingModels + importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator"); + + // TODO when adding invokerPackage + //importMapping.put("StringUtil", invokerPackage + ".StringUtil"); + + if (!additionalProperties.containsKey(CodegenConstants.LIBRARY)) { + additionalProperties.put(CodegenConstants.LIBRARY, library); + } + + if (additionalProperties.containsKey(BASE_PACKAGE)) { + this.setBasePackage((String) additionalProperties.get(BASE_PACKAGE)); + } else { + additionalProperties.put(BASE_PACKAGE, basePackage); + } + + if (additionalProperties.containsKey(SERVER_PORT)) { + this.setServerPort((String) additionalProperties.get(SERVER_PORT)); + } else { + additionalProperties.put(SERVER_PORT, serverPort); + } + + if (additionalProperties.containsKey(EXCEPTION_HANDLER)) { + this.setExceptionHandler(Boolean.valueOf(additionalProperties.get(EXCEPTION_HANDLER).toString())); + } + writePropertyBack(EXCEPTION_HANDLER, exceptionHandler); + + if (additionalProperties.containsKey(GRADLE_BUILD_FILE)) { + this.setGradleBuildFile(Boolean.valueOf(additionalProperties.get(GRADLE_BUILD_FILE).toString())); + } + writePropertyBack(GRADLE_BUILD_FILE, gradleBuildFile); + + if (additionalProperties.containsKey(SWAGGER_ANNOTATIONS)) { + this.setSwaggerAnnotations(Boolean.valueOf(additionalProperties.get(SWAGGER_ANNOTATIONS).toString())); + } + writePropertyBack(SWAGGER_ANNOTATIONS, swaggerAnnotations); + + if (additionalProperties.containsKey(SERVICE_INTERFACE)) { + this.setServiceInterface(Boolean.valueOf(additionalProperties.get(SERVICE_INTERFACE).toString())); + } + writePropertyBack(SERVICE_INTERFACE, serviceInterface); + + if (additionalProperties.containsKey(SERVICE_IMPLEMENTATION)) { + this.setServiceImplementation(Boolean.valueOf(additionalProperties.get(SERVICE_IMPLEMENTATION).toString())); + } + writePropertyBack(SERVICE_IMPLEMENTATION, serviceImplementation); + + if (additionalProperties.containsKey(USE_BEANVALIDATION)) { + this.setUseBeanValidation(convertPropertyToBoolean(USE_BEANVALIDATION)); + } + writePropertyBack(USE_BEANVALIDATION, useBeanValidation); + + modelTemplateFiles.put("model.mustache", ".kt"); + apiTemplateFiles.put("api.mustache", ".kt"); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + + if (this.serviceInterface) { + apiTemplateFiles.put("service.mustache", "Service.kt"); + } else if (this.serviceImplementation) { + LOGGER.warn("If you set `serviceImplementation` to true, `serviceInterface` will also be set to true"); + additionalProperties.put(SERVICE_INTERFACE, true); + apiTemplateFiles.put("service.mustache", "Service.kt"); + apiTemplateFiles.put("serviceImpl.mustache", "ServiceImpl.kt"); + } + + if (this.exceptionHandler) { + supportingFiles.add(new SupportingFile("exceptions.mustache", + sanitizeDirectory(sourceFolder + File.separator + apiPackage), "Exceptions.kt")); + } + + if (library.equals(SPRING_BOOT)) { + LOGGER.info("Setup code generator for Kotlin Spring Boot"); + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + + if (this.gradleBuildFile) { + supportingFiles.add(new SupportingFile("buildGradleKts.mustache", "", "build.gradle.kts")); + supportingFiles.add(new SupportingFile("settingsGradle.mustache", "", "settings.gradle")); + } + + supportingFiles.add(new SupportingFile("application.mustache", resourceFolder, "application.yaml")); + supportingFiles.add(new SupportingFile("springBootApplication.mustache", + sanitizeDirectory(sourceFolder + File.separator + basePackage), "Application.kt")); + } + + addMustacheLambdas(additionalProperties); + + // spring uses the jackson lib, and we disallow configuration. + additionalProperties.put("jackson", "true"); + } + + private void addMustacheLambdas(final Map objs) { + Map lambdas = + new ImmutableMap.Builder() + .put("escapeDoubleQuote", new EscapeLambda("\"", "\\\"")) + .build(); + + if (objs.containsKey(LAMBDA)) { + LOGGER.warn("The lambda property is a reserved word, and will be overwritten!"); + } + objs.put(LAMBDA, lambdas); + } + + @Override + public void preprocessOpenAPI(OpenAPI openAPI) { + super.preprocessOpenAPI(openAPI); + + if (!additionalProperties.containsKey(TITLE)) { + // The purpose of the title is for: + // - README documentation + // - The spring.application.name + // - And linking the @RequestMapping + // This is an additional step we add when pre-processing the API spec, if + // there is no user configuration set for the `title` of the project, + // we try build and normalise a title from the API spec itself. + String title = openAPI.getInfo().getTitle(); + + // Drop any API suffix + if (title != null) { + title = title.trim().replace(" ", "-"); + if (title.toUpperCase(Locale.ROOT).endsWith("API")) + title = title.substring(0, title.length() - 3); + + this.title = camelize(sanitizeName(title), true); + } + additionalProperties.put(TITLE, this.title); + } + + if (!additionalProperties.containsKey(SERVER_PORT)) { + URL url = URLPathUtils.getServerURL(openAPI); + this.additionalProperties.put(SERVER_PORT, URLPathUtils.getPort(url, 8080)); + } + + // TODO: Handle tags + } + + @Override + public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { + super.postProcessModelProperty(model, property); + + if ("null".equals(property.example)) { + property.example = null; + } + + //Add imports for Jackson + if (!Boolean.TRUE.equals(model.isEnum)) { + model.imports.add("JsonProperty"); + if (Boolean.TRUE.equals(model.hasEnums)) { + model.imports.add("JsonValue"); + } + + } else { + //Needed imports for Jackson's JsonCreator + if (additionalProperties.containsKey("jackson")) { + model.imports.add("JsonCreator"); + } + } + + } + + @Override + public Map postProcessModelsEnum(Map objs) { + objs = super.postProcessModelsEnum(objs); + + //Add imports for Jackson + List> imports = (List>) objs.get("imports"); + List models = (List) objs.get("models"); + + models.stream() + .map(mo -> (Map) mo) + .map(mo -> (CodegenModel) mo.get("model")) + .filter(cm -> Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) + .forEach(cm -> { + cm.imports.add(importMapping.get("JsonValue")); + Map item = new HashMap<>(); + item.put("import", importMapping.get("JsonValue")); + imports.add(item); + }); + + return objs; + } + + @Override + public Map postProcessOperationsWithModels(Map objs, List allModels) { + Map operations = (Map) objs.get("operations"); + if (operations != null) { + List ops = (List) operations.get("operation"); + ops.forEach(operation -> { + List responses = operation.responses; + if (responses != null) { + responses.forEach(resp -> { + + if ("0".equals(resp.code)) { + resp.code = "200"; + } + + doDataTypeAssignment(resp.dataType, new DataTypeAssigner() { + @Override + public void setReturnType(final String returnType) { + resp.dataType = returnType; + } + + @Override + public void setReturnContainer(final String returnContainer) { + resp.containerType = returnContainer; + } + }); + }); + } + doDataTypeAssignment(operation.returnType, new DataTypeAssigner() { + + @Override + public void setReturnType(final String returnType) { + operation.returnType = returnType; + } + + @Override + public void setReturnContainer(final String returnContainer) { + operation.returnContainer = returnContainer; + } + }); +// if(implicitHeaders){ +// removeHeadersFromAllParams(operation.allParams); +// } + }); + } + + return objs; + } + + private interface DataTypeAssigner { + void setReturnType(String returnType); + + void setReturnContainer(String returnContainer); + } + + /** + * @param returnType The return type that needs to be converted + * @param dataTypeAssigner An object that will assign the data to the respective fields in the model. + */ + private void doDataTypeAssignment(final String returnType, DataTypeAssigner dataTypeAssigner) { + if (returnType == null) { + dataTypeAssigner.setReturnType("Unit"); + } else if (returnType.startsWith("kotlin.Array")) { + int end = returnType.lastIndexOf(">"); + if (end > 0) { + dataTypeAssigner.setReturnType(returnType.substring("kotlin.Array<".length(), end).trim()); + dataTypeAssigner.setReturnContainer("List"); + } + } else if (returnType.startsWith("kotlin.collections.Map")) { + int end = returnType.lastIndexOf(">"); + if (end > 0) { + dataTypeAssigner.setReturnType(returnType.substring("kotlin.collections.Map<".length(), end).split(",")[1].trim()); + dataTypeAssigner.setReturnContainer("Map"); + } + } + } + + private static String sanitizeDirectory(String in) { + return in.replace(".", File.separator); + } + + // TODO could probably be made more generic, and moved to the `mustache` package if required by other components. + private static class EscapeLambda implements Mustache.Lambda { + private String from; + private String to; + + EscapeLambda(final String from, final String to) { + this.from = from; + this.to = Matcher.quoteReplacement(to); + } + + @Override + public void execute(Template.Fragment fragment, Writer writer) throws IOException { + writer.write(fragment.execute().replaceAll(from, to)); + } + } +} diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index a5c3d07b08a..5e27cd01c56 100644 --- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -91,3 +91,4 @@ org.openapitools.codegen.languages.TypeScriptFetchClientCodegen org.openapitools.codegen.languages.TypeScriptInversifyClientCodegen org.openapitools.codegen.languages.TypeScriptJqueryClientCodegen org.openapitools.codegen.languages.TypeScriptNodeClientCodegen +org.openapitools.codegen.languages.KotlinSpringServerCodegen diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache new file mode 100644 index 00000000000..0ab788eea19 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache @@ -0,0 +1,70 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +{{#swaggerAnnotations}} +import io.swagger.annotations.* +{{/swaggerAnnotations}} +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +{{#useBeanValidation}} +import org.springframework.validation.annotation.Validated +{{/useBeanValidation}} +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +{{#useBeanValidation}} +import javax.validation.Valid +import javax.validation.constraints.* +{{/useBeanValidation}} + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +{{#useBeanValidation}} +@Validated +{{/useBeanValidation}} +{{#swaggerAnnotations}} +@Api(value = "{{{baseName}}}", description = "The {{{baseName}}} API") +{{/swaggerAnnotations}} +{{=<% %>=}} +@RequestMapping("\${openapi.<%title%>.base-path:<%contextPath%>}") +<%={{ }}=%> +{{#operations}} +class {{classname}}Controller({{#serviceInterface}}@Autowired(required = true) val service: {{classname}}Service{{/serviceInterface}}) { +{{#operation}} + + {{#swaggerAnnotations}} + @ApiOperation( + value = "{{{summary}}}", + nickname = "{{{operationId}}}", + notes = "{{{notes}}}"{{#returnBaseType}}, + response = {{{returnBaseType}}}::class{{/returnBaseType}}{{#returnContainer}}, + responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, + authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}}, {{/hasMore}}{{/scopes}}]{{/isOAuth}}){{#hasMore}}, {{/hasMore}}{{/authMethods}}]{{/hasAuthMethods}}) + @ApiResponses( + value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{{message}}}"{{#baseType}}, response = {{{baseType}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{containerType}}}"{{/containerType}}){{#hasMore}},{{/hasMore}}{{/responses}}]){{/swaggerAnnotations}} + @RequestMapping( + value = ["{{#lambda.escapeDoubleQuote}}{{path}}{{/lambda.escapeDoubleQuote}}"],{{#singleContentTypes}}{{#hasProduces}} + produces = "{{{vendorExtensions.x-accepts}}}", {{/hasProduces}}{{#hasConsumes}} + consumes = "{{{vendorExtensions.x-contentType}}}",{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}} + produces = [{{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}}], {{/hasProduces}}{{#hasConsumes}} + consumes = [{{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}}],{{/hasConsumes}}{{/singleContentTypes}} + method = [RequestMethod.{{httpMethod}}]) + fun {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/allParams}}): ResponseEntity<{{>returnTypes}}> { + return {{>returnValue}} + } +{{/operation}} +} +{{/operations}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationModel.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationModel.mustache new file mode 100644 index 00000000000..0564f1e3630 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationModel.mustache @@ -0,0 +1,20 @@ +{{#pattern}}@get:Pattern(regexp="{{{pattern}}}") {{/pattern}}{{! +minLength && maxLength set +}}{{#minLength}}{{#maxLength}}@get:Size(min={{minLength}},max={{maxLength}}) {{/maxLength}}{{/minLength}}{{! +minLength set, maxLength not +}}{{#minLength}}{{^maxLength}}@get:Size(min={{minLength}}) {{/maxLength}}{{/minLength}}{{! +minLength not set, maxLength set +}}{{^minLength}}{{#maxLength}}@get:Size(max={{maxLength}}) {{/maxLength}}{{/minLength}}{{! +@Size: minItems && maxItems set +}}{{#minItems}}{{#maxItems}}@get:Size(min={{minItems}},max={{maxItems}}) {{/maxItems}}{{/minItems}}{{! +@Size: minItems set, maxItems not +}}{{#minItems}}{{^maxItems}}@get:Size(min={{minItems}}) {{/maxItems}}{{/minItems}}{{! +@Size: minItems not set && maxItems set +}}{{^minItems}}{{#maxItems}}@get:Size(max={{maxItems}}) {{/maxItems}}{{/minItems}}{{! +check for integer or long / all others=decimal type with @Decimal* +isInteger set +}}{{#isInteger}}{{#minimum}}@get:Min({{minimum}}){{/minimum}}{{#maximum}} @get:Max({{maximum}}) {{/maximum}}{{/isInteger}}{{! +isLong set +}}{{#isLong}}{{#minimum}}@get:Min({{minimum}}L){{/minimum}}{{#maximum}} @get:Max({{maximum}}L) {{/maximum}}{{/isLong}}{{! +Not Integer, not Long => we have a decimal value! +}}{{^isInteger}}{{^isLong}}{{#minimum}}@get:DecimalMin("{{minimum}}"){{/minimum}}{{#maximum}} @get:DecimalMax("{{maximum}}") {{/maximum}}{{/isLong}}{{/isInteger}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPath.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPath.mustache new file mode 100644 index 00000000000..4b7b561ce70 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPath.mustache @@ -0,0 +1,20 @@ +{{#pattern}}@Pattern(regexp="{{{pattern}}}") {{/pattern}}{{! +minLength && maxLength set +}}{{#minLength}}{{#maxLength}}@Size(min={{minLength}},max={{maxLength}}) {{/maxLength}}{{/minLength}}{{! +minLength set, maxLength not +}}{{#minLength}}{{^maxLength}}@Size(min={{minLength}}) {{/maxLength}}{{/minLength}}{{! +minLength not set, maxLength set +}}{{^minLength}}{{#maxLength}}@Size(max={{maxLength}}) {{/maxLength}}{{/minLength}}{{! +@Size: minItems && maxItems set +}}{{#minItems}}{{#maxItems}}@Size(min={{minItems}},max={{maxItems}}) {{/maxItems}}{{/minItems}}{{! +@Size: minItems set, maxItems not +}}{{#minItems}}{{^maxItems}}@Size(min={{minItems}}) {{/maxItems}}{{/minItems}}{{! +@Size: minItems not set && maxItems set +}}{{^minItems}}{{#maxItems}}@Size(max={{maxItems}}) {{/maxItems}}{{/minItems}}{{! +check for integer or long / all others=decimal type with @Decimal* +isInteger set +}}{{#isInteger}}{{#minimum}}@Min({{minimum}}){{/minimum}}{{#maximum}} @Max({{maximum}}) {{/maximum}}{{/isInteger}}{{! +isLong set +}}{{#isLong}}{{#minimum}}@Min({{minimum}}L){{/minimum}}{{#maximum}} @Max({{maximum}}L) {{/maximum}}{{/isLong}}{{! +Not Integer, not Long => we have a decimal value! +}}{{^isInteger}}{{^isLong}}{{#minimum}}@DecimalMin("{{minimum}}"){{/minimum}}{{#maximum}} @DecimalMax("{{maximum}}") {{/maximum}}{{/isLong}}{{/isInteger}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPathParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPathParams.mustache new file mode 100644 index 00000000000..3c57e76be1a --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationPathParams.mustache @@ -0,0 +1 @@ +{{! PathParam is always required, no @NotNull necessary }}{{>beanValidationPath}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationQueryParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationQueryParams.mustache new file mode 100644 index 00000000000..cc53bc96232 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/beanValidationQueryParams.mustache @@ -0,0 +1 @@ +{{#required}}@NotNull {{/required}}{{>beanValidationPath}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache new file mode 100644 index 00000000000..041fcb4ccad --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache @@ -0,0 +1 @@ +{{#isBodyParam}}{{#swaggerAnnotations}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{^isContainer}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/swaggerAnnotations}} {{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestBody {{paramName}}: {{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isListContainer}}Mono{{/isListContainer}}{{#isListContainer}}Flux{{/isListContainer}}<{{{baseType}}}>{{/reactive}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache new file mode 100644 index 00000000000..aead2978801 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -0,0 +1,25 @@ +/** + * {{{description}}} +{{#vars}} + * @param {{name}} {{{description}}} +{{/vars}} + */ +data class {{classname}} ( +{{#requiredVars}} +{{>dataClassReqVar}}{{^-last}}, +{{/-last}}{{/requiredVars}}{{#hasRequired}}{{#hasOptional}}, +{{/hasOptional}}{{/hasRequired}}{{#optionalVars}}{{>dataClassOptVar}}{{^-last}}, +{{/-last}}{{/optionalVars}} +) { +{{#hasEnums}}{{#vars}}{{#isEnum}} + /** + * {{{description}}} + * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} + */ + enum class {{nameInCamelCase}}(val value: {{{dataType}}}) { + {{#allowableValues}}{{#enumVars}} + @JsonProperty({{{value}}}) {{{name}}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} + {{/enumVars}}{{/allowableValues}} + } +{{/isEnum}}{{/vars}}{{/hasEnums}} +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache new file mode 100644 index 00000000000..52b6ae1157d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache @@ -0,0 +1,4 @@ +{{#useBeanValidation}}{{#required}} + @get:NotNull {{/required}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swaggerAnnotations}} + @ApiModelProperty({{#example}}example = "{{{example}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swaggerAnnotations}} + @JsonProperty("{{{baseName}}}") val {{{name}}}: {{#isEnum}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache new file mode 100644 index 00000000000..e09ea971bea --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache @@ -0,0 +1,4 @@ +{{#useBeanValidation}}{{#required}} + @get:NotNull {{/required}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swaggerAnnotations}} + @ApiModelProperty({{#example}}example = "{{{example}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swaggerAnnotations}} + @JsonProperty("{{{baseName}}}") val {{{name}}}: {{#isEnum}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/enumClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/enumClass.mustache new file mode 100644 index 00000000000..2f24a1de76b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/enumClass.mustache @@ -0,0 +1,9 @@ +/** +* {{{description}}} +* Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} +*/ +enum class {{classname}}(val value: {{dataType}}) { +{{#allowableValues}}{{#enumVars}} + {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} +{{/enumVars}}{{/allowableValues}} +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/exceptions.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/exceptions.mustache new file mode 100644 index 00000000000..d85b8396fa5 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/exceptions.mustache @@ -0,0 +1,29 @@ +package {{apiPackage}} + +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + + +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache new file mode 100644 index 00000000000..0b6649b8945 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache @@ -0,0 +1 @@ +{{#isFormParam}}{{^isFile}}{{#swaggerAnnotations}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}}{{#allowableValues}}, allowableValues="{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{#-last}}{{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/swaggerAnnotations}} @RequestParam(value="{{baseName}}"{{#required}}, required=true{{/required}}{{^required}}, required=false{{/required}}) {{paramName}}: {{{dataType}}} {{/isFile}}{{#isFile}}{{#swaggerAnnotations}}@ApiParam(value = "file detail"){{/swaggerAnnotations}} {{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("file") {{baseName}}: MultipartFile{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache new file mode 100644 index 00000000000..aa702dc4546 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache @@ -0,0 +1 @@ +{{#isHeaderParam}}{{#swaggerAnnotations}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{#-last}}{{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/swaggerAnnotations}} @RequestHeader(value="{{baseName}}", required={{#required}}true{{/required}}{{^required}}false{{/required}}) {{paramName}}: {{>optionalDataType}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/README.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/README.mustache new file mode 100644 index 00000000000..c25481e376b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/README.mustache @@ -0,0 +1,21 @@ +# {{#title}}{{title}}{{/title}}{{^title}}Generated Kotlin Spring Boot App{{/title}} + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/{{artifactId}}-{{artifactVersion}}.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/{{artifactId}}-{{artifactVersion}}.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:{{serverPort}}/) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache new file mode 100644 index 00000000000..b3245b77481 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache @@ -0,0 +1,3 @@ +spring.application.name={{title}} +server.port={{serverPort}} +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache new file mode 100644 index 00000000000..d8c488429f9 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache @@ -0,0 +1,47 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + jcenter() + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE") + } +} + +group = "{{groupId}}" +version = "{{artifactVersion}}" + +repositories { + jcenter() + mavenCentral() +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} + +plugins { + val kotlinVersion = "1.2.60" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "2.0.3.RELEASE" + id("io.spring.dependency-management") version "1.0.5.RELEASE" +} + +dependencies { + compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compile("org.jetbrains.kotlin:kotlin-reflect") + compile("org.springframework.boot:spring-boot-starter-web") +{{#swaggerAnnotations}} + compile("io.swagger:swagger-annotations:1.5.21") +{{/swaggerAnnotations}} + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + + testCompile("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache new file mode 100644 index 00000000000..fe2c87baaef --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache @@ -0,0 +1,109 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + 1.2.60 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 1.8 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + {{#swaggerAnnotations}} + + io.swagger + swagger-annotations + 1.5.21 + + {{/swaggerAnnotations}} + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + {{#useBeanValidation}} + + + javax.validation + validation-api + + {{/useBeanValidation}} + + diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/settingsGradle.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/settingsGradle.mustache new file mode 100644 index 00000000000..b8fd6c4c41f --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/settingsGradle.mustache @@ -0,0 +1 @@ +rootProject.name = "{{artifactId}}" \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/springBootApplication.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/springBootApplication.mustache new file mode 100644 index 00000000000..5b0d62ebf0a --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/springBootApplication.mustache @@ -0,0 +1,14 @@ +package {{basePackage}} + +import org.springframework.boot.runApplication +import org.springframework.context.annotation.ComponentScan +import org.springframework.boot.autoconfigure.SpringBootApplication + + +@SpringBootApplication +@ComponentScan(basePackages = ["{{basePackage}}", "{{apiPackage}}", "{{modelPackage}}"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/model.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/model.mustache new file mode 100644 index 00000000000..37e21201cff --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/model.mustache @@ -0,0 +1,18 @@ +package {{package}} + +import java.util.Objects +{{#imports}}import {{import}} +{{/imports}} +{{#useBeanValidation}} +import javax.validation.Valid +import javax.validation.constraints.* +{{/useBeanValidation}} +{{#swaggerAnnotations}} +import io.swagger.annotations.ApiModelProperty +{{/swaggerAnnotations}} + +{{#models}} +{{#model}} +{{#isEnum}}{{>enumClass}}{{/isEnum}}{{^isEnum}}{{>dataClass}}{{/isEnum}} +{{/model}} +{{/models}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/optionalDataType.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/optionalDataType.mustache new file mode 100644 index 00000000000..976950e27e8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/optionalDataType.mustache @@ -0,0 +1 @@ +{{#useOptional}}{{#required}}{{{dataType}}}{{/required}}{{^required}}Optional<{{{dataType}}}>{{/required}}{{/useOptional}}{{^useOptional}}{{{dataType}}}{{/useOptional}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache new file mode 100644 index 00000000000..d83b2d0469e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache @@ -0,0 +1 @@ +{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}{{#swaggerAnnotations}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}}{{#allowableValues}}, allowableValues = "{{#enumVars}}{{#lambda.escapeDoubleQuote}}{{{value}}}{{/lambda.escapeDoubleQuote}}{{^-last}}, {{/-last}}{{#-last}}{{/-last}}{{/enumVars}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}){{/swaggerAnnotations}} @PathVariable("{{baseName}}") {{paramName}}: {{>optionalDataType}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache new file mode 100644 index 00000000000..ecceefb0856 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache @@ -0,0 +1 @@ +{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swaggerAnnotations}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{#-last}}{{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{#useBeanValidation}}@Valid{{/useBeanValidation}}{{/swaggerAnnotations}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) {{paramName}}: {{>optionalDataType}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/returnTypes.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/returnTypes.mustache new file mode 100644 index 00000000000..67d79cc198c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/returnTypes.mustache @@ -0,0 +1 @@ +{{#isMapContainer}}{{#reactive}}Mono<{{/reactive}}Map{{/reactive}}>{{/isMapContainer}}{{#isListContainer}}{{#reactive}}Flux{{/reactive}}{{^reactive}}List{{/reactive}}<{{{returnType}}}>{{/isListContainer}}{{^returnContainer}}{{#reactive}}Mono<{{{returnType}}}>{{/reactive}}{{^reactive}}{{{returnType}}}{{/reactive}}{{/returnContainer}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/returnValue.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/returnValue.mustache new file mode 100644 index 00000000000..4973c83431d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/returnValue.mustache @@ -0,0 +1 @@ +{{#serviceInterface}}ResponseEntity(service.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}), HttpStatus.OK){{/serviceInterface}}{{^serviceInterface}}ResponseEntity(HttpStatus.NOT_IMPLEMENTED){{/serviceInterface}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache new file mode 100644 index 00000000000..32bb190ea6b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache @@ -0,0 +1,13 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +{{#operations}} +interface {{classname}}Service { +{{#operation}} + + fun {{operationId}}({{#allParams}}{{paramName}}: {{^isFile}}{{>optionalDataType}}{{/isFile}}{{#isFile}}org.springframework.web.multipart.MultipartFile{{/isFile}}{{#hasMore}},{{/hasMore}}{{/allParams}}): {{>returnTypes}} +{{/operation}} +} +{{/operations}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/serviceImpl.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/serviceImpl.mustache new file mode 100644 index 00000000000..d3dcedb061e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/serviceImpl.mustache @@ -0,0 +1,17 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import org.springframework.stereotype.Service + +@Service +{{#operations}} +class {{classname}}ServiceImpl : {{classname}}Service { +{{#operation}} + + override fun {{operationId}}({{#allParams}}{{paramName}}: {{^isFile}}{{>optionalDataType}}{{/isFile}}{{#isFile}}org.springframework.web.multipart.MultipartFile{{/isFile}}{{#hasMore}},{{/hasMore}}{{/allParams}}): {{>returnTypes}} { + TODO("Implement me") + } +{{/operation}} +} +{{/operations}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java new file mode 100644 index 00000000000..17ec8e74c20 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -0,0 +1,115 @@ +package org.openapitools.codegen.kotlin.spring; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.servers.Server; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.languages.KotlinSpringServerCodegen; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class KotlinSpringServerCodegenTest { + + @Test + public void testInitialConfigValues() throws Exception { + final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); + codegen.processOpts(); + + final OpenAPI openAPI = new OpenAPI(); + openAPI.addServersItem(new Server().url("https://api.abcde.xy:8082/v2")); + openAPI.setInfo(new Info()); + codegen.preprocessOpenAPI(openAPI); + + Assert.assertEquals(codegen.getLibrary(), KotlinSpringServerCodegen.SPRING_BOOT); + Assert.assertTrue(codegen.supportedLibraries().containsKey(KotlinSpringServerCodegen.SPRING_BOOT)); + + Assert.assertEquals(codegen.modelPackage(), "org.openapitools.model"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "org.openapitools.model"); + Assert.assertEquals(codegen.apiPackage(), "org.openapitools.api"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.API_PACKAGE), "org.openapitools.api"); + Assert.assertEquals(codegen.getBasePackage(), "org.openapitools"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.BASE_PACKAGE), "org.openapitools"); + Assert.assertEquals(codegen.getServerPort(), "8080"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVER_PORT), "8080"); + } + + @Test + public void testSettersForConfigValues() throws Exception { + final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); + codegen.setModelPackage("xx.yyyyyyyy.model"); + codegen.setApiPackage("xx.yyyyyyyy.api"); + codegen.setBasePackage("xx.yyyyyyyy.base"); + codegen.setServerPort("8181"); + codegen.setExceptionHandler(false); + codegen.setGradleBuildFile(false); + codegen.setSwaggerAnnotations(true); + codegen.setServiceInterface(true); + codegen.setServiceImplementation(true); + codegen.setUseBeanValidation(false); + codegen.processOpts(); + + Assert.assertEquals(codegen.modelPackage(), "xx.yyyyyyyy.model"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "xx.yyyyyyyy.model"); + Assert.assertEquals(codegen.apiPackage(), "xx.yyyyyyyy.api"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.API_PACKAGE), "xx.yyyyyyyy.api"); + Assert.assertEquals(codegen.getBasePackage(), "xx.yyyyyyyy.base"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.BASE_PACKAGE), "xx.yyyyyyyy.base"); + Assert.assertEquals(codegen.getServerPort(), "8181"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVER_PORT), "8181"); + Assert.assertFalse(codegen.getExceptionHandler()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.EXCEPTION_HANDLER), false); + Assert.assertFalse(codegen.getGradleBuildFile()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.GRADLE_BUILD_FILE), false); + Assert.assertTrue(codegen.getSwaggerAnnotations()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SWAGGER_ANNOTATIONS), true); + Assert.assertTrue(codegen.getServiceInterface()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVICE_INTERFACE), true); + Assert.assertTrue(codegen.getServiceImplementation()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION), true); + Assert.assertFalse(codegen.getUseBeanValidation()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.USE_BEANVALIDATION), false); + } + + @Test + public void testAdditionalPropertiesPutForConfigValues() throws Exception { + final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); + codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.yyyyy.mmmmm.model"); + codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.yyyyy.aaaaa.api"); + codegen.additionalProperties().put(KotlinSpringServerCodegen.BASE_PACKAGE, "xyz.yyyyy.bbbb.base"); + codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVER_PORT, "8088"); + codegen.additionalProperties().put(KotlinSpringServerCodegen.EXCEPTION_HANDLER, false); + codegen.additionalProperties().put(KotlinSpringServerCodegen.GRADLE_BUILD_FILE, false); + codegen.additionalProperties().put(KotlinSpringServerCodegen.SWAGGER_ANNOTATIONS, true); + codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_INTERFACE, true); + codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); + codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_BEANVALIDATION, false); + codegen.processOpts(); + + final OpenAPI openAPI = new OpenAPI(); + openAPI.addServersItem(new Server().url("https://api.abcde.xy:8082/v2")); + openAPI.setInfo(new Info()); + openAPI.getInfo().setTitle("Some test API"); + codegen.preprocessOpenAPI(openAPI); + + Assert.assertEquals(codegen.modelPackage(), "xyz.yyyyy.mmmmm.model"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.MODEL_PACKAGE), "xyz.yyyyy.mmmmm.model"); + Assert.assertEquals(codegen.apiPackage(), "xyz.yyyyy.aaaaa.api"); + Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.API_PACKAGE), "xyz.yyyyy.aaaaa.api"); + Assert.assertEquals(codegen.getBasePackage(), "xyz.yyyyy.bbbb.base"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.BASE_PACKAGE), "xyz.yyyyy.bbbb.base"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.TITLE), "someTest"); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVER_PORT), "8088"); + Assert.assertFalse(codegen.getExceptionHandler()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.EXCEPTION_HANDLER), false); + Assert.assertFalse(codegen.getGradleBuildFile()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.GRADLE_BUILD_FILE), false); + Assert.assertTrue(codegen.getSwaggerAnnotations()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SWAGGER_ANNOTATIONS), true); + Assert.assertTrue(codegen.getServiceInterface()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVICE_INTERFACE), true); + Assert.assertTrue(codegen.getServiceImplementation()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION), true); + Assert.assertFalse(codegen.getUseBeanValidation()); + Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.USE_BEANVALIDATION), false); + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator-ignore b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION new file mode 100644 index 00000000000..c791c986fbb --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/server/openapi3/petstore/kotlin-springboot/README.md b/samples/server/openapi3/petstore/kotlin-springboot/README.md new file mode 100644 index 00000000000..b6865a08113 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts b/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts new file mode 100644 index 00000000000..b5a8fef7453 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts @@ -0,0 +1,45 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + jcenter() + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE") + } +} + +group = "org.openapitools" +version = "1.0.0" + +repositories { + jcenter() + mavenCentral() +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} + +plugins { + val kotlinVersion = "1.2.60" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "2.0.3.RELEASE" + id("io.spring.dependency-management") version "1.0.5.RELEASE" +} + +dependencies { + compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compile("org.jetbrains.kotlin:kotlin-reflect") + compile("org.springframework.boot:spring-boot-starter-web") + compile("io.swagger:swagger-annotations:1.5.21") + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + + testCompile("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/pom.xml b/samples/server/openapi3/petstore/kotlin-springboot/pom.xml new file mode 100644 index 00000000000..fb79c82ccae --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/pom.xml @@ -0,0 +1,105 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 1.2.60 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 1.8 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + io.swagger + swagger-annotations + 1.5.21 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + javax.validation + validation-api + + + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/settings.gradle b/samples/server/openapi3/petstore/kotlin-springboot/settings.gradle new file mode 100644 index 00000000000..f0dd035311e --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "openapi-spring" \ No newline at end of file diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 00000000000..f2ee49d476b --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,14 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.context.annotation.ComponentScan +import org.springframework.boot.autoconfigure.SpringBootApplication + + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 00000000000..4d8400902aa --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,29 @@ +package org.openapitools.api + +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + + +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt new file mode 100644 index 00000000000..05aee6becb9 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -0,0 +1,159 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "Pet", description = "The Pet API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + @ApiOperation( + value = "Add a new pet to the store", + nickname = "addPet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + value = ["/pet"], + consumes = ["application/json", "application/xml"], + method = [RequestMethod.POST]) + fun addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody pet: Pet): ResponseEntity { + return ResponseEntity(service.addPet(pet), HttpStatus.OK) + } + + @ApiOperation( + value = "Deletes a pet", + nickname = "deletePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid pet value")]) + @RequestMapping( + value = ["/pet/{petId}"], + method = [RequestMethod.DELETE]) + fun deletePet(@ApiParam(value = "Pet id to delete", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) apiKey: kotlin.String): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.OK) + } + + @ApiOperation( + value = "Finds Pets by status", + nickname = "findPetsByStatus", + notes = "Multiple status values can be provided with comma separated strings", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + @RequestMapping( + value = ["/pet/findByStatus"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.Array): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.OK) + } + + @ApiOperation( + value = "Finds Pets by tags", + nickname = "findPetsByTags", + notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + @RequestMapping( + value = ["/pet/findByTags"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.Array): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.OK) + } + + @ApiOperation( + value = "Find pet by ID", + nickname = "getPetById", + notes = "Returns a single pet", + response = Pet::class, + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + @RequestMapping( + value = ["/pet/{petId}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getPetById(@ApiParam(value = "ID of pet to return", required=true) @PathVariable("petId") petId: kotlin.Long): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.OK) + } + + @ApiOperation( + value = "Update an existing pet", + nickname = "updatePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + @RequestMapping( + value = ["/pet"], + consumes = ["application/json", "application/xml"], + method = [RequestMethod.PUT]) + fun updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody pet: Pet): ResponseEntity { + return ResponseEntity(service.updatePet(pet), HttpStatus.OK) + } + + @ApiOperation( + value = "Updates a pet in the store with form data", + nickname = "updatePetWithForm", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + value = ["/pet/{petId}"], + consumes = ["application/x-www-form-urlencoded"], + method = [RequestMethod.POST]) + fun updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) name: kotlin.String ,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) status: kotlin.String ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.OK) + } + + @ApiOperation( + value = "uploads an image", + nickname = "uploadFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + @RequestMapping( + value = ["/pet/{petId}/uploadImage"], + produces = ["application/json"], + consumes = ["multipart/form-data"], + method = [RequestMethod.POST]) + fun uploadFile(@ApiParam(value = "ID of pet to update", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) additionalMetadata: kotlin.String ,@ApiParam(value = "file detail") @Valid @RequestPart("file") file: MultipartFile): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, additionalMetadata, file), HttpStatus.OK) + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 00000000000..e7bd7fae34e --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + fun addPet(pet: Pet): Unit + + fun deletePet(petId: kotlin.Long,apiKey: kotlin.String): Unit + + fun findPetsByStatus(status: kotlin.Array): List + + fun findPetsByTags(tags: kotlin.Array): List + + fun getPetById(petId: kotlin.Long): Pet + + fun updatePet(pet: Pet): Unit + + fun updatePetWithForm(petId: kotlin.Long,name: kotlin.String,status: kotlin.String): Unit + + fun uploadFile(petId: kotlin.Long,additionalMetadata: kotlin.String,file: org.springframework.web.multipart.MultipartFile): ModelApiResponse +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 00000000000..e898ab98921 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,41 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service + +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(pet: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long,apiKey: kotlin.String): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.Array): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.Array): List { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(pet: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long,name: kotlin.String,status: kotlin.String): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long,additionalMetadata: kotlin.String,file: org.springframework.web.multipart.MultipartFile): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt new file mode 100644 index 00000000000..fb6c7cb9a32 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -0,0 +1,93 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "Store", description = "The Store API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + @ApiOperation( + value = "Delete purchase order by ID", + nickname = "deleteOrder", + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + value = ["/store/order/{orderId}"], + method = [RequestMethod.DELETE]) + fun deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted", required=true) @PathVariable("orderId") orderId: kotlin.String): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.OK) + } + + @ApiOperation( + value = "Returns pet inventories by status", + nickname = "getInventory", + notes = "Returns a map of status codes to quantities", + response = kotlin.Int::class, + responseContainer = "Map", + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + @RequestMapping( + value = ["/store/inventory"], + produces = ["application/json"], + method = [RequestMethod.GET]) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.OK) + } + + @ApiOperation( + value = "Find purchase order by ID", + nickname = "getOrderById", + notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + value = ["/store/order/{orderId}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched", required=true) @PathVariable("orderId") orderId: kotlin.Long): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.OK) + } + + @ApiOperation( + value = "Place an order for a pet", + nickname = "placeOrder", + notes = "", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + @RequestMapping( + value = ["/store/order"], + produces = ["application/xml", "application/json"], + consumes = ["application/json"], + method = [RequestMethod.POST]) + fun placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody order: Order): ResponseEntity { + return ResponseEntity(service.placeOrder(order), HttpStatus.OK) + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 00000000000..5eb379cb185 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,14 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + fun deleteOrder(orderId: kotlin.String): Unit + + fun getInventory(): Map + + fun getOrderById(orderId: kotlin.Long): Order + + fun placeOrder(order: Order): Order +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 00000000000..87d2551740d --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,24 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service + +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(order: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt new file mode 100644 index 00000000000..4b88b867b13 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -0,0 +1,144 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "User", description = "The User API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + @ApiOperation( + value = "Create user", + nickname = "createUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user"], + consumes = ["application/json"], + method = [RequestMethod.POST]) + fun createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody user: User): ResponseEntity { + return ResponseEntity(service.createUser(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithArrayInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/createWithArray"], + consumes = ["application/json"], + method = [RequestMethod.POST]) + fun createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody user: kotlin.Array): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithListInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/createWithList"], + consumes = ["application/json"], + method = [RequestMethod.POST]) + fun createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody user: kotlin.Array): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Delete user", + nickname = "deleteUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + method = [RequestMethod.DELETE]) + fun deleteUser(@ApiParam(value = "The name that needs to be deleted", required=true) @PathVariable("username") username: kotlin.String): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.OK) + } + + @ApiOperation( + value = "Get user by user name", + nickname = "getUserByName", + notes = "", + response = User::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.", required=true) @PathVariable("username") username: kotlin.String): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.OK) + } + + @ApiOperation( + value = "Logs user into the system", + nickname = "loginUser", + notes = "", + response = kotlin.String::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + @RequestMapping( + value = ["/user/login"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.OK) + } + + @ApiOperation( + value = "Logs out current logged in user session", + nickname = "logoutUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/logout"], + method = [RequestMethod.GET]) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.OK) + } + + @ApiOperation( + value = "Updated user", + nickname = "updateUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + consumes = ["application/json"], + method = [RequestMethod.PUT]) + fun updateUser(@ApiParam(value = "name that need to be deleted", required=true) @PathVariable("username") username: kotlin.String,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody user: User): ResponseEntity { + return ResponseEntity(service.updateUser(username, user), HttpStatus.OK) + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 00000000000..4b913ace3db --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,22 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + fun createUser(user: User): Unit + + fun createUsersWithArrayInput(user: kotlin.Array): Unit + + fun createUsersWithListInput(user: kotlin.Array): Unit + + fun deleteUser(username: kotlin.String): Unit + + fun getUserByName(username: kotlin.String): User + + fun loginUser(username: kotlin.String,password: kotlin.String): kotlin.String + + fun logoutUser(): Unit + + fun updateUser(username: kotlin.String,user: User): Unit +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 00000000000..9600f607688 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,40 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service + +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(user: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(user: kotlin.Array): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(user: kotlin.Array): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String,password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String,user: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body.kt new file mode 100644 index 00000000000..440495ed85a --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param name Updated name of the pet + * @param status Updated status of the pet + */ +data class Body ( + + @ApiModelProperty(value = "Updated name of the pet") + @JsonProperty("name") val name: kotlin.String? = null, + + @ApiModelProperty(value = "Updated status of the pet") + @JsonProperty("status") val status: kotlin.String? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body1.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body1.kt new file mode 100644 index 00000000000..0b7b3dc8917 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Body1.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param additionalMetadata Additional data to pass to server + * @param file file to upload + */ +data class Body1 ( + + @ApiModelProperty(value = "Additional data to pass to server") + @JsonProperty("additionalMetadata") val additionalMetadata: kotlin.String? = null, + + @ApiModelProperty(value = "file to upload") + @JsonProperty("file") val file: java.io.File? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 00000000000..36d48aa0938 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("name") val name: kotlin.String? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 00000000000..9a259e9baa2 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,28 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse ( + + @ApiModelProperty(value = "") + @JsonProperty("code") val code: kotlin.Int? = null, + + @ApiModelProperty(value = "") + @JsonProperty("type") val type: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("message") val message: kotlin.String? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 00000000000..2a7a639a9cf --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,55 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("petId") val petId: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @ApiModelProperty(value = "") + @JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @ApiModelProperty(value = "Order Status") + @JsonProperty("status") val status: Order.Status? = null, + + @ApiModelProperty(value = "") + @JsonProperty("complete") val complete: kotlin.Boolean? = null +) { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(val value: kotlin.String) { + + @JsonProperty("placed") placed("placed"), + + @JsonProperty("approved") approved("approved"), + + @JsonProperty("delivered") delivered("delivered"); + + } + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 00000000000..29665f17797 --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,59 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A pet for sale in the pet store + * @param id + * @param category + * @param name + * @param photoUrls + * @param tags + * @param status pet status in the store + */ +data class Pet ( + + @get:NotNull + @ApiModelProperty(example = "doggie", required = true, value = "") + @JsonProperty("name") val name: kotlin.String, + + @get:NotNull + @ApiModelProperty(required = true, value = "") + @JsonProperty("photoUrls") val photoUrls: kotlin.Array, + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("category") val category: Category? = null, + + @ApiModelProperty(value = "") + @JsonProperty("tags") val tags: kotlin.Array? = null, + + @ApiModelProperty(value = "pet status in the store") + @JsonProperty("status") val status: Pet.Status? = null +) { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(val value: kotlin.String) { + + @JsonProperty("available") available("available"), + + @JsonProperty("pending") pending("pending"), + + @JsonProperty("sold") sold("sold"); + + } + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 00000000000..76b362380bf --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("name") val name: kotlin.String? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 00000000000..6ebdab0208c --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,48 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("username") val username: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("firstName") val firstName: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("lastName") val lastName: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("email") val email: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("password") val password: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("phone") val phone: kotlin.String? = null, + + @ApiModelProperty(value = "User Status") + @JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) { + +} + diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml b/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml new file mode 100644 index 00000000000..366e320d52c --- /dev/null +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring.application.name=openAPIPetstore +server.port=8080 +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION new file mode 100644 index 00000000000..c791c986fbb --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot/README.md b/samples/server/petstore/kotlin-springboot/README.md new file mode 100644 index 00000000000..b6865a08113 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot/build.gradle.kts b/samples/server/petstore/kotlin-springboot/build.gradle.kts new file mode 100644 index 00000000000..b5a8fef7453 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/build.gradle.kts @@ -0,0 +1,45 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + jcenter() + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.3.RELEASE") + } +} + +group = "org.openapitools" +version = "1.0.0" + +repositories { + jcenter() + mavenCentral() +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} + +plugins { + val kotlinVersion = "1.2.60" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "2.0.3.RELEASE" + id("io.spring.dependency-management") version "1.0.5.RELEASE" +} + +dependencies { + compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + compile("org.jetbrains.kotlin:kotlin-reflect") + compile("org.springframework.boot:spring-boot-starter-web") + compile("io.swagger:swagger-annotations:1.5.21") + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + + testCompile("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot/pom.xml b/samples/server/petstore/kotlin-springboot/pom.xml new file mode 100644 index 00000000000..fb79c82ccae --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/pom.xml @@ -0,0 +1,105 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 1.2.60 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.3.RELEASE + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 1.8 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + io.swagger + swagger-annotations + 1.5.21 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + javax.validation + validation-api + + + diff --git a/samples/server/petstore/kotlin-springboot/settings.gradle b/samples/server/petstore/kotlin-springboot/settings.gradle new file mode 100644 index 00000000000..f0dd035311e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "openapi-spring" \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 00000000000..f2ee49d476b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,14 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.context.annotation.ComponentScan +import org.springframework.boot.autoconfigure.SpringBootApplication + + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 00000000000..4d8400902aa --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,29 @@ +package org.openapitools.api + +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + + +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt new file mode 100644 index 00000000000..05aee6becb9 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -0,0 +1,159 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "Pet", description = "The Pet API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + @ApiOperation( + value = "Add a new pet to the store", + nickname = "addPet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + value = ["/pet"], + consumes = ["application/json", "application/xml"], + method = [RequestMethod.POST]) + fun addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody pet: Pet): ResponseEntity { + return ResponseEntity(service.addPet(pet), HttpStatus.OK) + } + + @ApiOperation( + value = "Deletes a pet", + nickname = "deletePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid pet value")]) + @RequestMapping( + value = ["/pet/{petId}"], + method = [RequestMethod.DELETE]) + fun deletePet(@ApiParam(value = "Pet id to delete", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) apiKey: kotlin.String): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.OK) + } + + @ApiOperation( + value = "Finds Pets by status", + nickname = "findPetsByStatus", + notes = "Multiple status values can be provided with comma separated strings", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + @RequestMapping( + value = ["/pet/findByStatus"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.Array): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.OK) + } + + @ApiOperation( + value = "Finds Pets by tags", + nickname = "findPetsByTags", + notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + @RequestMapping( + value = ["/pet/findByTags"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.Array): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.OK) + } + + @ApiOperation( + value = "Find pet by ID", + nickname = "getPetById", + notes = "Returns a single pet", + response = Pet::class, + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + @RequestMapping( + value = ["/pet/{petId}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getPetById(@ApiParam(value = "ID of pet to return", required=true) @PathVariable("petId") petId: kotlin.Long): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.OK) + } + + @ApiOperation( + value = "Update an existing pet", + nickname = "updatePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + @RequestMapping( + value = ["/pet"], + consumes = ["application/json", "application/xml"], + method = [RequestMethod.PUT]) + fun updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody pet: Pet): ResponseEntity { + return ResponseEntity(service.updatePet(pet), HttpStatus.OK) + } + + @ApiOperation( + value = "Updates a pet in the store with form data", + nickname = "updatePetWithForm", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")]) + @RequestMapping( + value = ["/pet/{petId}"], + consumes = ["application/x-www-form-urlencoded"], + method = [RequestMethod.POST]) + fun updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) name: kotlin.String ,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) status: kotlin.String ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.OK) + } + + @ApiOperation( + value = "uploads an image", + nickname = "uploadFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + @RequestMapping( + value = ["/pet/{petId}/uploadImage"], + produces = ["application/json"], + consumes = ["multipart/form-data"], + method = [RequestMethod.POST]) + fun uploadFile(@ApiParam(value = "ID of pet to update", required=true) @PathVariable("petId") petId: kotlin.Long,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) additionalMetadata: kotlin.String ,@ApiParam(value = "file detail") @Valid @RequestPart("file") file: MultipartFile): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, additionalMetadata, file), HttpStatus.OK) + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 00000000000..e7bd7fae34e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + fun addPet(pet: Pet): Unit + + fun deletePet(petId: kotlin.Long,apiKey: kotlin.String): Unit + + fun findPetsByStatus(status: kotlin.Array): List + + fun findPetsByTags(tags: kotlin.Array): List + + fun getPetById(petId: kotlin.Long): Pet + + fun updatePet(pet: Pet): Unit + + fun updatePetWithForm(petId: kotlin.Long,name: kotlin.String,status: kotlin.String): Unit + + fun uploadFile(petId: kotlin.Long,additionalMetadata: kotlin.String,file: org.springframework.web.multipart.MultipartFile): ModelApiResponse +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 00000000000..e898ab98921 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,41 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service + +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(pet: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long,apiKey: kotlin.String): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.Array): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.Array): List { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(pet: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long,name: kotlin.String,status: kotlin.String): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long,additionalMetadata: kotlin.String,file: org.springframework.web.multipart.MultipartFile): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt new file mode 100644 index 00000000000..fd682adb7c2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -0,0 +1,92 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "Store", description = "The Store API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + @ApiOperation( + value = "Delete purchase order by ID", + nickname = "deleteOrder", + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + value = ["/store/order/{orderId}"], + method = [RequestMethod.DELETE]) + fun deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted", required=true) @PathVariable("orderId") orderId: kotlin.String): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.OK) + } + + @ApiOperation( + value = "Returns pet inventories by status", + nickname = "getInventory", + notes = "Returns a map of status codes to quantities", + response = kotlin.Int::class, + responseContainer = "Map", + authorizations = [Authorization(value = "api_key")]) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + @RequestMapping( + value = ["/store/inventory"], + produces = ["application/json"], + method = [RequestMethod.GET]) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.OK) + } + + @ApiOperation( + value = "Find purchase order by ID", + nickname = "getOrderById", + notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + @RequestMapping( + value = ["/store/order/{orderId}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched", required=true) @PathVariable("orderId") orderId: kotlin.Long): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.OK) + } + + @ApiOperation( + value = "Place an order for a pet", + nickname = "placeOrder", + notes = "", + response = Order::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + @RequestMapping( + value = ["/store/order"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.POST]) + fun placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody order: Order): ResponseEntity { + return ResponseEntity(service.placeOrder(order), HttpStatus.OK) + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 00000000000..5eb379cb185 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,14 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + fun deleteOrder(orderId: kotlin.String): Unit + + fun getInventory(): Map + + fun getOrderById(orderId: kotlin.Long): Order + + fun placeOrder(order: Order): Order +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 00000000000..87d2551740d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,24 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service + +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(order: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt new file mode 100644 index 00000000000..cc275f82f4c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -0,0 +1,140 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.annotations.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestPart +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMethod +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.multipart.MultipartFile +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.* + +import kotlin.collections.List +import kotlin.collections.Map + +@Controller +@Validated +@Api(value = "User", description = "The User API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + @ApiOperation( + value = "Create user", + nickname = "createUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user"], + method = [RequestMethod.POST]) + fun createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody user: User): ResponseEntity { + return ResponseEntity(service.createUser(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithArrayInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/createWithArray"], + method = [RequestMethod.POST]) + fun createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody user: kotlin.Array): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithListInput", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/createWithList"], + method = [RequestMethod.POST]) + fun createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody user: kotlin.Array): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(user), HttpStatus.OK) + } + + @ApiOperation( + value = "Delete user", + nickname = "deleteUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + method = [RequestMethod.DELETE]) + fun deleteUser(@ApiParam(value = "The name that needs to be deleted", required=true) @PathVariable("username") username: kotlin.String): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.OK) + } + + @ApiOperation( + value = "Get user by user name", + nickname = "getUserByName", + notes = "", + response = User::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.", required=true) @PathVariable("username") username: kotlin.String): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.OK) + } + + @ApiOperation( + value = "Logs user into the system", + nickname = "loginUser", + notes = "", + response = kotlin.String::class) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + @RequestMapping( + value = ["/user/login"], + produces = ["application/xml", "application/json"], + method = [RequestMethod.GET]) + fun loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.OK) + } + + @ApiOperation( + value = "Logs out current logged in user session", + nickname = "logoutUser", + notes = "") + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")]) + @RequestMapping( + value = ["/user/logout"], + method = [RequestMethod.GET]) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.OK) + } + + @ApiOperation( + value = "Updated user", + nickname = "updateUser", + notes = "This can only be done by the logged in user.") + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + @RequestMapping( + value = ["/user/{username}"], + method = [RequestMethod.PUT]) + fun updateUser(@ApiParam(value = "name that need to be deleted", required=true) @PathVariable("username") username: kotlin.String,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody user: User): ResponseEntity { + return ResponseEntity(service.updateUser(username, user), HttpStatus.OK) + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 00000000000..4b913ace3db --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,22 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + fun createUser(user: User): Unit + + fun createUsersWithArrayInput(user: kotlin.Array): Unit + + fun createUsersWithListInput(user: kotlin.Array): Unit + + fun deleteUser(username: kotlin.String): Unit + + fun getUserByName(username: kotlin.String): User + + fun loginUser(username: kotlin.String,password: kotlin.String): kotlin.String + + fun logoutUser(): Unit + + fun updateUser(username: kotlin.String,user: User): Unit +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 00000000000..9600f607688 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,40 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service + +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(user: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(user: kotlin.Array): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(user: kotlin.Array): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String,password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String,user: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 00000000000..36d48aa0938 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("name") val name: kotlin.String? = null +) { + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 00000000000..9a259e9baa2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,28 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse ( + + @ApiModelProperty(value = "") + @JsonProperty("code") val code: kotlin.Int? = null, + + @ApiModelProperty(value = "") + @JsonProperty("type") val type: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("message") val message: kotlin.String? = null +) { + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 00000000000..2a7a639a9cf --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,55 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("petId") val petId: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @ApiModelProperty(value = "") + @JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @ApiModelProperty(value = "Order Status") + @JsonProperty("status") val status: Order.Status? = null, + + @ApiModelProperty(value = "") + @JsonProperty("complete") val complete: kotlin.Boolean? = null +) { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(val value: kotlin.String) { + + @JsonProperty("placed") placed("placed"), + + @JsonProperty("approved") approved("approved"), + + @JsonProperty("delivered") delivered("delivered"); + + } + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 00000000000..29665f17797 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,59 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A pet for sale in the pet store + * @param id + * @param category + * @param name + * @param photoUrls + * @param tags + * @param status pet status in the store + */ +data class Pet ( + + @get:NotNull + @ApiModelProperty(example = "doggie", required = true, value = "") + @JsonProperty("name") val name: kotlin.String, + + @get:NotNull + @ApiModelProperty(required = true, value = "") + @JsonProperty("photoUrls") val photoUrls: kotlin.Array, + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("category") val category: Category? = null, + + @ApiModelProperty(value = "") + @JsonProperty("tags") val tags: kotlin.Array? = null, + + @ApiModelProperty(value = "pet status in the store") + @JsonProperty("status") val status: Pet.Status? = null +) { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(val value: kotlin.String) { + + @JsonProperty("available") available("available"), + + @JsonProperty("pending") pending("pending"), + + @JsonProperty("sold") sold("sold"); + + } + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 00000000000..76b362380bf --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,24 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("name") val name: kotlin.String? = null +) { + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 00000000000..6ebdab0208c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,48 @@ +package org.openapitools.model + +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.* +import io.swagger.annotations.ApiModelProperty + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User ( + + @ApiModelProperty(value = "") + @JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(value = "") + @JsonProperty("username") val username: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("firstName") val firstName: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("lastName") val lastName: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("email") val email: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("password") val password: kotlin.String? = null, + + @ApiModelProperty(value = "") + @JsonProperty("phone") val phone: kotlin.String? = null, + + @ApiModelProperty(value = "User Status") + @JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) { + +} + diff --git a/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml new file mode 100644 index 00000000000..366e320d52c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring.application.name=openAPIPetstore +server.port=8080 +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file From 5926ee5f1f5d33c6947c6460ba0a06d9f7641bf1 Mon Sep 17 00:00:00 2001 From: Jack O'Sullivan Date: Tue, 28 Aug 2018 14:10:13 +0100 Subject: [PATCH 09/74] Add callback model (#861) * Add callback model (#372) This adds a new `CodegenCallback` class, a list of which is now present in `CodegenOperation`. `CodegenOperation` now also includes a `isCallbackRequest` boolean since `fromCallback()` (the method added to `DefaultCodegen` to process operations which contain OpenAPI callbacks) uses CodegenOperation as the model for a callback request. A `CodegenOperation` which represents a callback request will have a `null` operation id. A test is included for this new model. * Generate callback request `operationId` * Add license to `CodegenCallback` --- .../openapitools/codegen/CodegenCallback.java | 80 ++++++++++++++++ .../codegen/CodegenOperation.java | 9 +- .../openapitools/codegen/DefaultCodegen.java | 95 ++++++++++++++++++- .../codegen/DefaultCodegenTest.java | 61 ++++++++++-- .../src/test/resources/3_0/callbacks.yaml | 85 +++++++++++++++++ 5 files changed, 320 insertions(+), 10 deletions(-) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenCallback.java create mode 100644 modules/openapi-generator/src/test/resources/3_0/callbacks.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenCallback.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenCallback.java new file mode 100644 index 00000000000..3dcf7cfbeae --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenCallback.java @@ -0,0 +1,80 @@ +/* + * 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 + * + * http://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; + +import java.util.*; + +public class CodegenCallback { + public String name; + public boolean hasMore; + public List urls = new ArrayList<>(); + public Map vendorExtensions = new HashMap<>(); + + public static class Url { + public String expression; + public boolean hasMore; + public List requests = new ArrayList<>(); + public Map vendorExtensions = new HashMap<>(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Url that = (Url) o; + return Objects.equals(that.expression, expression) && Objects.equals(that.hasMore, hasMore) && + Objects.equals(that.requests, requests) && Objects.equals(that.vendorExtensions, vendorExtensions); + } + @Override + public int hashCode() { + return Objects.hash(expression, hasMore, requests, vendorExtensions); + } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("CodegenCallback.Urls {\n"); + sb.append(" expression: ").append(expression).append("\n"); + requests.forEach(r -> sb.append(" ").append(r).append("\n")); + sb.append("}"); + return sb.toString(); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CodegenCallback that = (CodegenCallback) o; + return Objects.equals(that.name, name) && Objects.equals(that.hasMore, hasMore) && + Objects.equals(that.urls, urls) && Objects.equals(that.vendorExtensions, vendorExtensions); + } + @Override + public int hashCode() { + return Objects.hash(name, hasMore, urls, vendorExtensions); + } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("CodegenCallback {\n"); + sb.append(" name: ").append(name).append("\n"); + urls.forEach(u -> sb.append(" ").append(u).append("\n")); + sb.append("}"); + return sb.toString(); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java index 1e66e45edef..acc15ba3212 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java @@ -36,7 +36,7 @@ public class CodegenOperation { isListContainer, isMultipart, hasMore = true, isResponseBinary = false, isResponseFile = false, hasReference = false, isRestfulIndex, isRestfulShow, isRestfulCreate, isRestfulUpdate, isRestfulDestroy, - isRestful, isDeprecated; + isRestful, isDeprecated, isCallbackRequest; public String path, operationId, returnType, httpMethod, returnBaseType, returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse; public CodegenDiscriminator discriminator; @@ -54,6 +54,7 @@ public class CodegenOperation { public List authMethods; public List tags; public List responses = new ArrayList(); + public List callbacks = new ArrayList<>(); public Set imports = new HashSet(); public List> examples; public List> requestBodyExamples; @@ -293,6 +294,8 @@ public class CodegenOperation { return false; if (isDeprecated != that.isDeprecated) return false; + if (isCallbackRequest != that.isCallbackRequest) + return false; if (path != null ? !path.equals(that.path) : that.path != null) return false; if (operationId != null ? !operationId.equals(that.operationId) : that.operationId != null) @@ -347,6 +350,8 @@ public class CodegenOperation { return false; if (responses != null ? !responses.equals(that.responses) : that.responses != null) return false; + if (callbacks != null ? !callbacks.equals(that.callbacks) : that.callbacks != null) + return false; if (imports != null ? !imports.equals(that.imports) : that.imports != null) return false; if (examples != null ? !examples.equals(that.examples) : that.examples != null) @@ -386,6 +391,7 @@ public class CodegenOperation { result = 31 * result + (isResponseFile ? 13:31); result = 31 * result + (hasReference ? 13:31); result = 31 * result + (isDeprecated ? 13:31); + result = 31 * result + (isCallbackRequest ? 13:31); result = 31 * result + (path != null ? path.hashCode() : 0); result = 31 * result + (operationId != null ? operationId.hashCode() : 0); result = 31 * result + (returnType != null ? returnType.hashCode() : 0); @@ -413,6 +419,7 @@ public class CodegenOperation { result = 31 * result + (authMethods != null ? authMethods.hashCode() : 0); result = 31 * result + (tags != null ? tags.hashCode() : 0); result = 31 * result + (responses != null ? responses.hashCode() : 0); + result = 31 * result + (callbacks != null ? callbacks.hashCode() : 0); result = 31 * result + (imports != null ? imports.hashCode() : 0); result = 31 * result + (examples != null ? examples.hashCode() : 0); result = 31 * result + (externalDocs != null ? externalDocs.hashCode() : 0); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 01017af3fad..0574a7bcc08 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -24,6 +24,7 @@ import com.samskivert.mustache.Mustache.Compiler; import io.swagger.v3.core.util.Json; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.callbacks.Callback; import io.swagger.v3.oas.models.examples.Example; import io.swagger.v3.oas.models.headers.Header; import io.swagger.v3.oas.models.media.ArraySchema; @@ -50,6 +51,7 @@ import io.swagger.v3.parser.util.SchemaTypeUtil; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.openapitools.codegen.CodegenDiscriminator.MappedModel; import org.openapitools.codegen.examples.ExampleGenerator; import org.openapitools.codegen.serializer.SerializerUtils; @@ -75,6 +77,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Stream; import java.util.stream.Collectors; public class DefaultCodegen implements CodegenConfig { @@ -2232,14 +2235,17 @@ public class DefaultCodegen implements CodegenConfig { Map schemas, OpenAPI openAPI) { LOGGER.debug("fromOperation => operation: " + operation); + if (operation == null) + throw new RuntimeException("operation cannot be null in fromOperation"); + CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); Set imports = new HashSet(); if (operation.getExtensions() != null && !operation.getExtensions().isEmpty()) { op.vendorExtensions.putAll(operation.getExtensions()); - } - if (operation == null) - throw new RuntimeException("operation cannot be null in fromOperation"); + Object isCallbackRequest = op.vendorExtensions.remove("x-callback-request"); + op.isCallbackRequest = Boolean.TRUE.equals(isCallbackRequest); + } // store the original operationId for plug-in op.operationIdOriginal = operation.getOperationId(); @@ -2253,6 +2259,7 @@ public class DefaultCodegen implements CodegenConfig { } } operationId = removeNonNameElementToCamelCase(operationId); + op.path = path; op.operationId = toOperationId(operationId); op.summary = escapeText(operation.getSummary()); @@ -2344,6 +2351,15 @@ public class DefaultCodegen implements CodegenConfig { } } + if (operation.getCallbacks() != null && !operation.getCallbacks().isEmpty()) { + operation.getCallbacks().forEach((name, callback) -> { + CodegenCallback c = fromCallback(name, callback, schemas, openAPI); + c.hasMore = true; + op.callbacks.add(c); + }); + op.callbacks.get(op.callbacks.size() - 1).hasMore = false; + } + List parameters = operation.getParameters(); List allParams = new ArrayList(); List bodyParams = new ArrayList(); @@ -2621,6 +2637,79 @@ public class DefaultCodegen implements CodegenConfig { return r; } + /** + * Convert OAS Callback object to Codegen Callback object + * + * @param name callback name + * @param callback OAS Callback object + * @param schemas a map of OAS models + * @param openAPI a OAS object representing the spec + * @return Codegen Response object + */ + public CodegenCallback fromCallback(String name, Callback callback, Map schemas, OpenAPI openAPI) { + CodegenCallback c = new CodegenCallback(); + c.name = name; + + if (callback.getExtensions() != null && !callback.getExtensions().isEmpty()) { + c.vendorExtensions.putAll(callback.getExtensions()); + } + + callback.forEach((expression, pi) -> { + CodegenCallback.Url u = new CodegenCallback.Url(); + u.expression = expression; + u.hasMore = true; + + if (pi.getExtensions() != null && !pi.getExtensions().isEmpty()) { + u.vendorExtensions.putAll(pi.getExtensions()); + } + + Stream.of( + Pair.of("get", pi.getGet()), + Pair.of("head", pi.getHead()), + Pair.of("put", pi.getPut()), + Pair.of("post", pi.getPost()), + Pair.of("delete", pi.getDelete()), + Pair.of("patch", pi.getPatch()), + Pair.of("options", pi.getOptions())) + .filter(p -> p.getValue() != null) + .forEach(p -> { + String method = p.getKey(); + Operation op = p.getValue(); + + boolean genId = op.getOperationId() == null; + if (genId) { + op.setOperationId(getOrGenerateOperationId(op, c.name+"_"+expression.replaceAll("\\{\\$.*}", ""), method)); + } + + if (op.getExtensions() == null) { + op.setExtensions(new HashMap<>()); + } + // This extension will be removed later by `fromOperation()` as it is only needed here to + // distinguish between normal operations and callback requests + op.getExtensions().put("x-callback-request", true); + + CodegenOperation co = fromOperation(expression, method, op, schemas, openAPI); + if (genId) { + co.operationIdOriginal = null; + // legacy (see `fromOperation()`) + co.nickname = co.operationId; + } + u.requests.add(co); + }); + + if (!u.requests.isEmpty()) { + u.requests.get(u.requests.size() - 1).hasMore = false; + } + c.urls.add(u); + }); + + if (!c.urls.isEmpty()) { + c.urls.get(c.urls.size() - 1).hasMore = false; + } + + return c; + } + /** * Convert OAS Parameter object to Codegen Parameter object * diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 2666cc2c6dd..cf78dbc1a99 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -38,12 +38,7 @@ import org.testng.Assert; import org.testng.annotations.Test; import java.lang.reflect.Method; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class DefaultCodegenTest { @@ -407,6 +402,60 @@ public class DefaultCodegenTest { verifyPersonDiscriminator(personModel.discriminator); } + @Test + public void testCallbacks() { + final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/callbacks.yaml", null, new ParseOptions()).getOpenAPI(); + final CodegenConfig codegen = new DefaultCodegen(); + + final String path = "/streams"; + Operation subscriptionOperation = openAPI.getPaths().get("/streams").getPost(); + CodegenOperation op = codegen.fromOperation(path, "post", subscriptionOperation, openAPI.getComponents().getSchemas(), openAPI); + + Assert.assertFalse(op.isCallbackRequest); + Assert.assertNotNull(op.operationId); + Assert.assertEquals(op.callbacks.size(), 2); + + CodegenCallback cbB = op.callbacks.get(1); + Assert.assertEquals(cbB.name, "dummy"); + Assert.assertFalse(cbB.hasMore); + Assert.assertEquals(cbB.urls.size(), 0); + + CodegenCallback cbA = op.callbacks.get(0); + Assert.assertEquals(cbA.name, "onData"); + Assert.assertTrue(cbA.hasMore); + + Assert.assertEquals(cbA.urls.size(), 2); + + CodegenCallback.Url urlB = cbA.urls.get(1); + Assert.assertEquals(urlB.expression, "{$request.query.callbackUrl}/test"); + Assert.assertFalse(urlB.hasMore); + Assert.assertEquals(urlB.requests.size(), 0); + + CodegenCallback.Url urlA = cbA.urls.get(0); + Assert.assertEquals(urlA.expression, "{$request.query.callbackUrl}/data"); + Assert.assertTrue(urlA.hasMore); + Assert.assertEquals(urlA.requests.size(), 2); + + urlA.requests.forEach(req -> { + Assert.assertTrue(req.isCallbackRequest); + Assert.assertNotNull(req.bodyParam); + Assert.assertEquals(req.responses.size(), 2); + + switch (req.httpMethod.toLowerCase(Locale.getDefault())) { + case "post": + Assert.assertEquals(req.operationId, "onDataDataPost"); + Assert.assertEquals(req.bodyParam.dataType, "NewNotificationData"); + break; + case "delete": + Assert.assertEquals(req.operationId, "onDataDataDelete"); + Assert.assertEquals(req.bodyParam.dataType, "DeleteNotificationData"); + break; + default: + Assert.fail(String.format(Locale.getDefault(), "invalid callback request http method '%s'", req.httpMethod)); + } + }); + } + private void verifyPersonDiscriminator(CodegenDiscriminator discriminator) { CodegenDiscriminator test = new CodegenDiscriminator(); test.setPropertyName("$_type"); diff --git a/modules/openapi-generator/src/test/resources/3_0/callbacks.yaml b/modules/openapi-generator/src/test/resources/3_0/callbacks.yaml new file mode 100644 index 00000000000..1423867789b --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/callbacks.yaml @@ -0,0 +1,85 @@ +openapi: 3.0.0 +info: + title: Callback Example + version: 1.0.0 +paths: + /streams: + post: + description: subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + onData: + '{$request.query.callbackUrl}/data': + post: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/NewNotificationData' + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates + delete: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteNotificationData' + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates + '{$request.query.callbackUrl}/test': {} + dummy: {} + +components: + schemas: + NewNotificationData: + description: subscription payload + properties: + timestamp: + type: string + format: date-time + userData: + type: string + DeleteNotificationData: + description: subscription payload + properties: + timestamp: + type: string + format: date-time From 4558e49c7ef1fc082ce0ae9f9d09444e54902a06 Mon Sep 17 00:00:00 2001 From: lukoyanov Date: Tue, 28 Aug 2018 17:48:05 +0300 Subject: [PATCH 10/74] [Java] Retrofit2 Play! Framework 2.6.x support (#901) * added play framework 2.6 support * generated petstore sample * generated petstore sample #2 * generated petstore sample #3 * Revert "generated petstore sample #3" * generated petstore sample #4 * fixed circleci configs * one more time samples regen --- CI/pom.xml.circleci | 1 + bin/java-petstore-retrofit2-play26.json | 1 + bin/java-petstore-retrofit2-play26.sh | 35 ++ .../codegen/languages/JavaClientCodegen.java | 26 +- .../libraries/retrofit2/build.gradle.mustache | 10 + .../libraries/retrofit2/build.sbt.mustache | 7 + .../retrofit2/play26/ApiClient.mustache | 205 +++++++ .../play26/Play26CallAdapterFactory.mustache | 116 ++++ .../play26/Play26CallFactory.mustache | 245 ++++++++ .../libraries/retrofit2/play26/api.mustache | 59 ++ .../Java/libraries/retrofit2/pom.mustache | 27 + .../okhttp-gson/.openapi-generator/VERSION | 2 +- .../java/okhttp-gson/docs/FakeApi.md | 8 +- .../org/openapitools/client/ApiClient.java | 6 +- .../java/org/openapitools/client/JSON.java | 18 +- .../org/openapitools/client/api/FakeApi.java | 17 +- .../client/model/ModelReturn.java | 16 +- .../petstore/java/retrofit2-play24/pom.xml | 2 + .../petstore/java/retrofit2-play25/pom.xml | 2 + .../petstore/java/retrofit2-play26/.gitignore | 21 + .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../java/retrofit2-play26/.travis.yml | 17 + .../petstore/java/retrofit2-play26/README.md | 39 ++ .../java/retrofit2-play26/build.gradle | 125 ++++ .../petstore/java/retrofit2-play26/build.sbt | 27 + .../docs/AdditionalPropertiesClass.md | 11 + .../java/retrofit2-play26/docs/Animal.md | 11 + .../java/retrofit2-play26/docs/AnimalFarm.md | 9 + .../retrofit2-play26/docs/AnotherFakeApi.md | 54 ++ .../docs/ArrayOfArrayOfNumberOnly.md | 10 + .../docs/ArrayOfNumberOnly.md | 10 + .../java/retrofit2-play26/docs/ArrayTest.md | 12 + .../retrofit2-play26/docs/Capitalization.md | 15 + .../java/retrofit2-play26/docs/Cat.md | 10 + .../java/retrofit2-play26/docs/Category.md | 11 + .../java/retrofit2-play26/docs/ClassModel.md | 10 + .../java/retrofit2-play26/docs/Client.md | 10 + .../java/retrofit2-play26/docs/Dog.md | 10 + .../java/retrofit2-play26/docs/EnumArrays.md | 27 + .../java/retrofit2-play26/docs/EnumClass.md | 14 + .../java/retrofit2-play26/docs/EnumTest.md | 48 ++ .../java/retrofit2-play26/docs/FakeApi.md | 555 ++++++++++++++++++ .../docs/FakeClassnameTags123Api.md | 64 ++ .../docs/FileSchemaTestClass.md | 11 + .../java/retrofit2-play26/docs/FormatTest.md | 22 + .../retrofit2-play26/docs/HasOnlyReadOnly.md | 11 + .../java/retrofit2-play26/docs/MapTest.md | 21 + ...dPropertiesAndAdditionalPropertiesClass.md | 12 + .../retrofit2-play26/docs/Model200Response.md | 11 + .../retrofit2-play26/docs/ModelApiResponse.md | 12 + .../java/retrofit2-play26/docs/ModelReturn.md | 10 + .../java/retrofit2-play26/docs/Name.md | 13 + .../java/retrofit2-play26/docs/NumberOnly.md | 10 + .../java/retrofit2-play26/docs/Order.md | 24 + .../retrofit2-play26/docs/OuterComposite.md | 12 + .../java/retrofit2-play26/docs/OuterEnum.md | 14 + .../java/retrofit2-play26/docs/Pet.md | 24 + .../java/retrofit2-play26/docs/PetApi.md | 494 ++++++++++++++++ .../retrofit2-play26/docs/ReadOnlyFirst.md | 11 + .../retrofit2-play26/docs/SpecialModelName.md | 10 + .../java/retrofit2-play26/docs/StoreApi.md | 195 ++++++ .../retrofit2-play26/docs/StringBooleanMap.md | 9 + .../java/retrofit2-play26/docs/Tag.md | 11 + .../java/retrofit2-play26/docs/User.md | 17 + .../java/retrofit2-play26/docs/UserApi.md | 360 ++++++++++++ .../java/retrofit2-play26/git_push.sh | 52 ++ .../java/retrofit2-play26/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53639 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../petstore/java/retrofit2-play26/gradlew | 160 +++++ .../java/retrofit2-play26/gradlew.bat | 90 +++ .../petstore/java/retrofit2-play26/pom.xml | 295 ++++++++++ .../retrofit2-play26/project/build.properties | 1 + .../java/retrofit2-play26/settings.gradle | 1 + .../src/main/AndroidManifest.xml | 3 + .../org/openapitools/client/ApiClient.java | 206 +++++++ .../client/CollectionFormats.java | 95 +++ .../java/org/openapitools/client/Pair.java | 52 ++ .../client/Play26CallAdapterFactory.java | 116 ++++ .../client/Play26CallFactory.java | 245 ++++++++ .../client/RFC3339DateFormat.java | 32 + .../org/openapitools/client/StringUtil.java | 55 ++ .../client/api/AnotherFakeApi.java | 39 ++ .../org/openapitools/client/api/FakeApi.java | 190 ++++++ .../client/api/FakeClassnameTags123Api.java | 39 ++ .../org/openapitools/client/api/PetApi.java | 142 +++++ .../org/openapitools/client/api/StoreApi.java | 67 +++ .../org/openapitools/client/api/UserApi.java | 113 ++++ .../openapitools/client/auth/ApiKeyAuth.java | 78 +++ .../client/auth/Authentication.java | 29 + .../model/AdditionalPropertiesClass.java | 136 +++++ .../org/openapitools/client/model/Animal.java | 125 ++++ .../openapitools/client/model/AnimalFarm.java | 68 +++ .../model/ArrayOfArrayOfNumberOnly.java | 105 ++++ .../client/model/ArrayOfNumberOnly.java | 105 ++++ .../openapitools/client/model/ArrayTest.java | 168 ++++++ .../client/model/Capitalization.java | 208 +++++++ .../org/openapitools/client/model/Cat.java | 95 +++ .../openapitools/client/model/Category.java | 116 ++++ .../openapitools/client/model/ClassModel.java | 94 +++ .../org/openapitools/client/model/Client.java | 93 +++ .../org/openapitools/client/model/Dog.java | 95 +++ .../openapitools/client/model/EnumArrays.java | 196 +++++++ .../openapitools/client/model/EnumClass.java | 61 ++ .../openapitools/client/model/EnumTest.java | 332 +++++++++++ .../client/model/FileSchemaTestClass.java | 128 ++++ .../openapitools/client/model/FormatTest.java | 393 +++++++++++++ .../client/model/HasOnlyReadOnly.java | 98 ++++ .../openapitools/client/model/MapTest.java | 227 +++++++ ...ropertiesAndAdditionalPropertiesClass.java | 156 +++++ .../client/model/Model200Response.java | 117 ++++ .../client/model/ModelApiResponse.java | 139 +++++ .../client/model/ModelReturn.java | 94 +++ .../org/openapitools/client/model/Name.java | 146 +++++ .../openapitools/client/model/NumberOnly.java | 95 +++ .../org/openapitools/client/model/Order.java | 247 ++++++++ .../client/model/OuterComposite.java | 141 +++++ .../openapitools/client/model/OuterEnum.java | 61 ++ .../org/openapitools/client/model/Pet.java | 266 +++++++++ .../client/model/ReadOnlyFirst.java | 107 ++++ .../client/model/SpecialModelName.java | 93 +++ .../client/model/StringBooleanMap.java | 67 +++ .../org/openapitools/client/model/Tag.java | 116 ++++ .../org/openapitools/client/model/User.java | 254 ++++++++ .../client/api/AnotherFakeApiTest.java | 32 + .../openapitools/client/api/FakeApiTest.java | 184 ++++++ .../api/FakeClassnameTags123ApiTest.java | 32 + .../openapitools/client/api/PetApiTest.java | 138 +++++ .../openapitools/client/api/StoreApiTest.java | 67 +++ .../openapitools/client/api/UserApiTest.java | 119 ++++ 131 files changed, 10842 insertions(+), 41 deletions(-) create mode 100644 bin/java-petstore-retrofit2-play26.json create mode 100755 bin/java-petstore-retrofit2-play26.sh create mode 100644 modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/ApiClient.mustache create mode 100644 modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallAdapterFactory.mustache create mode 100644 modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallFactory.mustache create mode 100644 modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/api.mustache create mode 100644 samples/client/petstore/java/retrofit2-play26/.gitignore create mode 100644 samples/client/petstore/java/retrofit2-play26/.openapi-generator-ignore create mode 100644 samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION create mode 100644 samples/client/petstore/java/retrofit2-play26/.travis.yml create mode 100644 samples/client/petstore/java/retrofit2-play26/README.md create mode 100644 samples/client/petstore/java/retrofit2-play26/build.gradle create mode 100644 samples/client/petstore/java/retrofit2-play26/build.sbt create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/AdditionalPropertiesClass.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Animal.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/AnimalFarm.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/AnotherFakeApi.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ArrayOfArrayOfNumberOnly.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ArrayOfNumberOnly.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ArrayTest.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Capitalization.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Cat.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Category.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ClassModel.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Client.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Dog.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/EnumArrays.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/EnumClass.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/EnumTest.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/FakeApi.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/FakeClassnameTags123Api.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/FileSchemaTestClass.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/FormatTest.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/HasOnlyReadOnly.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/MapTest.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/MixedPropertiesAndAdditionalPropertiesClass.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Model200Response.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ModelApiResponse.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ModelReturn.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Name.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/NumberOnly.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Order.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/OuterComposite.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/OuterEnum.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Pet.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/PetApi.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/ReadOnlyFirst.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/SpecialModelName.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/StoreApi.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/StringBooleanMap.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/Tag.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/User.md create mode 100644 samples/client/petstore/java/retrofit2-play26/docs/UserApi.md create mode 100644 samples/client/petstore/java/retrofit2-play26/git_push.sh create mode 100644 samples/client/petstore/java/retrofit2-play26/gradle.properties create mode 100644 samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/client/petstore/java/retrofit2-play26/gradlew create mode 100644 samples/client/petstore/java/retrofit2-play26/gradlew.bat create mode 100644 samples/client/petstore/java/retrofit2-play26/pom.xml create mode 100644 samples/client/petstore/java/retrofit2-play26/project/build.properties create mode 100644 samples/client/petstore/java/retrofit2-play26/settings.gradle create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/AndroidManifest.xml create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/ApiClient.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/CollectionFormats.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallAdapterFactory.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallFactory.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/RFC3339DateFormat.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/AnotherFakeApi.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeApi.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/PetApi.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/StoreApi.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/UserApi.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/Authentication.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Animal.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AnimalFarm.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Capitalization.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Cat.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Category.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ClassModel.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Client.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Dog.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumArrays.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumClass.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FormatTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MapTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Model200Response.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelApiResponse.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelReturn.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Name.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/NumberOnly.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Order.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterComposite.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterEnum.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Pet.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/SpecialModelName.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/StringBooleanMap.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Tag.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/User.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeApiTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/PetApiTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/StoreApiTest.java create mode 100644 samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/UserApiTest.java diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index 1d50c1410d8..072235afd59 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -899,6 +899,7 @@ samples/client/petstore/java/retrofit2 samples/client/petstore/java/retrofit2rx samples/client/petstore/java/retrofit2-play25 + samples/client/petstore/java/retrofit2-play26 samples/client/petstore/jaxrs-cxf-client samples/client/petstore/java/resttemplate samples/client/petstore/java/resttemplate-withXml diff --git a/bin/java-petstore-retrofit2-play26.json b/bin/java-petstore-retrofit2-play26.json new file mode 100644 index 00000000000..0c7456430d4 --- /dev/null +++ b/bin/java-petstore-retrofit2-play26.json @@ -0,0 +1 @@ +{"useBeanValidation":"true","enableBuilderSupport":"true","library":"retrofit2","usePlayWS":"true","playVersion":"play26"} diff --git a/bin/java-petstore-retrofit2-play26.sh b/bin/java-petstore-retrofit2-play26.sh new file mode 100755 index 00000000000..326f5fa5b3c --- /dev/null +++ b/bin/java-petstore-retrofit2-play26.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate --artifact-id petstore-java-client-retrofit2-play26 -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g java -c bin/java-petstore-retrofit2-play26.json -o samples/client/petstore/java/retrofit2-play26 -DhideGenerationTimestamp=true $@" + +echo "Removing files and folders under samples/client/petstore/java/retrofit2-play26/src/main" +rm -rf samples/client/petstore/java/retrofit2-play26/src/main +find samples/client/petstore/java/retrofit2-play26 -maxdepth 1 -type f ! -name "README.md" -exec rm {} + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index a7a5046ea3d..d5d16a62f8c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -17,10 +17,6 @@ package org.openapitools.codegen.languages; -import static com.google.common.base.CaseFormat.LOWER_CAMEL; -import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE; -import static java.util.Collections.sort; - import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; @@ -43,12 +39,14 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import static com.google.common.base.CaseFormat.LOWER_CAMEL; +import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE; +import static java.util.Collections.sort; + public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, PerformBeanValidationFeatures, GzipFeatures { @@ -67,6 +65,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen public static final String PLAY_24 = "play24"; public static final String PLAY_25 = "play25"; + public static final String PLAY_26 = "play26"; public static final String FEIGN = "feign"; public static final String GOOGLE_API_CLIENT = "google-api-client"; @@ -333,7 +332,9 @@ public class JavaClientCodegen extends AbstractJavaCodegen supportingFiles.add(new SupportingFile("play24/Play24CallFactory.mustache", invokerFolder, "Play24CallFactory.java")); supportingFiles.add(new SupportingFile("play24/Play24CallAdapterFactory.mustache", invokerFolder, "Play24CallAdapterFactory.java")); - } else { + } + + if (PLAY_25.equals(playVersion)) { additionalProperties.put(PLAY_25, true); apiTemplateFiles.put("play25/api.mustache", ".java"); @@ -344,6 +345,17 @@ public class JavaClientCodegen extends AbstractJavaCodegen additionalProperties.put("java8", "true"); } + if (PLAY_26.equals(playVersion)) { + additionalProperties.put(PLAY_26, true); + apiTemplateFiles.put("play26/api.mustache", ".java"); + + supportingFiles.add(new SupportingFile("play26/ApiClient.mustache", invokerFolder, "ApiClient.java")); + supportingFiles.add(new SupportingFile("play26/Play26CallFactory.mustache", invokerFolder, "Play26CallFactory.java")); + supportingFiles.add(new SupportingFile("play26/Play26CallAdapterFactory.mustache", invokerFolder, + "Play26CallAdapterFactory.java")); + additionalProperties.put("java8", "true"); + } + supportingFiles.add(new SupportingFile("play-common/auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java")); supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java")); diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache index 858b88971b2..cd9baeb50d3 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache @@ -129,6 +129,10 @@ ext { jackson_version = "2.7.8" play_version = "2.5.14" {{/play25}} + {{#play26}} + jackson_version = "2.8.10" + play_version = "2.6.7" + {{/play26}} {{/usePlayWS}} swagger_annotations_version = "1.5.17" junit_version = "4.12" @@ -171,7 +175,13 @@ dependencies { compile "org.threeten:threetenbp:$threetenbp_version" {{/threetenbp}} {{#usePlayWS}} + {{#play26}} + compile "com.typesafe.play:play-ahc-ws_2.12:$play_version" + compile "javax.validation:validation-api:1.1.0.Final" + {{/play26}} + {{^play26}} compile "com.typesafe.play:play-java-ws_2.11:$play_version" + {{/play26}} compile "com.squareup.retrofit2:converter-jackson:$retrofit_version" compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache index 66635daa973..b08e715a7bd 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache @@ -27,6 +27,13 @@ lazy val root = (project in file(".")). "com.fasterxml.jackson.core" % "jackson-annotations" % "2.7.8" % "compile", "com.fasterxml.jackson.core" % "jackson-databind" % "2.7.8" % "compile", {{/play25}} + {{#play26}} + "com.typesafe.play" % "play-ahc-ws_2.12" % "2.6.7" % "compile", + "javax.validation" % "validation-api" % "1.1.0.Final" % "compile", + "com.fasterxml.jackson.core" % "jackson-core" % "2.8.10" % "compile", + "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.10" % "compile", + "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.10" % "compile", + {{/play26}} "com.squareup.retrofit2" % "converter-jackson" % "2.3.0" % "compile", {{/usePlayWS}} {{#useRxJava}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/ApiClient.mustache new file mode 100644 index 00000000000..d59912773c8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/ApiClient.mustache @@ -0,0 +1,205 @@ +package {{invokerPackage}}; + +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import retrofit2.Converter; +import retrofit2.Retrofit; +import retrofit2.converter.scalars.ScalarsConverterFactory; +import retrofit2.converter.jackson.JacksonConverterFactory; + +import play.libs.Json; +import play.libs.ws.WSClient; + +import {{invokerPackage}}.Play26CallAdapterFactory; +import {{invokerPackage}}.Play26CallFactory; + +import okhttp3.Interceptor; +import okhttp3.ResponseBody; +import {{invokerPackage}}.auth.ApiKeyAuth; +import {{invokerPackage}}.auth.Authentication; + +/** + * API client + */ +public class ApiClient { + + /** Underlying HTTP-client */ + private WSClient wsClient; + + /** Creates HTTP call instances */ + private Play26CallFactory callFactory; + + /** Create {@link java.util.concurrent.CompletionStage} instances from HTTP calls */ + private Play26CallAdapterFactory callAdapterFactory; + + /** Supported auths */ + private Map authentications; + + /** API base path */ + private String basePath = "{{{basePath}}}"; + + /** Default ObjectMapper */ + private ObjectMapper defaultMapper; + + public ApiClient(WSClient wsClient) { + this(); + this.wsClient = wsClient; + } + + public ApiClient() { + // Setup authentications (key: authentication name, value: authentication). + authentications = new HashMap<>();{{#authMethods}}{{#isBasic}} + // authentications.put("{{name}}", new HttpBasicAuth());{{/isBasic}}{{#isApiKey}} + authentications.put("{{name}}", new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{^isKeyInHeader}}"query"{{/isKeyInHeader}}, "{{keyParamName}}"));{{/isApiKey}}{{#isOAuth}} + // authentications.put("{{name}}", new OAuth());{{/isOAuth}}{{/authMethods}} + // Prevent the authentications from being modified. + authentications = Collections.unmodifiableMap(authentications); + } + + /** + * Creates a retrofit2 client for given API interface + */ + public S createService(Class serviceClass) { + if(!basePath.endsWith("/")) { + basePath = basePath + "/"; + } + + Map extraHeaders = new HashMap<>(); + List extraQueryParams = new ArrayList<>(); + + for (String authName : authentications.keySet()) { + Authentication auth = authentications.get(authName); + if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + + auth.applyToParams(extraQueryParams, extraHeaders); + } + + if (callFactory == null) { + callFactory = new Play26CallFactory(wsClient, extraHeaders, extraQueryParams); + } + if (callAdapterFactory == null) { + callAdapterFactory = new Play26CallAdapterFactory(); + } + if (defaultMapper == null) { + defaultMapper = Json.mapper(); + } + + return new Retrofit.Builder() + .baseUrl(basePath) + .addConverterFactory(new FileConverter()) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(JacksonConverterFactory.create(defaultMapper)) + .callFactory(callFactory) + .addCallAdapterFactory(callAdapterFactory) + .build() + .create(serviceClass); + } + + /** + * Helper method to set API base path + */ + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + /** + * Get authentications (key: authentication name, value: authentication). + */ + public Map getAuthentications() { + return authentications; + } + + /** + * Get authentication for the given name. + * + * @param authName The authentication name + * @return The authentication, null if not found + */ + public Authentication getAuthentication(String authName) { + return authentications.get(authName); + } + + /** + * Helper method to set API key value for the first API key authentication. + */ + public ApiClient setApiKey(String apiKey) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKey(apiKey); + return this; + } + } + + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set API key prefix for the first API key authentication. + */ + public ApiClient setApiKeyPrefix(String apiKeyPrefix) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); + return this; + } + } + + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set HTTP call instances factory + */ + public ApiClient setCallFactory(Play26CallFactory callFactory) { + this.callFactory = callFactory; + return this; + } + + /** + * Helper method to set {@link java.util.concurrent.CompletionStage} instances factory + */ + public ApiClient setCallAdapterFactory(Play26CallAdapterFactory callAdapterFactory) { + this.callAdapterFactory = callAdapterFactory; + return this; + } + + /** + * Helper method to set Jackson's {@link ObjectMapper} + */ + public ApiClient setObjectMapper(ObjectMapper mapper) { + this.defaultMapper = mapper; + return this; + } + + static class FileConverter extends Converter.Factory { + + @Override + public Converter responseBodyConverter(Type type, + Annotation[] annotations, Retrofit retrofit) { + + if (!File.class.getTypeName().equals(type.getTypeName())) { + return null; + } + + return new Converter() { + + @Override + public File convert(ResponseBody value) throws IOException { + + File file = File.createTempFile("retrofit-file", ".tmp"); + Files.write(Paths.get(file.getPath()), value.bytes()); + return file; + } + }; + } + } + +} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallAdapterFactory.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallAdapterFactory.mustache new file mode 100644 index 00000000000..efbc0ac298b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallAdapterFactory.mustache @@ -0,0 +1,116 @@ +package {{invokerPackage}}; + +import java.util.concurrent.CompletionStage; +import retrofit2.*; + +import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.function.Function; + +/** + * Creates {@link CallAdapter} instances that convert {@link Call} into {@link java.util.concurrent.CompletionStage} + */ +public class Play26CallAdapterFactory extends CallAdapter.Factory { + + private Function exceptionConverter = Function.identity(); + + public Play26CallAdapterFactory() { + } + + public Play26CallAdapterFactory( + Function exceptionConverter) { + this.exceptionConverter = exceptionConverter; + } + + @Override + public CallAdapter get(Type returnType, Annotation[] annotations, Retrofit retrofit) { + if (!(returnType instanceof ParameterizedType)) { + return null; + } + + ParameterizedType type = (ParameterizedType) returnType; + if (type.getRawType() != CompletionStage.class) { + return null; + } + + return createAdapter((ParameterizedType) returnType); + } + + private CallAdapter> createAdapter(ParameterizedType returnType) { + // Get CompletionStage type argument + Type[] types = returnType.getActualTypeArguments(); + if (types.length != 1) { + throw new IllegalStateException("Must be exactly one type parameter"); + } + + Type resultType = types[0]; + Class rawTypeParam = getRawType(resultType); + + boolean includeResponse = false; + if (rawTypeParam == Response.class) { + if (!(resultType instanceof ParameterizedType)) { + throw new IllegalStateException("Response must be parameterized" + + " as Response"); + } + resultType = ((ParameterizedType) resultType).getActualTypeArguments()[0]; + includeResponse = true; + } + + return new ValueAdapter(resultType, includeResponse, exceptionConverter); + } + + /** + * Adpater that coverts values returned by API interface into CompletionStage + */ + private static final class ValueAdapter implements CallAdapter> { + + private final Type responseType; + private final boolean includeResponse; + private Function exceptionConverter; + + ValueAdapter(Type responseType, boolean includeResponse, + Function exceptionConverter) { + this.responseType = responseType; + this.includeResponse = includeResponse; + this.exceptionConverter = exceptionConverter; + } + + @Override + public Type responseType() { + return responseType; + } + + @Override + public CompletionStage adapt(final Call call) { + final CompletableFuture promise = new CompletableFuture(); + + call.enqueue(new Callback() { + + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + if (includeResponse) { + promise.complete((R) response); + } else { + promise.complete(response.body()); + } + } else { + promise.completeExceptionally(exceptionConverter.apply(new HttpException(response))); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + promise.completeExceptionally(t); + } + + }); + + return promise; + } + } +} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallFactory.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallFactory.mustache new file mode 100644 index 00000000000..6e4180341bf --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/Play26CallFactory.mustache @@ -0,0 +1,245 @@ +package {{invokerPackage}}; + +import okhttp3.*; +import okio.Buffer; +import okio.BufferedSource; +import play.libs.ws.WSClient; +import play.libs.ws.WSRequest; +import play.libs.ws.WSResponse; +import play.libs.ws.WSRequestFilter; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; + +/** + * Creates {@link Call} instances that invoke underlying {@link WSClient} + */ +public class Play26CallFactory implements okhttp3.Call.Factory { + + /** PlayWS http client */ + private final WSClient wsClient; + + /** Extra headers to add to request */ + private Map extraHeaders = new HashMap<>(); + + /** Extra query parameters to add to request */ + private List extraQueryParams = new ArrayList<>(); + + /** Filters (interceptors) */ + private List filters = new ArrayList<>(); + + /** Executor for WSClient */ + private Executor executor; + + public Play26CallFactory(WSClient wsClient) { + this.wsClient = wsClient; + } + + public Play26CallFactory(WSClient wsClient, List filters) { + this.wsClient = wsClient; + this.filters.addAll(filters); + } + + public Play26CallFactory(WSClient wsClient, Map extraHeaders, + List extraQueryParams) { + this.wsClient = wsClient; + + this.extraHeaders.putAll(extraHeaders); + this.extraQueryParams.addAll(extraQueryParams); + } + + public Play26CallFactory withExecutor(Executor executor) { + this.executor = executor; + return this; + } + + @Override + public Call newCall(Request request) { + // add extra headers + Request.Builder rb = request.newBuilder(); + for (Map.Entry header : this.extraHeaders.entrySet()) { + rb.addHeader(header.getKey(), header.getValue()); + } + + // add extra query params + if (!this.extraQueryParams.isEmpty()) { + String newQuery = request.url().uri().getQuery(); + for (Pair queryParam : this.extraQueryParams) { + String param = String.format("%s=%s", queryParam.getName(), queryParam.getValue()); + if (newQuery == null) { + newQuery = param; + } else { + newQuery += "&" + param; + } + } + + URI newUri; + try { + newUri = new URI(request.url().uri().getScheme(), request.url().uri().getAuthority(), + request.url().uri().getPath(), newQuery, request.url().uri().getFragment()); + rb.url(newUri.toURL()); + } catch (MalformedURLException | URISyntaxException e) { + throw new RuntimeException("Error while updating an url", e); + } + } + + return new PlayWSCall(wsClient, this.executor, this.filters, rb.build()); + } + + /** + * Call implementation that delegates to Play WS Client + */ + static class PlayWSCall implements Call { + + private final WSClient wsClient; + private WSRequest wsRequest; + private List filters; + private Executor executor = java.util.concurrent.ForkJoinPool.commonPool(); + + private final Request request; + + public PlayWSCall(WSClient wsClient, Executor executor, List filters, Request request) { + this.wsClient = wsClient; + this.request = request; + this.filters = filters; + + if (executor != null) { + this.executor = executor; + } + } + + @Override + public Request request() { + return request; + } + + @Override + public void enqueue(final okhttp3.Callback responseCallback) { + final Call call = this; + final CompletionStage promise = executeAsync(); + + promise.whenCompleteAsync((v, t) -> { + if (t != null) { + if (t instanceof IOException) { + responseCallback.onFailure(call, (IOException) t); + } else { + responseCallback.onFailure(call, new IOException(t)); + } + } else { + try { + responseCallback.onResponse(call, PlayWSCall.this.toWSResponse(v)); + } catch (Exception e) { + responseCallback.onFailure(call, new IOException(e)); + } + } + }, this.executor); + } + + CompletionStage executeAsync() { + try { + HttpUrl url = request.url(); + wsRequest = wsClient.url(url.scheme()+ "://" + url.host() + ":" + url.port() + url.encodedPath()); + url.queryParameterNames().forEach(queryParam -> { + wsRequest.addQueryParameter(queryParam, url.queryParameter(queryParam)); + }); + addHeaders(wsRequest); + if (request.body() != null) { + addBody(wsRequest); + } + filters.stream().forEach(f -> wsRequest.setRequestFilter(f)); + + return wsRequest.execute(request.method()); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + private void addHeaders(WSRequest wsRequest) { + for(Map.Entry> entry : request.headers().toMultimap().entrySet()) { + List values = entry.getValue(); + for (String value : values) { + wsRequest.setHeader(entry.getKey(), value); + } + } + } + + private void addBody(WSRequest wsRequest) throws IOException { + MediaType mediaType = request.body().contentType(); + if (mediaType != null) { + wsRequest.setContentType(mediaType.toString()); + } + + Buffer buffer = new Buffer(); + request.body().writeTo(buffer); + wsRequest.setBody(buffer.inputStream()); + } + + private Response toWSResponse(final WSResponse r) { + final Response.Builder builder = new Response.Builder(); + builder.request(request) + .code(r.getStatus()) + .body(new ResponseBody() { + + @Override + public MediaType contentType() { + return r.getSingleHeader("Content-Type") + .map(MediaType::parse) + .orElse(null); + } + + @Override + public long contentLength() { + return r.asByteArray().length; + } + + @Override + public BufferedSource source() { + return new Buffer().write(r.asByteArray()); + } + }); + + for (Map.Entry> entry : r.getAllHeaders().entrySet()) { + for (String value : entry.getValue()) { + builder.addHeader(entry.getKey(), value); + } + } + + builder.message(r.getStatusText()); + builder.protocol(Protocol.HTTP_1_1); + return builder.build(); + } + + @Override + public Response execute() throws IOException { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public void cancel() { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public PlayWSCall clone() { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public boolean isExecuted() { + return false; + } + + @Override + public boolean isCanceled() { + return false; + } + } +} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/api.mustache new file mode 100644 index 00000000000..b435a16c051 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/play26/api.mustache @@ -0,0 +1,59 @@ +package {{package}}; + +import {{invokerPackage}}.CollectionFormats.*; + +{{#useRxJava}}import rx.Observable;{{/useRxJava}} +{{#useRxJava2}}import io.reactivex.Observable;{{/useRxJava2}} +{{#doNotUseRx}}import retrofit2.Call;{{/doNotUseRx}} +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +{{#imports}}import {{import}}; +{{/imports}} + +{{^fullJavaUtil}} +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +{{/fullJavaUtil}} + +import java.util.concurrent.*; +import retrofit2.Response; + +{{#operations}} +public interface {{classname}} { + {{#operation}} + /** + * {{summary}} + * {{notes}} +{{#allParams}} + * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}} +{{/allParams}} + * @return Call<{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}> + */ + {{#formParams}} + {{#-first}} + {{#isMultipart}}@retrofit2.http.Multipart{{/isMultipart}}{{^isMultipart}}@retrofit2.http.FormUrlEncoded{{/isMultipart}} + {{/-first}} + {{/formParams}} + {{^formParams}} + {{#prioritizedContentTypes}} + {{#-first}} + @Headers({ + "Content-Type:{{{mediaType}}}" + }) + {{/-first}} + {{/prioritizedContentTypes}} + {{/formParams}} + @{{httpMethod}}("{{{path}}}") + CompletionStage> {{operationId}}({{^allParams}});{{/allParams}} + {{#allParams}}{{>libraries/retrofit2/queryParams}}{{>libraries/retrofit2/pathParams}}{{>libraries/retrofit2/headerParams}}{{>libraries/retrofit2/bodyParams}}{{>libraries/retrofit2/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}} + );{{/hasMore}}{{/allParams}} + + {{/operation}} +} +{{/operations}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache index f23642e46bb..8518053b809 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache @@ -300,11 +300,34 @@ {{/withXml}} + + {{#play24}} com.typesafe.play play-java-ws_2.11 ${play-version} + {{/play24}} + {{#play25}} + + com.typesafe.play + play-java-ws_2.11 + ${play-version} + + {{/play25}} + {{#play26}} + + com.typesafe.play + play-ahc-ws_2.12 + ${play-version} + + + javax.validation + validation-api + 1.1.0.Final + + {{/play26}} + {{/usePlayWS}} {{#parcelableModel}} @@ -341,6 +364,10 @@ 2.7.8 2.5.15 {{/play25}} + {{#play26}} + 2.8.10 + 2.6.7 + {{/play26}} {{/usePlayWS}} 2.3.0 {{#useRxJava}} diff --git a/samples/client/petstore-security-test/java/okhttp-gson/.openapi-generator/VERSION b/samples/client/petstore-security-test/java/okhttp-gson/.openapi-generator/VERSION index 096bf47efe3..c791c986fbb 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/.openapi-generator/VERSION +++ b/samples/client/petstore-security-test/java/okhttp-gson/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore-security-test/java/okhttp-gson/docs/FakeApi.md b/samples/client/petstore-security-test/java/okhttp-gson/docs/FakeApi.md index 362984cef7a..a125de0a897 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/docs/FakeApi.md +++ b/samples/client/petstore-security-test/java/okhttp-gson/docs/FakeApi.md @@ -1,6 +1,6 @@ # FakeApi -All URIs are relative to *petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r* +All URIs are relative to *http://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r* Method | HTTP request | Description ------------- | ------------- | ------------- @@ -13,6 +13,8 @@ Method | HTTP request | Description To test code injection *_/ ' \" =end -- \\r\\n \\n \\r +To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + ### Example ```java // Import classes: @@ -21,7 +23,7 @@ To test code injection *_/ ' \" =end -- \\r\\n \\n \\r FakeApi apiInstance = new FakeApi(); -Object UNKNOWN_BASE_TYPE = new UNKNOWN_BASE_TYPE(); // Object | +UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE = new UNKNOWN_BASE_TYPE(); // UNKNOWN_BASE_TYPE | try { apiInstance.testCodeInjectEndRnNR(UNKNOWN_BASE_TYPE); } catch (ApiException e) { @@ -34,7 +36,7 @@ try { Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **UNKNOWN_BASE_TYPE** | [**Object**](UNKNOWN_BASE_TYPE.md)| | [optional] + **UNKNOWN_BASE_TYPE** | [**UNKNOWN_BASE_TYPE**](UNKNOWN_BASE_TYPE.md)| | [optional] ### Return type diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java index e05519dae10..fb4236a0466 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java @@ -52,7 +52,7 @@ import org.openapitools.client.auth.OAuth; public class ApiClient { - private String basePath = "petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r"; + private String basePath = "http://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r"; private boolean debugging = false; private Map defaultHeaderMap = new HashMap(); private String tempFolderPath = null; @@ -107,7 +107,7 @@ public class ApiClient { /** * Set base path * - * @param basePath Base path of the URL (e.g petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r + * @param basePath Base path of the URL (e.g http://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r * @return An instance of OkHttpClient */ public ApiClient setBasePath(String basePath) { @@ -895,7 +895,7 @@ public class ApiClient { * @param Type * @param response Response * @param returnType Return type - * @throws ApiException If the response has a unsuccessful status code or + * @throws ApiException If the response has an unsuccessful status code or * fail to deserialize the response body * @return Type */ diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java index c9048812f0c..9f14cab573a 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java @@ -1,6 +1,6 @@ /* * OpenAPI Petstore *_/ ' \" =end -- \\r\\n \\n \\r - * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- * * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r @@ -15,21 +15,19 @@ package org.openapitools.client; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.TypeAdapter; import com.google.gson.internal.bind.util.ISO8601Utils; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import com.google.gson.JsonElement; import io.gsonfire.GsonFireBuilder; -import io.gsonfire.TypeSelector; +import okio.ByteString; +import org.openapitools.client.model.*; import org.threeten.bp.LocalDate; import org.threeten.bp.OffsetDateTime; import org.threeten.bp.format.DateTimeFormatter; -import org.openapitools.client.model.*; -import okio.ByteString; - import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Type; @@ -37,8 +35,8 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.ParsePosition; import java.util.Date; +import java.util.Locale; import java.util.Map; -import java.util.HashMap; public class JSON { private Gson gson; @@ -51,8 +49,10 @@ public class JSON { public static GsonBuilder createGson() { GsonFireBuilder fireBuilder = new GsonFireBuilder() + ; - return fireBuilder.createGsonBuilder(); + GsonBuilder builder = fireBuilder.createGsonBuilder(); + return builder; } private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) { @@ -64,7 +64,7 @@ public class JSON { } private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) { - Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase()); + Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase(Locale.ROOT)); if(null == clazz) { throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">"); } diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java index 2b03a1dbe80..d30884309a8 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java @@ -27,6 +27,7 @@ import com.google.gson.reflect.TypeToken; import java.io.IOException; +import org.openapitools.client.model.UNKNOWN_BASE_TYPE; import java.lang.reflect.Type; import java.util.ArrayList; @@ -61,7 +62,7 @@ public class FakeApi { * @return Call to execute * @throws ApiException If fail to serialize the request body object */ - public com.squareup.okhttp.Call testCodeInjectEndRnNRCall(Object UNKNOWN_BASE_TYPE, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + public com.squareup.okhttp.Call testCodeInjectEndRnNRCall(UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object localVarPostBody = UNKNOWN_BASE_TYPE; // create path and map variables @@ -103,7 +104,7 @@ public class FakeApi { } @SuppressWarnings("rawtypes") - private com.squareup.okhttp.Call testCodeInjectEndRnNRValidateBeforeCall(Object UNKNOWN_BASE_TYPE, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private com.squareup.okhttp.Call testCodeInjectEndRnNRValidateBeforeCall(UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { com.squareup.okhttp.Call call = testCodeInjectEndRnNRCall(UNKNOWN_BASE_TYPE, progressListener, progressRequestListener); @@ -113,35 +114,35 @@ public class FakeApi { /** * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r - * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r * @param UNKNOWN_BASE_TYPE (optional) * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ - public void testCodeInjectEndRnNR(Object UNKNOWN_BASE_TYPE) throws ApiException { + public void testCodeInjectEndRnNR(UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE) throws ApiException { testCodeInjectEndRnNRWithHttpInfo(UNKNOWN_BASE_TYPE); } /** * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r - * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r * @param UNKNOWN_BASE_TYPE (optional) * @return ApiResponse<Void> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ - public ApiResponse testCodeInjectEndRnNRWithHttpInfo(Object UNKNOWN_BASE_TYPE) throws ApiException { + public ApiResponse testCodeInjectEndRnNRWithHttpInfo(UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE) throws ApiException { com.squareup.okhttp.Call call = testCodeInjectEndRnNRValidateBeforeCall(UNKNOWN_BASE_TYPE, null, null); return apiClient.execute(call); } /** * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r (asynchronously) - * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r * @param UNKNOWN_BASE_TYPE (optional) * @param callback The callback to be executed when the API call finishes * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ - public com.squareup.okhttp.Call testCodeInjectEndRnNRAsync(Object UNKNOWN_BASE_TYPE, final ApiCallback callback) throws ApiException { + public com.squareup.okhttp.Call testCodeInjectEndRnNRAsync(UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE, final ApiCallback callback) throws ApiException { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/model/ModelReturn.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/model/ModelReturn.java index db937fd8170..54a34f836ac 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/model/ModelReturn.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/org/openapitools/client/model/ModelReturn.java @@ -1,6 +1,6 @@ /* * OpenAPI Petstore *_/ ' \" =end -- \\r\\n \\n \\r - * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- * * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r @@ -13,16 +13,11 @@ package org.openapitools.client.model; -import java.util.Objects; -import java.util.Arrays; -import com.google.gson.TypeAdapter; -import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import java.io.IOException; + +import java.util.Objects; /** * Model for testing reserved words *_/ ' \" =end -- \\r\\n \\n \\r @@ -30,7 +25,8 @@ import java.io.IOException; @ApiModel(description = "Model for testing reserved words *_/ ' \" =end -- \\r\\n \\n \\r") public class ModelReturn { - @SerializedName("return") + public static final String SERIALIZED_NAME_RETURN = "return"; + @SerializedName(SERIALIZED_NAME_RETURN) private Integer _return = null; public ModelReturn _return(Integer _return) { @@ -74,7 +70,7 @@ public class ModelReturn { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class ModelReturn {\n"); - + sb.append(" _return: ").append(toIndentedString(_return)).append("\n"); sb.append("}"); return sb.toString(); diff --git a/samples/client/petstore/java/retrofit2-play24/pom.xml b/samples/client/petstore/java/retrofit2-play24/pom.xml index 305b7e5e341..0ebc8092616 100644 --- a/samples/client/petstore/java/retrofit2-play24/pom.xml +++ b/samples/client/petstore/java/retrofit2-play24/pom.xml @@ -251,6 +251,7 @@ jackson-datatype-jsr310 ${jackson-version} + com.typesafe.play play-java-ws_2.11 @@ -258,6 +259,7 @@ + junit diff --git a/samples/client/petstore/java/retrofit2-play25/pom.xml b/samples/client/petstore/java/retrofit2-play25/pom.xml index 9181b7d41b4..e26afdebc70 100644 --- a/samples/client/petstore/java/retrofit2-play25/pom.xml +++ b/samples/client/petstore/java/retrofit2-play25/pom.xml @@ -256,6 +256,7 @@ jackson-datatype-jsr310 ${jackson-version} + com.typesafe.play play-java-ws_2.11 @@ -263,6 +264,7 @@ + junit diff --git a/samples/client/petstore/java/retrofit2-play26/.gitignore b/samples/client/petstore/java/retrofit2-play26/.gitignore new file mode 100644 index 00000000000..a530464afa1 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/.gitignore @@ -0,0 +1,21 @@ +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# exclude jar for gradle wrapper +!gradle/wrapper/*.jar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# build files +**/target +target +.gradle +build diff --git a/samples/client/petstore/java/retrofit2-play26/.openapi-generator-ignore b/samples/client/petstore/java/retrofit2-play26/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION b/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION new file mode 100644 index 00000000000..c791c986fbb --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/java/retrofit2-play26/.travis.yml b/samples/client/petstore/java/retrofit2-play26/.travis.yml new file mode 100644 index 00000000000..80a7f2fc66c --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/.travis.yml @@ -0,0 +1,17 @@ +# +# Generated by: https://openapi-generator.tech +# +language: java +jdk: + - oraclejdk8 + - oraclejdk7 +before_install: + # ensure gradlew has proper permission + - chmod a+x ./gradlew +script: + # test using maven + - mvn test + # uncomment below to test using gradle + # - gradle test + # uncomment below to test using sbt + # - sbt test diff --git a/samples/client/petstore/java/retrofit2-play26/README.md b/samples/client/petstore/java/retrofit2-play26/README.md new file mode 100644 index 00000000000..b15898583f7 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/README.md @@ -0,0 +1,39 @@ +# petstore-java-client-retrofit2-play26 + +## Requirements + +Building the API client library requires [Maven](https://maven.apache.org/) to be installed. + +## Installation & Usage + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn deploy +``` + +Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. + +After the client library is installed/deployed, you can use it in your Maven project by adding the following to your *pom.xml*: + +```xml + + org.openapitools + petstore-java-client-retrofit2-play26 + 1.0.0 + compile + + +``` + +## Author + + + + diff --git a/samples/client/petstore/java/retrofit2-play26/build.gradle b/samples/client/petstore/java/retrofit2-play26/build.gradle new file mode 100644 index 00000000000..e24d5f0643a --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/build.gradle @@ -0,0 +1,125 @@ +apply plugin: 'idea' +apply plugin: 'eclipse' + +group = 'org.openapitools' +version = '1.0.0' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.+' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 25 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + + install { + repositories.mavenInstaller { + pom.artifactId = 'petstore-java-client-retrofit2-play26' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + oltu_version = "1.0.1" + retrofit_version = "2.3.0" + jackson_version = "2.8.10" + play_version = "2.6.7" + swagger_annotations_version = "1.5.17" + junit_version = "4.12" + threetenbp_version = "1.3.5" + json_fire_version = "1.8.0" +} + +dependencies { + compile "com.squareup.retrofit2:retrofit:$retrofit_version" + compile "com.squareup.retrofit2:converter-scalars:$retrofit_version" + compile "com.squareup.retrofit2:converter-gson:$retrofit_version" + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile ("org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version"){ + exclude group:'org.apache.oltu.oauth2' , module: 'org.apache.oltu.oauth2.common' + } + compile "io.gsonfire:gson-fire:$json_fire_version" + compile "org.threeten:threetenbp:$threetenbp_version" + compile "com.typesafe.play:play-ahc-ws_2.12:$play_version" + compile "javax.validation:validation-api:1.1.0.Final" + compile "com.squareup.retrofit2:converter-jackson:$retrofit_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version" + + testCompile "junit:junit:$junit_version" +} diff --git a/samples/client/petstore/java/retrofit2-play26/build.sbt b/samples/client/petstore/java/retrofit2-play26/build.sbt new file mode 100644 index 00000000000..8a5dfc447be --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/build.sbt @@ -0,0 +1,27 @@ +lazy val root = (project in file(".")). + settings( + organization := "org.openapitools", + name := "petstore-java-client-retrofit2-play26", + version := "1.0.0", + scalaVersion := "2.11.4", + scalacOptions ++= Seq("-feature"), + javacOptions in compile ++= Seq("-Xlint:deprecation"), + publishArtifact in (Compile, packageDoc) := false, + resolvers += Resolver.mavenLocal, + libraryDependencies ++= Seq( + "com.squareup.retrofit2" % "retrofit" % "2.3.0" % "compile", + "com.squareup.retrofit2" % "converter-scalars" % "2.3.0" % "compile", + "com.typesafe.play" % "play-ahc-ws_2.12" % "2.6.7" % "compile", + "javax.validation" % "validation-api" % "1.1.0.Final" % "compile", + "com.fasterxml.jackson.core" % "jackson-core" % "2.8.10" % "compile", + "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.10" % "compile", + "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.10" % "compile", + "com.squareup.retrofit2" % "converter-jackson" % "2.3.0" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", + "org.threeten" % "threetenbp" % "1.3.5" % "compile", + "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", + "junit" % "junit" % "4.12" % "test", + "com.novocode" % "junit-interface" % "0.11" % "test" + ) + ) diff --git a/samples/client/petstore/java/retrofit2-play26/docs/AdditionalPropertiesClass.md b/samples/client/petstore/java/retrofit2-play26/docs/AdditionalPropertiesClass.md new file mode 100644 index 00000000000..0437c4dd8cc --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/AdditionalPropertiesClass.md @@ -0,0 +1,11 @@ + +# AdditionalPropertiesClass + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**mapProperty** | **Map<String, String>** | | [optional] +**mapOfMapProperty** | [**Map<String, Map<String, String>>**](Map.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Animal.md b/samples/client/petstore/java/retrofit2-play26/docs/Animal.md new file mode 100644 index 00000000000..b3f325c3524 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Animal.md @@ -0,0 +1,11 @@ + +# Animal + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**className** | **String** | | +**color** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/AnimalFarm.md b/samples/client/petstore/java/retrofit2-play26/docs/AnimalFarm.md new file mode 100644 index 00000000000..c7c7f1ddcce --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/AnimalFarm.md @@ -0,0 +1,9 @@ + +# AnimalFarm + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/AnotherFakeApi.md b/samples/client/petstore/java/retrofit2-play26/docs/AnotherFakeApi.md new file mode 100644 index 00000000000..c44a064755c --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/AnotherFakeApi.md @@ -0,0 +1,54 @@ +# AnotherFakeApi + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**call123testSpecialTags**](AnotherFakeApi.md#call123testSpecialTags) | **PATCH** another-fake/dummy | To test special tags + + + +# **call123testSpecialTags** +> Client call123testSpecialTags(client) + +To test special tags + +To test special tags and operation ID starting with number + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.AnotherFakeApi; + + +AnotherFakeApi apiInstance = new AnotherFakeApi(); +Client client = new Client(); // Client | client model +try { + Client result = apiInstance.call123testSpecialTags(client); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling AnotherFakeApi#call123testSpecialTags"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **client** | [**Client**](Client.md)| client model | + +### Return type + +[**Client**](Client.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfArrayOfNumberOnly.md b/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfArrayOfNumberOnly.md new file mode 100644 index 00000000000..77292549927 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfArrayOfNumberOnly.md @@ -0,0 +1,10 @@ + +# ArrayOfArrayOfNumberOnly + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**arrayArrayNumber** | [**List<List<BigDecimal>>**](List.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfNumberOnly.md b/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfNumberOnly.md new file mode 100644 index 00000000000..e8cc4cd36dc --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ArrayOfNumberOnly.md @@ -0,0 +1,10 @@ + +# ArrayOfNumberOnly + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**arrayNumber** | [**List<BigDecimal>**](BigDecimal.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ArrayTest.md b/samples/client/petstore/java/retrofit2-play26/docs/ArrayTest.md new file mode 100644 index 00000000000..9feee16427f --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ArrayTest.md @@ -0,0 +1,12 @@ + +# ArrayTest + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**arrayOfString** | **List<String>** | | [optional] +**arrayArrayOfInteger** | [**List<List<Long>>**](List.md) | | [optional] +**arrayArrayOfModel** | [**List<List<ReadOnlyFirst>>**](List.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Capitalization.md b/samples/client/petstore/java/retrofit2-play26/docs/Capitalization.md new file mode 100644 index 00000000000..0f3064c1996 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Capitalization.md @@ -0,0 +1,15 @@ + +# Capitalization + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**smallCamel** | **String** | | [optional] +**capitalCamel** | **String** | | [optional] +**smallSnake** | **String** | | [optional] +**capitalSnake** | **String** | | [optional] +**scAETHFlowPoints** | **String** | | [optional] +**ATT_NAME** | **String** | Name of the pet | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Cat.md b/samples/client/petstore/java/retrofit2-play26/docs/Cat.md new file mode 100644 index 00000000000..6e9f71ce7dd --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Cat.md @@ -0,0 +1,10 @@ + +# Cat + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**declawed** | **Boolean** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Category.md b/samples/client/petstore/java/retrofit2-play26/docs/Category.md new file mode 100644 index 00000000000..e2df0803278 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Category.md @@ -0,0 +1,11 @@ + +# Category + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**name** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ClassModel.md b/samples/client/petstore/java/retrofit2-play26/docs/ClassModel.md new file mode 100644 index 00000000000..64f880c8786 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ClassModel.md @@ -0,0 +1,10 @@ + +# ClassModel + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**propertyClass** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Client.md b/samples/client/petstore/java/retrofit2-play26/docs/Client.md new file mode 100644 index 00000000000..5c490ea166c --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Client.md @@ -0,0 +1,10 @@ + +# Client + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**client** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Dog.md b/samples/client/petstore/java/retrofit2-play26/docs/Dog.md new file mode 100644 index 00000000000..ac7cea323ff --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Dog.md @@ -0,0 +1,10 @@ + +# Dog + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**breed** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/EnumArrays.md b/samples/client/petstore/java/retrofit2-play26/docs/EnumArrays.md new file mode 100644 index 00000000000..4dddc0bfd27 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/EnumArrays.md @@ -0,0 +1,27 @@ + +# EnumArrays + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**justSymbol** | [**JustSymbolEnum**](#JustSymbolEnum) | | [optional] +**arrayEnum** | [**List<ArrayEnumEnum>**](#List<ArrayEnumEnum>) | | [optional] + + + +## Enum: JustSymbolEnum +Name | Value +---- | ----- +GREATER_THAN_OR_EQUAL_TO | ">=" +DOLLAR | "$" + + + +## Enum: List<ArrayEnumEnum> +Name | Value +---- | ----- +FISH | "fish" +CRAB | "crab" + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/EnumClass.md b/samples/client/petstore/java/retrofit2-play26/docs/EnumClass.md new file mode 100644 index 00000000000..c746edc3cb1 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/EnumClass.md @@ -0,0 +1,14 @@ + +# EnumClass + +## Enum + + +* `_ABC` (value: `"_abc"`) + +* `_EFG` (value: `"-efg"`) + +* `_XYZ_` (value: `"(xyz)"`) + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/EnumTest.md b/samples/client/petstore/java/retrofit2-play26/docs/EnumTest.md new file mode 100644 index 00000000000..ca048bcc515 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/EnumTest.md @@ -0,0 +1,48 @@ + +# EnumTest + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**enumString** | [**EnumStringEnum**](#EnumStringEnum) | | [optional] +**enumStringRequired** | [**EnumStringRequiredEnum**](#EnumStringRequiredEnum) | | +**enumInteger** | [**EnumIntegerEnum**](#EnumIntegerEnum) | | [optional] +**enumNumber** | [**EnumNumberEnum**](#EnumNumberEnum) | | [optional] +**outerEnum** | [**OuterEnum**](OuterEnum.md) | | [optional] + + + +## Enum: EnumStringEnum +Name | Value +---- | ----- +UPPER | "UPPER" +LOWER | "lower" +EMPTY | "" + + + +## Enum: EnumStringRequiredEnum +Name | Value +---- | ----- +UPPER | "UPPER" +LOWER | "lower" +EMPTY | "" + + + +## Enum: EnumIntegerEnum +Name | Value +---- | ----- +NUMBER_1 | 1 +NUMBER_MINUS_1 | -1 + + + +## Enum: EnumNumberEnum +Name | Value +---- | ----- +NUMBER_1_DOT_1 | 1.1 +NUMBER_MINUS_1_DOT_2 | -1.2 + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/FakeApi.md b/samples/client/petstore/java/retrofit2-play26/docs/FakeApi.md new file mode 100644 index 00000000000..2d5d6ba1369 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/FakeApi.md @@ -0,0 +1,555 @@ +# FakeApi + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**fakeOuterBooleanSerialize**](FakeApi.md#fakeOuterBooleanSerialize) | **POST** fake/outer/boolean | +[**fakeOuterCompositeSerialize**](FakeApi.md#fakeOuterCompositeSerialize) | **POST** fake/outer/composite | +[**fakeOuterNumberSerialize**](FakeApi.md#fakeOuterNumberSerialize) | **POST** fake/outer/number | +[**fakeOuterStringSerialize**](FakeApi.md#fakeOuterStringSerialize) | **POST** fake/outer/string | +[**testBodyWithFileSchema**](FakeApi.md#testBodyWithFileSchema) | **PUT** fake/body-with-file-schema | +[**testBodyWithQueryParams**](FakeApi.md#testBodyWithQueryParams) | **PUT** fake/body-with-query-params | +[**testClientModel**](FakeApi.md#testClientModel) | **PATCH** fake | To test \"client\" model +[**testEndpointParameters**](FakeApi.md#testEndpointParameters) | **POST** fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +[**testEnumParameters**](FakeApi.md#testEnumParameters) | **GET** fake | To test enum parameters +[**testInlineAdditionalProperties**](FakeApi.md#testInlineAdditionalProperties) | **POST** fake/inline-additionalProperties | test inline additionalProperties +[**testJsonFormData**](FakeApi.md#testJsonFormData) | **GET** fake/jsonFormData | test json serialization of form data + + + +# **fakeOuterBooleanSerialize** +> Boolean fakeOuterBooleanSerialize(body) + + + +Test serialization of outer boolean types + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +Boolean body = true; // Boolean | Input boolean as post body +try { + Boolean result = apiInstance.fakeOuterBooleanSerialize(body); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#fakeOuterBooleanSerialize"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | **Boolean**| Input boolean as post body | [optional] + +### Return type + +**Boolean** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: */* + + +# **fakeOuterCompositeSerialize** +> OuterComposite fakeOuterCompositeSerialize(outerComposite) + + + +Test serialization of object with outer number type + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +OuterComposite outerComposite = new OuterComposite(); // OuterComposite | Input composite as post body +try { + OuterComposite result = apiInstance.fakeOuterCompositeSerialize(outerComposite); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#fakeOuterCompositeSerialize"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **outerComposite** | [**OuterComposite**](OuterComposite.md)| Input composite as post body | [optional] + +### Return type + +[**OuterComposite**](OuterComposite.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: */* + + +# **fakeOuterNumberSerialize** +> BigDecimal fakeOuterNumberSerialize(body) + + + +Test serialization of outer number types + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +BigDecimal body = new BigDecimal(); // BigDecimal | Input number as post body +try { + BigDecimal result = apiInstance.fakeOuterNumberSerialize(body); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#fakeOuterNumberSerialize"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | **BigDecimal**| Input number as post body | [optional] + +### Return type + +[**BigDecimal**](BigDecimal.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: */* + + +# **fakeOuterStringSerialize** +> String fakeOuterStringSerialize(body) + + + +Test serialization of outer string types + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +String body = "body_example"; // String | Input string as post body +try { + String result = apiInstance.fakeOuterStringSerialize(body); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#fakeOuterStringSerialize"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | **String**| Input string as post body | [optional] + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: */* + + +# **testBodyWithFileSchema** +> testBodyWithFileSchema(fileSchemaTestClass) + + + +For this test, the body for this request much reference a schema named `File`. + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +FileSchemaTestClass fileSchemaTestClass = new FileSchemaTestClass(); // FileSchemaTestClass | +try { + apiInstance.testBodyWithFileSchema(fileSchemaTestClass); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testBodyWithFileSchema"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **fileSchemaTestClass** | [**FileSchemaTestClass**](FileSchemaTestClass.md)| | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + + +# **testBodyWithQueryParams** +> testBodyWithQueryParams(query, user) + + + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +String query = "query_example"; // String | +User user = new User(); // User | +try { + apiInstance.testBodyWithQueryParams(query, user); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testBodyWithQueryParams"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **query** | **String**| | + **user** | [**User**](User.md)| | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + + +# **testClientModel** +> Client testClientModel(client) + +To test \"client\" model + +To test \"client\" model + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +Client client = new Client(); // Client | client model +try { + Client result = apiInstance.testClientModel(client); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testClientModel"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **client** | [**Client**](Client.md)| client model | + +### Return type + +[**Client**](Client.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +# **testEndpointParameters** +> testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback) + +Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + +Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.FakeApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure HTTP basic authorization: http_basic_test +HttpBasicAuth http_basic_test = (HttpBasicAuth) defaultClient.getAuthentication("http_basic_test"); +http_basic_test.setUsername("YOUR USERNAME"); +http_basic_test.setPassword("YOUR PASSWORD"); + +FakeApi apiInstance = new FakeApi(); +BigDecimal number = new BigDecimal(); // BigDecimal | None +Double _double = 3.4D; // Double | None +String patternWithoutDelimiter = "null"; // String | None +byte[] _byte = null; // byte[] | None +Integer integer = null; // Integer | None +Integer int32 = null; // Integer | None +Long int64 = nullL; // Long | None +Float _float = nullF; // Float | None +String string = "null"; // String | None +File binary = new File("null"); // File | None +LocalDate date = new LocalDate(); // LocalDate | None +OffsetDateTime dateTime = new OffsetDateTime(); // OffsetDateTime | None +String password = "null"; // String | None +String paramCallback = "null"; // String | None +try { + apiInstance.testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testEndpointParameters"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **number** | **BigDecimal**| None | [default to null] + **_double** | **Double**| None | [default to null] + **patternWithoutDelimiter** | **String**| None | [default to null] + **_byte** | **byte[]**| None | [default to null] + **integer** | **Integer**| None | [optional] [default to null] + **int32** | **Integer**| None | [optional] [default to null] + **int64** | **Long**| None | [optional] [default to null] + **_float** | **Float**| None | [optional] [default to null] + **string** | **String**| None | [optional] [default to null] + **binary** | **File**| None | [optional] [default to null] + **date** | **LocalDate**| None | [optional] [default to null] + **dateTime** | **OffsetDateTime**| None | [optional] [default to null] + **password** | **String**| None | [optional] [default to null] + **paramCallback** | **String**| None | [optional] [default to null] + +### Return type + +null (empty response body) + +### Authorization + +[http_basic_test](../README.md#http_basic_test) + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + + +# **testEnumParameters** +> testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString) + +To test enum parameters + +To test enum parameters + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +List enumHeaderStringArray = Arrays.asList("enumHeaderStringArray_example"); // List | Header parameter enum test (string array) +String enumHeaderString = "-efg"; // String | Header parameter enum test (string) +List enumQueryStringArray = Arrays.asList("enumQueryStringArray_example"); // List | Query parameter enum test (string array) +String enumQueryString = "-efg"; // String | Query parameter enum test (string) +Integer enumQueryInteger = 56; // Integer | Query parameter enum test (double) +Double enumQueryDouble = 3.4D; // Double | Query parameter enum test (double) +List enumFormStringArray = "$"; // List | Form parameter enum test (string array) +String enumFormString = "-efg"; // String | Form parameter enum test (string) +try { + apiInstance.testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testEnumParameters"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **enumHeaderStringArray** | [**List<String>**](String.md)| Header parameter enum test (string array) | [optional] [enum: >, $] + **enumHeaderString** | **String**| Header parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] + **enumQueryStringArray** | [**List<String>**](String.md)| Query parameter enum test (string array) | [optional] [enum: >, $] + **enumQueryString** | **String**| Query parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] + **enumQueryInteger** | **Integer**| Query parameter enum test (double) | [optional] [enum: 1, -2] + **enumQueryDouble** | **Double**| Query parameter enum test (double) | [optional] [enum: 1.1, -1.2] + **enumFormStringArray** | [**List<String>**](String.md)| Form parameter enum test (string array) | [optional] [default to $] [enum: >, $] + **enumFormString** | **String**| Form parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + + +# **testInlineAdditionalProperties** +> testInlineAdditionalProperties(requestBody) + +test inline additionalProperties + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +Map requestBody = new HashMap(); // Map | request body +try { + apiInstance.testInlineAdditionalProperties(requestBody); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testInlineAdditionalProperties"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **requestBody** | [**Map<String, String>**](String.md)| request body | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + + +# **testJsonFormData** +> testJsonFormData(param, param2) + +test json serialization of form data + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.FakeApi; + + +FakeApi apiInstance = new FakeApi(); +String param = "null"; // String | field1 +String param2 = "null"; // String | field2 +try { + apiInstance.testJsonFormData(param, param2); +} catch (ApiException e) { + System.err.println("Exception when calling FakeApi#testJsonFormData"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **param** | **String**| field1 | [default to null] + **param2** | **String**| field2 | [default to null] + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/FakeClassnameTags123Api.md b/samples/client/petstore/java/retrofit2-play26/docs/FakeClassnameTags123Api.md new file mode 100644 index 00000000000..d805d10a830 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/FakeClassnameTags123Api.md @@ -0,0 +1,64 @@ +# FakeClassnameTags123Api + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**testClassname**](FakeClassnameTags123Api.md#testClassname) | **PATCH** fake_classname_test | To test class name in snake case + + + +# **testClassname** +> Client testClassname(client) + +To test class name in snake case + +To test class name in snake case + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.FakeClassnameTags123Api; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure API key authorization: api_key_query +ApiKeyAuth api_key_query = (ApiKeyAuth) defaultClient.getAuthentication("api_key_query"); +api_key_query.setApiKey("YOUR API KEY"); +// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) +//api_key_query.setApiKeyPrefix("Token"); + +FakeClassnameTags123Api apiInstance = new FakeClassnameTags123Api(); +Client client = new Client(); // Client | client model +try { + Client result = apiInstance.testClassname(client); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling FakeClassnameTags123Api#testClassname"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **client** | [**Client**](Client.md)| client model | + +### Return type + +[**Client**](Client.md) + +### Authorization + +[api_key_query](../README.md#api_key_query) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/FileSchemaTestClass.md b/samples/client/petstore/java/retrofit2-play26/docs/FileSchemaTestClass.md new file mode 100644 index 00000000000..95ba647df6f --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/FileSchemaTestClass.md @@ -0,0 +1,11 @@ + +# FileSchemaTestClass + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**file** | [**java.io.File**](java.io.File.md) | | [optional] +**files** | [**List<java.io.File>**](java.io.File.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/FormatTest.md b/samples/client/petstore/java/retrofit2-play26/docs/FormatTest.md new file mode 100644 index 00000000000..986f70236e1 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/FormatTest.md @@ -0,0 +1,22 @@ + +# FormatTest + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**integer** | **Integer** | | [optional] +**int32** | **Integer** | | [optional] +**int64** | **Long** | | [optional] +**number** | [**BigDecimal**](BigDecimal.md) | | +**_float** | **Float** | | [optional] +**_double** | **Double** | | [optional] +**string** | **String** | | [optional] +**_byte** | **byte[]** | | +**binary** | [**File**](File.md) | | [optional] +**date** | [**LocalDate**](LocalDate.md) | | +**dateTime** | [**OffsetDateTime**](OffsetDateTime.md) | | [optional] +**uuid** | [**UUID**](UUID.md) | | [optional] +**password** | **String** | | + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/HasOnlyReadOnly.md b/samples/client/petstore/java/retrofit2-play26/docs/HasOnlyReadOnly.md new file mode 100644 index 00000000000..c1d0aac5672 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/HasOnlyReadOnly.md @@ -0,0 +1,11 @@ + +# HasOnlyReadOnly + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**bar** | **String** | | [optional] +**foo** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/MapTest.md b/samples/client/petstore/java/retrofit2-play26/docs/MapTest.md new file mode 100644 index 00000000000..f3b592d43fe --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/MapTest.md @@ -0,0 +1,21 @@ + +# MapTest + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**mapMapOfString** | [**Map<String, Map<String, String>>**](Map.md) | | [optional] +**mapOfEnumString** | [**Map<String, InnerEnum>**](#Map<String, InnerEnum>) | | [optional] +**directMap** | **Map<String, Boolean>** | | [optional] +**indirectMap** | [**StringBooleanMap**](StringBooleanMap.md) | | [optional] + + + +## Enum: Map<String, InnerEnum> +Name | Value +---- | ----- +UPPER | "UPPER" +LOWER | "lower" + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/MixedPropertiesAndAdditionalPropertiesClass.md b/samples/client/petstore/java/retrofit2-play26/docs/MixedPropertiesAndAdditionalPropertiesClass.md new file mode 100644 index 00000000000..b12e2cd70e6 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/MixedPropertiesAndAdditionalPropertiesClass.md @@ -0,0 +1,12 @@ + +# MixedPropertiesAndAdditionalPropertiesClass + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**uuid** | [**UUID**](UUID.md) | | [optional] +**dateTime** | [**OffsetDateTime**](OffsetDateTime.md) | | [optional] +**map** | [**Map<String, Animal>**](Animal.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Model200Response.md b/samples/client/petstore/java/retrofit2-play26/docs/Model200Response.md new file mode 100644 index 00000000000..5b3a9a0e46d --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Model200Response.md @@ -0,0 +1,11 @@ + +# Model200Response + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **Integer** | | [optional] +**propertyClass** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ModelApiResponse.md b/samples/client/petstore/java/retrofit2-play26/docs/ModelApiResponse.md new file mode 100644 index 00000000000..3eec8686cc9 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ModelApiResponse.md @@ -0,0 +1,12 @@ + +# ModelApiResponse + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **Integer** | | [optional] +**type** | **String** | | [optional] +**message** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ModelReturn.md b/samples/client/petstore/java/retrofit2-play26/docs/ModelReturn.md new file mode 100644 index 00000000000..a679b04953e --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ModelReturn.md @@ -0,0 +1,10 @@ + +# ModelReturn + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**_return** | **Integer** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Name.md b/samples/client/petstore/java/retrofit2-play26/docs/Name.md new file mode 100644 index 00000000000..64060f82de4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Name.md @@ -0,0 +1,13 @@ + +# Name + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **Integer** | | +**snakeCase** | **Integer** | | [optional] +**property** | **String** | | [optional] +**_123number** | **Integer** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/NumberOnly.md b/samples/client/petstore/java/retrofit2-play26/docs/NumberOnly.md new file mode 100644 index 00000000000..a3feac7fadc --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/NumberOnly.md @@ -0,0 +1,10 @@ + +# NumberOnly + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**justNumber** | [**BigDecimal**](BigDecimal.md) | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Order.md b/samples/client/petstore/java/retrofit2-play26/docs/Order.md new file mode 100644 index 00000000000..268c617d1ff --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Order.md @@ -0,0 +1,24 @@ + +# Order + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**petId** | **Long** | | [optional] +**quantity** | **Integer** | | [optional] +**shipDate** | [**OffsetDateTime**](OffsetDateTime.md) | | [optional] +**status** | [**StatusEnum**](#StatusEnum) | Order Status | [optional] +**complete** | **Boolean** | | [optional] + + + +## Enum: StatusEnum +Name | Value +---- | ----- +PLACED | "placed" +APPROVED | "approved" +DELIVERED | "delivered" + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/OuterComposite.md b/samples/client/petstore/java/retrofit2-play26/docs/OuterComposite.md new file mode 100644 index 00000000000..3f5a633c998 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/OuterComposite.md @@ -0,0 +1,12 @@ + +# OuterComposite + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**myNumber** | [**BigDecimal**](BigDecimal.md) | | [optional] +**myString** | **String** | | [optional] +**myBoolean** | **Boolean** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/OuterEnum.md b/samples/client/petstore/java/retrofit2-play26/docs/OuterEnum.md new file mode 100644 index 00000000000..ed2cb206789 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/OuterEnum.md @@ -0,0 +1,14 @@ + +# OuterEnum + +## Enum + + +* `PLACED` (value: `"placed"`) + +* `APPROVED` (value: `"approved"`) + +* `DELIVERED` (value: `"delivered"`) + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Pet.md b/samples/client/petstore/java/retrofit2-play26/docs/Pet.md new file mode 100644 index 00000000000..5b63109ef92 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Pet.md @@ -0,0 +1,24 @@ + +# Pet + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**category** | [**Category**](Category.md) | | [optional] +**name** | **String** | | +**photoUrls** | **List<String>** | | +**tags** | [**List<Tag>**](Tag.md) | | [optional] +**status** | [**StatusEnum**](#StatusEnum) | pet status in the store | [optional] + + + +## Enum: StatusEnum +Name | Value +---- | ----- +AVAILABLE | "available" +PENDING | "pending" +SOLD | "sold" + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/PetApi.md b/samples/client/petstore/java/retrofit2-play26/docs/PetApi.md new file mode 100644 index 00000000000..0005f283293 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/PetApi.md @@ -0,0 +1,494 @@ +# PetApi + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**addPet**](PetApi.md#addPet) | **POST** pet | Add a new pet to the store +[**deletePet**](PetApi.md#deletePet) | **DELETE** pet/{petId} | Deletes a pet +[**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** pet/findByStatus | Finds Pets by status +[**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** pet/findByTags | Finds Pets by tags +[**getPetById**](PetApi.md#getPetById) | **GET** pet/{petId} | Find pet by ID +[**updatePet**](PetApi.md#updatePet) | **PUT** pet | Update an existing pet +[**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** pet/{petId} | Updates a pet in the store with form data +[**uploadFile**](PetApi.md#uploadFile) | **POST** pet/{petId}/uploadImage | uploads an image +[**uploadFileWithRequiredFile**](PetApi.md#uploadFileWithRequiredFile) | **POST** fake/{petId}/uploadImageWithRequiredFile | uploads an image (required) + + + +# **addPet** +> addPet(pet) + +Add a new pet to the store + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store +try { + apiInstance.addPet(pet); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#addPet"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + + +# **deletePet** +> deletePet(petId, apiKey) + +Deletes a pet + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Long petId = 56L; // Long | Pet id to delete +String apiKey = "apiKey_example"; // String | +try { + apiInstance.deletePet(petId, apiKey); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#deletePet"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| Pet id to delete | + **apiKey** | **String**| | [optional] + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **findPetsByStatus** +> List<Pet> findPetsByStatus(status) + +Finds Pets by status + +Multiple status values can be provided with comma separated strings + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +List status = Arrays.asList("status_example"); // List | Status values that need to be considered for filter +try { + List result = apiInstance.findPetsByStatus(status); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#findPetsByStatus"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | [enum: available, pending, sold] + +### Return type + +[**List<Pet>**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **findPetsByTags** +> List<Pet> findPetsByTags(tags) + +Finds Pets by tags + +Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +List tags = Arrays.asList("tags_example"); // List | Tags to filter by +try { + List result = apiInstance.findPetsByTags(tags); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#findPetsByTags"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tags** | [**List<String>**](String.md)| Tags to filter by | + +### Return type + +[**List<Pet>**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **getPetById** +> Pet getPetById(petId) + +Find pet by ID + +Returns a single pet + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure API key authorization: api_key +ApiKeyAuth api_key = (ApiKeyAuth) defaultClient.getAuthentication("api_key"); +api_key.setApiKey("YOUR API KEY"); +// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) +//api_key.setApiKeyPrefix("Token"); + +PetApi apiInstance = new PetApi(); +Long petId = 56L; // Long | ID of pet to return +try { + Pet result = apiInstance.getPetById(petId); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#getPetById"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet to return | + +### Return type + +[**Pet**](Pet.md) + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **updatePet** +> updatePet(pet) + +Update an existing pet + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store +try { + apiInstance.updatePet(pet); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#updatePet"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + + +# **updatePetWithForm** +> updatePetWithForm(petId, name, status) + +Updates a pet in the store with form data + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Long petId = 56L; // Long | ID of pet that needs to be updated +String name = "null"; // String | Updated name of the pet +String status = "null"; // String | Updated status of the pet +try { + apiInstance.updatePetWithForm(petId, name, status); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#updatePetWithForm"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet that needs to be updated | + **name** | **String**| Updated name of the pet | [optional] [default to null] + **status** | **String**| Updated status of the pet | [optional] [default to null] + +### Return type + +null (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + + +# **uploadFile** +> ModelApiResponse uploadFile(petId, additionalMetadata, file) + +uploads an image + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Long petId = 56L; // Long | ID of pet to update +String additionalMetadata = "null"; // String | Additional data to pass to server +File file = new File("null"); // File | file to upload +try { + ModelApiResponse result = apiInstance.uploadFile(petId, additionalMetadata, file); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#uploadFile"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet to update | + **additionalMetadata** | **String**| Additional data to pass to server | [optional] [default to null] + **file** | **File**| file to upload | [optional] [default to null] + +### Return type + +[**ModelApiResponse**](ModelApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + + +# **uploadFileWithRequiredFile** +> ModelApiResponse uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata) + +uploads an image (required) + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.PetApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure OAuth2 access token for authorization: petstore_auth +OAuth petstore_auth = (OAuth) defaultClient.getAuthentication("petstore_auth"); +petstore_auth.setAccessToken("YOUR ACCESS TOKEN"); + +PetApi apiInstance = new PetApi(); +Long petId = 56L; // Long | ID of pet to update +File requiredFile = new File("null"); // File | file to upload +String additionalMetadata = "null"; // String | Additional data to pass to server +try { + ModelApiResponse result = apiInstance.uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling PetApi#uploadFileWithRequiredFile"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **Long**| ID of pet to update | + **requiredFile** | **File**| file to upload | [default to null] + **additionalMetadata** | **String**| Additional data to pass to server | [optional] [default to null] + +### Return type + +[**ModelApiResponse**](ModelApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/ReadOnlyFirst.md b/samples/client/petstore/java/retrofit2-play26/docs/ReadOnlyFirst.md new file mode 100644 index 00000000000..426b7cde95a --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/ReadOnlyFirst.md @@ -0,0 +1,11 @@ + +# ReadOnlyFirst + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**bar** | **String** | | [optional] +**baz** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/SpecialModelName.md b/samples/client/petstore/java/retrofit2-play26/docs/SpecialModelName.md new file mode 100644 index 00000000000..6cf53410ace --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/SpecialModelName.md @@ -0,0 +1,10 @@ + +# SpecialModelName + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**$specialPropertyName** | **Long** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/StoreApi.md b/samples/client/petstore/java/retrofit2-play26/docs/StoreApi.md new file mode 100644 index 00000000000..06886f6d565 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/StoreApi.md @@ -0,0 +1,195 @@ +# StoreApi + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** store/order/{order_id} | Delete purchase order by ID +[**getInventory**](StoreApi.md#getInventory) | **GET** store/inventory | Returns pet inventories by status +[**getOrderById**](StoreApi.md#getOrderById) | **GET** store/order/{order_id} | Find purchase order by ID +[**placeOrder**](StoreApi.md#placeOrder) | **POST** store/order | Place an order for a pet + + + +# **deleteOrder** +> deleteOrder(orderId) + +Delete purchase order by ID + +For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.StoreApi; + + +StoreApi apiInstance = new StoreApi(); +String orderId = "orderId_example"; // String | ID of the order that needs to be deleted +try { + apiInstance.deleteOrder(orderId); +} catch (ApiException e) { + System.err.println("Exception when calling StoreApi#deleteOrder"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **String**| ID of the order that needs to be deleted | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **getInventory** +> Map<String, Integer> getInventory() + +Returns pet inventories by status + +Returns a map of status codes to quantities + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiClient; +//import org.openapitools.client.ApiException; +//import org.openapitools.client.Configuration; +//import org.openapitools.client.auth.*; +//import org.openapitools.client.api.StoreApi; + +ApiClient defaultClient = Configuration.getDefaultApiClient(); + +// Configure API key authorization: api_key +ApiKeyAuth api_key = (ApiKeyAuth) defaultClient.getAuthentication("api_key"); +api_key.setApiKey("YOUR API KEY"); +// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) +//api_key.setApiKeyPrefix("Token"); + +StoreApi apiInstance = new StoreApi(); +try { + Map result = apiInstance.getInventory(); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling StoreApi#getInventory"); + e.printStackTrace(); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**Map<String, Integer>** + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +# **getOrderById** +> Order getOrderById(orderId) + +Find purchase order by ID + +For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.StoreApi; + + +StoreApi apiInstance = new StoreApi(); +Long orderId = 56L; // Long | ID of pet that needs to be fetched +try { + Order result = apiInstance.getOrderById(orderId); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling StoreApi#getOrderById"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **Long**| ID of pet that needs to be fetched | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **placeOrder** +> Order placeOrder(order) + +Place an order for a pet + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.StoreApi; + + +StoreApi apiInstance = new StoreApi(); +Order order = new Order(); // Order | order placed for purchasing the pet +try { + Order result = apiInstance.placeOrder(order); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling StoreApi#placeOrder"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **order** | [**Order**](Order.md)| order placed for purchasing the pet | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/StringBooleanMap.md b/samples/client/petstore/java/retrofit2-play26/docs/StringBooleanMap.md new file mode 100644 index 00000000000..cac7afc80e0 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/StringBooleanMap.md @@ -0,0 +1,9 @@ + +# StringBooleanMap + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/Tag.md b/samples/client/petstore/java/retrofit2-play26/docs/Tag.md new file mode 100644 index 00000000000..de6814b55d5 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/Tag.md @@ -0,0 +1,11 @@ + +# Tag + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**name** | **String** | | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/User.md b/samples/client/petstore/java/retrofit2-play26/docs/User.md new file mode 100644 index 00000000000..8b6753dd284 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/User.md @@ -0,0 +1,17 @@ + +# User + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **Long** | | [optional] +**username** | **String** | | [optional] +**firstName** | **String** | | [optional] +**lastName** | **String** | | [optional] +**email** | **String** | | [optional] +**password** | **String** | | [optional] +**phone** | **String** | | [optional] +**userStatus** | **Integer** | User Status | [optional] + + + diff --git a/samples/client/petstore/java/retrofit2-play26/docs/UserApi.md b/samples/client/petstore/java/retrofit2-play26/docs/UserApi.md new file mode 100644 index 00000000000..795bb22a03f --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/docs/UserApi.md @@ -0,0 +1,360 @@ +# UserApi + +All URIs are relative to *http://petstore.swagger.io:80/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createUser**](UserApi.md#createUser) | **POST** user | Create user +[**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** user/createWithArray | Creates list of users with given input array +[**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** user/createWithList | Creates list of users with given input array +[**deleteUser**](UserApi.md#deleteUser) | **DELETE** user/{username} | Delete user +[**getUserByName**](UserApi.md#getUserByName) | **GET** user/{username} | Get user by user name +[**loginUser**](UserApi.md#loginUser) | **GET** user/login | Logs user into the system +[**logoutUser**](UserApi.md#logoutUser) | **GET** user/logout | Logs out current logged in user session +[**updateUser**](UserApi.md#updateUser) | **PUT** user/{username} | Updated user + + + +# **createUser** +> createUser(user) + +Create user + +This can only be done by the logged in user. + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +User user = new User(); // User | Created user object +try { + apiInstance.createUser(user); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUser"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**User**](User.md)| Created user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **createUsersWithArrayInput** +> createUsersWithArrayInput(user) + +Creates list of users with given input array + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +List user = Arrays.asList(new List()); // List | List of user object +try { + apiInstance.createUsersWithArrayInput(user); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUsersWithArrayInput"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **createUsersWithListInput** +> createUsersWithListInput(user) + +Creates list of users with given input array + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +List user = Arrays.asList(new List()); // List | List of user object +try { + apiInstance.createUsersWithListInput(user); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#createUsersWithListInput"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **deleteUser** +> deleteUser(username) + +Delete user + +This can only be done by the logged in user. + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +String username = "username_example"; // String | The name that needs to be deleted +try { + apiInstance.deleteUser(username); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#deleteUser"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be deleted | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **getUserByName** +> User getUserByName(username) + +Get user by user name + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +String username = "username_example"; // String | The name that needs to be fetched. Use user1 for testing. +try { + User result = apiInstance.getUserByName(username); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#getUserByName"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be fetched. Use user1 for testing. | + +### Return type + +[**User**](User.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **loginUser** +> String loginUser(username, password) + +Logs user into the system + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +String username = "username_example"; // String | The user name for login +String password = "password_example"; // String | The password for login in clear text +try { + String result = apiInstance.loginUser(username, password); + System.out.println(result); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#loginUser"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The user name for login | + **password** | **String**| The password for login in clear text | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + + +# **logoutUser** +> logoutUser() + +Logs out current logged in user session + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +try { + apiInstance.logoutUser(); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#logoutUser"); + e.printStackTrace(); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + + +# **updateUser** +> updateUser(username, user) + +Updated user + +This can only be done by the logged in user. + +### Example +```java +// Import classes: +//import org.openapitools.client.ApiException; +//import org.openapitools.client.api.UserApi; + + +UserApi apiInstance = new UserApi(); +String username = "username_example"; // String | name that need to be deleted +User user = new User(); // User | Updated user object +try { + apiInstance.updateUser(username, user); +} catch (ApiException e) { + System.err.println("Exception when calling UserApi#updateUser"); + e.printStackTrace(); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| name that need to be deleted | + **user** | [**User**](User.md)| Updated user object | + +### Return type + +null (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + diff --git a/samples/client/petstore/java/retrofit2-play26/git_push.sh b/samples/client/petstore/java/retrofit2-play26/git_push.sh new file mode 100644 index 00000000000..8442b80bb44 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore/java/retrofit2-play26/gradle.properties b/samples/client/petstore/java/retrofit2-play26/gradle.properties new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/gradle.properties @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.jar b/samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2c6137b87896c8f70315ae454e00a969ef5f6019 GIT binary patch literal 53639 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 F{{tUq7iIte literal 0 HcmV?d00001 diff --git a/samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.properties b/samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..b7a36473955 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 17 23:08:05 CST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-bin.zip diff --git a/samples/client/petstore/java/retrofit2-play26/gradlew b/samples/client/petstore/java/retrofit2-play26/gradlew new file mode 100644 index 00000000000..9d82f789151 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/client/petstore/java/retrofit2-play26/gradlew.bat b/samples/client/petstore/java/retrofit2-play26/gradlew.bat new file mode 100644 index 00000000000..5f192121eb4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/client/petstore/java/retrofit2-play26/pom.xml b/samples/client/petstore/java/retrofit2-play26/pom.xml new file mode 100644 index 00000000000..338ae2c35f3 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/pom.xml @@ -0,0 +1,295 @@ + + 4.0.0 + org.openapitools + petstore-java-client-retrofit2-play26 + jar + petstore-java-client-retrofit2-play26 + 1.0.0 + https://github.com/openapitools/openapi-generator + OpenAPI Java + + scm:git:git@github.com:openapitools/openapi-generator.git + scm:git:git@github.com:openapitools/openapi-generator.git + https://github.com/openapitools/openapi-generator + + + + + Unlicense + http://www.apache.org/licenses/LICENSE-2.0.html + repo + + + + + + OpenAPI + team@openapitools.org + OpenAPI + http://openapitools.org + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M1 + + + enforce-maven + + enforce + + + + + 2.2.0 + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + add_sources + generate-sources + + add-source + + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + + + sign-artifacts + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + io.swagger + swagger-annotations + ${swagger-core-version} + + + com.squareup.retrofit2 + converter-gson + ${retrofit-version} + + + com.squareup.retrofit2 + retrofit + ${retrofit-version} + + + com.squareup.retrofit2 + converter-scalars + ${retrofit-version} + + + org.apache.oltu.oauth2 + org.apache.oltu.oauth2.client + ${oltu-version} + + + org.apache.oltu.oauth2 + common + + + + + io.gsonfire + gson-fire + ${gson-fire-version} + + + org.threeten + threetenbp + ${threetenbp-version} + + + + + com.squareup.retrofit2 + converter-jackson + ${retrofit-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson-version} + + + + com.typesafe.play + play-ahc-ws_2.12 + ${play-version} + + + javax.validation + validation-api + 1.1.0.Final + + + + + + + junit + junit + ${junit-version} + test + + + + UTF-8 + 1.8 + ${java.version} + ${java.version} + 1.8.0 + 1.5.18 + 2.8.10 + 2.6.7 + 2.3.0 + 1.3.5 + 1.0.1 + 4.12 + + diff --git a/samples/client/petstore/java/retrofit2-play26/project/build.properties b/samples/client/petstore/java/retrofit2-play26/project/build.properties new file mode 100644 index 00000000000..5620cc502b4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.1 diff --git a/samples/client/petstore/java/retrofit2-play26/settings.gradle b/samples/client/petstore/java/retrofit2-play26/settings.gradle new file mode 100644 index 00000000000..5b3f1e58867 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "petstore-java-client-retrofit2-play26" \ No newline at end of file diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/AndroidManifest.xml b/samples/client/petstore/java/retrofit2-play26/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..54fbcb3da1e --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/ApiClient.java new file mode 100644 index 00000000000..6daa98296f7 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/ApiClient.java @@ -0,0 +1,206 @@ +package org.openapitools.client; + +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import retrofit2.Converter; +import retrofit2.Retrofit; +import retrofit2.converter.scalars.ScalarsConverterFactory; +import retrofit2.converter.jackson.JacksonConverterFactory; + +import play.libs.Json; +import play.libs.ws.WSClient; + +import org.openapitools.client.Play26CallAdapterFactory; +import org.openapitools.client.Play26CallFactory; + +import okhttp3.Interceptor; +import okhttp3.ResponseBody; +import org.openapitools.client.auth.ApiKeyAuth; +import org.openapitools.client.auth.Authentication; + +/** + * API client + */ +public class ApiClient { + + /** Underlying HTTP-client */ + private WSClient wsClient; + + /** Creates HTTP call instances */ + private Play26CallFactory callFactory; + + /** Create {@link java.util.concurrent.CompletionStage} instances from HTTP calls */ + private Play26CallAdapterFactory callAdapterFactory; + + /** Supported auths */ + private Map authentications; + + /** API base path */ + private String basePath = "http://petstore.swagger.io:80/v2"; + + /** Default ObjectMapper */ + private ObjectMapper defaultMapper; + + public ApiClient(WSClient wsClient) { + this(); + this.wsClient = wsClient; + } + + public ApiClient() { + // Setup authentications (key: authentication name, value: authentication). + authentications = new HashMap<>(); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("api_key_query", new ApiKeyAuth("query", "api_key_query")); + // authentications.put("http_basic_test", new HttpBasicAuth()); + // authentications.put("petstore_auth", new OAuth()); + // Prevent the authentications from being modified. + authentications = Collections.unmodifiableMap(authentications); + } + + /** + * Creates a retrofit2 client for given API interface + */ + public S createService(Class serviceClass) { + if(!basePath.endsWith("/")) { + basePath = basePath + "/"; + } + + Map extraHeaders = new HashMap<>(); + List extraQueryParams = new ArrayList<>(); + + for (String authName : authentications.keySet()) { + Authentication auth = authentications.get(authName); + if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + + auth.applyToParams(extraQueryParams, extraHeaders); + } + + if (callFactory == null) { + callFactory = new Play26CallFactory(wsClient, extraHeaders, extraQueryParams); + } + if (callAdapterFactory == null) { + callAdapterFactory = new Play26CallAdapterFactory(); + } + if (defaultMapper == null) { + defaultMapper = Json.mapper(); + } + + return new Retrofit.Builder() + .baseUrl(basePath) + .addConverterFactory(new FileConverter()) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(JacksonConverterFactory.create(defaultMapper)) + .callFactory(callFactory) + .addCallAdapterFactory(callAdapterFactory) + .build() + .create(serviceClass); + } + + /** + * Helper method to set API base path + */ + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + /** + * Get authentications (key: authentication name, value: authentication). + */ + public Map getAuthentications() { + return authentications; + } + + /** + * Get authentication for the given name. + * + * @param authName The authentication name + * @return The authentication, null if not found + */ + public Authentication getAuthentication(String authName) { + return authentications.get(authName); + } + + /** + * Helper method to set API key value for the first API key authentication. + */ + public ApiClient setApiKey(String apiKey) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKey(apiKey); + return this; + } + } + + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set API key prefix for the first API key authentication. + */ + public ApiClient setApiKeyPrefix(String apiKeyPrefix) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); + return this; + } + } + + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set HTTP call instances factory + */ + public ApiClient setCallFactory(Play26CallFactory callFactory) { + this.callFactory = callFactory; + return this; + } + + /** + * Helper method to set {@link java.util.concurrent.CompletionStage} instances factory + */ + public ApiClient setCallAdapterFactory(Play26CallAdapterFactory callAdapterFactory) { + this.callAdapterFactory = callAdapterFactory; + return this; + } + + /** + * Helper method to set Jackson's {@link ObjectMapper} + */ + public ApiClient setObjectMapper(ObjectMapper mapper) { + this.defaultMapper = mapper; + return this; + } + + static class FileConverter extends Converter.Factory { + + @Override + public Converter responseBodyConverter(Type type, + Annotation[] annotations, Retrofit retrofit) { + + if (!File.class.getTypeName().equals(type.getTypeName())) { + return null; + } + + return new Converter() { + + @Override + public File convert(ResponseBody value) throws IOException { + + File file = File.createTempFile("retrofit-file", ".tmp"); + Files.write(Paths.get(file.getPath()), value.bytes()); + return file; + } + }; + } + } + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/CollectionFormats.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/CollectionFormats.java new file mode 100644 index 00000000000..15cfcd1bd93 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/CollectionFormats.java @@ -0,0 +1,95 @@ +package org.openapitools.client; + +import java.util.Arrays; +import java.util.List; + +public class CollectionFormats { + + public static class CSVParams { + + protected List params; + + public CSVParams() { + } + + public CSVParams(List params) { + this.params = params; + } + + public CSVParams(String... params) { + this.params = Arrays.asList(params); + } + + public List getParams() { + return params; + } + + public void setParams(List params) { + this.params = params; + } + + @Override + public String toString() { + return StringUtil.join(params.toArray(new String[0]), ","); + } + + } + + public static class SSVParams extends CSVParams { + + public SSVParams() { + } + + public SSVParams(List params) { + super(params); + } + + public SSVParams(String... params) { + super(params); + } + + @Override + public String toString() { + return StringUtil.join(params.toArray(new String[0]), " "); + } + } + + public static class TSVParams extends CSVParams { + + public TSVParams() { + } + + public TSVParams(List params) { + super(params); + } + + public TSVParams(String... params) { + super(params); + } + + @Override + public String toString() { + return StringUtil.join( params.toArray(new String[0]), "\t"); + } + } + + public static class PIPESParams extends CSVParams { + + public PIPESParams() { + } + + public PIPESParams(List params) { + super(params); + } + + public PIPESParams(String... params) { + super(params); + } + + @Override + public String toString() { + return StringUtil.join(params.toArray(new String[0]), "|"); + } + } + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java new file mode 100644 index 00000000000..18a0e96bfc7 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java @@ -0,0 +1,52 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client; + + +public class Pair { + private String name = ""; + private String value = ""; + + public Pair (String name, String value) { + setName(name); + setValue(value); + } + + private void setName(String name) { + if (!isValidString(name)) return; + + this.name = name; + } + + private void setValue(String value) { + if (!isValidString(value)) return; + + this.value = value; + } + + public String getName() { + return this.name; + } + + public String getValue() { + return this.value; + } + + private boolean isValidString(String arg) { + if (arg == null) return false; + if (arg.trim().isEmpty()) return false; + + return true; + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallAdapterFactory.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallAdapterFactory.java new file mode 100644 index 00000000000..e3777b8eb7c --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallAdapterFactory.java @@ -0,0 +1,116 @@ +package org.openapitools.client; + +import java.util.concurrent.CompletionStage; +import retrofit2.*; + +import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.function.Function; + +/** + * Creates {@link CallAdapter} instances that convert {@link Call} into {@link java.util.concurrent.CompletionStage} + */ +public class Play26CallAdapterFactory extends CallAdapter.Factory { + + private Function exceptionConverter = Function.identity(); + + public Play26CallAdapterFactory() { + } + + public Play26CallAdapterFactory( + Function exceptionConverter) { + this.exceptionConverter = exceptionConverter; + } + + @Override + public CallAdapter get(Type returnType, Annotation[] annotations, Retrofit retrofit) { + if (!(returnType instanceof ParameterizedType)) { + return null; + } + + ParameterizedType type = (ParameterizedType) returnType; + if (type.getRawType() != CompletionStage.class) { + return null; + } + + return createAdapter((ParameterizedType) returnType); + } + + private CallAdapter> createAdapter(ParameterizedType returnType) { + // Get CompletionStage type argument + Type[] types = returnType.getActualTypeArguments(); + if (types.length != 1) { + throw new IllegalStateException("Must be exactly one type parameter"); + } + + Type resultType = types[0]; + Class rawTypeParam = getRawType(resultType); + + boolean includeResponse = false; + if (rawTypeParam == Response.class) { + if (!(resultType instanceof ParameterizedType)) { + throw new IllegalStateException("Response must be parameterized" + + " as Response"); + } + resultType = ((ParameterizedType) resultType).getActualTypeArguments()[0]; + includeResponse = true; + } + + return new ValueAdapter(resultType, includeResponse, exceptionConverter); + } + + /** + * Adpater that coverts values returned by API interface into CompletionStage + */ + private static final class ValueAdapter implements CallAdapter> { + + private final Type responseType; + private final boolean includeResponse; + private Function exceptionConverter; + + ValueAdapter(Type responseType, boolean includeResponse, + Function exceptionConverter) { + this.responseType = responseType; + this.includeResponse = includeResponse; + this.exceptionConverter = exceptionConverter; + } + + @Override + public Type responseType() { + return responseType; + } + + @Override + public CompletionStage adapt(final Call call) { + final CompletableFuture promise = new CompletableFuture(); + + call.enqueue(new Callback() { + + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + if (includeResponse) { + promise.complete((R) response); + } else { + promise.complete(response.body()); + } + } else { + promise.completeExceptionally(exceptionConverter.apply(new HttpException(response))); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + promise.completeExceptionally(t); + } + + }); + + return promise; + } + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallFactory.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallFactory.java new file mode 100644 index 00000000000..d320157bcf2 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Play26CallFactory.java @@ -0,0 +1,245 @@ +package org.openapitools.client; + +import okhttp3.*; +import okio.Buffer; +import okio.BufferedSource; +import play.libs.ws.WSClient; +import play.libs.ws.WSRequest; +import play.libs.ws.WSResponse; +import play.libs.ws.WSRequestFilter; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; + +/** + * Creates {@link Call} instances that invoke underlying {@link WSClient} + */ +public class Play26CallFactory implements okhttp3.Call.Factory { + + /** PlayWS http client */ + private final WSClient wsClient; + + /** Extra headers to add to request */ + private Map extraHeaders = new HashMap<>(); + + /** Extra query parameters to add to request */ + private List extraQueryParams = new ArrayList<>(); + + /** Filters (interceptors) */ + private List filters = new ArrayList<>(); + + /** Executor for WSClient */ + private Executor executor; + + public Play26CallFactory(WSClient wsClient) { + this.wsClient = wsClient; + } + + public Play26CallFactory(WSClient wsClient, List filters) { + this.wsClient = wsClient; + this.filters.addAll(filters); + } + + public Play26CallFactory(WSClient wsClient, Map extraHeaders, + List extraQueryParams) { + this.wsClient = wsClient; + + this.extraHeaders.putAll(extraHeaders); + this.extraQueryParams.addAll(extraQueryParams); + } + + public Play26CallFactory withExecutor(Executor executor) { + this.executor = executor; + return this; + } + + @Override + public Call newCall(Request request) { + // add extra headers + Request.Builder rb = request.newBuilder(); + for (Map.Entry header : this.extraHeaders.entrySet()) { + rb.addHeader(header.getKey(), header.getValue()); + } + + // add extra query params + if (!this.extraQueryParams.isEmpty()) { + String newQuery = request.url().uri().getQuery(); + for (Pair queryParam : this.extraQueryParams) { + String param = String.format("%s=%s", queryParam.getName(), queryParam.getValue()); + if (newQuery == null) { + newQuery = param; + } else { + newQuery += "&" + param; + } + } + + URI newUri; + try { + newUri = new URI(request.url().uri().getScheme(), request.url().uri().getAuthority(), + request.url().uri().getPath(), newQuery, request.url().uri().getFragment()); + rb.url(newUri.toURL()); + } catch (MalformedURLException | URISyntaxException e) { + throw new RuntimeException("Error while updating an url", e); + } + } + + return new PlayWSCall(wsClient, this.executor, this.filters, rb.build()); + } + + /** + * Call implementation that delegates to Play WS Client + */ + static class PlayWSCall implements Call { + + private final WSClient wsClient; + private WSRequest wsRequest; + private List filters; + private Executor executor = java.util.concurrent.ForkJoinPool.commonPool(); + + private final Request request; + + public PlayWSCall(WSClient wsClient, Executor executor, List filters, Request request) { + this.wsClient = wsClient; + this.request = request; + this.filters = filters; + + if (executor != null) { + this.executor = executor; + } + } + + @Override + public Request request() { + return request; + } + + @Override + public void enqueue(final okhttp3.Callback responseCallback) { + final Call call = this; + final CompletionStage promise = executeAsync(); + + promise.whenCompleteAsync((v, t) -> { + if (t != null) { + if (t instanceof IOException) { + responseCallback.onFailure(call, (IOException) t); + } else { + responseCallback.onFailure(call, new IOException(t)); + } + } else { + try { + responseCallback.onResponse(call, PlayWSCall.this.toWSResponse(v)); + } catch (Exception e) { + responseCallback.onFailure(call, new IOException(e)); + } + } + }, this.executor); + } + + CompletionStage executeAsync() { + try { + HttpUrl url = request.url(); + wsRequest = wsClient.url(url.scheme()+ "://" + url.host() + ":" + url.port() + url.encodedPath()); + url.queryParameterNames().forEach(queryParam -> { + wsRequest.addQueryParameter(queryParam, url.queryParameter(queryParam)); + }); + addHeaders(wsRequest); + if (request.body() != null) { + addBody(wsRequest); + } + filters.stream().forEach(f -> wsRequest.setRequestFilter(f)); + + return wsRequest.execute(request.method()); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + private void addHeaders(WSRequest wsRequest) { + for(Map.Entry> entry : request.headers().toMultimap().entrySet()) { + List values = entry.getValue(); + for (String value : values) { + wsRequest.setHeader(entry.getKey(), value); + } + } + } + + private void addBody(WSRequest wsRequest) throws IOException { + MediaType mediaType = request.body().contentType(); + if (mediaType != null) { + wsRequest.setContentType(mediaType.toString()); + } + + Buffer buffer = new Buffer(); + request.body().writeTo(buffer); + wsRequest.setBody(buffer.inputStream()); + } + + private Response toWSResponse(final WSResponse r) { + final Response.Builder builder = new Response.Builder(); + builder.request(request) + .code(r.getStatus()) + .body(new ResponseBody() { + + @Override + public MediaType contentType() { + return r.getSingleHeader("Content-Type") + .map(MediaType::parse) + .orElse(null); + } + + @Override + public long contentLength() { + return r.asByteArray().length; + } + + @Override + public BufferedSource source() { + return new Buffer().write(r.asByteArray()); + } + }); + + for (Map.Entry> entry : r.getAllHeaders().entrySet()) { + for (String value : entry.getValue()) { + builder.addHeader(entry.getKey(), value); + } + } + + builder.message(r.getStatusText()); + builder.protocol(Protocol.HTTP_1_1); + return builder.build(); + } + + @Override + public Response execute() throws IOException { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public void cancel() { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public PlayWSCall clone() { + throw new UnsupportedOperationException("Not supported"); + } + + @Override + public boolean isExecuted() { + return false; + } + + @Override + public boolean isCanceled() { + return false; + } + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/RFC3339DateFormat.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/RFC3339DateFormat.java new file mode 100644 index 00000000000..4ed672bced9 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/RFC3339DateFormat.java @@ -0,0 +1,32 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package org.openapitools.client; + +import com.fasterxml.jackson.databind.util.ISO8601DateFormat; +import com.fasterxml.jackson.databind.util.ISO8601Utils; + +import java.text.FieldPosition; +import java.util.Date; + + +public class RFC3339DateFormat extends ISO8601DateFormat { + + // Same as ISO8601DateFormat but serializing milliseconds. + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + String value = ISO8601Utils.format(date, true); + toAppendTo.append(value); + return toAppendTo; + } + +} \ No newline at end of file diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java new file mode 100644 index 00000000000..b731bc530e2 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java @@ -0,0 +1,55 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client; + + +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/AnotherFakeApi.java new file mode 100644 index 00000000000..616c44b0102 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -0,0 +1,39 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import org.openapitools.client.model.Client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface AnotherFakeApi { + /** + * To test special tags + * To test special tags and operation ID starting with number + * @param client client model (required) + * @return Call<Client> + */ + @Headers({ + "Content-Type:application/json" + }) + @PATCH("another-fake/dummy") + CompletionStage> call123testSpecialTags( + @retrofit2.http.Body Client client + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeApi.java new file mode 100644 index 00000000000..1a9ea5cbba4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeApi.java @@ -0,0 +1,190 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import java.math.BigDecimal; +import org.openapitools.client.model.Client; +import java.io.File; +import org.openapitools.client.model.FileSchemaTestClass; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; +import org.openapitools.client.model.OuterComposite; +import org.openapitools.client.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface FakeApi { + /** + * + * Test serialization of outer boolean types + * @param body Input boolean as post body (optional) + * @return Call<Boolean> + */ + @POST("fake/outer/boolean") + CompletionStage> fakeOuterBooleanSerialize( + @retrofit2.http.Body Boolean body + ); + + /** + * + * Test serialization of object with outer number type + * @param outerComposite Input composite as post body (optional) + * @return Call<OuterComposite> + */ + @POST("fake/outer/composite") + CompletionStage> fakeOuterCompositeSerialize( + @retrofit2.http.Body OuterComposite outerComposite + ); + + /** + * + * Test serialization of outer number types + * @param body Input number as post body (optional) + * @return Call<BigDecimal> + */ + @POST("fake/outer/number") + CompletionStage> fakeOuterNumberSerialize( + @retrofit2.http.Body BigDecimal body + ); + + /** + * + * Test serialization of outer string types + * @param body Input string as post body (optional) + * @return Call<String> + */ + @POST("fake/outer/string") + CompletionStage> fakeOuterStringSerialize( + @retrofit2.http.Body String body + ); + + /** + * + * For this test, the body for this request much reference a schema named `File`. + * @param fileSchemaTestClass (required) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @PUT("fake/body-with-file-schema") + CompletionStage> testBodyWithFileSchema( + @retrofit2.http.Body FileSchemaTestClass fileSchemaTestClass + ); + + /** + * + * + * @param query (required) + * @param user (required) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @PUT("fake/body-with-query-params") + CompletionStage> testBodyWithQueryParams( + @retrofit2.http.Query("query") String query, @retrofit2.http.Body User user + ); + + /** + * To test \"client\" model + * To test \"client\" model + * @param client client model (required) + * @return Call<Client> + */ + @Headers({ + "Content-Type:application/json" + }) + @PATCH("fake") + CompletionStage> testClientModel( + @retrofit2.http.Body Client client + ); + + /** + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * @param number None (required) + * @param _double None (required) + * @param patternWithoutDelimiter None (required) + * @param _byte None (required) + * @param integer None (optional, default to null) + * @param int32 None (optional, default to null) + * @param int64 None (optional, default to null) + * @param _float None (optional, default to null) + * @param string None (optional, default to null) + * @param binary None (optional, default to null) + * @param date None (optional, default to null) + * @param dateTime None (optional, default to null) + * @param password None (optional, default to null) + * @param paramCallback None (optional, default to null) + * @return Call<Void> + */ + @retrofit2.http.FormUrlEncoded + @POST("fake") + CompletionStage> testEndpointParameters( + @retrofit2.http.Field("number") BigDecimal number, @retrofit2.http.Field("double") Double _double, @retrofit2.http.Field("pattern_without_delimiter") String patternWithoutDelimiter, @retrofit2.http.Field("byte") byte[] _byte, @retrofit2.http.Field("integer") Integer integer, @retrofit2.http.Field("int32") Integer int32, @retrofit2.http.Field("int64") Long int64, @retrofit2.http.Field("float") Float _float, @retrofit2.http.Field("string") String string, @retrofit2.http.Field("binary") MultipartBody.Part binary, @retrofit2.http.Field("date") LocalDate date, @retrofit2.http.Field("dateTime") OffsetDateTime dateTime, @retrofit2.http.Field("password") String password, @retrofit2.http.Field("callback") String paramCallback + ); + + /** + * To test enum parameters + * To test enum parameters + * @param enumHeaderStringArray Header parameter enum test (string array) (optional) + * @param enumHeaderString Header parameter enum test (string) (optional, default to -efg) + * @param enumQueryStringArray Query parameter enum test (string array) (optional) + * @param enumQueryString Query parameter enum test (string) (optional, default to -efg) + * @param enumQueryInteger Query parameter enum test (double) (optional) + * @param enumQueryDouble Query parameter enum test (double) (optional) + * @param enumFormStringArray Form parameter enum test (string array) (optional, default to $) + * @param enumFormString Form parameter enum test (string) (optional, default to -efg) + * @return Call<Void> + */ + @retrofit2.http.FormUrlEncoded + @GET("fake") + CompletionStage> testEnumParameters( + @retrofit2.http.Header("enum_header_string_array") List enumHeaderStringArray, @retrofit2.http.Header("enum_header_string") String enumHeaderString, @retrofit2.http.Query("enum_query_string_array") CSVParams enumQueryStringArray, @retrofit2.http.Query("enum_query_string") String enumQueryString, @retrofit2.http.Query("enum_query_integer") Integer enumQueryInteger, @retrofit2.http.Query("enum_query_double") Double enumQueryDouble, @retrofit2.http.Field("enum_form_string_array") List enumFormStringArray, @retrofit2.http.Field("enum_form_string") String enumFormString + ); + + /** + * test inline additionalProperties + * + * @param requestBody request body (required) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @POST("fake/inline-additionalProperties") + CompletionStage> testInlineAdditionalProperties( + @retrofit2.http.Body Map requestBody + ); + + /** + * test json serialization of form data + * + * @param param field1 (required) + * @param param2 field2 (required) + * @return Call<Void> + */ + @retrofit2.http.FormUrlEncoded + @GET("fake/jsonFormData") + CompletionStage> testJsonFormData( + @retrofit2.http.Field("param") String param, @retrofit2.http.Field("param2") String param2 + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java new file mode 100644 index 00000000000..c3db217e30d --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -0,0 +1,39 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import org.openapitools.client.model.Client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface FakeClassnameTags123Api { + /** + * To test class name in snake case + * To test class name in snake case + * @param client client model (required) + * @return Call<Client> + */ + @Headers({ + "Content-Type:application/json" + }) + @PATCH("fake_classname_test") + CompletionStage> testClassname( + @retrofit2.http.Body Client client + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/PetApi.java new file mode 100644 index 00000000000..75fff9f67c4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/PetApi.java @@ -0,0 +1,142 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import java.io.File; +import org.openapitools.client.model.ModelApiResponse; +import org.openapitools.client.model.Pet; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface PetApi { + /** + * Add a new pet to the store + * + * @param pet Pet object that needs to be added to the store (required) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @POST("pet") + CompletionStage> addPet( + @retrofit2.http.Body Pet pet + ); + + /** + * Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return Call<Void> + */ + @DELETE("pet/{petId}") + CompletionStage> deletePet( + @retrofit2.http.Path("petId") Long petId, @retrofit2.http.Header("api_key") String apiKey + ); + + /** + * Finds Pets by status + * Multiple status values can be provided with comma separated strings + * @param status Status values that need to be considered for filter (required) + * @return Call<List<Pet>> + */ + @GET("pet/findByStatus") + CompletionStage>> findPetsByStatus( + @retrofit2.http.Query("status") CSVParams status + ); + + /** + * Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * @param tags Tags to filter by (required) + * @return Call<List<Pet>> + */ + @GET("pet/findByTags") + CompletionStage>> findPetsByTags( + @retrofit2.http.Query("tags") CSVParams tags + ); + + /** + * Find pet by ID + * Returns a single pet + * @param petId ID of pet to return (required) + * @return Call<Pet> + */ + @GET("pet/{petId}") + CompletionStage> getPetById( + @retrofit2.http.Path("petId") Long petId + ); + + /** + * Update an existing pet + * + * @param pet Pet object that needs to be added to the store (required) + * @return Call<Void> + */ + @Headers({ + "Content-Type:application/json" + }) + @PUT("pet") + CompletionStage> updatePet( + @retrofit2.http.Body Pet pet + ); + + /** + * Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional, default to null) + * @param status Updated status of the pet (optional, default to null) + * @return Call<Void> + */ + @retrofit2.http.FormUrlEncoded + @POST("pet/{petId}") + CompletionStage> updatePetWithForm( + @retrofit2.http.Path("petId") Long petId, @retrofit2.http.Field("name") String name, @retrofit2.http.Field("status") String status + ); + + /** + * uploads an image + * + * @param petId ID of pet to update (required) + * @param additionalMetadata Additional data to pass to server (optional, default to null) + * @param file file to upload (optional, default to null) + * @return Call<ModelApiResponse> + */ + @retrofit2.http.Multipart + @POST("pet/{petId}/uploadImage") + CompletionStage> uploadFile( + @retrofit2.http.Path("petId") Long petId, @retrofit2.http.Part("additionalMetadata") String additionalMetadata, @retrofit2.http.Part("file") MultipartBody.Part file + ); + + /** + * uploads an image (required) + * + * @param petId ID of pet to update (required) + * @param requiredFile file to upload (required) + * @param additionalMetadata Additional data to pass to server (optional, default to null) + * @return Call<ModelApiResponse> + */ + @retrofit2.http.Multipart + @POST("fake/{petId}/uploadImageWithRequiredFile") + CompletionStage> uploadFileWithRequiredFile( + @retrofit2.http.Path("petId") Long petId, @retrofit2.http.Part("requiredFile") MultipartBody.Part requiredFile, @retrofit2.http.Part("additionalMetadata") String additionalMetadata + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/StoreApi.java new file mode 100644 index 00000000000..040c1680202 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/StoreApi.java @@ -0,0 +1,67 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import org.openapitools.client.model.Order; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface StoreApi { + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param orderId ID of the order that needs to be deleted (required) + * @return Call<Void> + */ + @DELETE("store/order/{order_id}") + CompletionStage> deleteOrder( + @retrofit2.http.Path("order_id") String orderId + ); + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @return Call<Map<String, Integer>> + */ + @GET("store/inventory") + CompletionStage>> getInventory(); + + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param orderId ID of pet that needs to be fetched (required) + * @return Call<Order> + */ + @GET("store/order/{order_id}") + CompletionStage> getOrderById( + @retrofit2.http.Path("order_id") Long orderId + ); + + /** + * Place an order for a pet + * + * @param order order placed for purchasing the pet (required) + * @return Call<Order> + */ + @POST("store/order") + CompletionStage> placeOrder( + @retrofit2.http.Body Order order + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/UserApi.java new file mode 100644 index 00000000000..47f55e188ef --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/api/UserApi.java @@ -0,0 +1,113 @@ +package org.openapitools.client.api; + +import org.openapitools.client.CollectionFormats.*; + + + +import retrofit2.Call; +import retrofit2.http.*; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import okhttp3.MultipartBody; + +import org.openapitools.client.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import java.util.concurrent.*; +import retrofit2.Response; + +public interface UserApi { + /** + * Create user + * This can only be done by the logged in user. + * @param user Created user object (required) + * @return Call<Void> + */ + @POST("user") + CompletionStage> createUser( + @retrofit2.http.Body User user + ); + + /** + * Creates list of users with given input array + * + * @param user List of user object (required) + * @return Call<Void> + */ + @POST("user/createWithArray") + CompletionStage> createUsersWithArrayInput( + @retrofit2.http.Body List user + ); + + /** + * Creates list of users with given input array + * + * @param user List of user object (required) + * @return Call<Void> + */ + @POST("user/createWithList") + CompletionStage> createUsersWithListInput( + @retrofit2.http.Body List user + ); + + /** + * Delete user + * This can only be done by the logged in user. + * @param username The name that needs to be deleted (required) + * @return Call<Void> + */ + @DELETE("user/{username}") + CompletionStage> deleteUser( + @retrofit2.http.Path("username") String username + ); + + /** + * Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return Call<User> + */ + @GET("user/{username}") + CompletionStage> getUserByName( + @retrofit2.http.Path("username") String username + ); + + /** + * Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return Call<String> + */ + @GET("user/login") + CompletionStage> loginUser( + @retrofit2.http.Query("username") String username, @retrofit2.http.Query("password") String password + ); + + /** + * Logs out current logged in user session + * + * @return Call<Void> + */ + @GET("user/logout") + CompletionStage> logoutUser(); + + + /** + * Updated user + * This can only be done by the logged in user. + * @param username name that need to be deleted (required) + * @param user Updated user object (required) + * @return Call<Void> + */ + @PUT("user/{username}") + CompletionStage> updateUser( + @retrofit2.http.Path("username") String username, @retrofit2.http.Body User user + ); + +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java new file mode 100644 index 00000000000..a84e0135241 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java @@ -0,0 +1,78 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.auth; + +import org.openapitools.client.Pair; + +import java.util.Map; +import java.util.List; + +/** + * Holds ApiKey auth info + */ + +public class ApiKeyAuth implements Authentication { + private final String location; + private final String paramName; + + private String apiKey; + private String apiKeyPrefix; + + public ApiKeyAuth(String location, String paramName) { + this.location = location; + this.paramName = paramName; + } + + public String getLocation() { + return location; + } + + public String getParamName() { + return paramName; + } + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + public String getApiKeyPrefix() { + return apiKeyPrefix; + } + + public void setApiKeyPrefix(String apiKeyPrefix) { + this.apiKeyPrefix = apiKeyPrefix; + } + + @Override + public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } + String value; + if (apiKeyPrefix != null) { + value = apiKeyPrefix + " " + apiKey; + } else { + value = apiKey; + } + if ("query".equals(location)) { + queryParams.add(new Pair(paramName, value)); + } else if ("header".equals(location)) { + headerParams.put(paramName, value); + } + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/Authentication.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/Authentication.java new file mode 100644 index 00000000000..ff392f0451a --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/auth/Authentication.java @@ -0,0 +1,29 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.auth; + +import org.openapitools.client.Pair; + +import java.util.Map; +import java.util.List; + +public interface Authentication { + /** + * Apply authentication settings to header and query params. + * + * @param queryParams List of query parameters + * @param headerParams Map of header parameters + */ + void applyToParams(List queryParams, Map headerParams); +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java new file mode 100644 index 00000000000..2f9a3c4eae1 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java @@ -0,0 +1,136 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * AdditionalPropertiesClass + */ + +public class AdditionalPropertiesClass { + @JsonProperty("map_property") + private Map mapProperty = null; + + @JsonProperty("map_of_map_property") + private Map> mapOfMapProperty = null; + + public AdditionalPropertiesClass mapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + return this; + } + + public AdditionalPropertiesClass putMapPropertyItem(String key, String mapPropertyItem) { + if (this.mapProperty == null) { + this.mapProperty = new HashMap<>(); + } + this.mapProperty.put(key, mapPropertyItem); + return this; + } + + /** + * Get mapProperty + * @return mapProperty + **/ + @ApiModelProperty(value = "") + public Map getMapProperty() { + return mapProperty; + } + + public void setMapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + } + + public AdditionalPropertiesClass mapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + return this; + } + + public AdditionalPropertiesClass putMapOfMapPropertyItem(String key, Map mapOfMapPropertyItem) { + if (this.mapOfMapProperty == null) { + this.mapOfMapProperty = new HashMap<>(); + } + this.mapOfMapProperty.put(key, mapOfMapPropertyItem); + return this; + } + + /** + * Get mapOfMapProperty + * @return mapOfMapProperty + **/ + @Valid + @ApiModelProperty(value = "") + public Map> getMapOfMapProperty() { + return mapOfMapProperty; + } + + public void setMapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AdditionalPropertiesClass additionalPropertiesClass = (AdditionalPropertiesClass) o; + return Objects.equals(this.mapProperty, additionalPropertiesClass.mapProperty) && + Objects.equals(this.mapOfMapProperty, additionalPropertiesClass.mapOfMapProperty); + } + + @Override + public int hashCode() { + return Objects.hash(mapProperty, mapOfMapProperty); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AdditionalPropertiesClass {\n"); + + sb.append(" mapProperty: ").append(toIndentedString(mapProperty)).append("\n"); + sb.append(" mapOfMapProperty: ").append(toIndentedString(mapOfMapProperty)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Animal.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Animal.java new file mode 100644 index 00000000000..96bdf028335 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Animal.java @@ -0,0 +1,125 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Animal + */ + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Dog.class, name = "Dog"), + @JsonSubTypes.Type(value = Cat.class, name = "Cat"), +}) + +public class Animal { + @JsonProperty("className") + private String className = null; + + @JsonProperty("color") + private String color = "red"; + + public Animal className(String className) { + this.className = className; + return this; + } + + /** + * Get className + * @return className + **/ + @NotNull + @ApiModelProperty(required = true, value = "") + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Animal color(String color) { + this.color = color; + return this; + } + + /** + * Get color + * @return color + **/ + @ApiModelProperty(value = "") + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Animal animal = (Animal) o; + return Objects.equals(this.className, animal.className) && + Objects.equals(this.color, animal.color); + } + + @Override + public int hashCode() { + return Objects.hash(className, color); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Animal {\n"); + + sb.append(" className: ").append(toIndentedString(className)).append("\n"); + sb.append(" color: ").append(toIndentedString(color)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AnimalFarm.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AnimalFarm.java new file mode 100644 index 00000000000..867cf78d4ac --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/AnimalFarm.java @@ -0,0 +1,68 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.Animal; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * AnimalFarm + */ + +public class AnimalFarm extends ArrayList { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AnimalFarm {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java new file mode 100644 index 00000000000..3f30332d244 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java @@ -0,0 +1,105 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * ArrayOfArrayOfNumberOnly + */ + +public class ArrayOfArrayOfNumberOnly { + @JsonProperty("ArrayArrayNumber") + private List> arrayArrayNumber = null; + + public ArrayOfArrayOfNumberOnly arrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + return this; + } + + public ArrayOfArrayOfNumberOnly addArrayArrayNumberItem(List arrayArrayNumberItem) { + if (this.arrayArrayNumber == null) { + this.arrayArrayNumber = new ArrayList<>(); + } + this.arrayArrayNumber.add(arrayArrayNumberItem); + return this; + } + + /** + * Get arrayArrayNumber + * @return arrayArrayNumber + **/ + @Valid + @ApiModelProperty(value = "") + public List> getArrayArrayNumber() { + return arrayArrayNumber; + } + + public void setArrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfArrayOfNumberOnly arrayOfArrayOfNumberOnly = (ArrayOfArrayOfNumberOnly) o; + return Objects.equals(this.arrayArrayNumber, arrayOfArrayOfNumberOnly.arrayArrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayArrayNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfArrayOfNumberOnly {\n"); + + sb.append(" arrayArrayNumber: ").append(toIndentedString(arrayArrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java new file mode 100644 index 00000000000..6f9af6ac2c3 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java @@ -0,0 +1,105 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * ArrayOfNumberOnly + */ + +public class ArrayOfNumberOnly { + @JsonProperty("ArrayNumber") + private List arrayNumber = null; + + public ArrayOfNumberOnly arrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + return this; + } + + public ArrayOfNumberOnly addArrayNumberItem(BigDecimal arrayNumberItem) { + if (this.arrayNumber == null) { + this.arrayNumber = new ArrayList<>(); + } + this.arrayNumber.add(arrayNumberItem); + return this; + } + + /** + * Get arrayNumber + * @return arrayNumber + **/ + @Valid + @ApiModelProperty(value = "") + public List getArrayNumber() { + return arrayNumber; + } + + public void setArrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfNumberOnly arrayOfNumberOnly = (ArrayOfNumberOnly) o; + return Objects.equals(this.arrayNumber, arrayOfNumberOnly.arrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfNumberOnly {\n"); + + sb.append(" arrayNumber: ").append(toIndentedString(arrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayTest.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayTest.java new file mode 100644 index 00000000000..1dab8f3356b --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ArrayTest.java @@ -0,0 +1,168 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.ReadOnlyFirst; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * ArrayTest + */ + +public class ArrayTest { + @JsonProperty("array_of_string") + private List arrayOfString = null; + + @JsonProperty("array_array_of_integer") + private List> arrayArrayOfInteger = null; + + @JsonProperty("array_array_of_model") + private List> arrayArrayOfModel = null; + + public ArrayTest arrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + return this; + } + + public ArrayTest addArrayOfStringItem(String arrayOfStringItem) { + if (this.arrayOfString == null) { + this.arrayOfString = new ArrayList<>(); + } + this.arrayOfString.add(arrayOfStringItem); + return this; + } + + /** + * Get arrayOfString + * @return arrayOfString + **/ + @ApiModelProperty(value = "") + public List getArrayOfString() { + return arrayOfString; + } + + public void setArrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + } + + public ArrayTest arrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + return this; + } + + public ArrayTest addArrayArrayOfIntegerItem(List arrayArrayOfIntegerItem) { + if (this.arrayArrayOfInteger == null) { + this.arrayArrayOfInteger = new ArrayList<>(); + } + this.arrayArrayOfInteger.add(arrayArrayOfIntegerItem); + return this; + } + + /** + * Get arrayArrayOfInteger + * @return arrayArrayOfInteger + **/ + @Valid + @ApiModelProperty(value = "") + public List> getArrayArrayOfInteger() { + return arrayArrayOfInteger; + } + + public void setArrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + } + + public ArrayTest arrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + return this; + } + + public ArrayTest addArrayArrayOfModelItem(List arrayArrayOfModelItem) { + if (this.arrayArrayOfModel == null) { + this.arrayArrayOfModel = new ArrayList<>(); + } + this.arrayArrayOfModel.add(arrayArrayOfModelItem); + return this; + } + + /** + * Get arrayArrayOfModel + * @return arrayArrayOfModel + **/ + @Valid + @ApiModelProperty(value = "") + public List> getArrayArrayOfModel() { + return arrayArrayOfModel; + } + + public void setArrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayTest arrayTest = (ArrayTest) o; + return Objects.equals(this.arrayOfString, arrayTest.arrayOfString) && + Objects.equals(this.arrayArrayOfInteger, arrayTest.arrayArrayOfInteger) && + Objects.equals(this.arrayArrayOfModel, arrayTest.arrayArrayOfModel); + } + + @Override + public int hashCode() { + return Objects.hash(arrayOfString, arrayArrayOfInteger, arrayArrayOfModel); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayTest {\n"); + + sb.append(" arrayOfString: ").append(toIndentedString(arrayOfString)).append("\n"); + sb.append(" arrayArrayOfInteger: ").append(toIndentedString(arrayArrayOfInteger)).append("\n"); + sb.append(" arrayArrayOfModel: ").append(toIndentedString(arrayArrayOfModel)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Capitalization.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Capitalization.java new file mode 100644 index 00000000000..93ab5bb6add --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Capitalization.java @@ -0,0 +1,208 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Capitalization + */ + +public class Capitalization { + @JsonProperty("smallCamel") + private String smallCamel = null; + + @JsonProperty("CapitalCamel") + private String capitalCamel = null; + + @JsonProperty("small_Snake") + private String smallSnake = null; + + @JsonProperty("Capital_Snake") + private String capitalSnake = null; + + @JsonProperty("SCA_ETH_Flow_Points") + private String scAETHFlowPoints = null; + + @JsonProperty("ATT_NAME") + private String ATT_NAME = null; + + public Capitalization smallCamel(String smallCamel) { + this.smallCamel = smallCamel; + return this; + } + + /** + * Get smallCamel + * @return smallCamel + **/ + @ApiModelProperty(value = "") + public String getSmallCamel() { + return smallCamel; + } + + public void setSmallCamel(String smallCamel) { + this.smallCamel = smallCamel; + } + + public Capitalization capitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + return this; + } + + /** + * Get capitalCamel + * @return capitalCamel + **/ + @ApiModelProperty(value = "") + public String getCapitalCamel() { + return capitalCamel; + } + + public void setCapitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + } + + public Capitalization smallSnake(String smallSnake) { + this.smallSnake = smallSnake; + return this; + } + + /** + * Get smallSnake + * @return smallSnake + **/ + @ApiModelProperty(value = "") + public String getSmallSnake() { + return smallSnake; + } + + public void setSmallSnake(String smallSnake) { + this.smallSnake = smallSnake; + } + + public Capitalization capitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + return this; + } + + /** + * Get capitalSnake + * @return capitalSnake + **/ + @ApiModelProperty(value = "") + public String getCapitalSnake() { + return capitalSnake; + } + + public void setCapitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + } + + public Capitalization scAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + return this; + } + + /** + * Get scAETHFlowPoints + * @return scAETHFlowPoints + **/ + @ApiModelProperty(value = "") + public String getScAETHFlowPoints() { + return scAETHFlowPoints; + } + + public void setScAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + } + + public Capitalization ATT_NAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + return this; + } + + /** + * Name of the pet + * @return ATT_NAME + **/ + @ApiModelProperty(value = "Name of the pet ") + public String getATTNAME() { + return ATT_NAME; + } + + public void setATTNAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Capitalization capitalization = (Capitalization) o; + return Objects.equals(this.smallCamel, capitalization.smallCamel) && + Objects.equals(this.capitalCamel, capitalization.capitalCamel) && + Objects.equals(this.smallSnake, capitalization.smallSnake) && + Objects.equals(this.capitalSnake, capitalization.capitalSnake) && + Objects.equals(this.scAETHFlowPoints, capitalization.scAETHFlowPoints) && + Objects.equals(this.ATT_NAME, capitalization.ATT_NAME); + } + + @Override + public int hashCode() { + return Objects.hash(smallCamel, capitalCamel, smallSnake, capitalSnake, scAETHFlowPoints, ATT_NAME); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Capitalization {\n"); + + sb.append(" smallCamel: ").append(toIndentedString(smallCamel)).append("\n"); + sb.append(" capitalCamel: ").append(toIndentedString(capitalCamel)).append("\n"); + sb.append(" smallSnake: ").append(toIndentedString(smallSnake)).append("\n"); + sb.append(" capitalSnake: ").append(toIndentedString(capitalSnake)).append("\n"); + sb.append(" scAETHFlowPoints: ").append(toIndentedString(scAETHFlowPoints)).append("\n"); + sb.append(" ATT_NAME: ").append(toIndentedString(ATT_NAME)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Cat.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Cat.java new file mode 100644 index 00000000000..bed98769d85 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Cat.java @@ -0,0 +1,95 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.Animal; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Cat + */ + +public class Cat extends Animal { + @JsonProperty("declawed") + private Boolean declawed = null; + + public Cat declawed(Boolean declawed) { + this.declawed = declawed; + return this; + } + + /** + * Get declawed + * @return declawed + **/ + @ApiModelProperty(value = "") + public Boolean getDeclawed() { + return declawed; + } + + public void setDeclawed(Boolean declawed) { + this.declawed = declawed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Cat cat = (Cat) o; + return Objects.equals(this.declawed, cat.declawed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(declawed, super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Cat {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" declawed: ").append(toIndentedString(declawed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Category.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Category.java new file mode 100644 index 00000000000..7a342072469 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Category.java @@ -0,0 +1,116 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Category + */ + +public class Category { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Category id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Category name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(this.id, category.id) && + Objects.equals(this.name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ClassModel.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ClassModel.java new file mode 100644 index 00000000000..2f4d3aadd35 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ClassModel.java @@ -0,0 +1,94 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Model for testing model with \"_class\" property + */ +@ApiModel(description = "Model for testing model with \"_class\" property") + +public class ClassModel { + @JsonProperty("_class") + private String propertyClass = null; + + public ClassModel propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ClassModel classModel = (ClassModel) o; + return Objects.equals(this.propertyClass, classModel.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(propertyClass); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ClassModel {\n"); + + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Client.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Client.java new file mode 100644 index 00000000000..c6efc5a533e --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Client.java @@ -0,0 +1,93 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Client + */ + +public class Client { + @JsonProperty("client") + private String client = null; + + public Client client(String client) { + this.client = client; + return this; + } + + /** + * Get client + * @return client + **/ + @ApiModelProperty(value = "") + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Client client = (Client) o; + return Objects.equals(this.client, client.client); + } + + @Override + public int hashCode() { + return Objects.hash(client); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Client {\n"); + + sb.append(" client: ").append(toIndentedString(client)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Dog.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Dog.java new file mode 100644 index 00000000000..29210dd068e --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Dog.java @@ -0,0 +1,95 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.Animal; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Dog + */ + +public class Dog extends Animal { + @JsonProperty("breed") + private String breed = null; + + public Dog breed(String breed) { + this.breed = breed; + return this; + } + + /** + * Get breed + * @return breed + **/ + @ApiModelProperty(value = "") + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Dog dog = (Dog) o; + return Objects.equals(this.breed, dog.breed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(breed, super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Dog {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" breed: ").append(toIndentedString(breed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumArrays.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumArrays.java new file mode 100644 index 00000000000..32a694a4de1 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumArrays.java @@ -0,0 +1,196 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * EnumArrays + */ + +public class EnumArrays { + /** + * Gets or Sets justSymbol + */ + public enum JustSymbolEnum { + GREATER_THAN_OR_EQUAL_TO(">="), + + DOLLAR("$"); + + private String value; + + JustSymbolEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static JustSymbolEnum fromValue(String text) { + for (JustSymbolEnum b : JustSymbolEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("just_symbol") + private JustSymbolEnum justSymbol = null; + + /** + * Gets or Sets arrayEnum + */ + public enum ArrayEnumEnum { + FISH("fish"), + + CRAB("crab"); + + private String value; + + ArrayEnumEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ArrayEnumEnum fromValue(String text) { + for (ArrayEnumEnum b : ArrayEnumEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("array_enum") + private List arrayEnum = null; + + public EnumArrays justSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + return this; + } + + /** + * Get justSymbol + * @return justSymbol + **/ + @ApiModelProperty(value = "") + public JustSymbolEnum getJustSymbol() { + return justSymbol; + } + + public void setJustSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + } + + public EnumArrays arrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + return this; + } + + public EnumArrays addArrayEnumItem(ArrayEnumEnum arrayEnumItem) { + if (this.arrayEnum == null) { + this.arrayEnum = new ArrayList<>(); + } + this.arrayEnum.add(arrayEnumItem); + return this; + } + + /** + * Get arrayEnum + * @return arrayEnum + **/ + @ApiModelProperty(value = "") + public List getArrayEnum() { + return arrayEnum; + } + + public void setArrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumArrays enumArrays = (EnumArrays) o; + return Objects.equals(this.justSymbol, enumArrays.justSymbol) && + Objects.equals(this.arrayEnum, enumArrays.arrayEnum); + } + + @Override + public int hashCode() { + return Objects.hash(justSymbol, arrayEnum); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumArrays {\n"); + + sb.append(" justSymbol: ").append(toIndentedString(justSymbol)).append("\n"); + sb.append(" arrayEnum: ").append(toIndentedString(arrayEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumClass.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumClass.java new file mode 100644 index 00000000000..5ba02415fc9 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumClass.java @@ -0,0 +1,61 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import javax.validation.constraints.*; +import javax.validation.Valid; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Gets or Sets EnumClass + */ +public enum EnumClass { + + _ABC("_abc"), + + _EFG("-efg"), + + _XYZ_("(xyz)"); + + private String value; + + EnumClass(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumClass fromValue(String text) { + for (EnumClass b : EnumClass.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumTest.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumTest.java new file mode 100644 index 00000000000..2d835a86ed8 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/EnumTest.java @@ -0,0 +1,332 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.OuterEnum; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * EnumTest + */ + +public class EnumTest { + /** + * Gets or Sets enumString + */ + public enum EnumStringEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringEnum fromValue(String text) { + for (EnumStringEnum b : EnumStringEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string") + private EnumStringEnum enumString = null; + + /** + * Gets or Sets enumStringRequired + */ + public enum EnumStringRequiredEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringRequiredEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringRequiredEnum fromValue(String text) { + for (EnumStringRequiredEnum b : EnumStringRequiredEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string_required") + private EnumStringRequiredEnum enumStringRequired = null; + + /** + * Gets or Sets enumInteger + */ + public enum EnumIntegerEnum { + NUMBER_1(1), + + NUMBER_MINUS_1(-1); + + private Integer value; + + EnumIntegerEnum(Integer value) { + this.value = value; + } + + @JsonValue + public Integer getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumIntegerEnum fromValue(String text) { + for (EnumIntegerEnum b : EnumIntegerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_integer") + private EnumIntegerEnum enumInteger = null; + + /** + * Gets or Sets enumNumber + */ + public enum EnumNumberEnum { + NUMBER_1_DOT_1(1.1), + + NUMBER_MINUS_1_DOT_2(-1.2); + + private Double value; + + EnumNumberEnum(Double value) { + this.value = value; + } + + @JsonValue + public Double getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumNumberEnum fromValue(String text) { + for (EnumNumberEnum b : EnumNumberEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_number") + private EnumNumberEnum enumNumber = null; + + @JsonProperty("outerEnum") + private OuterEnum outerEnum = null; + + public EnumTest enumString(EnumStringEnum enumString) { + this.enumString = enumString; + return this; + } + + /** + * Get enumString + * @return enumString + **/ + @ApiModelProperty(value = "") + public EnumStringEnum getEnumString() { + return enumString; + } + + public void setEnumString(EnumStringEnum enumString) { + this.enumString = enumString; + } + + public EnumTest enumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + return this; + } + + /** + * Get enumStringRequired + * @return enumStringRequired + **/ + @NotNull + @ApiModelProperty(required = true, value = "") + public EnumStringRequiredEnum getEnumStringRequired() { + return enumStringRequired; + } + + public void setEnumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + } + + public EnumTest enumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + return this; + } + + /** + * Get enumInteger + * @return enumInteger + **/ + @ApiModelProperty(value = "") + public EnumIntegerEnum getEnumInteger() { + return enumInteger; + } + + public void setEnumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + } + + public EnumTest enumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + return this; + } + + /** + * Get enumNumber + * @return enumNumber + **/ + @ApiModelProperty(value = "") + public EnumNumberEnum getEnumNumber() { + return enumNumber; + } + + public void setEnumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + } + + public EnumTest outerEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + return this; + } + + /** + * Get outerEnum + * @return outerEnum + **/ + @Valid + @ApiModelProperty(value = "") + public OuterEnum getOuterEnum() { + return outerEnum; + } + + public void setOuterEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumTest enumTest = (EnumTest) o; + return Objects.equals(this.enumString, enumTest.enumString) && + Objects.equals(this.enumStringRequired, enumTest.enumStringRequired) && + Objects.equals(this.enumInteger, enumTest.enumInteger) && + Objects.equals(this.enumNumber, enumTest.enumNumber) && + Objects.equals(this.outerEnum, enumTest.outerEnum); + } + + @Override + public int hashCode() { + return Objects.hash(enumString, enumStringRequired, enumInteger, enumNumber, outerEnum); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumTest {\n"); + + sb.append(" enumString: ").append(toIndentedString(enumString)).append("\n"); + sb.append(" enumStringRequired: ").append(toIndentedString(enumStringRequired)).append("\n"); + sb.append(" enumInteger: ").append(toIndentedString(enumInteger)).append("\n"); + sb.append(" enumNumber: ").append(toIndentedString(enumNumber)).append("\n"); + sb.append(" outerEnum: ").append(toIndentedString(outerEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java new file mode 100644 index 00000000000..0733417b912 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java @@ -0,0 +1,128 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * FileSchemaTestClass + */ + +public class FileSchemaTestClass { + @JsonProperty("file") + private java.io.File file = null; + + @JsonProperty("files") + private List files = null; + + public FileSchemaTestClass file(java.io.File file) { + this.file = file; + return this; + } + + /** + * Get file + * @return file + **/ + @Valid + @ApiModelProperty(value = "") + public java.io.File getFile() { + return file; + } + + public void setFile(java.io.File file) { + this.file = file; + } + + public FileSchemaTestClass files(List files) { + this.files = files; + return this; + } + + public FileSchemaTestClass addFilesItem(java.io.File filesItem) { + if (this.files == null) { + this.files = new ArrayList<>(); + } + this.files.add(filesItem); + return this; + } + + /** + * Get files + * @return files + **/ + @Valid + @ApiModelProperty(value = "") + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FileSchemaTestClass fileSchemaTestClass = (FileSchemaTestClass) o; + return Objects.equals(this.file, fileSchemaTestClass.file) && + Objects.equals(this.files, fileSchemaTestClass.files); + } + + @Override + public int hashCode() { + return Objects.hash(file, files); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FileSchemaTestClass {\n"); + + sb.append(" file: ").append(toIndentedString(file)).append("\n"); + sb.append(" files: ").append(toIndentedString(files)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FormatTest.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FormatTest.java new file mode 100644 index 00000000000..0b0d2915632 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/FormatTest.java @@ -0,0 +1,393 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.File; +import java.math.BigDecimal; +import java.util.UUID; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * FormatTest + */ + +public class FormatTest { + @JsonProperty("integer") + private Integer integer = null; + + @JsonProperty("int32") + private Integer int32 = null; + + @JsonProperty("int64") + private Long int64 = null; + + @JsonProperty("number") + private BigDecimal number = null; + + @JsonProperty("float") + private Float _float = null; + + @JsonProperty("double") + private Double _double = null; + + @JsonProperty("string") + private String string = null; + + @JsonProperty("byte") + private byte[] _byte = null; + + @JsonProperty("binary") + private File binary = null; + + @JsonProperty("date") + private LocalDate date = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("password") + private String password = null; + + public FormatTest integer(Integer integer) { + this.integer = integer; + return this; + } + + /** + * Get integer + * minimum: 10 + * maximum: 100 + * @return integer + **/ + @Min(10) @Max(100) @ApiModelProperty(value = "") + public Integer getInteger() { + return integer; + } + + public void setInteger(Integer integer) { + this.integer = integer; + } + + public FormatTest int32(Integer int32) { + this.int32 = int32; + return this; + } + + /** + * Get int32 + * minimum: 20 + * maximum: 200 + * @return int32 + **/ + @Min(20) @Max(200) @ApiModelProperty(value = "") + public Integer getInt32() { + return int32; + } + + public void setInt32(Integer int32) { + this.int32 = int32; + } + + public FormatTest int64(Long int64) { + this.int64 = int64; + return this; + } + + /** + * Get int64 + * @return int64 + **/ + @ApiModelProperty(value = "") + public Long getInt64() { + return int64; + } + + public void setInt64(Long int64) { + this.int64 = int64; + } + + public FormatTest number(BigDecimal number) { + this.number = number; + return this; + } + + /** + * Get number + * minimum: 32.1 + * maximum: 543.2 + * @return number + **/ + @NotNull + @Valid + @DecimalMin("32.1") @DecimalMax("543.2") @ApiModelProperty(required = true, value = "") + public BigDecimal getNumber() { + return number; + } + + public void setNumber(BigDecimal number) { + this.number = number; + } + + public FormatTest _float(Float _float) { + this._float = _float; + return this; + } + + /** + * Get _float + * minimum: 54.3 + * maximum: 987.6 + * @return _float + **/ + @DecimalMin("54.3") @DecimalMax("987.6") @ApiModelProperty(value = "") + public Float getFloat() { + return _float; + } + + public void setFloat(Float _float) { + this._float = _float; + } + + public FormatTest _double(Double _double) { + this._double = _double; + return this; + } + + /** + * Get _double + * minimum: 67.8 + * maximum: 123.4 + * @return _double + **/ + @DecimalMin("67.8") @DecimalMax("123.4") @ApiModelProperty(value = "") + public Double getDouble() { + return _double; + } + + public void setDouble(Double _double) { + this._double = _double; + } + + public FormatTest string(String string) { + this.string = string; + return this; + } + + /** + * Get string + * @return string + **/ + @Pattern(regexp="/[a-z]/i") @ApiModelProperty(value = "") + public String getString() { + return string; + } + + public void setString(String string) { + this.string = string; + } + + public FormatTest _byte(byte[] _byte) { + this._byte = _byte; + return this; + } + + /** + * Get _byte + * @return _byte + **/ + @NotNull + @Pattern(regexp="^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$") @ApiModelProperty(required = true, value = "") + public byte[] getByte() { + return _byte; + } + + public void setByte(byte[] _byte) { + this._byte = _byte; + } + + public FormatTest binary(File binary) { + this.binary = binary; + return this; + } + + /** + * Get binary + * @return binary + **/ + @Valid + @ApiModelProperty(value = "") + public File getBinary() { + return binary; + } + + public void setBinary(File binary) { + this.binary = binary; + } + + public FormatTest date(LocalDate date) { + this.date = date; + return this; + } + + /** + * Get date + * @return date + **/ + @NotNull + @Valid + @ApiModelProperty(required = true, value = "") + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public FormatTest dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @Valid + @ApiModelProperty(value = "") + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public FormatTest uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @Valid + @ApiModelProperty(value = "") + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public FormatTest password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @NotNull + @Size(min=10,max=64) @ApiModelProperty(required = true, value = "") + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FormatTest formatTest = (FormatTest) o; + return Objects.equals(this.integer, formatTest.integer) && + Objects.equals(this.int32, formatTest.int32) && + Objects.equals(this.int64, formatTest.int64) && + Objects.equals(this.number, formatTest.number) && + Objects.equals(this._float, formatTest._float) && + Objects.equals(this._double, formatTest._double) && + Objects.equals(this.string, formatTest.string) && + Arrays.equals(this._byte, formatTest._byte) && + Objects.equals(this.binary, formatTest.binary) && + Objects.equals(this.date, formatTest.date) && + Objects.equals(this.dateTime, formatTest.dateTime) && + Objects.equals(this.uuid, formatTest.uuid) && + Objects.equals(this.password, formatTest.password); + } + + @Override + public int hashCode() { + return Objects.hash(integer, int32, int64, number, _float, _double, string, Arrays.hashCode(_byte), binary, date, dateTime, uuid, password); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FormatTest {\n"); + + sb.append(" integer: ").append(toIndentedString(integer)).append("\n"); + sb.append(" int32: ").append(toIndentedString(int32)).append("\n"); + sb.append(" int64: ").append(toIndentedString(int64)).append("\n"); + sb.append(" number: ").append(toIndentedString(number)).append("\n"); + sb.append(" _float: ").append(toIndentedString(_float)).append("\n"); + sb.append(" _double: ").append(toIndentedString(_double)).append("\n"); + sb.append(" string: ").append(toIndentedString(string)).append("\n"); + sb.append(" _byte: ").append(toIndentedString(_byte)).append("\n"); + sb.append(" binary: ").append(toIndentedString(binary)).append("\n"); + sb.append(" date: ").append(toIndentedString(date)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java new file mode 100644 index 00000000000..dee87cf7fb4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java @@ -0,0 +1,98 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * HasOnlyReadOnly + */ + +public class HasOnlyReadOnly { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("foo") + private String foo = null; + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(value = "") + public String getBar() { + return bar; + } + + /** + * Get foo + * @return foo + **/ + @ApiModelProperty(value = "") + public String getFoo() { + return foo; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + HasOnlyReadOnly hasOnlyReadOnly = (HasOnlyReadOnly) o; + return Objects.equals(this.bar, hasOnlyReadOnly.bar) && + Objects.equals(this.foo, hasOnlyReadOnly.foo); + } + + @Override + public int hashCode() { + return Objects.hash(bar, foo); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class HasOnlyReadOnly {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" foo: ").append(toIndentedString(foo)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MapTest.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MapTest.java new file mode 100644 index 00000000000..aca072ecc75 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MapTest.java @@ -0,0 +1,227 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.openapitools.client.model.StringBooleanMap; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * MapTest + */ + +public class MapTest { + @JsonProperty("map_map_of_string") + private Map> mapMapOfString = null; + + /** + * Gets or Sets inner + */ + public enum InnerEnum { + UPPER("UPPER"), + + LOWER("lower"); + + private String value; + + InnerEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static InnerEnum fromValue(String text) { + for (InnerEnum b : InnerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("map_of_enum_string") + private Map mapOfEnumString = null; + + @JsonProperty("direct_map") + private Map directMap = null; + + @JsonProperty("indirect_map") + private StringBooleanMap indirectMap = null; + + public MapTest mapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + return this; + } + + public MapTest putMapMapOfStringItem(String key, Map mapMapOfStringItem) { + if (this.mapMapOfString == null) { + this.mapMapOfString = new HashMap<>(); + } + this.mapMapOfString.put(key, mapMapOfStringItem); + return this; + } + + /** + * Get mapMapOfString + * @return mapMapOfString + **/ + @Valid + @ApiModelProperty(value = "") + public Map> getMapMapOfString() { + return mapMapOfString; + } + + public void setMapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + } + + public MapTest mapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + return this; + } + + public MapTest putMapOfEnumStringItem(String key, InnerEnum mapOfEnumStringItem) { + if (this.mapOfEnumString == null) { + this.mapOfEnumString = new HashMap<>(); + } + this.mapOfEnumString.put(key, mapOfEnumStringItem); + return this; + } + + /** + * Get mapOfEnumString + * @return mapOfEnumString + **/ + @ApiModelProperty(value = "") + public Map getMapOfEnumString() { + return mapOfEnumString; + } + + public void setMapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + } + + public MapTest directMap(Map directMap) { + this.directMap = directMap; + return this; + } + + public MapTest putDirectMapItem(String key, Boolean directMapItem) { + if (this.directMap == null) { + this.directMap = new HashMap<>(); + } + this.directMap.put(key, directMapItem); + return this; + } + + /** + * Get directMap + * @return directMap + **/ + @ApiModelProperty(value = "") + public Map getDirectMap() { + return directMap; + } + + public void setDirectMap(Map directMap) { + this.directMap = directMap; + } + + public MapTest indirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + return this; + } + + /** + * Get indirectMap + * @return indirectMap + **/ + @Valid + @ApiModelProperty(value = "") + public StringBooleanMap getIndirectMap() { + return indirectMap; + } + + public void setIndirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MapTest mapTest = (MapTest) o; + return Objects.equals(this.mapMapOfString, mapTest.mapMapOfString) && + Objects.equals(this.mapOfEnumString, mapTest.mapOfEnumString) && + Objects.equals(this.directMap, mapTest.directMap) && + Objects.equals(this.indirectMap, mapTest.indirectMap); + } + + @Override + public int hashCode() { + return Objects.hash(mapMapOfString, mapOfEnumString, directMap, indirectMap); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MapTest {\n"); + + sb.append(" mapMapOfString: ").append(toIndentedString(mapMapOfString)).append("\n"); + sb.append(" mapOfEnumString: ").append(toIndentedString(mapOfEnumString)).append("\n"); + sb.append(" directMap: ").append(toIndentedString(directMap)).append("\n"); + sb.append(" indirectMap: ").append(toIndentedString(indirectMap)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java new file mode 100644 index 00000000000..212fd13d413 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java @@ -0,0 +1,156 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.openapitools.client.model.Animal; +import org.threeten.bp.OffsetDateTime; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * MixedPropertiesAndAdditionalPropertiesClass + */ + +public class MixedPropertiesAndAdditionalPropertiesClass { + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("map") + private Map map = null; + + public MixedPropertiesAndAdditionalPropertiesClass uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @Valid + @ApiModelProperty(value = "") + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public MixedPropertiesAndAdditionalPropertiesClass dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @Valid + @ApiModelProperty(value = "") + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public MixedPropertiesAndAdditionalPropertiesClass map(Map map) { + this.map = map; + return this; + } + + public MixedPropertiesAndAdditionalPropertiesClass putMapItem(String key, Animal mapItem) { + if (this.map == null) { + this.map = new HashMap<>(); + } + this.map.put(key, mapItem); + return this; + } + + /** + * Get map + * @return map + **/ + @Valid + @ApiModelProperty(value = "") + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MixedPropertiesAndAdditionalPropertiesClass mixedPropertiesAndAdditionalPropertiesClass = (MixedPropertiesAndAdditionalPropertiesClass) o; + return Objects.equals(this.uuid, mixedPropertiesAndAdditionalPropertiesClass.uuid) && + Objects.equals(this.dateTime, mixedPropertiesAndAdditionalPropertiesClass.dateTime) && + Objects.equals(this.map, mixedPropertiesAndAdditionalPropertiesClass.map); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, dateTime, map); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MixedPropertiesAndAdditionalPropertiesClass {\n"); + + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" map: ").append(toIndentedString(map)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Model200Response.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Model200Response.java new file mode 100644 index 00000000000..bcdb67df9de --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Model200Response.java @@ -0,0 +1,117 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Model for testing model name starting with number + */ +@ApiModel(description = "Model for testing model name starting with number") + +public class Model200Response { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("class") + private String propertyClass = null; + + public Model200Response name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + public Model200Response propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Model200Response _200response = (Model200Response) o; + return Objects.equals(this.name, _200response.name) && + Objects.equals(this.propertyClass, _200response.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(name, propertyClass); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Model200Response {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelApiResponse.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelApiResponse.java new file mode 100644 index 00000000000..8eb69f7d469 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelApiResponse.java @@ -0,0 +1,139 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * ModelApiResponse + */ + +public class ModelApiResponse { + @JsonProperty("code") + private Integer code = null; + + @JsonProperty("type") + private String type = null; + + @JsonProperty("message") + private String message = null; + + public ModelApiResponse code(Integer code) { + this.code = code; + return this; + } + + /** + * Get code + * @return code + **/ + @ApiModelProperty(value = "") + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public ModelApiResponse type(String type) { + this.type = type; + return this; + } + + /** + * Get type + * @return type + **/ + @ApiModelProperty(value = "") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public ModelApiResponse message(String message) { + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @ApiModelProperty(value = "") + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelApiResponse _apiResponse = (ModelApiResponse) o; + return Objects.equals(this.code, _apiResponse.code) && + Objects.equals(this.type, _apiResponse.type) && + Objects.equals(this.message, _apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelApiResponse {\n"); + + sb.append(" code: ").append(toIndentedString(code)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelReturn.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelReturn.java new file mode 100644 index 00000000000..7fd7e7c0cb4 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ModelReturn.java @@ -0,0 +1,94 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Model for testing reserved words + */ +@ApiModel(description = "Model for testing reserved words") + +public class ModelReturn { + @JsonProperty("return") + private Integer _return = null; + + public ModelReturn _return(Integer _return) { + this._return = _return; + return this; + } + + /** + * Get _return + * @return _return + **/ + @ApiModelProperty(value = "") + public Integer getReturn() { + return _return; + } + + public void setReturn(Integer _return) { + this._return = _return; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelReturn _return = (ModelReturn) o; + return Objects.equals(this._return, _return._return); + } + + @Override + public int hashCode() { + return Objects.hash(_return); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelReturn {\n"); + + sb.append(" _return: ").append(toIndentedString(_return)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Name.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Name.java new file mode 100644 index 00000000000..16a25a54a29 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Name.java @@ -0,0 +1,146 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Model for testing model name same as property name + */ +@ApiModel(description = "Model for testing model name same as property name") + +public class Name { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("snake_case") + private Integer snakeCase = null; + + @JsonProperty("property") + private String property = null; + + @JsonProperty("123Number") + private Integer _123number = null; + + public Name name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @NotNull + @ApiModelProperty(required = true, value = "") + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + /** + * Get snakeCase + * @return snakeCase + **/ + @ApiModelProperty(value = "") + public Integer getSnakeCase() { + return snakeCase; + } + + public Name property(String property) { + this.property = property; + return this; + } + + /** + * Get property + * @return property + **/ + @ApiModelProperty(value = "") + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + /** + * Get _123number + * @return _123number + **/ + @ApiModelProperty(value = "") + public Integer get123number() { + return _123number; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Name name = (Name) o; + return Objects.equals(this.name, name.name) && + Objects.equals(this.snakeCase, name.snakeCase) && + Objects.equals(this.property, name.property) && + Objects.equals(this._123number, name._123number); + } + + @Override + public int hashCode() { + return Objects.hash(name, snakeCase, property, _123number); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Name {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" snakeCase: ").append(toIndentedString(snakeCase)).append("\n"); + sb.append(" property: ").append(toIndentedString(property)).append("\n"); + sb.append(" _123number: ").append(toIndentedString(_123number)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/NumberOnly.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/NumberOnly.java new file mode 100644 index 00000000000..c3bada4d06f --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/NumberOnly.java @@ -0,0 +1,95 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * NumberOnly + */ + +public class NumberOnly { + @JsonProperty("JustNumber") + private BigDecimal justNumber = null; + + public NumberOnly justNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + return this; + } + + /** + * Get justNumber + * @return justNumber + **/ + @Valid + @ApiModelProperty(value = "") + public BigDecimal getJustNumber() { + return justNumber; + } + + public void setJustNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberOnly numberOnly = (NumberOnly) o; + return Objects.equals(this.justNumber, numberOnly.justNumber); + } + + @Override + public int hashCode() { + return Objects.hash(justNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class NumberOnly {\n"); + + sb.append(" justNumber: ").append(toIndentedString(justNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Order.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Order.java new file mode 100644 index 00000000000..e109aaa7cbb --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Order.java @@ -0,0 +1,247 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.threeten.bp.OffsetDateTime; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Order + */ + +public class Order { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("petId") + private Long petId = null; + + @JsonProperty("quantity") + private Integer quantity = null; + + @JsonProperty("shipDate") + private OffsetDateTime shipDate = null; + + /** + * Order Status + */ + public enum StatusEnum { + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + @JsonProperty("complete") + private Boolean complete = false; + + public Order id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Order petId(Long petId) { + this.petId = petId; + return this; + } + + /** + * Get petId + * @return petId + **/ + @ApiModelProperty(value = "") + public Long getPetId() { + return petId; + } + + public void setPetId(Long petId) { + this.petId = petId; + } + + public Order quantity(Integer quantity) { + this.quantity = quantity; + return this; + } + + /** + * Get quantity + * @return quantity + **/ + @ApiModelProperty(value = "") + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Order shipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + return this; + } + + /** + * Get shipDate + * @return shipDate + **/ + @Valid + @ApiModelProperty(value = "") + public OffsetDateTime getShipDate() { + return shipDate; + } + + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + public Order status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * Order Status + * @return status + **/ + @ApiModelProperty(value = "Order Status") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + public Order complete(Boolean complete) { + this.complete = complete; + return this; + } + + /** + * Get complete + * @return complete + **/ + @ApiModelProperty(value = "") + public Boolean getComplete() { + return complete; + } + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(this.id, order.id) && + Objects.equals(this.petId, order.petId) && + Objects.equals(this.quantity, order.quantity) && + Objects.equals(this.shipDate, order.shipDate) && + Objects.equals(this.status, order.status) && + Objects.equals(this.complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterComposite.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterComposite.java new file mode 100644 index 00000000000..f0bf1fbaab2 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterComposite.java @@ -0,0 +1,141 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * OuterComposite + */ + +public class OuterComposite { + @JsonProperty("my_number") + private BigDecimal myNumber = null; + + @JsonProperty("my_string") + private String myString = null; + + @JsonProperty("my_boolean") + private Boolean myBoolean = null; + + public OuterComposite myNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + return this; + } + + /** + * Get myNumber + * @return myNumber + **/ + @Valid + @ApiModelProperty(value = "") + public BigDecimal getMyNumber() { + return myNumber; + } + + public void setMyNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + } + + public OuterComposite myString(String myString) { + this.myString = myString; + return this; + } + + /** + * Get myString + * @return myString + **/ + @ApiModelProperty(value = "") + public String getMyString() { + return myString; + } + + public void setMyString(String myString) { + this.myString = myString; + } + + public OuterComposite myBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + return this; + } + + /** + * Get myBoolean + * @return myBoolean + **/ + @ApiModelProperty(value = "") + public Boolean getMyBoolean() { + return myBoolean; + } + + public void setMyBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OuterComposite outerComposite = (OuterComposite) o; + return Objects.equals(this.myNumber, outerComposite.myNumber) && + Objects.equals(this.myString, outerComposite.myString) && + Objects.equals(this.myBoolean, outerComposite.myBoolean); + } + + @Override + public int hashCode() { + return Objects.hash(myNumber, myString, myBoolean); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class OuterComposite {\n"); + + sb.append(" myNumber: ").append(toIndentedString(myNumber)).append("\n"); + sb.append(" myString: ").append(toIndentedString(myString)).append("\n"); + sb.append(" myBoolean: ").append(toIndentedString(myBoolean)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterEnum.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterEnum.java new file mode 100644 index 00000000000..7a9fbfc01f6 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/OuterEnum.java @@ -0,0 +1,61 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import javax.validation.constraints.*; +import javax.validation.Valid; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Gets or Sets OuterEnum + */ +public enum OuterEnum { + + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + OuterEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static OuterEnum fromValue(String text) { + for (OuterEnum b : OuterEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Pet.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Pet.java new file mode 100644 index 00000000000..eda15f833c6 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Pet.java @@ -0,0 +1,266 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.Category; +import org.openapitools.client.model.Tag; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Pet + */ + +public class Pet { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("category") + private Category category = null; + + @JsonProperty("name") + private String name = null; + + @JsonProperty("photoUrls") + private List photoUrls = new ArrayList<>(); + + @JsonProperty("tags") + private List tags = null; + + /** + * pet status in the store + */ + public enum StatusEnum { + AVAILABLE("available"), + + PENDING("pending"), + + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + public Pet id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Pet category(Category category) { + this.category = category; + return this; + } + + /** + * Get category + * @return category + **/ + @Valid + @ApiModelProperty(value = "") + public Category getCategory() { + return category; + } + + public void setCategory(Category category) { + this.category = category; + } + + public Pet name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @NotNull + @ApiModelProperty(example = "doggie", required = true, value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Pet photoUrls(List photoUrls) { + this.photoUrls = photoUrls; + return this; + } + + public Pet addPhotoUrlsItem(String photoUrlsItem) { + this.photoUrls.add(photoUrlsItem); + return this; + } + + /** + * Get photoUrls + * @return photoUrls + **/ + @NotNull + @ApiModelProperty(required = true, value = "") + public List getPhotoUrls() { + return photoUrls; + } + + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + public Pet tags(List tags) { + this.tags = tags; + return this; + } + + public Pet addTagsItem(Tag tagsItem) { + if (this.tags == null) { + this.tags = new ArrayList<>(); + } + this.tags.add(tagsItem); + return this; + } + + /** + * Get tags + * @return tags + **/ + @Valid + @ApiModelProperty(value = "") + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public Pet status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * pet status in the store + * @return status + **/ + @ApiModelProperty(value = "pet status in the store") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(this.id, pet.id) && + Objects.equals(this.category, pet.category) && + Objects.equals(this.name, pet.name) && + Objects.equals(this.photoUrls, pet.photoUrls) && + Objects.equals(this.tags, pet.tags) && + Objects.equals(this.status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java new file mode 100644 index 00000000000..882a50757ad --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java @@ -0,0 +1,107 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * ReadOnlyFirst + */ + +public class ReadOnlyFirst { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("baz") + private String baz = null; + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(value = "") + public String getBar() { + return bar; + } + + public ReadOnlyFirst baz(String baz) { + this.baz = baz; + return this; + } + + /** + * Get baz + * @return baz + **/ + @ApiModelProperty(value = "") + public String getBaz() { + return baz; + } + + public void setBaz(String baz) { + this.baz = baz; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReadOnlyFirst readOnlyFirst = (ReadOnlyFirst) o; + return Objects.equals(this.bar, readOnlyFirst.bar) && + Objects.equals(this.baz, readOnlyFirst.baz); + } + + @Override + public int hashCode() { + return Objects.hash(bar, baz); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ReadOnlyFirst {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" baz: ").append(toIndentedString(baz)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/SpecialModelName.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/SpecialModelName.java new file mode 100644 index 00000000000..0a73668a0ec --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/SpecialModelName.java @@ -0,0 +1,93 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * SpecialModelName + */ + +public class SpecialModelName { + @JsonProperty("$special[property.name]") + private Long $specialPropertyName = null; + + public SpecialModelName $specialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + return this; + } + + /** + * Get $specialPropertyName + * @return $specialPropertyName + **/ + @ApiModelProperty(value = "") + public Long get$SpecialPropertyName() { + return $specialPropertyName; + } + + public void set$SpecialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SpecialModelName $specialModelName = (SpecialModelName) o; + return Objects.equals(this.$specialPropertyName, $specialModelName.$specialPropertyName); + } + + @Override + public int hashCode() { + return Objects.hash($specialPropertyName); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class SpecialModelName {\n"); + + sb.append(" $specialPropertyName: ").append(toIndentedString($specialPropertyName)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/StringBooleanMap.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/StringBooleanMap.java new file mode 100644 index 00000000000..c651556f7d0 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/StringBooleanMap.java @@ -0,0 +1,67 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * StringBooleanMap + */ + +public class StringBooleanMap extends HashMap { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class StringBooleanMap {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Tag.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Tag.java new file mode 100644 index 00000000000..ea23d8f46c2 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/Tag.java @@ -0,0 +1,116 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * Tag + */ + +public class Tag { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Tag id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Tag name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(this.id, tag.id) && + Objects.equals(this.name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/User.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/User.java new file mode 100644 index 00000000000..5173076477d --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/model/User.java @@ -0,0 +1,254 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; +import javax.validation.Valid; + +/** + * User + */ + +public class User { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("username") + private String username = null; + + @JsonProperty("firstName") + private String firstName = null; + + @JsonProperty("lastName") + private String lastName = null; + + @JsonProperty("email") + private String email = null; + + @JsonProperty("password") + private String password = null; + + @JsonProperty("phone") + private String phone = null; + + @JsonProperty("userStatus") + private Integer userStatus = null; + + public User id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public User username(String username) { + this.username = username; + return this; + } + + /** + * Get username + * @return username + **/ + @ApiModelProperty(value = "") + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public User firstName(String firstName) { + this.firstName = firstName; + return this; + } + + /** + * Get firstName + * @return firstName + **/ + @ApiModelProperty(value = "") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public User lastName(String lastName) { + this.lastName = lastName; + return this; + } + + /** + * Get lastName + * @return lastName + **/ + @ApiModelProperty(value = "") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public User email(String email) { + this.email = email; + return this; + } + + /** + * Get email + * @return email + **/ + @ApiModelProperty(value = "") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public User password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(value = "") + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public User phone(String phone) { + this.phone = phone; + return this; + } + + /** + * Get phone + * @return phone + **/ + @ApiModelProperty(value = "") + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User userStatus(Integer userStatus) { + this.userStatus = userStatus; + return this; + } + + /** + * User Status + * @return userStatus + **/ + @ApiModelProperty(value = "User Status") + public Integer getUserStatus() { + return userStatus; + } + + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(this.id, user.id) && + Objects.equals(this.username, user.username) && + Objects.equals(this.firstName, user.firstName) && + Objects.equals(this.lastName, user.lastName) && + Objects.equals(this.email, user.email) && + Objects.equals(this.password, user.password) && + Objects.equals(this.phone, user.phone) && + Objects.equals(this.userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java new file mode 100644 index 00000000000..0307ed17779 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java @@ -0,0 +1,32 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Client; + +/** + * API tests for AnotherFakeApi + */ +public class AnotherFakeApiTest { + + private AnotherFakeApi api; + + @Before + public void setup() { + api = new ApiClient().createService(AnotherFakeApi.class); + } + + /** + * To test special tags + * + * To test special tags and operation ID starting with number + */ + @Test + public void call123testSpecialTagsTest() { + Client client = null; + // Client response = api.call123testSpecialTags(client); + + // TODO: test validations + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeApiTest.java new file mode 100644 index 00000000000..4889e92772c --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeApiTest.java @@ -0,0 +1,184 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Client; +import org.openapitools.client.model.FileSchemaTestClass; +import org.openapitools.client.model.OuterComposite; +import org.openapitools.client.model.User; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; + +import java.io.File; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * API tests for FakeApi + */ +public class FakeApiTest { + + private FakeApi api; + + @Before + public void setup() { + api = new ApiClient().createService(FakeApi.class); + } + + /** + * + * + * Test serialization of outer boolean types + */ + @Test + public void fakeOuterBooleanSerializeTest() { + Boolean body = null; + // Boolean response = api.fakeOuterBooleanSerialize(body); + + // TODO: test validations + } + /** + * + * + * Test serialization of object with outer number type + */ + @Test + public void fakeOuterCompositeSerializeTest() { + OuterComposite outerComposite = null; + // OuterComposite response = api.fakeOuterCompositeSerialize(outerComposite); + + // TODO: test validations + } + /** + * + * + * Test serialization of outer number types + */ + @Test + public void fakeOuterNumberSerializeTest() { + BigDecimal body = null; + // BigDecimal response = api.fakeOuterNumberSerialize(body); + + // TODO: test validations + } + /** + * + * + * Test serialization of outer string types + */ + @Test + public void fakeOuterStringSerializeTest() { + String body = null; + // String response = api.fakeOuterStringSerialize(body); + + // TODO: test validations + } + /** + * + * + * For this test, the body for this request much reference a schema named `File`. + */ + @Test + public void testBodyWithFileSchemaTest() { + FileSchemaTestClass fileSchemaTestClass = null; + // api.testBodyWithFileSchema(fileSchemaTestClass); + + // TODO: test validations + } + /** + * + * + * + */ + @Test + public void testBodyWithQueryParamsTest() { + String query = null; + User user = null; + // api.testBodyWithQueryParams(query, user); + + // TODO: test validations + } + /** + * To test \"client\" model + * + * To test \"client\" model + */ + @Test + public void testClientModelTest() { + Client client = null; + // Client response = api.testClientModel(client); + + // TODO: test validations + } + /** + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + */ + @Test + public void testEndpointParametersTest() { + BigDecimal number = null; + Double _double = null; + String patternWithoutDelimiter = null; + byte[] _byte = null; + Integer integer = null; + Integer int32 = null; + Long int64 = null; + Float _float = null; + String string = null; + File binary = null; + LocalDate date = null; + OffsetDateTime dateTime = null; + String password = null; + String paramCallback = null; + // api.testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback); + + // TODO: test validations + } + /** + * To test enum parameters + * + * To test enum parameters + */ + @Test + public void testEnumParametersTest() { + List enumHeaderStringArray = null; + String enumHeaderString = null; + List enumQueryStringArray = null; + String enumQueryString = null; + Integer enumQueryInteger = null; + Double enumQueryDouble = null; + List enumFormStringArray = null; + String enumFormString = null; + // api.testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString); + + // TODO: test validations + } + /** + * test inline additionalProperties + * + * + */ + @Test + public void testInlineAdditionalPropertiesTest() { + Map requestBody = null; + // api.testInlineAdditionalProperties(requestBody); + + // TODO: test validations + } + /** + * test json serialization of form data + * + * + */ + @Test + public void testJsonFormDataTest() { + String param = null; + String param2 = null; + // api.testJsonFormData(param, param2); + + // TODO: test validations + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java new file mode 100644 index 00000000000..e615576da23 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java @@ -0,0 +1,32 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Client; + +/** + * API tests for FakeClassnameTags123Api + */ +public class FakeClassnameTags123ApiTest { + + private FakeClassnameTags123Api api; + + @Before + public void setup() { + api = new ApiClient().createService(FakeClassnameTags123Api.class); + } + + /** + * To test class name in snake case + * + * To test class name in snake case + */ + @Test + public void testClassnameTest() { + Client client = null; + // Client response = api.testClassname(client); + + // TODO: test validations + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/PetApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/PetApiTest.java new file mode 100644 index 00000000000..9d7a40be314 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/PetApiTest.java @@ -0,0 +1,138 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Pet; + +import java.io.File; +import java.util.List; + +/** + * API tests for PetApi + */ +public class PetApiTest { + + private PetApi api; + + @Before + public void setup() { + api = new ApiClient().createService(PetApi.class); + } + + /** + * Add a new pet to the store + * + * + */ + @Test + public void addPetTest() { + Pet pet = null; + // api.addPet(pet); + + // TODO: test validations + } + /** + * Deletes a pet + * + * + */ + @Test + public void deletePetTest() { + Long petId = null; + String apiKey = null; + // api.deletePet(petId, apiKey); + + // TODO: test validations + } + /** + * Finds Pets by status + * + * Multiple status values can be provided with comma separated strings + */ + @Test + public void findPetsByStatusTest() { + List status = null; + // List response = api.findPetsByStatus(status); + + // TODO: test validations + } + /** + * Finds Pets by tags + * + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + */ + @Test + public void findPetsByTagsTest() { + List tags = null; + // List response = api.findPetsByTags(tags); + + // TODO: test validations + } + /** + * Find pet by ID + * + * Returns a single pet + */ + @Test + public void getPetByIdTest() { + Long petId = null; + // Pet response = api.getPetById(petId); + + // TODO: test validations + } + /** + * Update an existing pet + * + * + */ + @Test + public void updatePetTest() { + Pet pet = null; + // api.updatePet(pet); + + // TODO: test validations + } + /** + * Updates a pet in the store with form data + * + * + */ + @Test + public void updatePetWithFormTest() { + Long petId = null; + String name = null; + String status = null; + // api.updatePetWithForm(petId, name, status); + + // TODO: test validations + } + /** + * uploads an image + * + * + */ + @Test + public void uploadFileTest() { + Long petId = null; + String additionalMetadata = null; + File file = null; + // ModelApiResponse response = api.uploadFile(petId, additionalMetadata, file); + + // TODO: test validations + } + /** + * uploads an image (required) + * + * + */ + @Test + public void uploadFileWithRequiredFileTest() { + Long petId = null; + File requiredFile = null; + String additionalMetadata = null; + // ModelApiResponse response = api.uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata); + + // TODO: test validations + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/StoreApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/StoreApiTest.java new file mode 100644 index 00000000000..90c204243b9 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/StoreApiTest.java @@ -0,0 +1,67 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Order; + +/** + * API tests for StoreApi + */ +public class StoreApiTest { + + private StoreApi api; + + @Before + public void setup() { + api = new ApiClient().createService(StoreApi.class); + } + + /** + * Delete purchase order by ID + * + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + */ + @Test + public void deleteOrderTest() { + String orderId = null; + // api.deleteOrder(orderId); + + // TODO: test validations + } + /** + * Returns pet inventories by status + * + * Returns a map of status codes to quantities + */ + @Test + public void getInventoryTest() { + // Map response = api.getInventory(); + + // TODO: test validations + } + /** + * Find purchase order by ID + * + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + */ + @Test + public void getOrderByIdTest() { + Long orderId = null; + // Order response = api.getOrderById(orderId); + + // TODO: test validations + } + /** + * Place an order for a pet + * + * + */ + @Test + public void placeOrderTest() { + Order order = null; + // Order response = api.placeOrder(order); + + // TODO: test validations + } +} diff --git a/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/UserApiTest.java b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/UserApiTest.java new file mode 100644 index 00000000000..c64cf2a1a68 --- /dev/null +++ b/samples/client/petstore/java/retrofit2-play26/src/test/java/org/openapitools/client/api/UserApiTest.java @@ -0,0 +1,119 @@ +package org.openapitools.client.api; + +import org.junit.Before; +import org.junit.Test; +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.User; + +import java.util.List; + +/** + * API tests for UserApi + */ +public class UserApiTest { + + private UserApi api; + + @Before + public void setup() { + api = new ApiClient().createService(UserApi.class); + } + + /** + * Create user + * + * This can only be done by the logged in user. + */ + @Test + public void createUserTest() { + User user = null; + // api.createUser(user); + + // TODO: test validations + } + /** + * Creates list of users with given input array + * + * + */ + @Test + public void createUsersWithArrayInputTest() { + List user = null; + // api.createUsersWithArrayInput(user); + + // TODO: test validations + } + /** + * Creates list of users with given input array + * + * + */ + @Test + public void createUsersWithListInputTest() { + List user = null; + // api.createUsersWithListInput(user); + + // TODO: test validations + } + /** + * Delete user + * + * This can only be done by the logged in user. + */ + @Test + public void deleteUserTest() { + String username = null; + // api.deleteUser(username); + + // TODO: test validations + } + /** + * Get user by user name + * + * + */ + @Test + public void getUserByNameTest() { + String username = null; + // User response = api.getUserByName(username); + + // TODO: test validations + } + /** + * Logs user into the system + * + * + */ + @Test + public void loginUserTest() { + String username = null; + String password = null; + // String response = api.loginUser(username, password); + + // TODO: test validations + } + /** + * Logs out current logged in user session + * + * + */ + @Test + public void logoutUserTest() { + // api.logoutUser(); + + // TODO: test validations + } + /** + * Updated user + * + * This can only be done by the logged in user. + */ + @Test + public void updateUserTest() { + String username = null; + User user = null; + // api.updateUser(username, user); + + // TODO: test validations + } +} From a1205f61091b086c4522f442e10ff00a9c87e87d Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 29 Aug 2018 00:42:40 +0800 Subject: [PATCH 11/74] add https://www.boxever.com/ to the company list (#916) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee102011cb2..493475424b1 100644 --- a/README.md +++ b/README.md @@ -469,6 +469,7 @@ Here are some companies/projects (alphabetical order) using OpenAPI Generator in - [Angular.Schule](https://angular.schule/) - [Bithost GmbH](https://www.bithost.ch) +- [Boxever](https://www.boxever.com/) - [GMO Pepabo](https://pepabo.com/en/) - [Raiffeisen Schweiz Genossenschaft](https://www.raiffeisen.ch) - [RepreZen API Studio](https://www.reprezen.com/swagger-openapi-code-generation-api-first-microservices-enterprise-development) From 2544ace26213d80b1b2865bfb16ec8df528c1b65 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Tue, 28 Aug 2018 18:08:51 -0400 Subject: [PATCH 12/74] [docker] Fixes hub dockerfile for online project (#914) An update was made in #876 to remove version from the generated artifact for openapi-generator-online. The change is missing the -online suffix. My original glob pattern put the * in the wrong place for maintainability. --- .hub.online.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.hub.online.dockerfile b/.hub.online.dockerfile index 48c04f5a568..083b84d4ead 100644 --- a/.hub.online.dockerfile +++ b/.hub.online.dockerfile @@ -26,7 +26,7 @@ RUN mkdir -p ${TARGET_DIR} WORKDIR ${TARGET_DIR} -COPY --from=builder ${GEN_DIR}/modules/openapi-generator-online/target/openapi-generator.jar ${TARGET_DIR}/openapi-generator-online.jar +COPY --from=builder ${GEN_DIR}/modules/openapi-generator-online/target/openapi-generator-online.jar ${TARGET_DIR}/openapi-generator-online.jar ENV GENERATOR_HOST=http://localhost From 09a62d7fef66d603824e2f0a9100bd6bac951834 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 29 Aug 2018 11:34:58 +0800 Subject: [PATCH 13/74] Minor improvements to Kotlin Spring Boot generator (#918) * minor improvement to kotlin sprinbboot generator * add dr4ke616 to tech comm, add zalando to company list --- README.md | 8 +++++--- .../languages/KotlinSpringServerCodegen.java | 16 ++++++++++++++++ .../org.openapitools.codegen.CodegenConfig | 4 ++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 493475424b1..8352b8529b9 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ OpenAPI Generator allows generation of API client libraries (SDK generation), se | | Languages/Frameworks | |-|-| -**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 3.5 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 6.x), Aurelia, Fetch, Inversify, jQuery, Node) -**Server stubs** | **Ada**, **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples)), **Kotlin**, **PHP** (Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** ([Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), Scalatra) +**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 3.5 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 6.x), Aurelia, Fetch, Inversify, jQuery, Node) +**Server stubs** | **Ada**, **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples)), **Kotlin** (Spring Boot), **PHP** (Laravel, Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** ([Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), Scalatra) **API documentation generators** | **HTML**, **Confluence Wiki** **Configuration files** | [**Apache2**](https://httpd.apache.org/) **Others** | **JMeter** @@ -477,6 +477,7 @@ Here are some companies/projects (alphabetical order) using OpenAPI Generator in - [Suva](https://www.suva.ch/) - [Telstra](https://dev.telstra.com) - [unblu inc.](https://www.unblu.com/) +- [Zalando](https://www.zalando.com) ## [5 - Presentations/Videos/Tutorials/Books](#table-of-contents) @@ -577,6 +578,7 @@ Here is a list of template creators: * JAX-RS CXF (CDI): @nickcmaynard * JAX-RS RestEasy (JBoss EAP): @jfiala * Kotlin: @jimschubert + * Kotlin (Spring Boot): @dr4ke616 * PHP Laravel: @renepardon * PHP Lumen: @abcsun * PHP Slim: @jfastnacht @@ -640,7 +642,7 @@ If you want to join the committee, please kindly apply by sending an email to te | Groovy | | | Haskell | | | Java | @bbdouglas (2017/07) @JFCote (2017/08) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) | -| Kotlin | @jimschubert (2017/09) | +| Kotlin | @jimschubert (2017/09) @dr4ke616 (2018/08) | | Lua | @daurnimator (2017/08) | | NodeJS/Javascript | @CodeNinjai (2017/07) @frol (2017/07) @cliffano (2017/07) | | ObjC | | diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java index 99fc5a18606..c06863cc373 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java @@ -1,3 +1,19 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * 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 + * + * http://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 com.google.common.collect.ImmutableMap; diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index 5e27cd01c56..b557cd203f2 100644 --- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -29,6 +29,7 @@ org.openapitools.codegen.languages.GoServerCodegen org.openapitools.codegen.languages.GroovyClientCodegen org.openapitools.codegen.languages.KotlinClientCodegen org.openapitools.codegen.languages.KotlinServerCodegen +org.openapitools.codegen.languages.KotlinSpringServerCodegen org.openapitools.codegen.languages.HaskellHttpClientCodegen org.openapitools.codegen.languages.HaskellServantCodegen org.openapitools.codegen.languages.JavaClientCodegen @@ -90,5 +91,4 @@ org.openapitools.codegen.languages.TypeScriptAureliaClientCodegen org.openapitools.codegen.languages.TypeScriptFetchClientCodegen org.openapitools.codegen.languages.TypeScriptInversifyClientCodegen org.openapitools.codegen.languages.TypeScriptJqueryClientCodegen -org.openapitools.codegen.languages.TypeScriptNodeClientCodegen -org.openapitools.codegen.languages.KotlinSpringServerCodegen +org.openapitools.codegen.languages.TypeScriptNodeClientCodegen \ No newline at end of file From 8e1e05e86cfcbac29eae0e9589498d7caa2cc77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Wed, 29 Aug 2018 06:56:37 +0200 Subject: [PATCH 14/74] [CLI] Improvements for meta and list command (#799) --- bin/meta-codegen.sh | 4 +-- bin/utils/ensure-up-to-date | 1 + .../codegen/cmd/ListGenerators.java | 36 +++++++++++++------ .../org/openapitools/codegen/cmd/Meta.java | 12 +++++-- .../main/resources/codegen/README.mustache | 32 ++++++++++------- .../resources/codegen/generatorClass.mustache | 2 +- .../src/main/resources/codegen/pom.mustache | 4 +-- samples/meta-codegen/lib/README.md | 34 +++++++++++------- samples/meta-codegen/lib/pom.xml | 6 ++-- .../codegen/MyclientcodegenGenerator.java | 2 +- samples/meta-codegen/pom.xml | 12 +++++++ .../usage/.openapi-generator/VERSION | 2 +- 12 files changed, 99 insertions(+), 48 deletions(-) create mode 100644 samples/meta-codegen/pom.xml diff --git a/bin/meta-codegen.sh b/bin/meta-codegen.sh index 00b67984464..2a0f55cf8a0 100755 --- a/bin/meta-codegen.sh +++ b/bin/meta-codegen.sh @@ -26,11 +26,11 @@ then fi export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="meta -n myClientCodegen -p com.my.company.codegen -o samples/meta-codegen/lib $@" +ags="meta -n myClientCodegen -t DOCUMENTATION -p com.my.company.codegen -o samples/meta-codegen/lib $@" java $JAVA_OPTS -jar $executable $ags -mvn verify -f samples/meta-codegen/lib/pom.xml +mvn clean package -f samples/meta-codegen/pom.xml ags2="generate -g myClientCodegen -i modules/openapi-generator/src/test/resources/2_0/petstore.json -o samples/meta-codegen/usage $@" diff --git a/bin/utils/ensure-up-to-date b/bin/utils/ensure-up-to-date index 6e2fd3a1ec2..e29fed7643c 100755 --- a/bin/utils/ensure-up-to-date +++ b/bin/utils/ensure-up-to-date @@ -32,6 +32,7 @@ sleep 5 ./bin/rust-server-petstore.sh > /dev/null 2>&1 ./bin/openapi3/haskell-http-client-petstore.sh > /dev/null 2>&1 ./bin/csharp-petstore.sh > /dev/null 2>&1 +./bin/meta-codegen.sh > /dev/null 2>&1 # Check: if [ -n "$(git status --porcelain)" ]; then diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ListGenerators.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ListGenerators.java index edd85ff79af..83a3ada42c9 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ListGenerators.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/ListGenerators.java @@ -1,7 +1,10 @@ package org.openapitools.codegen.cmd; +import com.google.common.base.Objects; + import io.airlift.airline.Command; import io.airlift.airline.Option; + import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenConfigLoader; import org.openapitools.codegen.CodegenType; @@ -10,6 +13,7 @@ import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Locale; +import java.util.stream.Collectors; // NOTE: List can later have subcommands such as list languages, list types, list frameworks, etc. @Command(name = "list", description = "Lists the available generators") @@ -41,19 +45,29 @@ public class ListGenerators implements Runnable { sb.append(System.lineSeparator()); for (CodegenType type : types) { - sb.append(type.name()).append(" generators:"); - sb.append(System.lineSeparator()); - - generators.stream() - .filter(g -> g.getTag().equals(type)) - .sorted(Comparator.comparing(CodegenConfig::getName)) - .forEach(generator -> sb.append(" - ").append(generator.getName()).append(System.lineSeparator())); - - sb.append(System.lineSeparator()); - sb.append(System.lineSeparator()); + appendForType(sb, type, type.name(), generators); } + appendForType(sb, null, "UNSPECIFIED", generators); } - System.out.printf(Locale.ROOT,"%s%n", sb.toString()); + System.out.printf(Locale.ROOT, "%s%n", sb.toString()); + } + + private void appendForType(StringBuilder sb, CodegenType type, String typeName, List generators) { + List list = generators.stream() + .filter(g -> Objects.equal(type, g.getTag())) + .sorted(Comparator.comparing(CodegenConfig::getName)) + .collect(Collectors.toList()); + + if(list.size() > 0) { + sb.append(typeName).append(" generators:"); + sb.append(System.lineSeparator()); + + list.stream() + .forEach(generator -> sb.append(" - ").append(generator.getName()).append(System.lineSeparator())); + + sb.append(System.lineSeparator()); + sb.append(System.lineSeparator()); + } } } diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Meta.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Meta.java index 1865550ca91..c373aaa8c70 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Meta.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Meta.java @@ -67,6 +67,11 @@ public class Meta implements Runnable { description = "the package to put the main class into (defaults to org.openapitools.codegen)") private String targetPackage = "org.openapitools.codegen"; + @Option(name = {"-t", "--type"}, title = "type", + description = "the type of generator that is created", + allowedValues = {"CLIENT", "SERVER", "DOCUMENTATION", "CONFIG", "OTHER"}) + private String type = "OTHER"; + @Override public void run() { final File targetDir = new File(outputFolder); @@ -87,8 +92,11 @@ public class Meta implements Runnable { String currentVersion = Version.readVersionFromResources(); Map data = - new ImmutableMap.Builder().put("generatorPackage", targetPackage) - .put("generatorClass", mainClass).put("name", name) + new ImmutableMap.Builder() + .put("generatorPackage", targetPackage) + .put("generatorClass", mainClass) + .put("name", name) + .put("generatorType", type) .put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass) .put("openapiGeneratorVersion", currentVersion).build(); diff --git a/modules/openapi-generator/src/main/resources/codegen/README.mustache b/modules/openapi-generator/src/main/resources/codegen/README.mustache index d8c6ab3ca32..7b274871839 100644 --- a/modules/openapi-generator/src/main/resources/codegen/README.mustache +++ b/modules/openapi-generator/src/main/resources/codegen/README.mustache @@ -1,15 +1,16 @@ # OpenAPI Generator for the {{name}} library ## Overview -This is a boiler-plate project to generate your own client library with Swagger. Its goal is -to get you started with the basic plumbing so you can put in your own logic. It won't work without -your changes applied. +This is a boiler-plate project to generate your own project derived from an OpenAPI specification. +Its goal is to get you started with the basic plumbing so you can put in your own logic. +It won't work without your changes applied. -## What's Swagger? -The goal of Swagger™ is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined via Swagger, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interfaces have done for lower-level programming, Swagger removes the guesswork in calling the service. +## What's OpenAPI +The goal of OpenAPI is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. +When properly described with OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. +Similar to what interfaces have done for lower-level programming, OpenAPI removes the guesswork in calling the service. - -Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the OpenAPI project, including additional libraries with support for other languages and more. ## How do I use this? At this point, you've likely generated a client setup. It will include something along these lines: @@ -43,10 +44,17 @@ Once modified, you can run this: mvn package ``` -In your generator project. A single jar file will be produced in `target`. You can now use that with codegen: +In your generator project. A single jar file will be produced in `target`. You can now use that with [OpenAPI Generator](https://openapi-generator.tech): +For mac/linux: ``` -java -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.Codegen -g {{name}} -i /path/to/openapi.yaml -o ./test +java -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g {{name}} -i /path/to/openapi.yaml -o ./test +``` +(Do not forget to replace the values `/path/to/openapi-generator-cli.jar`, `/path/to/your.jar` and `/path/to/openapi.yaml` in the previous command) + +For Windows users, you will need to use `;` instead of `:` in the classpath, e.g. +``` +java -cp /path/to/openapi-generator-cli.jar;/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g {{name}} -i /path/to/openapi.yaml -o ./test ``` Now your templates are available to the client generator and you can write output values @@ -67,8 +75,8 @@ the object you have available during client generation: # -DdebugOperations prints operations passed to the template engine # -DdebugSupportingFiles prints additional data passed to the template engine -java -DdebugOperations -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.Codegen -g {{name}} -i /path/to/swagger.yaml -o ./test +java -DdebugOperations -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g {{name}} -i /path/to/openapi.yaml -o ./test ``` -Will, for example, output the debug info for operations. You can use this info -in the `api.mustache` file. \ No newline at end of file +Will, for example, output the debug info for operations. +You can use this info in the `api.mustache` file. \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/codegen/generatorClass.mustache b/modules/openapi-generator/src/main/resources/codegen/generatorClass.mustache index acdeeba6f49..cefd218cb50 100644 --- a/modules/openapi-generator/src/main/resources/codegen/generatorClass.mustache +++ b/modules/openapi-generator/src/main/resources/codegen/generatorClass.mustache @@ -19,7 +19,7 @@ public class {{generatorClass}} extends DefaultCodegen implements CodegenConfig * @see org.openapitools.codegen.CodegenType */ public CodegenType getTag() { - return CodegenType.CLIENT; + return CodegenType.{{generatorType}}; } /** diff --git a/modules/openapi-generator/src/main/resources/codegen/pom.mustache b/modules/openapi-generator/src/main/resources/codegen/pom.mustache index 2548456f813..cb3712e87ad 100644 --- a/modules/openapi-generator/src/main/resources/codegen/pom.mustache +++ b/modules/openapi-generator/src/main/resources/codegen/pom.mustache @@ -100,8 +100,8 @@ maven-compiler-plugin 3.6.1 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/samples/meta-codegen/lib/README.md b/samples/meta-codegen/lib/README.md index e970d9f068f..94907133436 100644 --- a/samples/meta-codegen/lib/README.md +++ b/samples/meta-codegen/lib/README.md @@ -1,15 +1,16 @@ # OpenAPI Generator for the myClientCodegen library ## Overview -This is a boiler-plate project to generate your own client library with Swagger. Its goal is -to get you started with the basic plumbing so you can put in your own logic. It won't work without -your changes applied. +This is a boiler-plate project to generate your own project derived from an OpenAPI specification. +Its goal is to get you started with the basic plumbing so you can put in your own logic. +It won't work without your changes applied. -## What's Swagger? -The goal of Swagger™ is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined via Swagger, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interfaces have done for lower-level programming, Swagger removes the guesswork in calling the service. +## What's OpenAPI +The goal of OpenAPI is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. +When properly described with OpenAPI, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. +Similar to what interfaces have done for lower-level programming, OpenAPI removes the guesswork in calling the service. - -Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the OpenAPI project, including additional libraries with support for other languages and more. ## How do I use this? At this point, you've likely generated a client setup. It will include something along these lines: @@ -43,10 +44,17 @@ Once modified, you can run this: mvn package ``` -In your generator project. A single jar file will be produced in `target`. You can now use that with codegen: +In your generator project. A single jar file will be produced in `target`. You can now use that with [OpenAPI Generator](https://openapi-generator.tech): +For mac/linux: ``` -java -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.Codegen -g myClientCodegen -i /path/to/openapi.yaml -o ./test +java -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g myClientCodegen -i /path/to/openapi.yaml -o ./test +``` +(Do not forget to replace the values `/path/to/openapi-generator-cli.jar`, `/path/to/your.jar` and `/path/to/openapi.yaml` in the previous command) + +For Windows users, you will need to use `;` instead of `:` in the classpath, e.g. +``` +java -cp /path/to/openapi-generator-cli.jar;/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g myClientCodegen -i /path/to/openapi.yaml -o ./test ``` Now your templates are available to the client generator and you can write output values @@ -62,13 +70,13 @@ the object you have available during client generation: ``` # The following additional debug options are available for all codegen targets: -# -DdebugSwagger prints the OpenAPI Specification as interpreted by the codegen +# -DdebugOpenAPI prints the OpenAPI Specification as interpreted by the codegen # -DdebugModels prints models passed to the template engine # -DdebugOperations prints operations passed to the template engine # -DdebugSupportingFiles prints additional data passed to the template engine -java -DdebugOperations -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.Codegen -g myClientCodegen -i /path/to/swagger.yaml -o ./test +java -DdebugOperations -cp /path/to/openapi-generator-cli.jar:/path/to/your.jar org.openapitools.codegen.OpenAPIGenerator generate -g myClientCodegen -i /path/to/openapi.yaml -o ./test ``` -Will, for example, output the debug info for operations. You can use this info -in the `api.mustache` file. \ No newline at end of file +Will, for example, output the debug info for operations. +You can use this info in the `api.mustache` file. \ No newline at end of file diff --git a/samples/meta-codegen/lib/pom.xml b/samples/meta-codegen/lib/pom.xml index dd8dcf14fea..91bb6efc757 100644 --- a/samples/meta-codegen/lib/pom.xml +++ b/samples/meta-codegen/lib/pom.xml @@ -100,8 +100,8 @@ maven-compiler-plugin 3.6.1 - 1.7 - 1.7 + 1.8 + 1.8 @@ -116,7 +116,7 @@ UTF-8 - 3.0.0-SNAPSHOT + 3.2.3-SNAPSHOT 1.0.0 4.8.1 diff --git a/samples/meta-codegen/lib/src/main/java/com/my/company/codegen/MyclientcodegenGenerator.java b/samples/meta-codegen/lib/src/main/java/com/my/company/codegen/MyclientcodegenGenerator.java index 877b5778383..fd43a342519 100644 --- a/samples/meta-codegen/lib/src/main/java/com/my/company/codegen/MyclientcodegenGenerator.java +++ b/samples/meta-codegen/lib/src/main/java/com/my/company/codegen/MyclientcodegenGenerator.java @@ -19,7 +19,7 @@ public class MyclientcodegenGenerator extends DefaultCodegen implements CodegenC * @see org.openapitools.codegen.CodegenType */ public CodegenType getTag() { - return CodegenType.CLIENT; + return CodegenType.DOCUMENTATION; } /** diff --git a/samples/meta-codegen/pom.xml b/samples/meta-codegen/pom.xml new file mode 100644 index 00000000000..fc3ad25673e --- /dev/null +++ b/samples/meta-codegen/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + org.openapitools + meta-codegen + 1.0.0 + pom + + lib/ + ../../modules/openapi-generator + + diff --git a/samples/meta-codegen/usage/.openapi-generator/VERSION b/samples/meta-codegen/usage/.openapi-generator/VERSION index 096bf47efe3..c791c986fbb 100644 --- a/samples/meta-codegen/usage/.openapi-generator/VERSION +++ b/samples/meta-codegen/usage/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file From b8db2af4bbcff5873d0a5e48fc77fc2cd316d748 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 29 Aug 2018 16:43:41 +0800 Subject: [PATCH 15/74] Update swagger annotation version in Java clients (#915) * update swagger annotation version in java client * add java retrofit2 play 2.6 to java petstore all bin script * remove empty line in pom.xml --- bin/java-petstore-all.sh | 1 + .../libraries/feign/build.gradle.mustache | 2 +- .../Java/libraries/feign/build.sbt.mustache | 2 +- .../Java/libraries/feign/pom.mustache | 12 ++--- .../google-api-client/build.gradle.mustache | 2 +- .../google-api-client/build.sbt.mustache | 2 +- .../libraries/google-api-client/pom.mustache | 12 ++--- .../libraries/jersey2/build.gradle.mustache | 2 +- .../Java/libraries/jersey2/build.sbt.mustache | 2 +- .../Java/libraries/jersey2/pom.mustache | 10 ++-- .../rest-assured/build.gradle.mustache | 2 +- .../libraries/rest-assured/build.sbt.mustache | 2 +- .../Java/libraries/rest-assured/pom.mustache | 10 ++-- .../Java/libraries/resteasy/pom.mustache | 10 ++-- .../resttemplate/build.gradle.mustache | 2 +- .../Java/libraries/resttemplate/pom.mustache | 8 ++- .../libraries/retrofit/build.gradle.mustache | 2 +- .../libraries/retrofit/build.sbt.mustache | 2 +- .../Java/libraries/retrofit/pom.mustache | 26 +++++----- .../libraries/retrofit2/build.gradle.mustache | 2 +- .../libraries/retrofit2/build.sbt.mustache | 2 +- .../Java/libraries/retrofit2/pom.mustache | 49 ++++++++----------- .../libraries/vertx/build.gradle.mustache | 2 +- .../Java/libraries/vertx/pom.mustache | 10 ++-- .../src/main/resources/Java/pom.mustache | 8 ++- .../client/petstore/java/feign/build.gradle | 2 +- samples/client/petstore/java/feign/build.sbt | 2 +- samples/client/petstore/java/feign/pom.xml | 12 ++--- .../java/google-api-client/build.gradle | 2 +- .../petstore/java/google-api-client/build.sbt | 2 +- .../petstore/java/google-api-client/pom.xml | 10 ++-- samples/client/petstore/java/jersey1/pom.xml | 8 ++- .../petstore/java/jersey2-java6/build.sbt | 2 +- .../petstore/java/jersey2-java6/pom.xml | 10 ++-- .../petstore/java/jersey2-java8/build.gradle | 2 +- .../petstore/java/jersey2-java8/build.sbt | 2 +- .../petstore/java/jersey2-java8/pom.xml | 10 ++-- .../client/petstore/java/jersey2/build.gradle | 2 +- .../client/petstore/java/jersey2/build.sbt | 2 +- samples/client/petstore/java/jersey2/pom.xml | 10 ++-- .../petstore/java/rest-assured/build.gradle | 2 +- .../petstore/java/rest-assured/build.sbt | 2 +- .../client/petstore/java/rest-assured/pom.xml | 10 ++-- samples/client/petstore/java/resteasy/pom.xml | 10 ++-- .../java/resttemplate-withXml/build.gradle | 2 +- .../java/resttemplate-withXml/pom.xml | 8 ++- .../petstore/java/resttemplate/build.gradle | 2 +- .../client/petstore/java/resttemplate/pom.xml | 8 ++- .../petstore/java/retrofit/build.gradle | 2 +- .../client/petstore/java/retrofit/build.sbt | 2 +- samples/client/petstore/java/retrofit/pom.xml | 12 ++--- .../java/retrofit2-play24/build.gradle | 2 +- .../petstore/java/retrofit2-play24/build.sbt | 2 +- .../petstore/java/retrofit2-play24/pom.xml | 19 +++---- .../java/retrofit2-play25/build.gradle | 2 +- .../petstore/java/retrofit2-play25/build.sbt | 2 +- .../petstore/java/retrofit2-play25/pom.xml | 21 +++----- .../java/retrofit2-play26/build.gradle | 2 +- .../petstore/java/retrofit2-play26/build.sbt | 2 +- .../petstore/java/retrofit2-play26/pom.xml | 21 +++----- .../petstore/java/retrofit2/build.gradle | 2 +- .../client/petstore/java/retrofit2/build.sbt | 2 +- .../client/petstore/java/retrofit2/pom.xml | 15 ++---- .../petstore/java/retrofit2rx/build.gradle | 2 +- .../petstore/java/retrofit2rx/build.sbt | 2 +- .../client/petstore/java/retrofit2rx/pom.xml | 17 +++---- .../petstore/java/retrofit2rx2/build.gradle | 2 +- .../petstore/java/retrofit2rx2/build.sbt | 2 +- .../client/petstore/java/retrofit2rx2/pom.xml | 17 +++---- .../client/petstore/java/vertx/build.gradle | 2 +- samples/client/petstore/java/vertx/pom.xml | 10 ++-- 71 files changed, 189 insertions(+), 279 deletions(-) diff --git a/bin/java-petstore-all.sh b/bin/java-petstore-all.sh index b8cb3014e08..190bf33fa5b 100755 --- a/bin/java-petstore-all.sh +++ b/bin/java-petstore-all.sh @@ -13,6 +13,7 @@ ./bin/java8-petstore-jersey2.sh ./bin/java-petstore-retrofit2-play24.sh ./bin/java-petstore-retrofit2-play25.sh +./bin/java-petstore-retrofit2-play26.sh ./bin/java-petstore-jersey2-java6.sh ./bin/java-petstore-resttemplate.sh ./bin/java-petstore-resttemplate-withxml.sh diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache index 32254e52506..a4e5ea5a791 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache @@ -118,7 +118,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.9" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.7" {{#threetenbp}} threepane_version = "2.6.4" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache index d745ef7e86d..a3dff942003 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.9" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "io.github.openfeign" % "feign-core" % "9.4.0" % "compile", "io.github.openfeign" % "feign-jackson" % "9.4.0" % "compile", "io.github.openfeign" % "feign-slf4j" % "9.4.0" % "compile", diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache index a616e68bcff..7a81b340af9 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -294,12 +292,12 @@ {{#supportJava6}}1.6{{/supportJava6}}{{^supportJava6}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/supportJava6}} ${java.version} ${java.version} - 1.5.18 + 1.5.21 9.4.0 2.1.0 2.8.9 {{#threetenbp}} - 2.6.4 + 2.6.4 {{/threetenbp}} 4.12 1.0.0 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.gradle.mustache index 1a2b2afc6cd..acbe24a53f6 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.gradle.mustache @@ -118,7 +118,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.9" google_api_client_version = "1.23.0" jersey_common_version = "2.25.1" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.sbt.mustache index d6b88c91d96..9f1aeaf1570 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/build.sbt.mustache @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.17", + "io.swagger" % "swagger-annotations" % "1.5.21", "com.google.api-client" % "google-api-client" % "1.23.0", "org.glassfish.jersey.core" % "jersey-common" % "2.25.1", "com.fasterxml.jackson.core" % "jackson-core" % "2.8.9" % "compile", diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/pom.mustache index 2fff29a15b5..69aac87b279 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/google-api-client/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -287,15 +285,15 @@ UTF-8 - 1.5.17 + 1.5.21 1.23.0 2.25.1 2.8.9 {{#joda}} - 2.9.9 + 2.9.9 {{/joda}} {{#threetenbp}} - 2.6.4 + 2.6.4 {{/threetenbp}} 1.0.0 4.12 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache index 8f7c03adefa..2a4a56b935c 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.gradle.mustache @@ -117,7 +117,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.20" + swagger_annotations_version = "1.5.21" jackson_version = "2.9.6" {{#supportJava6}} jersey_version = "2.6" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.sbt.mustache index 54902da7989..cc2e9480b6a 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/build.sbt.mustache @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.20", + "io.swagger" % "swagger-annotations" % "1.5.21", "org.glassfish.jersey.core" % "jersey-client" % {{#supportJava6}}"2.6"{{/supportJava6}}{{^supportJava6}}"2.25.1"{{/supportJava6}}, "org.glassfish.jersey.media" % "jersey-media-multipart" % {{#supportJava6}}"2.6"{{/supportJava6}}{{^supportJava6}}"2.25.1"{{/supportJava6}}, "org.glassfish.jersey.media" % "jersey-media-json-jackson" % {{#supportJava6}}"2.6"{{/supportJava6}}{{^supportJava6}}"2.25.1"{{/supportJava6}}, diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache index 5c273fa147b..93f2d9e2c9b 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -212,7 +210,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -318,7 +316,7 @@ UTF-8 - 1.5.20 + 1.5.21 {{^supportJava6}} 2.27 {{/supportJava6}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.gradle.mustache index 54b90483f4c..87608f21024 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.gradle.mustache @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.15" + swagger_annotations_version = "1.5.21" rest_assured_version = "3.1.0" junit_version = "4.12" gson_version = "2.6.1" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.sbt.mustache index 68f3eff08d0..7a666ebace6 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/build.sbt.mustache @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.15", + "io.swagger" % "swagger-annotations" % "1.5.21", "io.rest-assured" % "scala-support" % "3.1.0", "com.google.code.gson" % "gson" % "2.6.1", "io.gsonfire" % "gson-fire" % "1.8.2" % "compile", diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/pom.mustache index 1d0c1711389..aa0c15d8b38 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/rest-assured/pom.mustache @@ -113,8 +113,7 @@ - - src/main/java + src/main/java @@ -126,8 +125,7 @@ - - src/test/java + src/test/java @@ -199,7 +197,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} io.rest-assured @@ -245,7 +243,7 @@ UTF-8 - 1.5.15 + 1.5.21 3.1.0 2.6.1 1.8.2 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resteasy/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resteasy/pom.mustache index f2f7fa53a40..540c54c6813 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resteasy/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resteasy/pom.mustache @@ -95,8 +95,7 @@ - - src/main/java + src/main/java @@ -108,8 +107,7 @@ - - src/test/java + src/test/java @@ -155,7 +153,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -259,7 +257,7 @@ UTF-8 - 1.5.18 + 1.5.21 3.1.3.Final 2.8.6 2.6.4 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache index 9925cc43daf..b50203a337a 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache @@ -118,7 +118,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.9" spring_web_version = "4.3.9.RELEASE" jodatime_version = "2.9.9" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache index 0d371de6ea1..10d84edafc2 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -290,7 +288,7 @@ UTF-8 - 1.5.17 + 1.5.21 4.3.9.RELEASE 2.8.9 {{#joda}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.gradle.mustache index f0c1cbe4c88..45da8dd03bb 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.gradle.mustache @@ -109,7 +109,7 @@ ext { okhttp_version = "2.7.5" oltu_version = "1.0.1" retrofit_version = "1.9.0" - swagger_annotations_version = "1.5.8" + swagger_annotations_version = "1.5.21" junit_version = "4.12" jodatime_version = "2.9.3" {{#threetenbp}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.sbt.mustache index ffa308d528a..9d5df5e223c 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/build.sbt.mustache @@ -11,7 +11,7 @@ lazy val root = (project in file(".")). libraryDependencies ++= Seq( "com.squareup.okhttp" % "okhttp" % "2.7.5" % "compile", "com.squareup.retrofit" % "retrofit" % "1.9.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.8" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "joda-time" % "joda-time" % "2.9.3" % "compile", {{#threetenbp}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/pom.mustache index adbd6e99e50..155a8128e30 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -212,7 +210,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit @@ -241,17 +239,15 @@ ${threetenbp-version} {{/threetenbp}} - {{#parcelableModel}} - - - com.google.android - android - 4.1.1.4 - provided - + + + com.google.android + android + 4.1.1.4 + provided + {{/parcelableModel}} - junit @@ -262,7 +258,7 @@ UTF-8 - 1.5.18 + 1.5.21 1.9.0 2.7.5 2.9.9 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache index cd9baeb50d3..dfd1f6d9405 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache @@ -134,7 +134,7 @@ ext { play_version = "2.6.7" {{/play26}} {{/usePlayWS}} - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" {{#useRxJava}} rx_java_version = "1.3.0" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache index b08e715a7bd..e66ca784036 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/build.sbt.mustache @@ -44,7 +44,7 @@ lazy val root = (project in file(".")). "com.squareup.retrofit2" % "adapter-rxjava2" % "2.3.0" % "compile", "io.reactivex.rxjava2" % "rxjava" % "2.1.1" % "compile", {{/useRxJava2}} - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", {{#joda}} "joda-time" % "joda-time" % "2.9.9" % "compile", diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache index 8518053b809..3028604c360 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/retrofit2/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -262,7 +260,6 @@ ${retrofit-version} {{/useRxJava2}} - {{#usePlayWS}} @@ -291,16 +288,13 @@ ${jackson-version} {{#withXml}} - com.fasterxml.jackson.dataformat jackson-dataformat-xml ${jackson-version} - {{/withXml}} - {{#play24}} com.typesafe.play @@ -327,9 +321,7 @@ 1.1.0.Final {{/play26}} - {{/usePlayWS}} - {{#parcelableModel}} @@ -339,7 +331,6 @@ provided {{/parcelableModel}} - junit @@ -354,33 +345,33 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 + 1.5.21 {{#usePlayWS}} - {{#play24}} - 2.6.6 - 2.4.11 - {{/play24}} - {{#play25}} - 2.7.8 - 2.5.15 - {{/play25}} - {{#play26}} - 2.8.10 - 2.6.7 - {{/play26}} + {{#play24}} + 2.6.6 + 2.4.11 + {{/play24}} + {{#play25}} + 2.7.8 + 2.5.15 + {{/play25}} + {{#play26}} + 2.8.10 + 2.6.7 + {{/play26}} {{/usePlayWS}} 2.3.0 {{#useRxJava}} - 1.3.0 + 1.3.0 {{/useRxJava}} {{#useRxJava2}} - 2.1.1 + 2.1.1 {{/useRxJava2}} {{#joda}} - 2.9.9 + 2.9.9 {{/joda}} {{#threetenbp}} - 1.3.5 + 1.3.5 {{/threetenbp}} 1.0.1 4.12 diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/vertx/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/vertx/build.gradle.mustache index e1c956d5f72..1f2ebac4399 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/vertx/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/vertx/build.gradle.mustache @@ -26,7 +26,7 @@ task execute(type:JavaExec) { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "{{^threetenbp}}2.8.9{{/threetenbp}}{{#threetenbp}}2.6.4{{/threetenbp}}" vertx_version = "3.4.2" junit_version = "4.12" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/vertx/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/vertx/pom.mustache index 32f94b62639..b8d7e513d6b 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/vertx/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/vertx/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -271,7 +269,7 @@ UTF-8 3.4.2 - 1.5.18 + 1.5.21 {{^threetenbp}}2.8.9{{/threetenbp}}{{#threetenbp}}2.6.4{{/threetenbp}} 4.12 diff --git a/modules/openapi-generator/src/main/resources/Java/pom.mustache b/modules/openapi-generator/src/main/resources/Java/pom.mustache index 0c1501e115c..275a5c869a4 100644 --- a/modules/openapi-generator/src/main/resources/Java/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/pom.mustache @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -327,7 +325,7 @@ UTF-8 - 1.5.17 + 1.5.21 1.19.4 {{#supportJava6}} 2.5 diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle index b4d7da79267..e2126b12432 100644 --- a/samples/client/petstore/java/feign/build.gradle +++ b/samples/client/petstore/java/feign/build.gradle @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.9" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.7" threepane_version = "2.6.4" feign_version = "9.4.0" diff --git a/samples/client/petstore/java/feign/build.sbt b/samples/client/petstore/java/feign/build.sbt index 0b09ff26bd1..b387ad56e61 100644 --- a/samples/client/petstore/java/feign/build.sbt +++ b/samples/client/petstore/java/feign/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.9" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "io.github.openfeign" % "feign-core" % "9.4.0" % "compile", "io.github.openfeign" % "feign-jackson" % "9.4.0" % "compile", "io.github.openfeign" % "feign-slf4j" % "9.4.0" % "compile", diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml index ce837265abd..58b7d4d7e0e 100644 --- a/samples/client/petstore/java/feign/pom.xml +++ b/samples/client/petstore/java/feign/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -268,11 +266,11 @@ 1.7 ${java.version} ${java.version} - 1.5.18 + 1.5.21 9.4.0 2.1.0 2.8.9 - 2.6.4 + 2.6.4 4.12 1.0.0 1.0.1 diff --git a/samples/client/petstore/java/google-api-client/build.gradle b/samples/client/petstore/java/google-api-client/build.gradle index d66603375ad..97de036a9ce 100644 --- a/samples/client/petstore/java/google-api-client/build.gradle +++ b/samples/client/petstore/java/google-api-client/build.gradle @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.9" google_api_client_version = "1.23.0" jersey_common_version = "2.25.1" diff --git a/samples/client/petstore/java/google-api-client/build.sbt b/samples/client/petstore/java/google-api-client/build.sbt index 92a0aabedde..7052571b29f 100644 --- a/samples/client/petstore/java/google-api-client/build.sbt +++ b/samples/client/petstore/java/google-api-client/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.17", + "io.swagger" % "swagger-annotations" % "1.5.21", "com.google.api-client" % "google-api-client" % "1.23.0", "org.glassfish.jersey.core" % "jersey-common" % "2.25.1", "com.fasterxml.jackson.core" % "jackson-core" % "2.8.9" % "compile", diff --git a/samples/client/petstore/java/google-api-client/pom.xml b/samples/client/petstore/java/google-api-client/pom.xml index 02d40660155..af558ebb155 100644 --- a/samples/client/petstore/java/google-api-client/pom.xml +++ b/samples/client/petstore/java/google-api-client/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -246,11 +244,11 @@ UTF-8 - 1.5.17 + 1.5.21 1.23.0 2.25.1 2.8.9 - 2.6.4 + 2.6.4 1.0.0 4.12 diff --git a/samples/client/petstore/java/jersey1/pom.xml b/samples/client/petstore/java/jersey1/pom.xml index 397958485ba..c2ccfcede3a 100644 --- a/samples/client/petstore/java/jersey1/pom.xml +++ b/samples/client/petstore/java/jersey1/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -257,7 +255,7 @@ UTF-8 - 1.5.17 + 1.5.21 1.19.4 2.6.4 1.0.0 diff --git a/samples/client/petstore/java/jersey2-java6/build.sbt b/samples/client/petstore/java/jersey2-java6/build.sbt index 3d85a70e1d7..ea742941dcd 100644 --- a/samples/client/petstore/java/jersey2-java6/build.sbt +++ b/samples/client/petstore/java/jersey2-java6/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.20", + "io.swagger" % "swagger-annotations" % "1.5.21", "org.glassfish.jersey.core" % "jersey-client" % "2.6", "org.glassfish.jersey.media" % "jersey-media-multipart" % "2.6", "org.glassfish.jersey.media" % "jersey-media-json-jackson" % "2.6", diff --git a/samples/client/petstore/java/jersey2-java6/pom.xml b/samples/client/petstore/java/jersey2-java6/pom.xml index 46ee931b3d4..eea08b8d535 100644 --- a/samples/client/petstore/java/jersey2-java6/pom.xml +++ b/samples/client/petstore/java/jersey2-java6/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -267,7 +265,7 @@ UTF-8 - 1.5.20 + 1.5.21 2.6 2.5 3.6 diff --git a/samples/client/petstore/java/jersey2-java8/build.gradle b/samples/client/petstore/java/jersey2-java8/build.gradle index d271017ae90..d2daa9fa14a 100644 --- a/samples/client/petstore/java/jersey2-java8/build.gradle +++ b/samples/client/petstore/java/jersey2-java8/build.gradle @@ -93,7 +93,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.20" + swagger_annotations_version = "1.5.21" jackson_version = "2.9.6" jersey_version = "2.27" junit_version = "4.12" diff --git a/samples/client/petstore/java/jersey2-java8/build.sbt b/samples/client/petstore/java/jersey2-java8/build.sbt index 1bd1f63a7d5..8edfce668ab 100644 --- a/samples/client/petstore/java/jersey2-java8/build.sbt +++ b/samples/client/petstore/java/jersey2-java8/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.20", + "io.swagger" % "swagger-annotations" % "1.5.21", "org.glassfish.jersey.core" % "jersey-client" % "2.25.1", "org.glassfish.jersey.media" % "jersey-media-multipart" % "2.25.1", "org.glassfish.jersey.media" % "jersey-media-json-jackson" % "2.25.1", diff --git a/samples/client/petstore/java/jersey2-java8/pom.xml b/samples/client/petstore/java/jersey2-java8/pom.xml index c6317e79ee4..70130e62c2a 100644 --- a/samples/client/petstore/java/jersey2-java8/pom.xml +++ b/samples/client/petstore/java/jersey2-java8/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -251,7 +249,7 @@ UTF-8 - 1.5.20 + 1.5.21 2.27 2.8.9 1.0.0 diff --git a/samples/client/petstore/java/jersey2/build.gradle b/samples/client/petstore/java/jersey2/build.gradle index f1a401ef53e..84f8976c2ca 100644 --- a/samples/client/petstore/java/jersey2/build.gradle +++ b/samples/client/petstore/java/jersey2/build.gradle @@ -93,7 +93,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.20" + swagger_annotations_version = "1.5.21" jackson_version = "2.9.6" jersey_version = "2.27" junit_version = "4.12" diff --git a/samples/client/petstore/java/jersey2/build.sbt b/samples/client/petstore/java/jersey2/build.sbt index 578112888ec..e3f30385eff 100644 --- a/samples/client/petstore/java/jersey2/build.sbt +++ b/samples/client/petstore/java/jersey2/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.20", + "io.swagger" % "swagger-annotations" % "1.5.21", "org.glassfish.jersey.core" % "jersey-client" % "2.25.1", "org.glassfish.jersey.media" % "jersey-media-multipart" % "2.25.1", "org.glassfish.jersey.media" % "jersey-media-json-jackson" % "2.25.1", diff --git a/samples/client/petstore/java/jersey2/pom.xml b/samples/client/petstore/java/jersey2/pom.xml index ffc94e97dec..94391c45448 100644 --- a/samples/client/petstore/java/jersey2/pom.xml +++ b/samples/client/petstore/java/jersey2/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -257,7 +255,7 @@ UTF-8 - 1.5.20 + 1.5.21 2.27 2.8.9 2.6.4 diff --git a/samples/client/petstore/java/rest-assured/build.gradle b/samples/client/petstore/java/rest-assured/build.gradle index 8afb2af1889..b9eb1e177e8 100644 --- a/samples/client/petstore/java/rest-assured/build.gradle +++ b/samples/client/petstore/java/rest-assured/build.gradle @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.15" + swagger_annotations_version = "1.5.21" rest_assured_version = "3.1.0" junit_version = "4.12" gson_version = "2.6.1" diff --git a/samples/client/petstore/java/rest-assured/build.sbt b/samples/client/petstore/java/rest-assured/build.sbt index a57bc62b677..eb61e74a894 100644 --- a/samples/client/petstore/java/rest-assured/build.sbt +++ b/samples/client/petstore/java/rest-assured/build.sbt @@ -9,7 +9,7 @@ lazy val root = (project in file(".")). publishArtifact in (Compile, packageDoc) := false, resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.15", + "io.swagger" % "swagger-annotations" % "1.5.21", "io.rest-assured" % "scala-support" % "3.1.0", "com.google.code.gson" % "gson" % "2.6.1", "io.gsonfire" % "gson-fire" % "1.8.2" % "compile", diff --git a/samples/client/petstore/java/rest-assured/pom.xml b/samples/client/petstore/java/rest-assured/pom.xml index 4ed742e4659..ed7f35ac028 100644 --- a/samples/client/petstore/java/rest-assured/pom.xml +++ b/samples/client/petstore/java/rest-assured/pom.xml @@ -113,8 +113,7 @@ - - src/main/java + src/main/java @@ -126,8 +125,7 @@ - - src/test/java + src/test/java @@ -199,7 +197,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} io.rest-assured @@ -236,7 +234,7 @@ UTF-8 - 1.5.15 + 1.5.21 3.1.0 2.6.1 1.8.2 diff --git a/samples/client/petstore/java/resteasy/pom.xml b/samples/client/petstore/java/resteasy/pom.xml index ffe295db737..de50c2bb944 100644 --- a/samples/client/petstore/java/resteasy/pom.xml +++ b/samples/client/petstore/java/resteasy/pom.xml @@ -95,8 +95,7 @@ - - src/main/java + src/main/java @@ -108,8 +107,7 @@ - - src/test/java + src/test/java @@ -143,7 +141,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -215,7 +213,7 @@ UTF-8 - 1.5.18 + 1.5.21 3.1.3.Final 2.8.6 2.6.4 diff --git a/samples/client/petstore/java/resttemplate-withXml/build.gradle b/samples/client/petstore/java/resttemplate-withXml/build.gradle index 1d6787e3dbe..6448e545d59 100644 --- a/samples/client/petstore/java/resttemplate-withXml/build.gradle +++ b/samples/client/petstore/java/resttemplate-withXml/build.gradle @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.9" spring_web_version = "4.3.9.RELEASE" jodatime_version = "2.9.9" diff --git a/samples/client/petstore/java/resttemplate-withXml/pom.xml b/samples/client/petstore/java/resttemplate-withXml/pom.xml index e8c5b512c7a..74cc0d02f02 100644 --- a/samples/client/petstore/java/resttemplate-withXml/pom.xml +++ b/samples/client/petstore/java/resttemplate-withXml/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -255,7 +253,7 @@ UTF-8 - 1.5.17 + 1.5.21 4.3.9.RELEASE 2.8.9 2.6.4 diff --git a/samples/client/petstore/java/resttemplate/build.gradle b/samples/client/petstore/java/resttemplate/build.gradle index a6de57bd8cb..17325018007 100644 --- a/samples/client/petstore/java/resttemplate/build.gradle +++ b/samples/client/petstore/java/resttemplate/build.gradle @@ -94,7 +94,7 @@ if(hasProperty('target') && target == 'android') { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.8.9" spring_web_version = "4.3.9.RELEASE" jodatime_version = "2.9.9" diff --git a/samples/client/petstore/java/resttemplate/pom.xml b/samples/client/petstore/java/resttemplate/pom.xml index 9869bad196e..d3a526022dd 100644 --- a/samples/client/petstore/java/resttemplate/pom.xml +++ b/samples/client/petstore/java/resttemplate/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -247,7 +245,7 @@ UTF-8 - 1.5.17 + 1.5.21 4.3.9.RELEASE 2.8.9 2.6.4 diff --git a/samples/client/petstore/java/retrofit/build.gradle b/samples/client/petstore/java/retrofit/build.gradle index fb1371f1f39..124982e8590 100644 --- a/samples/client/petstore/java/retrofit/build.gradle +++ b/samples/client/petstore/java/retrofit/build.gradle @@ -97,7 +97,7 @@ ext { okhttp_version = "2.7.5" oltu_version = "1.0.1" retrofit_version = "1.9.0" - swagger_annotations_version = "1.5.8" + swagger_annotations_version = "1.5.21" junit_version = "4.12" jodatime_version = "2.9.3" } diff --git a/samples/client/petstore/java/retrofit/build.sbt b/samples/client/petstore/java/retrofit/build.sbt index 44fb828418b..cedb083de93 100644 --- a/samples/client/petstore/java/retrofit/build.sbt +++ b/samples/client/petstore/java/retrofit/build.sbt @@ -11,7 +11,7 @@ lazy val root = (project in file(".")). libraryDependencies ++= Seq( "com.squareup.okhttp" % "okhttp" % "2.7.5" % "compile", "com.squareup.retrofit" % "retrofit" % "1.9.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.8" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "joda-time" % "joda-time" % "2.9.3" % "compile", "junit" % "junit" % "4.12" % "test", diff --git a/samples/client/petstore/java/retrofit/pom.xml b/samples/client/petstore/java/retrofit/pom.xml index 1373ec62643..3f6dfee60fe 100644 --- a/samples/client/petstore/java/retrofit/pom.xml +++ b/samples/client/petstore/java/retrofit/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit @@ -222,8 +220,6 @@ joda-time ${jodatime-version} - - junit @@ -234,7 +230,7 @@ UTF-8 - 1.5.18 + 1.5.21 1.9.0 2.7.5 2.9.9 diff --git a/samples/client/petstore/java/retrofit2-play24/build.gradle b/samples/client/petstore/java/retrofit2-play24/build.gradle index 714331ea310..667a9b283ec 100644 --- a/samples/client/petstore/java/retrofit2-play24/build.gradle +++ b/samples/client/petstore/java/retrofit2-play24/build.gradle @@ -98,7 +98,7 @@ ext { retrofit_version = "2.3.0" jackson_version = "2.6.6" play_version = "2.4.11" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" json_fire_version = "1.8.0" } diff --git a/samples/client/petstore/java/retrofit2-play24/build.sbt b/samples/client/petstore/java/retrofit2-play24/build.sbt index d754ac539e1..ef9a3ad8103 100644 --- a/samples/client/petstore/java/retrofit2-play24/build.sbt +++ b/samples/client/petstore/java/retrofit2-play24/build.sbt @@ -16,7 +16,7 @@ lazy val root = (project in file(".")). "com.fasterxml.jackson.core" % "jackson-annotations" % "2.6.6" % "compile", "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.6" % "compile", "com.squareup.retrofit2" % "converter-jackson" % "2.3.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", "junit" % "junit" % "4.12" % "test", diff --git a/samples/client/petstore/java/retrofit2-play24/pom.xml b/samples/client/petstore/java/retrofit2-play24/pom.xml index 0ebc8092616..e73282392c4 100644 --- a/samples/client/petstore/java/retrofit2-play24/pom.xml +++ b/samples/client/petstore/java/retrofit2-play24/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -224,7 +222,6 @@ gson-fire ${gson-fire-version} - com.squareup.retrofit2 @@ -251,15 +248,11 @@ jackson-datatype-jsr310 ${jackson-version} - com.typesafe.play play-java-ws_2.11 ${play-version} - - - junit @@ -274,9 +267,9 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 - 2.6.6 - 2.4.11 + 1.5.21 + 2.6.6 + 2.4.11 2.3.0 1.0.1 4.12 diff --git a/samples/client/petstore/java/retrofit2-play25/build.gradle b/samples/client/petstore/java/retrofit2-play25/build.gradle index 8197e915993..201ad458bbb 100644 --- a/samples/client/petstore/java/retrofit2-play25/build.gradle +++ b/samples/client/petstore/java/retrofit2-play25/build.gradle @@ -98,7 +98,7 @@ ext { retrofit_version = "2.3.0" jackson_version = "2.7.8" play_version = "2.5.14" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" threetenbp_version = "1.3.5" json_fire_version = "1.8.0" diff --git a/samples/client/petstore/java/retrofit2-play25/build.sbt b/samples/client/petstore/java/retrofit2-play25/build.sbt index 49e5cc4d0e9..1f17d6bfc97 100644 --- a/samples/client/petstore/java/retrofit2-play25/build.sbt +++ b/samples/client/petstore/java/retrofit2-play25/build.sbt @@ -16,7 +16,7 @@ lazy val root = (project in file(".")). "com.fasterxml.jackson.core" % "jackson-annotations" % "2.7.8" % "compile", "com.fasterxml.jackson.core" % "jackson-databind" % "2.7.8" % "compile", "com.squareup.retrofit2" % "converter-jackson" % "2.3.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "org.threeten" % "threetenbp" % "1.3.5" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", diff --git a/samples/client/petstore/java/retrofit2-play25/pom.xml b/samples/client/petstore/java/retrofit2-play25/pom.xml index e26afdebc70..4051b0036d1 100644 --- a/samples/client/petstore/java/retrofit2-play25/pom.xml +++ b/samples/client/petstore/java/retrofit2-play25/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -229,7 +227,6 @@ threetenbp ${threetenbp-version} - com.squareup.retrofit2 @@ -256,15 +253,11 @@ jackson-datatype-jsr310 ${jackson-version} - com.typesafe.play play-java-ws_2.11 ${play-version} - - - junit @@ -279,11 +272,11 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 - 2.7.8 - 2.5.15 + 1.5.21 + 2.7.8 + 2.5.15 2.3.0 - 1.3.5 + 1.3.5 1.0.1 4.12 diff --git a/samples/client/petstore/java/retrofit2-play26/build.gradle b/samples/client/petstore/java/retrofit2-play26/build.gradle index e24d5f0643a..dd9ded7db04 100644 --- a/samples/client/petstore/java/retrofit2-play26/build.gradle +++ b/samples/client/petstore/java/retrofit2-play26/build.gradle @@ -98,7 +98,7 @@ ext { retrofit_version = "2.3.0" jackson_version = "2.8.10" play_version = "2.6.7" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" threetenbp_version = "1.3.5" json_fire_version = "1.8.0" diff --git a/samples/client/petstore/java/retrofit2-play26/build.sbt b/samples/client/petstore/java/retrofit2-play26/build.sbt index 8a5dfc447be..6ef49aa26d9 100644 --- a/samples/client/petstore/java/retrofit2-play26/build.sbt +++ b/samples/client/petstore/java/retrofit2-play26/build.sbt @@ -17,7 +17,7 @@ lazy val root = (project in file(".")). "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.10" % "compile", "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.10" % "compile", "com.squareup.retrofit2" % "converter-jackson" % "2.3.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "org.threeten" % "threetenbp" % "1.3.5" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", diff --git a/samples/client/petstore/java/retrofit2-play26/pom.xml b/samples/client/petstore/java/retrofit2-play26/pom.xml index 338ae2c35f3..6957bc7ec62 100644 --- a/samples/client/petstore/java/retrofit2-play26/pom.xml +++ b/samples/client/petstore/java/retrofit2-play26/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -229,7 +227,6 @@ threetenbp ${threetenbp-version} - com.squareup.retrofit2 @@ -256,7 +253,6 @@ jackson-datatype-jsr310 ${jackson-version} - com.typesafe.play play-ahc-ws_2.12 @@ -267,9 +263,6 @@ validation-api 1.1.0.Final - - - junit @@ -284,11 +277,11 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 - 2.8.10 - 2.6.7 + 1.5.21 + 2.8.10 + 2.6.7 2.3.0 - 1.3.5 + 1.3.5 1.0.1 4.12 diff --git a/samples/client/petstore/java/retrofit2/build.gradle b/samples/client/petstore/java/retrofit2/build.gradle index f4017a3f71f..5b2dbdafa34 100644 --- a/samples/client/petstore/java/retrofit2/build.gradle +++ b/samples/client/petstore/java/retrofit2/build.gradle @@ -96,7 +96,7 @@ if(hasProperty('target') && target == 'android') { ext { oltu_version = "1.0.1" retrofit_version = "2.3.0" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" threetenbp_version = "1.3.5" json_fire_version = "1.8.0" diff --git a/samples/client/petstore/java/retrofit2/build.sbt b/samples/client/petstore/java/retrofit2/build.sbt index ef3a285ecb9..32ae3006148 100644 --- a/samples/client/petstore/java/retrofit2/build.sbt +++ b/samples/client/petstore/java/retrofit2/build.sbt @@ -12,7 +12,7 @@ lazy val root = (project in file(".")). "com.squareup.retrofit2" % "retrofit" % "2.3.0" % "compile", "com.squareup.retrofit2" % "converter-scalars" % "2.3.0" % "compile", "com.squareup.retrofit2" % "converter-gson" % "2.3.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "org.threeten" % "threetenbp" % "1.3.5" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", diff --git a/samples/client/petstore/java/retrofit2/pom.xml b/samples/client/petstore/java/retrofit2/pom.xml index eefa92c58a4..6cba3499f5a 100644 --- a/samples/client/petstore/java/retrofit2/pom.xml +++ b/samples/client/petstore/java/retrofit2/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -229,9 +227,6 @@ threetenbp ${threetenbp-version} - - - junit @@ -246,9 +241,9 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 + 1.5.21 2.3.0 - 1.3.5 + 1.3.5 1.0.1 4.12 diff --git a/samples/client/petstore/java/retrofit2rx/build.gradle b/samples/client/petstore/java/retrofit2rx/build.gradle index 79af8dae49d..9ea182cc720 100644 --- a/samples/client/petstore/java/retrofit2rx/build.gradle +++ b/samples/client/petstore/java/retrofit2rx/build.gradle @@ -96,7 +96,7 @@ if(hasProperty('target') && target == 'android') { ext { oltu_version = "1.0.1" retrofit_version = "2.3.0" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" rx_java_version = "1.3.0" threetenbp_version = "1.3.5" diff --git a/samples/client/petstore/java/retrofit2rx/build.sbt b/samples/client/petstore/java/retrofit2rx/build.sbt index 023b614314e..1cabf93331f 100644 --- a/samples/client/petstore/java/retrofit2rx/build.sbt +++ b/samples/client/petstore/java/retrofit2rx/build.sbt @@ -14,7 +14,7 @@ lazy val root = (project in file(".")). "com.squareup.retrofit2" % "converter-gson" % "2.3.0" % "compile", "com.squareup.retrofit2" % "adapter-rxjava" % "2.3.0" % "compile", "io.reactivex" % "rxjava" % "1.3.0" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "org.threeten" % "threetenbp" % "1.3.5" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", diff --git a/samples/client/petstore/java/retrofit2rx/pom.xml b/samples/client/petstore/java/retrofit2rx/pom.xml index d438ede5b46..d764b2112d3 100644 --- a/samples/client/petstore/java/retrofit2rx/pom.xml +++ b/samples/client/petstore/java/retrofit2rx/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -239,9 +237,6 @@ adapter-rxjava ${retrofit-version} - - - junit @@ -256,10 +251,10 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 + 1.5.21 2.3.0 - 1.3.0 - 1.3.5 + 1.3.0 + 1.3.5 1.0.1 4.12 diff --git a/samples/client/petstore/java/retrofit2rx2/build.gradle b/samples/client/petstore/java/retrofit2rx2/build.gradle index fc7fcf23f4c..44233fa5817 100644 --- a/samples/client/petstore/java/retrofit2rx2/build.gradle +++ b/samples/client/petstore/java/retrofit2rx2/build.gradle @@ -96,7 +96,7 @@ if(hasProperty('target') && target == 'android') { ext { oltu_version = "1.0.1" retrofit_version = "2.3.0" - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" junit_version = "4.12" rx_java_version = "2.1.1" threetenbp_version = "1.3.5" diff --git a/samples/client/petstore/java/retrofit2rx2/build.sbt b/samples/client/petstore/java/retrofit2rx2/build.sbt index 73856859866..fbdee2f1683 100644 --- a/samples/client/petstore/java/retrofit2rx2/build.sbt +++ b/samples/client/petstore/java/retrofit2rx2/build.sbt @@ -14,7 +14,7 @@ lazy val root = (project in file(".")). "com.squareup.retrofit2" % "converter-gson" % "2.3.0" % "compile", "com.squareup.retrofit2" % "adapter-rxjava2" % "2.3.0" % "compile", "io.reactivex.rxjava2" % "rxjava" % "2.1.1" % "compile", - "io.swagger" % "swagger-annotations" % "1.5.17" % "compile", + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", "org.threeten" % "threetenbp" % "1.3.5" % "compile", "io.gsonfire" % "gson-fire" % "1.8.0" % "compile", diff --git a/samples/client/petstore/java/retrofit2rx2/pom.xml b/samples/client/petstore/java/retrofit2rx2/pom.xml index 0ffd258fae9..316cedb4f2e 100644 --- a/samples/client/petstore/java/retrofit2rx2/pom.xml +++ b/samples/client/petstore/java/retrofit2rx2/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -191,7 +189,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} com.squareup.retrofit2 @@ -239,9 +237,6 @@ adapter-rxjava2 ${retrofit-version} - - - junit @@ -256,10 +251,10 @@ ${java.version} ${java.version} 1.8.0 - 1.5.18 + 1.5.21 2.3.0 - 2.1.1 - 1.3.5 + 2.1.1 + 1.3.5 1.0.1 4.12 diff --git a/samples/client/petstore/java/vertx/build.gradle b/samples/client/petstore/java/vertx/build.gradle index b10a98e8f1b..d55ccac8c36 100644 --- a/samples/client/petstore/java/vertx/build.gradle +++ b/samples/client/petstore/java/vertx/build.gradle @@ -26,7 +26,7 @@ task execute(type:JavaExec) { } ext { - swagger_annotations_version = "1.5.17" + swagger_annotations_version = "1.5.21" jackson_version = "2.6.4" vertx_version = "3.4.2" junit_version = "4.12" diff --git a/samples/client/petstore/java/vertx/pom.xml b/samples/client/petstore/java/vertx/pom.xml index a7e7b8bb4ce..754d4660cae 100644 --- a/samples/client/petstore/java/vertx/pom.xml +++ b/samples/client/petstore/java/vertx/pom.xml @@ -114,8 +114,7 @@ - - src/main/java + src/main/java @@ -127,8 +126,7 @@ - - src/test/java + src/test/java @@ -200,7 +198,7 @@ io.swagger swagger-annotations - ${swagger-core-version} + ${swagger-annotations-version} @@ -260,7 +258,7 @@ UTF-8 3.4.2 - 1.5.18 + 1.5.21 2.6.4 4.12 From 62abd51a02ae9159f473a25ddc632d0163e94552 Mon Sep 17 00:00:00 2001 From: osjupiter Date: Thu, 30 Aug 2018 14:23:19 +0900 Subject: [PATCH 16/74] [all] add "x-enum-varnames" extension to control enum varname (#917) * add "x-enum-varnames" extension to control the naming of the enum parameter name * allow to set different size from target enum --- .../openapitools/codegen/DefaultCodegen.java | 14 +++ .../codegen/DefaultCodegenTest.java | 86 +++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 0574a7bcc08..0181846492d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -287,6 +287,8 @@ public class DefaultCodegen implements CodegenConfig { enumVar.put("isString", isDataTypeString(cm.dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions()); cm.allowableValues.put("enumVars", enumVars); } @@ -4003,6 +4005,8 @@ public class DefaultCodegen implements CodegenConfig { enumVar.put("isString", isDataTypeString(dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, var.getVendorExtensions()); allowableValues.put("enumVars", enumVars); // handle default value for enum, e.g. available => StatusEnum.AVAILABLE @@ -4020,6 +4024,16 @@ public class DefaultCodegen implements CodegenConfig { } } + private void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions) { + if (vendorExtensions != null && vendorExtensions.containsKey("x-enum-varnames")) { + List alias = (List) vendorExtensions.get("x-enum-varnames"); + int size = Math.min(enumVars.size(), alias.size()); + for (int i = 0; i < size; i++) { + enumVars.get(i).put("name", alias.get(i)); + } + } + } + /** * If the pattern misses the delimiter, add "/" to the beginning and end * Otherwise, return the original pattern diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index cf78dbc1a99..425eb7a23ab 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -306,6 +306,66 @@ public class DefaultCodegenTest { Assert.assertEquals(testedEnumVar.getOrDefault("isString", ""), false); } + @Test + public void updateCodegenPropertyEnumWithExtention() { + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("dog", "cat"), Arrays.asList("DOGVAR", "CATVAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("1", "2"), Arrays.asList("ONE", "TWO")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ONE"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1\""); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "TWO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"2\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b", "c", "d"), Arrays.asList("FOO", "BAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "C"); + Assert.assertEquals(enumVars.get(3).getOrDefault("name", ""), "D"); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b"), Arrays.asList("FOO", "BAR", "BAZ")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.size(), 2); + } + } + + @Test + public void postProcessModelsEnumWithExtention() { + final DefaultCodegen codegen = new DefaultCodegen(); + Map objs = codegenModelWithXEnumVarName(); + CodegenModel cm = (CodegenModel) ((Map) ((List) objs.get("models")).get(0)).get("model"); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + @Test public void testExample1() { final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/examples.yaml", null, new ParseOptions()).getOpenAPI(); @@ -478,4 +538,30 @@ public class DefaultCodegenTest { array.dataType = "Array"; return array; } + + private CodegenProperty codegenPropertyWithXEnumVarName(List values, List aliases) { + final CodegenProperty var = new CodegenProperty(); + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", values); + var.setAllowableValues(allowableValues); + var.dataType = "String"; + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + var.setVendorExtensions(extentions); + return var; + } + + private Map codegenModelWithXEnumVarName() { + final CodegenModel cm = new CodegenModel(); + cm.isEnum = true; + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", Arrays.asList("dog", "cat")); + cm.setAllowableValues(allowableValues); + cm.dataType = "String"; + final List aliases = Arrays.asList("DOGVAR", "CATVAR"); + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + cm.setVendorExtensions(extentions); + cm.setVars(Collections.emptyList()); + Map objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm))); + return objs; + } } From f987306a15032a38b5e48d6ff51be6d7b7bcc266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Thu, 30 Aug 2018 07:54:34 +0200 Subject: [PATCH 17/74] Remove x-nullable extension support (#930) --- .../openapitools/codegen/DefaultCodegen.java | 19 ++++--------------- .../codegen/ruby/RubyClientCodegenTest.java | 3 +-- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 0181846492d..ee69531208e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -77,8 +77,8 @@ import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Stream; import java.util.stream.Collectors; +import java.util.stream.Stream; public class DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); @@ -1794,11 +1794,7 @@ public class DefaultCodegen implements CodegenConfig { if (p.getWriteOnly() != null) { property.isWriteOnly = p.getWriteOnly(); } - - // use x-nullable - if (p.getExtensions() != null && p.getExtensions().get("x-nullable") != null) { - property.isNullable = Boolean.valueOf(p.getExtensions().get("x-nullable").toString()); - } else if (p.getNullable() != null) { // use nullable defined in OAS3 + if (p.getNullable() != null) { property.isNullable = p.getNullable(); } @@ -2745,10 +2741,7 @@ public class DefaultCodegen implements CodegenConfig { parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition."); } - // x-nullable extension in OAS2 - if (parameter.getExtensions() != null && parameter.getExtensions().get("x-nullable") != null) { - codegenParameter.isNullable = Boolean.valueOf(parameter.getExtensions().get("x-nullable").toString()); - } else if (Boolean.TRUE.equals(parameterSchema.getNullable())) { // use nullable defined in the spec + if (Boolean.TRUE.equals(parameterSchema.getNullable())) { // use nullable defined in the spec codegenParameter.isNullable = true; } @@ -4766,10 +4759,6 @@ public class DefaultCodegen implements CodegenConfig { } private void setParameterNullable(CodegenParameter parameter, CodegenProperty property) { - if (property.getVendorExtensions() != null && property.getVendorExtensions().get("x-nullable") != null) { - parameter.isNullable = Boolean.valueOf(property.getVendorExtensions().get("x-nullable").toString()); - } else { - parameter.isNullable = property.isNullable; - } + parameter.isNullable = property.isNullable; } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/ruby/RubyClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/ruby/RubyClientCodegenTest.java index 2e43257eaa2..2d89be08cf8 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/ruby/RubyClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/ruby/RubyClientCodegenTest.java @@ -268,8 +268,7 @@ public class RubyClientCodegenTest { CodegenParameter name = op.formParams.get(0); Assert.assertFalse(name.isNullable); CodegenParameter status = op.formParams.get(1); - // TODO comment out the following as there seems to be an issue with swagger parser not brining over the - // vendor extensions of the form parameter when creating the schema + // TODO comment out the following until https://github.com/swagger-api/swagger-parser/issues/820 is solved //Assert.assertTrue(status.isNullable); } } From f4d7403ed698fc9ea0c4e98d043604059ee1988c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Thu, 30 Aug 2018 08:05:34 +0200 Subject: [PATCH 18/74] [Java][JAXRS] improve generated readme (#920) * [Java][JAXRS] improve readmes * Update samples * Update jersey readme * Update jersey examples --- bin/openapi3/jaxrs-jersey-petstore.sh | 0 .../languages/JavaJAXRSSpecServerCodegen.java | 2 + .../main/resources/JavaJaxRS/README.mustache | 13 +- .../JavaJaxRS/resteasy/README.mustache | 15 +-- .../JavaJaxRS/resteasy/eap/README.mustache | 12 +- .../resources/JavaJaxRS/spec/README.mustache | 33 +++++ .../jaxrs-jersey/.openapi-generator/VERSION | 2 +- .../server/petstore/jaxrs-jersey/README.md | 13 +- .../org/openapitools/api/ApiException.java | 2 +- .../org/openapitools/api/ApiOriginFilter.java | 2 +- .../openapitools/api/ApiResponseMessage.java | 2 +- .../openapitools/api/NotFoundException.java | 2 +- .../gen/java/org/openapitools/api/PetApi.java | 2 +- .../org/openapitools/api/PetApiService.java | 2 +- .../java/org/openapitools/api/StoreApi.java | 2 +- .../org/openapitools/api/StoreApiService.java | 2 +- .../java/org/openapitools/api/StringUtil.java | 2 +- .../java/org/openapitools/api/UserApi.java | 2 +- .../org/openapitools/api/UserApiService.java | 2 +- .../gen/java/org/openapitools/model/Body.java | 114 +++++++++++++++++ .../java/org/openapitools/model/Body1.java | 115 ++++++++++++++++++ .../java/org/openapitools/model/Category.java | 2 +- .../openapitools/model/ModelApiResponse.java | 2 +- .../java/org/openapitools/model/Order.java | 2 +- .../gen/java/org/openapitools/model/Pet.java | 2 +- .../gen/java/org/openapitools/model/Tag.java | 2 +- .../gen/java/org/openapitools/model/User.java | 2 +- .../api/factories/PetApiServiceFactory.java | 2 +- .../api/factories/StoreApiServiceFactory.java | 2 +- .../api/factories/UserApiServiceFactory.java | 2 +- .../api/impl/PetApiServiceImpl.java | 2 +- .../api/impl/StoreApiServiceImpl.java | 2 +- .../api/impl/UserApiServiceImpl.java | 2 +- .../petstore/jaxrs-resteasy/default/README.md | 15 +-- .../jaxrs-resteasy/eap-java8/README.md | 12 +- .../jaxrs-resteasy/eap-joda/README.md | 12 +- .../petstore/jaxrs-resteasy/eap/README.md | 12 +- .../petstore/jaxrs-resteasy/joda/README.md | 15 +-- .../petstore/jaxrs-spec-interface/README.md | 12 ++ samples/server/petstore/jaxrs-spec/README.md | 27 ++++ .../petstore/jaxrs/jersey1-useTags/README.md | 13 +- .../server/petstore/jaxrs/jersey1/README.md | 13 +- .../petstore/jaxrs/jersey2-useTags/README.md | 13 +- .../server/petstore/jaxrs/jersey2/README.md | 13 +- 44 files changed, 417 insertions(+), 105 deletions(-) mode change 100644 => 100755 bin/openapi3/jaxrs-jersey-petstore.sh create mode 100644 modules/openapi-generator/src/main/resources/JavaJaxRS/spec/README.mustache create mode 100644 samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body.java create mode 100644 samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body1.java create mode 100644 samples/server/petstore/jaxrs-spec-interface/README.md create mode 100644 samples/server/petstore/jaxrs-spec/README.md diff --git a/bin/openapi3/jaxrs-jersey-petstore.sh b/bin/openapi3/jaxrs-jersey-petstore.sh old mode 100644 new mode 100755 diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index 3a7cb617d13..e83b438790f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; + import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConstants; @@ -130,6 +131,7 @@ public class JavaJAXRSSpecServerCodegen extends AbstractJavaJAXRSServerCodegen { super.processOpts(); supportingFiles.clear(); // Don't need extra files provided by AbstractJAX-RS & Java Codegen + writeOptional(outputFolder, new SupportingFile("README.mustache", "", "README.md")); if (generatePom) { writeOptional(outputFolder, new SupportingFile("pom.mustache", "", "pom.xml")); } diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/README.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/README.mustache index dcf00bfdcf4..98a0fd82419 100644 --- a/modules/openapi-generator/src/main/resources/JavaJaxRS/README.mustache +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/README.mustache @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the -[OpenAPI-Spec](https://openapis.org) from a remote server, you can easily generate a server stub. This -is an example of building a OpenAPI-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:{{serverPort}}{{contextPath}}/openapi.json +http://localhost:{{serverPort}}{{contextPath}}/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/README.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/README.mustache index 45f4438e36a..647f45ff5a3 100644 --- a/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/README.mustache +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/README.mustache @@ -1,22 +1,23 @@ -# OpenAPI generated server +# JAX-RS/RESTEasy server with OpenAPI ## Overview -This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the -[OpenAPI-Spec](https://openapis.org) from a remote server, you can easily generate a server stub. This -is an example of building a OpenAPI-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +RESTEasy is used as JAX-RS implementation library and is defined as dependency. To run the server, please execute the following: ``` -mvn clean package jetty:run +mvn -Djetty.http.port={{serverPort}} package org.eclipse.jetty:jetty-maven-plugin:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:{{serverPort}}{{contextPath}}/openapi.json +http://localhost:{{serverPort}}{{contextPath}}/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/eap/README.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/eap/README.mustache index 5e1dce9b0a8..ed1aa06a3cc 100644 --- a/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/eap/README.mustache +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/resteasy/eap/README.mustache @@ -1,18 +1,18 @@ -# OpenAPI generated server +# JAX-RS/Resteasy server with OpenAPI for Jboss EAP ## Overview -This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the -[OpenAPI-Spec](https://openapis.org) from a remote server, you can easily generate a server stub. This -is an example of building a OpenAPI-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework for Jboss Resteasy. You can deploy the WAR file to Jboss EAP or any other JEE server supporting Jboss Resteasy. -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:{{serverPort}}{{contextPath}}/openapi.json +http://localhost:{{serverPort}}{{contextPath}}/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/README.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/README.mustache new file mode 100644 index 00000000000..93c1ccb7811 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/README.mustache @@ -0,0 +1,33 @@ +# JAX-RS server with OpenAPI + +## Overview +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. + +This is an example of building a OpenAPI-enabled JAX-RS server. +This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. + +{{#interfaceOnly}} +This project produces a jar that defines some interfaces. +The jar can be used in combination with an other project providing the implementation. +{{/interfaceOnly}} + +{{^interfaceOnly}} +The JAX-RS implementation needs to be provided by the application server you are deploying on. + +To run the server from the command line, you can use maven to provision an start a TomEE Server. +Please execute the following: + +``` +mvn -Dtomee-embedded-plugin.http={{serverPort}} package org.apache.tomee.maven:tomee-embedded-maven-plugin:7.0.5:run +``` + +You can then call your server endpoints under: + +``` +http://localhost:{{serverPort}}{{contextPath}}/ +``` + +Note that if you have configured the `host` to be something other than localhost, the calls through +swagger-ui will be directed to that host and not localhost! +{{/interfaceOnly}} diff --git a/samples/server/petstore/jaxrs-jersey/.openapi-generator/VERSION b/samples/server/petstore/jaxrs-jersey/.openapi-generator/VERSION index 14900cee60e..c791c986fbb 100644 --- a/samples/server/petstore/jaxrs-jersey/.openapi-generator/VERSION +++ b/samples/server/petstore/jaxrs-jersey/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/jaxrs-jersey/README.md b/samples/server/petstore/jaxrs-jersey/README.md index ed004204491..64a6c60dc38 100644 --- a/samples/server/petstore/jaxrs-jersey/README.md +++ b/samples/server/petstore/jaxrs-jersey/README.md @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the -[OpenAPI-Spec](https://openapis.org) from a remote server, you can easily generate a server stub. This -is an example of building a OpenAPI-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiException.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiException.java index 2d2990bc7f0..5cc52cf8f10 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiException.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiException.java @@ -1,6 +1,6 @@ package org.openapitools.api; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class ApiException extends Exception{ private int code; public ApiException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiOriginFilter.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiOriginFilter.java index 96f2e348300..d6aca4e4be3 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiOriginFilter.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiOriginFilter.java @@ -5,7 +5,7 @@ import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class ApiOriginFilter implements javax.servlet.Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiResponseMessage.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiResponseMessage.java index d25a2f4d834..15bc0653ec2 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiResponseMessage.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/ApiResponseMessage.java @@ -3,7 +3,7 @@ package org.openapitools.api; import javax.xml.bind.annotation.XmlTransient; @javax.xml.bind.annotation.XmlRootElement -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class ApiResponseMessage { public static final int ERROR = 1; public static final int WARNING = 2; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/NotFoundException.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/NotFoundException.java index edfc4e392a8..4bc02b8fc25 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/NotFoundException.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/NotFoundException.java @@ -1,6 +1,6 @@ package org.openapitools.api; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class NotFoundException extends ApiException { private int code; public NotFoundException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApi.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApi.java index c65b8d422e2..deaa2ea7aa9 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApi.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApi.java @@ -31,7 +31,7 @@ import javax.validation.constraints.*; @io.swagger.annotations.Api(description = "the pet API") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class PetApi { private final PetApiService delegate; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApiService.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApiService.java index 95bf11d9b09..3b79de69e71 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApiService.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/PetApiService.java @@ -17,7 +17,7 @@ import java.io.InputStream; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public abstract class PetApiService { public abstract Response addPet(Pet pet,SecurityContext securityContext) throws NotFoundException; public abstract Response deletePet(Long petId,String apiKey,SecurityContext securityContext) throws NotFoundException; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApi.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApi.java index d0f12395db8..d93e01928fe 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApi.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApi.java @@ -30,7 +30,7 @@ import javax.validation.constraints.*; @io.swagger.annotations.Api(description = "the store API") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class StoreApi { private final StoreApiService delegate; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApiService.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApiService.java index 13698d783a9..952e554c473 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApiService.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StoreApiService.java @@ -16,7 +16,7 @@ import java.io.InputStream; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public abstract class StoreApiService { public abstract Response deleteOrder(String orderId,SecurityContext securityContext) throws NotFoundException; public abstract Response getInventory(SecurityContext securityContext) throws NotFoundException; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StringUtil.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StringUtil.java index 8810d4383bd..28589f66e96 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StringUtil.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/StringUtil.java @@ -1,6 +1,6 @@ package org.openapitools.api; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApi.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApi.java index 2c5625c2fe4..5531c4f9e67 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApi.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApi.java @@ -30,7 +30,7 @@ import javax.validation.constraints.*; @io.swagger.annotations.Api(description = "the user API") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class UserApi { private final UserApiService delegate; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApiService.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApiService.java index e5919ae31cb..572a568f050 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApiService.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/api/UserApiService.java @@ -16,7 +16,7 @@ import java.io.InputStream; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public abstract class UserApiService { public abstract Response createUser(User user,SecurityContext securityContext) throws NotFoundException; public abstract Response createUsersWithArrayInput(List user,SecurityContext securityContext) throws NotFoundException; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body.java new file mode 100644 index 00000000000..34c1291b795 --- /dev/null +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body.java @@ -0,0 +1,114 @@ +/* + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.constraints.*; + +/** + * Body + */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") +public class Body { + @JsonProperty("name") + private String name = null; + + @JsonProperty("status") + private String status = null; + + public Body name(String name) { + this.name = name; + return this; + } + + /** + * Updated name of the pet + * @return name + **/ + @JsonProperty("name") + @ApiModelProperty(value = "Updated name of the pet") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Body status(String status) { + this.status = status; + return this; + } + + /** + * Updated status of the pet + * @return status + **/ + @JsonProperty("status") + @ApiModelProperty(value = "Updated status of the pet") + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Body body = (Body) o; + return Objects.equals(this.name, body.name) && + Objects.equals(this.status, body.status); + } + + @Override + public int hashCode() { + return Objects.hash(name, status); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Body {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body1.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body1.java new file mode 100644 index 00000000000..e57d78b0b71 --- /dev/null +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Body1.java @@ -0,0 +1,115 @@ +/* + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.File; +import javax.validation.constraints.*; + +/** + * Body1 + */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") +public class Body1 { + @JsonProperty("additionalMetadata") + private String additionalMetadata = null; + + @JsonProperty("file") + private File file = null; + + public Body1 additionalMetadata(String additionalMetadata) { + this.additionalMetadata = additionalMetadata; + return this; + } + + /** + * Additional data to pass to server + * @return additionalMetadata + **/ + @JsonProperty("additionalMetadata") + @ApiModelProperty(value = "Additional data to pass to server") + public String getAdditionalMetadata() { + return additionalMetadata; + } + + public void setAdditionalMetadata(String additionalMetadata) { + this.additionalMetadata = additionalMetadata; + } + + public Body1 file(File file) { + this.file = file; + return this; + } + + /** + * file to upload + * @return file + **/ + @JsonProperty("file") + @ApiModelProperty(value = "file to upload") + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Body1 body1 = (Body1) o; + return Objects.equals(this.additionalMetadata, body1.additionalMetadata) && + Objects.equals(this.file, body1.file); + } + + @Override + public int hashCode() { + return Objects.hash(additionalMetadata, file); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Body1 {\n"); + + sb.append(" additionalMetadata: ").append(toIndentedString(additionalMetadata)).append("\n"); + sb.append(" file: ").append(toIndentedString(file)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Category.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Category.java index 76cf0f87956..47a04f30d1c 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Category.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Category.java @@ -24,7 +24,7 @@ import javax.validation.constraints.*; * A category for a pet */ @ApiModel(description = "A category for a pet") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class Category { @JsonProperty("id") private Long id = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/ModelApiResponse.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/ModelApiResponse.java index 45069447901..dae86b07e40 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/ModelApiResponse.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/ModelApiResponse.java @@ -24,7 +24,7 @@ import javax.validation.constraints.*; * Describes the result of uploading an image resource */ @ApiModel(description = "Describes the result of uploading an image resource") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class ModelApiResponse { @JsonProperty("code") private Integer code = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Order.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Order.java index 1f1c23188d1..b3e07ef3014 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Order.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Order.java @@ -26,7 +26,7 @@ import javax.validation.constraints.*; * An order for a pets from the pet store */ @ApiModel(description = "An order for a pets from the pet store") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class Order { @JsonProperty("id") private Long id = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Pet.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Pet.java index 96271292913..92a06e101e7 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Pet.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Pet.java @@ -29,7 +29,7 @@ import javax.validation.constraints.*; * A pet for sale in the pet store */ @ApiModel(description = "A pet for sale in the pet store") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class Pet { @JsonProperty("id") private Long id = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Tag.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Tag.java index 5d78706d8f4..b2576bd98ae 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Tag.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/Tag.java @@ -24,7 +24,7 @@ import javax.validation.constraints.*; * A tag for a pet */ @ApiModel(description = "A tag for a pet") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class Tag { @JsonProperty("id") private Long id = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/User.java b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/User.java index 3709c050508..e417fbd7ca6 100644 --- a/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/User.java +++ b/samples/server/petstore/jaxrs-jersey/src/gen/java/org/openapitools/model/User.java @@ -24,7 +24,7 @@ import javax.validation.constraints.*; * A User who is purchasing from the pet store */ @ApiModel(description = "A User who is purchasing from the pet store") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class User { @JsonProperty("id") private Long id = null; diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/PetApiServiceFactory.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/PetApiServiceFactory.java index 5bd95e5f1c0..79a5da655de 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/PetApiServiceFactory.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/PetApiServiceFactory.java @@ -3,7 +3,7 @@ package org.openapitools.api.factories; import org.openapitools.api.PetApiService; import org.openapitools.api.impl.PetApiServiceImpl; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class PetApiServiceFactory { private final static PetApiService service = new PetApiServiceImpl(); diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/StoreApiServiceFactory.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/StoreApiServiceFactory.java index 3a9ab3531af..51f64e041a2 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/StoreApiServiceFactory.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/StoreApiServiceFactory.java @@ -3,7 +3,7 @@ package org.openapitools.api.factories; import org.openapitools.api.StoreApiService; import org.openapitools.api.impl.StoreApiServiceImpl; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class StoreApiServiceFactory { private final static StoreApiService service = new StoreApiServiceImpl(); diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/UserApiServiceFactory.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/UserApiServiceFactory.java index 12540d9364c..8496033949e 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/UserApiServiceFactory.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/factories/UserApiServiceFactory.java @@ -3,7 +3,7 @@ package org.openapitools.api.factories; import org.openapitools.api.UserApiService; import org.openapitools.api.impl.UserApiServiceImpl; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class UserApiServiceFactory { private final static UserApiService service = new UserApiServiceImpl(); diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/PetApiServiceImpl.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/PetApiServiceImpl.java index 3ef3488fe8f..f4a3e112321 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/PetApiServiceImpl.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/PetApiServiceImpl.java @@ -17,7 +17,7 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class PetApiServiceImpl extends PetApiService { @Override public Response addPet(Pet pet, SecurityContext securityContext) throws NotFoundException { diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/StoreApiServiceImpl.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/StoreApiServiceImpl.java index b4be886cf0c..8adf9550114 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/StoreApiServiceImpl.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/StoreApiServiceImpl.java @@ -16,7 +16,7 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class StoreApiServiceImpl extends StoreApiService { @Override public Response deleteOrder(String orderId, SecurityContext securityContext) throws NotFoundException { diff --git a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/UserApiServiceImpl.java b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/UserApiServiceImpl.java index fb2e323efc6..63312af2083 100644 --- a/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/UserApiServiceImpl.java +++ b/samples/server/petstore/jaxrs-jersey/src/main/java/org/openapitools/api/impl/UserApiServiceImpl.java @@ -16,7 +16,7 @@ import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.validation.constraints.*; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-10T15:02:11.723+09:00[Asia/Tokyo]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJerseyServerCodegen", date = "2018-08-29T07:47:48.785+02:00[Europe/Zurich]") public class UserApiServiceImpl extends UserApiService { @Override public Response createUser(User user, SecurityContext securityContext) throws NotFoundException { diff --git a/samples/server/petstore/jaxrs-resteasy/default/README.md b/samples/server/petstore/jaxrs-resteasy/default/README.md index 78b550b6cf3..050351dfcdb 100644 --- a/samples/server/petstore/jaxrs-resteasy/default/README.md +++ b/samples/server/petstore/jaxrs-resteasy/default/README.md @@ -1,22 +1,23 @@ -# Swagger generated server +# JAX-RS/RESTEasy server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +RESTEasy is used as JAX-RS implementation library and is defined as dependency. To run the server, please execute the following: ``` -mvn clean package jetty:run +mvn -Djetty.http.port=8080 package org.eclipse.jetty:jetty-maven-plugin:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-resteasy/eap-java8/README.md b/samples/server/petstore/jaxrs-resteasy/eap-java8/README.md index 7bb1cfae220..74db54ed53e 100644 --- a/samples/server/petstore/jaxrs-resteasy/eap-java8/README.md +++ b/samples/server/petstore/jaxrs-resteasy/eap-java8/README.md @@ -1,18 +1,18 @@ -# Swagger generated server +# JAX-RS/Resteasy server with OpenAPI for Jboss EAP ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework for Jboss Resteasy. You can deploy the WAR file to Jboss EAP or any other JEE server supporting Jboss Resteasy. -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-resteasy/eap-joda/README.md b/samples/server/petstore/jaxrs-resteasy/eap-joda/README.md index 7bb1cfae220..74db54ed53e 100644 --- a/samples/server/petstore/jaxrs-resteasy/eap-joda/README.md +++ b/samples/server/petstore/jaxrs-resteasy/eap-joda/README.md @@ -1,18 +1,18 @@ -# Swagger generated server +# JAX-RS/Resteasy server with OpenAPI for Jboss EAP ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework for Jboss Resteasy. You can deploy the WAR file to Jboss EAP or any other JEE server supporting Jboss Resteasy. -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-resteasy/eap/README.md b/samples/server/petstore/jaxrs-resteasy/eap/README.md index 7bb1cfae220..74db54ed53e 100644 --- a/samples/server/petstore/jaxrs-resteasy/eap/README.md +++ b/samples/server/petstore/jaxrs-resteasy/eap/README.md @@ -1,18 +1,18 @@ -# Swagger generated server +# JAX-RS/Resteasy server with OpenAPI for Jboss EAP ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework for Jboss Resteasy. You can deploy the WAR file to Jboss EAP or any other JEE server supporting Jboss Resteasy. -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-resteasy/joda/README.md b/samples/server/petstore/jaxrs-resteasy/joda/README.md index 78b550b6cf3..050351dfcdb 100644 --- a/samples/server/petstore/jaxrs-resteasy/joda/README.md +++ b/samples/server/petstore/jaxrs-resteasy/joda/README.md @@ -1,22 +1,23 @@ -# Swagger generated server +# JAX-RS/RESTEasy server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +RESTEasy is used as JAX-RS implementation library and is defined as dependency. To run the server, please execute the following: ``` -mvn clean package jetty:run +mvn -Djetty.http.port=8080 package org.eclipse.jetty:jetty-maven-plugin:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8080/v2/openapi.json +http://localhost:8080/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs-spec-interface/README.md b/samples/server/petstore/jaxrs-spec-interface/README.md new file mode 100644 index 00000000000..553be1f4b16 --- /dev/null +++ b/samples/server/petstore/jaxrs-spec-interface/README.md @@ -0,0 +1,12 @@ +# JAX-RS server with OpenAPI + +## Overview +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. + +This is an example of building a OpenAPI-enabled JAX-RS server. +This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. + +This project produces a jar that defines some interfaces. +The jar can be used in combination with an other project providing the implementation. + diff --git a/samples/server/petstore/jaxrs-spec/README.md b/samples/server/petstore/jaxrs-spec/README.md new file mode 100644 index 00000000000..603301eaf35 --- /dev/null +++ b/samples/server/petstore/jaxrs-spec/README.md @@ -0,0 +1,27 @@ +# JAX-RS server with OpenAPI + +## Overview +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. + +This is an example of building a OpenAPI-enabled JAX-RS server. +This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. + + +The JAX-RS implementation needs to be provided by the application server you are deploying on. + +To run the server from the command line, you can use maven to provision an start a TomEE Server. +Please execute the following: + +``` +mvn -Dtomee-embedded-plugin.http=80 package org.apache.tomee.maven:tomee-embedded-maven-plugin:7.0.5:run +``` + +You can then call your server endpoints under: + +``` +http://localhost:80/v2/ +``` + +Note that if you have configured the `host` to be something other than localhost, the calls through +swagger-ui will be directed to that host and not localhost! diff --git a/samples/server/petstore/jaxrs/jersey1-useTags/README.md b/samples/server/petstore/jaxrs/jersey1-useTags/README.md index 87263cc0503..28668de74f6 100644 --- a/samples/server/petstore/jaxrs/jersey1-useTags/README.md +++ b/samples/server/petstore/jaxrs/jersey1-useTags/README.md @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8082/v2/openapi.json +http://localhost:8082/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs/jersey1/README.md b/samples/server/petstore/jaxrs/jersey1/README.md index 87263cc0503..28668de74f6 100644 --- a/samples/server/petstore/jaxrs/jersey1/README.md +++ b/samples/server/petstore/jaxrs/jersey1/README.md @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8082/v2/openapi.json +http://localhost:8082/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs/jersey2-useTags/README.md b/samples/server/petstore/jaxrs/jersey2-useTags/README.md index 87263cc0503..28668de74f6 100644 --- a/samples/server/petstore/jaxrs/jersey2-useTags/README.md +++ b/samples/server/petstore/jaxrs/jersey2-useTags/README.md @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8082/v2/openapi.json +http://localhost:8082/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/samples/server/petstore/jaxrs/jersey2/README.md b/samples/server/petstore/jaxrs/jersey2/README.md index 87263cc0503..28668de74f6 100644 --- a/samples/server/petstore/jaxrs/jersey2/README.md +++ b/samples/server/petstore/jaxrs/jersey2/README.md @@ -1,11 +1,12 @@ -# Swagger Jersey generated server +# JAX-RS/Jersey server with OpenAPI ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using an +[OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. +Jersey is used as JAX-RS implementation, `io.swagger:swagger-jersey2-jaxrs` is used to derive the OpenAPI Specification from the annotated code. To run the server, please execute the following: @@ -13,10 +14,10 @@ To run the server, please execute the following: mvn clean package jetty:run ``` -You can then view the swagger listing here: +You can then view the OpenAPI v2 specification here: ``` -http://localhost:8082/v2/openapi.json +http://localhost:8082/v2/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through From d49fb1c7777a083d71a1ab721133775fd1cb8a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthieu=20Berthom=C3=A9?= Date: Thu, 30 Aug 2018 09:56:04 +0200 Subject: [PATCH 19/74] StringUtils functions (#859) * extract StringUtils * extract escape function * fixup! extract escape function * forbiddenapis fix * fix merge issue * put string utils methods as deprecated, call with FQDN to call the org.openapitools.codegen.utils.StringUtils static methods * javadoc fix --- .../openapitools/codegen/DefaultCodegen.java | 143 ++++----------- .../codegen/languages/AbstractAdaCodegen.java | 3 +- .../languages/AbstractApexCodegen.java | 13 +- .../languages/AbstractCSharpCodegen.java | 25 +-- .../languages/AbstractEiffelCodegen.java | 10 +- .../codegen/languages/AbstractGoCodegen.java | 24 +-- .../languages/AbstractJavaCodegen.java | 23 +-- .../AbstractJavaJAXRSServerCodegen.java | 3 +- .../languages/AbstractKotlinCodegen.java | 9 +- .../codegen/languages/AbstractPhpCodegen.java | 28 +-- .../languages/AbstractRubyCodegen.java | 7 +- .../languages/AbstractScalaCodegen.java | 3 +- .../AbstractTypeScriptClientCodegen.java | 23 +-- .../languages/AndroidClientCodegen.java | 9 +- .../codegen/languages/ApexClientCodegen.java | 3 +- .../languages/CSharpClientCodegen.java | 12 +- .../languages/CSharpNancyFXServerCodegen.java | 5 +- .../languages/ClojureClientCodegen.java | 13 +- .../languages/CppPistacheServerCodegen.java | 5 +- .../languages/CppQt5ClientCodegen.java | 3 +- .../CppQt5QHttpEngineServerCodegen.java | 3 +- .../languages/CppTizenClientCodegen.java | 3 +- .../codegen/languages/DartClientCodegen.java | 19 +- .../languages/ElixirClientCodegen.java | 21 +-- .../codegen/languages/ElmClientCodegen.java | 13 +- .../languages/ErlangClientCodegen.java | 19 +- .../languages/ErlangServerCodegen.java | 11 +- .../codegen/languages/FlashClientCodegen.java | 17 +- .../languages/GroovyClientCodegen.java | 3 +- .../languages/HaskellHttpClientCodegen.java | 13 +- .../languages/HaskellServantCodegen.java | 13 +- .../codegen/languages/JavaClientCodegen.java | 2 +- .../languages/JavaInflectorServerCodegen.java | 3 +- .../languages/JavaJAXRSSpecServerCodegen.java | 3 +- .../languages/JavaPKMSTServerCodegen.java | 5 +- .../languages/JavaPlayFrameworkCodegen.java | 3 +- .../languages/JavaUndertowServerCodegen.java | 3 +- .../languages/JavascriptClientCodegen.java | 21 +-- ...JavascriptClosureAngularClientCodegen.java | 11 +- .../JavascriptFlowtypedClientCodegen.java | 3 +- .../codegen/languages/LuaClientCodegen.java | 19 +- .../codegen/languages/ObjcClientCodegen.java | 23 +-- .../codegen/languages/PerlClientCodegen.java | 25 +-- .../languages/PhpLaravelServerCodegen.java | 5 +- .../languages/PhpSilexServerCodegen.java | 9 +- .../languages/PhpSymfonyServerCodegen.java | 5 +- .../languages/PowerShellClientCodegen.java | 10 +- .../languages/PythonClientCodegen.java | 25 +-- .../PythonFlaskConnexionServerCodegen.java | 20 +-- .../codegen/languages/RClientCodegen.java | 23 +-- .../codegen/languages/RubyClientCodegen.java | 29 +-- .../languages/RubyOnRailsServerCodegen.java | 15 +- .../languages/RubySinatraServerCodegen.java | 13 +- .../codegen/languages/RustClientCodegen.java | 19 +- .../codegen/languages/RustServerCodegen.java | 39 +++-- .../languages/ScalaAkkaClientCodegen.java | 3 +- .../languages/ScalaHttpClientCodegen.java | 11 +- .../languages/ScalaLagomServerCodegen.java | 11 +- .../languages/ScalazClientCodegen.java | 11 +- .../codegen/languages/SpringCodegen.java | 7 +- .../languages/StaticHtml2Generator.java | 5 +- .../codegen/languages/Swift3Codegen.java | 27 +-- .../codegen/languages/Swift4Codegen.java | 27 +-- .../codegen/languages/SwiftClientCodegen.java | 21 +-- .../TypeScriptAngularClientCodegen.java | 7 +- .../TypeScriptInversifyClientCodegen.java | 7 +- .../TypeScriptNodeClientCodegen.java | 7 +- .../codegen/mustache/CamelCaseLambda.java | 9 +- .../codegen/utils/StringUtils.java | 165 ++++++++++++++++++ .../codegen/DefaultCodegenTest.java | 18 +- .../codegen/utils/StringUtilsTest.java | 34 ++++ 71 files changed, 692 insertions(+), 510 deletions(-) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/StringUtils.java create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/StringUtilsTest.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index ee69531208e..c7adcd0b368 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -80,6 +80,10 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.openapitools.codegen.utils.StringUtils.camelize; +import static org.openapitools.codegen.utils.StringUtils.underscore; +import static org.openapitools.codegen.utils.StringUtils.escape; + public class DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); @@ -777,7 +781,7 @@ public class DefaultCodegen implements CodegenConfig { if (reservedWords.contains(name)) { return escapeReservedWord(name); } else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character)))) { - return escapeSpecialCharacters(name, null, null); + return escape(name, specialCharReplacements, null, null); } else { return name; } @@ -795,7 +799,7 @@ public class DefaultCodegen implements CodegenConfig { if (reservedWords.contains(name)) { return escapeReservedWord(name); } else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character)))) { - return escapeSpecialCharacters(name, null, null); + return escape(name, specialCharReplacements, null, null); } return name; } @@ -837,27 +841,19 @@ public class DefaultCodegen implements CodegenConfig { /** * Return the name with escaped characters. * - * @param name the name to be escaped - * @param charactersToAllow characters that are not escaped + * @param name the name to be escaped + * @param charactersToAllow characters that are not escaped * @param appdendixToReplacement String to append to replaced characters. * @return the escaped word *

* throws Runtime exception as word is not escaped properly. + * @deprecated since version 3.2.3, may be removed with the next major release (4.0) + * @see org.openapitools.codegen.utils.StringUtils#escape directly instead + * */ + @Deprecated public String escapeSpecialCharacters(String name, List charactersToAllow, String appdendixToReplacement) { - String result = (String) ((CharSequence) name).chars().mapToObj(c -> { - String character = "" + (char) c; - if (charactersToAllow != null && charactersToAllow.contains(character)) { - return character; - } else if (specialCharReplacements.containsKey(character)) { - return specialCharReplacements.get(character) + (appdendixToReplacement != null ? appdendixToReplacement : ""); - } else { - return character; - } - }).reduce((c1, c2) -> "" + c1 + c2).orElse(null); - - if (result != null) return result; - throw new RuntimeException("Word '" + name + "' could not be escaped."); + return escape(name, specialCharReplacements, charactersToAllow, appdendixToReplacement); } /** @@ -1755,7 +1751,7 @@ public class DefaultCodegen implements CodegenConfig { if (name == null || name.length() == 0) { return name; } - return camelize(toVarName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toVarName(name)); } /** @@ -1774,7 +1770,7 @@ public class DefaultCodegen implements CodegenConfig { CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); property.name = toVarName(name); property.baseName = name; - property.nameInCamelCase = camelize(property.name, false); + property.nameInCamelCase = org.openapitools.codegen.utils.StringUtils.camelize(property.name, false); property.nameInSnakeCase = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, property.nameInCamelCase); property.description = escapeText(p.getDescription()); property.unescapedDescription = p.getDescription(); @@ -3235,8 +3231,8 @@ public class DefaultCodegen implements CodegenConfig { } co.operationId = uniqueName; co.operationIdLowerCase = uniqueName.toLowerCase(Locale.ROOT); - co.operationIdCamelCase = DefaultCodegen.camelize(uniqueName); - co.operationIdSnakeCase = DefaultCodegen.underscore(uniqueName); + co.operationIdCamelCase = org.openapitools.codegen.utils.StringUtils.camelize(uniqueName); + co.operationIdSnakeCase = org.openapitools.codegen.utils.StringUtils.underscore(uniqueName); opList.add(co); co.baseName = tag; } @@ -3265,23 +3261,12 @@ public class DefaultCodegen implements CodegenConfig { * * @param word The word * @return The underscored version of the word + * @deprecated since version 3.2.3, may be removed with the next major release (4.0) + * @see org.openapitools.codegen.utils.StringUtils#underscore */ + @Deprecated public static String underscore(String word) { - String firstPattern = "([A-Z]+)([A-Z][a-z])"; - String secondPattern = "([a-z\\d])([A-Z])"; - String replacementPattern = "$1_$2"; - // Replace package separator with slash. - word = word.replaceAll("\\.", "/"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. - // Replace $ with two underscores for inner classes. - word = word.replaceAll("\\$", "__"); - // Replace capital letter with _ plus lowercase letter. - word = word.replaceAll(firstPattern, replacementPattern); - word = word.replaceAll(secondPattern, replacementPattern); - word = word.replace('-', '_'); - // replace space with underscore - word = word.replace(' ', '_'); - word = word.toLowerCase(Locale.ROOT); - return word; + return org.openapitools.codegen.utils.StringUtils.underscore(word); } /** @@ -3289,10 +3274,13 @@ public class DefaultCodegen implements CodegenConfig { * * @param word The word * @return The dashized version of the word, e.g. "my-name" + * @deprecated since version 3.2.3, may be removed with the next major release (4.0) + * @see org.openapitools.codegen.utils.StringUtils#dashize */ @SuppressWarnings("static-method") + @Deprecated protected String dashize(String word) { - return underscore(word).replaceAll("[_ ]", "-"); + return org.openapitools.codegen.utils.StringUtils.dashize(word); } /** @@ -3492,6 +3480,7 @@ public class DefaultCodegen implements CodegenConfig { return result; } + /** * Camelize name (parameter, property, method, etc) with upper case for first letter * copied from Twitter elephant bird @@ -3499,9 +3488,12 @@ public class DefaultCodegen implements CodegenConfig { * * @param word string to be camelize * @return camelized string + * @deprecated since version 3.2.3, may be removed with the next major release (4.0) + * @see org.openapitools.codegen.utils.StringUtils#camelize(String) */ + @Deprecated public static String camelize(String word) { - return camelize(word, false); + return org.openapitools.codegen.utils.StringUtils.camelize(word); } /** @@ -3510,80 +3502,15 @@ public class DefaultCodegen implements CodegenConfig { * @param word string to be camelize * @param lowercaseFirstLetter lower case for first letter if set to true * @return camelized string + * @deprecated since version 3.2.3, may be removed with the next major release (4.0) + * @see org.openapitools.codegen.utils.StringUtils#camelize(String, boolean) */ + @Deprecated public static String camelize(String word, boolean lowercaseFirstLetter) { - // Replace all slashes with dots (package separator) - Pattern p = Pattern.compile("\\/(.?)"); - Matcher m = p.matcher(word); - while (m.find()) { - word = m.replaceFirst("." + m.group(1)/*.toUpperCase(Locale.ROOT)*/); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. - m = p.matcher(word); - } - - // case out dots - String[] parts = word.split("\\."); - StringBuilder f = new StringBuilder(); - for (String z : parts) { - if (z.length() > 0) { - f.append(Character.toUpperCase(z.charAt(0))).append(z.substring(1)); - } - } - word = f.toString(); - - m = p.matcher(word); - while (m.find()) { - word = m.replaceFirst("" + Character.toUpperCase(m.group(1).charAt(0)) + m.group(1).substring(1)/*.toUpperCase(Locale.ROOT)*/); - m = p.matcher(word); - } - - // Uppercase the class name. - p = Pattern.compile("(\\.?)(\\w)([^\\.]*)$"); - m = p.matcher(word); - if (m.find()) { - String rep = m.group(1) + m.group(2).toUpperCase(Locale.ROOT) + m.group(3); - rep = rep.replaceAll("\\$", "\\\\\\$"); - word = m.replaceAll(rep); - } - - // Remove all underscores (underscore_case to camelCase) - p = Pattern.compile("(_)(.)"); - m = p.matcher(word); - while (m.find()) { - String original = m.group(2); - String upperCase = original.toUpperCase(Locale.ROOT); - if (original.equals(upperCase)) { - word = word.replaceFirst("_", ""); - } else { - word = m.replaceFirst(upperCase); - } - m = p.matcher(word); - } - - // Remove all hyphens (hyphen-case to camelCase) - p = Pattern.compile("(-)(.)"); - m = p.matcher(word); - while (m.find()) { - word = m.replaceFirst(m.group(2).toUpperCase(Locale.ROOT)); - m = p.matcher(word); - } - - if (lowercaseFirstLetter && word.length() > 0) { - int i = 0; - char charAt = word.charAt(i); - while (i + 1 < word.length() && !((charAt >= 'a' && charAt <= 'z') || (charAt >= 'A' && charAt <= 'Z'))) { - i = i + 1; - charAt = word.charAt(i); - } - i = i + 1; - word = word.substring(0, i).toLowerCase(Locale.ROOT) + word.substring(i); - } - - // remove all underscore - word = word.replaceAll("_", ""); - - return word; + return org.openapitools.codegen.utils.StringUtils.camelize(word, lowercaseFirstLetter); } + public String apiFilename(String templateName, String tag) { String suffix = apiTemplateFiles().get(templateName); return apiFileFolder() + File.separator + toApiFilename(tag) + suffix; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java index d15b57315da..b395b739ada 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java @@ -44,6 +44,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + abstract public class AbstractAdaCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAdaCodegen.class); @@ -619,7 +620,7 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg } } } - authMethod.name = camelize(sanitizeName(authMethod.name), true); + authMethod.name = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(authMethod.name), true); } } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java index 3968eaaca51..54abf6168e4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java @@ -36,6 +36,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public abstract class AbstractApexCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractApexCodegen.class); @@ -112,7 +113,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code // camelize (lower first character) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -159,7 +160,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code // camelize the model name // phone_number => PhoneNumber - final String camelizedName = camelize(nameWithPrefixSuffix); + final String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(nameWithPrefixSuffix); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { @@ -422,11 +423,11 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } @@ -515,7 +516,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code @Override public String toEnumName(CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } @Override @@ -669,7 +670,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code @Override public String sanitizeTag(String tag) { - return camelize(sanitizeName(tag)); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(tag)); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index 92c9f536068..2e99417e93a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -39,6 +39,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public abstract class AbstractCSharpCodegen extends DefaultCodegen implements CodegenConfig { protected boolean optionalAssemblyInfoFlag = true; @@ -600,17 +601,17 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return camelize(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId)); } @Override @@ -625,7 +626,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // camelize the variable name // pet_id => PetId - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -648,9 +649,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co return name; } - // camelize(lower) the variable name + // org.openapitools.codegen.utils.StringUtils.camelize(lower) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -836,19 +837,19 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -936,7 +937,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // for symbol, e.g. $, # if (getSymbolName(name) != null) { - return camelize(getSymbolName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(getSymbolName(name)); } String enumName = sanitizeName(name); @@ -944,7 +945,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); - enumName = camelize(enumName) + "Enum"; + enumName = org.openapitools.codegen.utils.StringUtils.camelize(enumName) + "Enum"; if (enumName.matches("\\d.*")) { // starts with number return "_" + enumName; @@ -955,7 +956,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co @Override public String toEnumName(CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } public String testPackageName() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java index 116a27d1cac..a9ad50d4b67 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java @@ -17,6 +17,8 @@ package org.openapitools.codegen.languages; +import static com.google.common.base.Strings.isNullOrEmpty; + import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import io.swagger.v3.core.util.Json; @@ -204,7 +206,7 @@ public abstract class AbstractEiffelCodegen extends DefaultCodegen implements Co // (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -215,7 +217,7 @@ public abstract class AbstractEiffelCodegen extends DefaultCodegen implements Co // methods parameters as 'final'. // e.g. PetApi.go => pet_api.go - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -333,7 +335,7 @@ public abstract class AbstractEiffelCodegen extends DefaultCodegen implements Co // method name cannot use reserved keyword, e.g. return if (isReservedWord(sanitizedOperationId)) { LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " - + camelize("call_" + operationId)); + + org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } // method name from updateSomething to update_Something. @@ -351,7 +353,7 @@ public abstract class AbstractEiffelCodegen extends DefaultCodegen implements Co for (CodegenOperation operation : operations) { // http method verb conversion (e.g. PUT => Put) - operation.httpMethod = camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); + operation.httpMethod = org.openapitools.codegen.utils.StringUtils.camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); } // remove model imports to avoid error diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java index e6d60a99df2..3a274341d55 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java @@ -134,7 +134,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } - return camelize(name) + '_'; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + '_'; } @Override @@ -149,7 +149,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege // camelize (lower first character) the variable name // pet_id => PetId - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // for reserved word append _ if (isReservedWord(name)) { @@ -174,7 +174,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege // params should be lowerCamelCase. E.g. "person Person", instead of // "Person Person". // - name = camelize(toVarName(name), true); + name = org.openapitools.codegen.utils.StringUtils.camelize(toVarName(name), true); // REVISIT: Actually, for idiomatic go, the param name should // really should just be a letter, e.g. "p Person"), but we'll get @@ -191,7 +191,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege public String toModelName(String name) { // camelize the model name // phone_number => PhoneNumber - return camelize(toModel(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toModel(name)); } @Override @@ -228,7 +228,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -237,7 +237,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PetApi.go => pet_api.go - name = "api_" + underscore(name); + name = "api_" + org.openapitools.codegen.utils.StringUtils.underscore(name); if (name.endsWith("_test")) { LOGGER.warn(name + ".go with `_test.go` suffix (reserved word) cannot be used as filename. Renamed to " + name + "_.go"); name += "_"; @@ -308,17 +308,17 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege // method name cannot use reserved keyword, e.g. return if (isReservedWord(sanitizedOperationId)) { LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " - + camelize("call_" + sanitizedOperationId)); + + org.openapitools.codegen.utils.StringUtils.camelize("call_" + sanitizedOperationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } // operationId starts with a number if (sanitizedOperationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize("call_" + sanitizedOperationId)); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("call_" + sanitizedOperationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } - return camelize(sanitizedOperationId); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizedOperationId); } @Override @@ -329,7 +329,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege List operations = (List) objectMap.get("operation"); for (CodegenOperation operation : operations) { // http method verb conversion (e.g. PUT => Put) - operation.httpMethod = camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); + operation.httpMethod = org.openapitools.codegen.utils.StringUtils.camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); } // remove model imports to avoid error @@ -560,7 +560,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -575,7 +575,7 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); // remove [] for array or map of enum enumName = enumName.replace("[]", ""); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index eb0d56a9470..ed83be48a39 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -53,6 +53,9 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; +import static org.openapitools.codegen.utils.StringUtils.escape; + + public abstract class AbstractJavaCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractJavaCodegen.class); @@ -552,7 +555,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code if (name.length() == 0) { return "DefaultApi"; } - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -587,12 +590,12 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code List allowedCharacters = new ArrayList<>(); allowedCharacters.add("_"); allowedCharacters.add("$"); - name = escapeSpecialCharacters(name, allowedCharacters, "_"); + name = escape(name, specialCharReplacements, allowedCharacters, "_"); } // camelize (lower first character) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -644,7 +647,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code // camelize the model name // phone_number => PhoneNumber - final String camelizedName = camelize(nameWithPrefixSuffix); + final String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(nameWithPrefixSuffix); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { @@ -876,19 +879,19 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method sname. Renamed to " + camelize("call_" + operationId), true); - operationId = camelize("call_" + operationId, true); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method sname. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); } return operationId; @@ -1039,7 +1042,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public String toEnumName(CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } @Override @@ -1335,7 +1338,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public String sanitizeTag(String tag) { - tag = camelize(underscore(sanitizeName(tag))); + tag = org.openapitools.codegen.utils.StringUtils.camelize(org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(tag))); // tag starts with numbers if (tag.matches("^\\d.*")) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaJAXRSServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaJAXRSServerCodegen.java index e24b1e7bd76..b57ca9e244e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaJAXRSServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaJAXRSServerCodegen.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + public abstract class AbstractJavaJAXRSServerCodegen extends AbstractJavaCodegen implements BeanValidationFeatures { public static final String SERVER_PORT = "serverPort"; /** @@ -250,7 +251,7 @@ public abstract class AbstractJavaJAXRSServerCodegen extends AbstractJavaCodegen return "DefaultApi"; } computed = sanitizeName(computed); - return camelize(computed) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(computed) + "Api"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 7ec6bc1573f..37c5124c9f0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -31,6 +31,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public abstract class AbstractKotlinCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractKotlinCodegen.class); @@ -400,16 +401,16 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co break; case camelCase: // NOTE: Removes hyphens and underscores - modified = camelize(modified, true); + modified = org.openapitools.codegen.utils.StringUtils.camelize(modified, true); break; case PascalCase: // NOTE: Removes hyphens and underscores - String result = camelize(modified); + String result = org.openapitools.codegen.utils.StringUtils.camelize(modified); modified = titleCase(result); break; case snake_case: // NOTE: Removes hyphens - modified = underscore(modified); + modified = org.openapitools.codegen.utils.StringUtils.underscore(modified); break; case UPPERCASE: modified = modified.toUpperCase(Locale.ROOT); @@ -471,7 +472,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co modifiedName = sanitizeKotlinSpecificNames(modifiedName); // Camelize name of nested properties - modifiedName = camelize(modifiedName); + modifiedName = org.openapitools.codegen.utils.StringUtils.camelize(modifiedName); // model name cannot use reserved keyword, e.g. return if (isReservedWord(modifiedName)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java index 98161179c1c..2b27fdbae19 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java @@ -40,6 +40,12 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; +import org.apache.commons.lang3.StringUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + public abstract class AbstractPhpCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractPhpCodegen.class); @@ -408,11 +414,11 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg if ("camelCase".equals(variableNamingConvention)) { // return the name in camelCase style // phone_number => phoneNumber - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); } else { // default to snake case // return the name in underscore style // PhoneNumber => phone_number - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); } // parameter name starting with number won't compile @@ -443,13 +449,13 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg // model name cannot use reserved keyword if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } @@ -466,7 +472,7 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -490,17 +496,17 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); operationId = "call_" + operationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); operationId = "call_" + operationId; } - return camelize(sanitizeName(operationId), true); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); } /** @@ -638,7 +644,7 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -651,7 +657,7 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); // remove [] for array or map of enum enumName = enumName.replace("[]", ""); @@ -676,7 +682,7 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg for (CodegenOperation op : operationList) { // for API test method name // e.g. public function test{{vendorExtensions.x-testOperationId}}() - op.vendorExtensions.put("x-testOperationId", camelize(op.operationId)); + op.vendorExtensions.put("x-testOperationId", org.openapitools.codegen.utils.StringUtils.camelize(op.operationId)); } return objs; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java index b26a99dd43b..c977c7cb899 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Locale; + abstract class AbstractRubyCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractRubyCodegen.class); @@ -123,7 +124,7 @@ abstract class AbstractRubyCodegen extends DefaultCodegen implements CodegenConf // camelize (lower first character) the variable name // petId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -143,12 +144,12 @@ abstract class AbstractRubyCodegen extends DefaultCodegen implements CodegenConf public String toOperationId(String operationId) { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = underscore("call_" + operationId); + String newOperationId = org.openapitools.codegen.utils.StringUtils.underscore("call_" + operationId); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } - return underscore(operationId); + return org.openapitools.codegen.utils.StringUtils.underscore(operationId); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index 05b9f4dea4e..80528f08ff3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -35,6 +35,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; + public abstract class AbstractScalaCodegen extends DefaultCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractScalaCodegen.class); @@ -273,7 +274,7 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { } protected String formatIdentifier(String name, boolean capitalized) { - String identifier = camelize(sanitizeName(name), true); + String identifier = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(name), true); if (capitalized) { identifier = StringUtils.capitalize(identifier); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 491fdf0b03e..313588199fb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTypeScriptClientCodegen.class); @@ -191,27 +192,27 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - String modelName = camelize("model_" + name); + String modelName = org.openapitools.codegen.utils.StringUtils.camelize("model_" + name); LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + modelName); return modelName; } // model name starts with number if (name.matches("^\\d.*")) { - String modelName = camelize("model_" + name); // e.g. 200Response => Model200Response (after camelize) + String modelName = org.openapitools.codegen.utils.StringUtils.camelize("model_" + name); // e.g. 200Response => Model200Response (after camelize) LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + modelName); return modelName; } if (languageSpecificPrimitives.contains(name)) { - String modelName = camelize("model_" + name); + String modelName = org.openapitools.codegen.utils.StringUtils.camelize("model_" + name); LOGGER.warn(name + " (model name matches existing language type) cannot be used as a model name. Renamed to " + modelName); return modelName; } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -375,10 +376,10 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp // method name cannot use reserved keyword, e.g. return // append _ at the beginning, e.g. _return if (isReservedWord(operationId)) { - return escapeReservedWord(camelize(sanitizeName(operationId), true)); + return escapeReservedWord(org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true)); } - return camelize(sanitizeName(operationId), true); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); } public void setModelPropertyNaming(String naming) { @@ -401,11 +402,11 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp case original: return name; case camelCase: - return camelize(name, true); + return org.openapitools.codegen.utils.StringUtils.camelize(name, true); case PascalCase: - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); case snake_case: - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + @@ -436,7 +437,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp // for symbol, e.g. $, # if (getSymbolName(name) != null) { - return camelize(getSymbolName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(getSymbolName(name)); } // number @@ -456,7 +457,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp // camelize the enum variable name // ref: https://basarat.gitbooks.io/typescript/content/docs/enums.html - enumName = camelize(enumName); + enumName = org.openapitools.codegen.utils.StringUtils.camelize(enumName); if (enumName.matches("\\d.*")) { // starts with number return "_" + enumName; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java index ea267ac8cb8..6c2a10ce57c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java @@ -36,6 +36,7 @@ import java.io.File; import java.util.Arrays; import java.util.HashSet; + public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(AndroidClientCodegen.class); public static final String USE_ANDROID_MAVEN_GRADLE_PLUGIN = "useAndroidMavenGradlePlugin"; @@ -228,7 +229,7 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi // camelize (lower first character) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -257,7 +258,7 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi // camelize the model name // phone_number => PhoneNumber - name = camelize(sanitizeName(name)); + name = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(name)); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { @@ -354,11 +355,11 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi throw new RuntimeException("Empty method name (operationId) not allowed"); } - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java index 66dcb89a522..65e0299062c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public class ApexClientCodegen extends AbstractApexCodegen { private static final String CLASS_PREFIX = "classPrefix"; @@ -191,7 +192,7 @@ public class ApexClientCodegen extends AbstractApexCodegen { @Override public String toApiName(String name) { - return camelize(classPrefix + super.toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(classPrefix + super.toApiName(name)); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index 470641d928a..f17c354de74 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -17,6 +17,8 @@ package org.openapitools.codegen.languages; +import static org.apache.commons.lang3.StringUtils.isEmpty; + import com.google.common.collect.ImmutableMap; import com.samskivert.mustache.Mustache; import io.swagger.v3.oas.models.media.Schema; @@ -702,7 +704,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { // for symbol, e.g. $, # if (getSymbolName(value) != null) { - return camelize(getSymbolName(value)); + return org.openapitools.codegen.utils.StringUtils.camelize(getSymbolName(value)); } // number @@ -718,7 +720,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { // string String var = value.replaceAll("_", " "); //var = WordUtils.capitalizeFully(var); - var = camelize(var); + var = org.openapitools.codegen.utils.StringUtils.camelize(var); var = var.replaceAll("\\W+", ""); if (var.matches("\\d.*")) { @@ -753,11 +755,11 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { case original: return name; case camelCase: - return camelize(name, true); + return org.openapitools.codegen.utils.StringUtils.camelize(name, true); case PascalCase: - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); case snake_case: - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNancyFXServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNancyFXServerCodegen.java index be5147d3dac..25106c48eee 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNancyFXServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpNancyFXServerCodegen.java @@ -36,6 +36,7 @@ import org.openapitools.codegen.utils.URLPathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.io.File; import java.net.URL; import java.util.ArrayList; @@ -332,7 +333,7 @@ public class CSharpNancyFXServerCodegen extends AbstractCSharpCodegen { return "Empty"; } - final String enumName = camelize( + final String enumName = org.openapitools.codegen.utils.StringUtils.camelize( sanitizeName(name) .replaceFirst("^_", "") .replaceFirst("_$", "") @@ -399,7 +400,7 @@ public class CSharpNancyFXServerCodegen extends AbstractCSharpCodegen { @Override public String toEnumName(final CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java index 89309b512d9..9bf751e2ac1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfig { private static final String PROJECT_NAME = "projectName"; private static final String PROJECT_DESCRIPTION = "projectDescription"; @@ -109,7 +110,7 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi Info info = openAPI.getInfo(); if (projectName == null && info.getTitle() != null) { // when projectName is not specified, generate it from info.title - projectName = dashize(info.getTitle()); + projectName = org.openapitools.codegen.utils.StringUtils.dashize(info.getTitle()); } if (projectVersion == null) { // when projectVersion is not specified, use info.version @@ -148,7 +149,7 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi projectDescription = "Client library of " + projectName; } if (baseNamespace == null) { - baseNamespace = dashize(projectName); + baseNamespace = org.openapitools.codegen.utils.StringUtils.dashize(projectName); } apiPackage = baseNamespace + ".api"; @@ -182,17 +183,17 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - return dashize(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.dashize(sanitizeName(operationId)); } @Override public String toApiFilename(String name) { - return underscore(toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(toApiName(name)); } @Override public String toApiName(String name) { - return dashize(name); + return org.openapitools.codegen.utils.StringUtils.dashize(name); } @Override @@ -203,7 +204,7 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi @Override public String toVarName(String name) { name = name.replaceAll("[^a-zA-Z0-9_-]+", ""); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. - name = dashize(name); + name = org.openapitools.codegen.utils.StringUtils.dashize(name); return name; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java index 01de20d8c83..7f7a4e33b8b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java @@ -41,6 +41,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; + public class CppPistacheServerCodegen extends AbstractCppCodegen { protected String implFolder = "impl"; protected boolean isAddExternalLibs = true; @@ -198,8 +199,8 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { public Map postProcessOperationsWithModels(Map objs, List allModels) { Map operations = (Map) objs.get("operations"); String classname = (String) operations.get("classname"); - operations.put("classnameSnakeUpperCase", DefaultCodegen.underscore(classname).toUpperCase(Locale.ROOT)); - operations.put("classnameSnakeLowerCase", DefaultCodegen.underscore(classname).toLowerCase(Locale.ROOT)); + operations.put("classnameSnakeUpperCase", org.openapitools.codegen.utils.StringUtils.underscore(classname).toUpperCase(Locale.ROOT)); + operations.put("classnameSnakeLowerCase", org.openapitools.codegen.utils.StringUtils.underscore(classname).toLowerCase(Locale.ROOT)); List operationList = (List) operations.get("operation"); for (CodegenOperation op : operationList) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5ClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5ClientCodegen.java index 0d3d963f0f4..e033b7c44b8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5ClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5ClientCodegen.java @@ -37,6 +37,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; + public class CppQt5ClientCodegen extends AbstractCppCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(CppQt5ClientCodegen.class); @@ -380,7 +381,7 @@ public class CppQt5ClientCodegen extends AbstractCppCodegen implements CodegenCo // camelize (lower first character) the variable name // petId => pet_id - varName = underscore(varName); + varName = org.openapitools.codegen.utils.StringUtils.underscore(varName); // for reserved word or word starting with number, append _ if (isReservedWord(varName) || varName.matches("^\\d.*")) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java index 7b16b3db886..776602bce72 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java @@ -40,6 +40,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; + public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implements CodegenConfig { @SuppressWarnings("unused") private static final Logger LOGGER = LoggerFactory.getLogger(CppQt5QHttpEngineServerCodegen.class); @@ -429,7 +430,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement // camelize (lower first character) the variable name // petId => pet_id - varName = underscore(varName); + varName = org.openapitools.codegen.utils.StringUtils.underscore(varName); // for reserved word or word starting with number, append _ if (isReservedWord(varName) || varName.matches("^\\d.*")) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppTizenClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppTizenClientCodegen.java index 049a906182f..7033661bdd4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppTizenClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppTizenClientCodegen.java @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; + public class CppTizenClientCodegen extends AbstractCppCodegen implements CodegenConfig { protected static String PREFIX = "ArtikCloud"; protected String sourceFolder = "src"; @@ -283,7 +284,7 @@ public class CppTizenClientCodegen extends AbstractCppCodegen implements Codegen } // add_pet_by_id => addPetById - return camelize(operationId, true); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId, true); } /** * Output the Getter name for boolean property, e.g. getActive diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java index d2d83170d94..a041bda543a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java @@ -39,6 +39,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; + public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DartClientCodegen.class); @@ -243,7 +244,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { // camelize (lower first character) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); if (name.matches("^\\d.*")) { name = "n" + name; @@ -266,23 +267,23 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { public String toModelName(String name) { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override public String toModelFilename(String name) { - return underscore(toModelName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(toModelName(name)); } @Override public String toApiFilename(String name) { - return underscore(toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(toApiName(name)); } @Override @@ -401,7 +402,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { new ArrayList>(); for (Map value : values) { Map enumVar = new HashMap(); - String name = camelize((String) value.get("identifier"), true); + String name = org.openapitools.codegen.utils.StringUtils.camelize((String) value.get("identifier"), true); if (isReservedWord(name)) { name = escapeReservedWord(name); } @@ -427,7 +428,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { "int".equalsIgnoreCase(datatype)) { var = "Number" + var; } - return escapeReservedWord(camelize(var, true)); + return escapeReservedWord(org.openapitools.codegen.utils.StringUtils.camelize(var, true)); } @Override @@ -444,12 +445,12 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { public String toOperationId(String operationId) { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } - return camelize(operationId, true); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId, true); } public void setBrowserClient(boolean browserClient) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java index 48da0380353..94cd4bb5c19 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java @@ -38,6 +38,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ElixirClientCodegen.class); @@ -276,7 +277,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig StringBuffer buffer = new StringBuffer(); while (matcher.find()) { String pathTemplateName = matcher.group(1); - matcher.appendReplacement(buffer, "#{" + underscore(pathTemplateName) + "}" + "$2"); + matcher.appendReplacement(buffer, "#{" + org.openapitools.codegen.utils.StringUtils.underscore(pathTemplateName) + "}" + "$2"); pathTemplateNames.add(pathTemplateName); } ExtendedCodegenOperation eco = new ExtendedCodegenOperation(o); @@ -324,7 +325,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig String underscored(String words) { ArrayList underscoredWords = new ArrayList(); for (String word : words.split(" ")) { - underscoredWords.add(underscore(word)); + underscoredWords.add(org.openapitools.codegen.utils.StringUtils.underscore(word)); } return join("_", underscoredWords); } @@ -332,7 +333,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig String modulized(String words) { ArrayList modulizedWords = new ArrayList(); for (String word : words.split(" ")) { - modulizedWords.add(camelize(word)); + modulizedWords.add(org.openapitools.codegen.utils.StringUtils.camelize(word)); } return join("", modulizedWords); } @@ -351,7 +352,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig private String sourceFolder() { ArrayList underscoredWords = new ArrayList(); for (String word : moduleName.split("\\.")) { - underscoredWords.add(underscore(word)); + underscoredWords.add(org.openapitools.codegen.utils.StringUtils.underscore(word)); } return ("lib/" + join("/", underscoredWords)).replace('/', File.separatorChar); } @@ -378,7 +379,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig if (name.length() == 0) { return "Default"; } - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -387,14 +388,14 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig name = name.replaceAll("-", "_"); // e.g. PetApi.go => pet_api.go - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override public String toModelName(String name) { // camelize the model name // phone_number => PhoneNumber - return camelize(toModelFilename(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toModelFilename(name)); } @Override @@ -421,7 +422,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -431,7 +432,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig throw new RuntimeException("Empty method name (operationId) not allowed"); } - return camelize(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId)); } /** @@ -584,7 +585,7 @@ public class ElixirClientCodegen extends DefaultCodegen implements CodegenConfig public String typespec() { StringBuilder sb = new StringBuilder("@spec "); - sb.append(underscore(operationId)); + sb.append(org.openapitools.codegen.utils.StringUtils.underscore(operationId)); sb.append("(Tesla.Env.client, "); for (CodegenParameter param : allParams) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 4f041c6843e..3867be62e46 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -47,6 +47,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; + public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { private static final String X_ENCODER = "x-encoder"; private static final String X_DECODER = "x-decoder"; @@ -172,7 +173,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toModelName(String name) { - final String modelName = camelize(name); + final String modelName = org.openapitools.codegen.utils.StringUtils.camelize(name); return defaultIncludes.contains(modelName) ? modelName + "_" : modelName; } @@ -188,13 +189,13 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toVarName(String name) { - final String varName = camelize(name, true); + final String varName = org.openapitools.codegen.utils.StringUtils.camelize(name, true); return isReservedWord(varName) ? escapeReservedWord(name) : varName; } @Override public String toEnumVarName(String value, String datatype) { - final String camelized = camelize(value.replace(" ", "_").replace("(", "_").replace(")", "")); // TODO FIXME escape properly + final String camelized = org.openapitools.codegen.utils.StringUtils.camelize(value.replace(" ", "_").replace("(", "_").replace(")", "")); // TODO FIXME escape properly if (!Character.isUpperCase(camelized.charAt(0))) { return "N" + camelized; } @@ -297,8 +298,8 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { elmImport.moduleName = modulePrefix + cm.arrayModelType; elmImport.exposures = new TreeSet<>(); elmImport.exposures.add(cm.arrayModelType); - elmImport.exposures.add(camelize(cm.arrayModelType, true) + "Decoder"); - elmImport.exposures.add(camelize(cm.arrayModelType, true) + "Encoder"); + elmImport.exposures.add(org.openapitools.codegen.utils.StringUtils.camelize(cm.arrayModelType, true) + "Decoder"); + elmImport.exposures.add(org.openapitools.codegen.utils.StringUtils.camelize(cm.arrayModelType, true) + "Encoder"); elmImport.hasExposures = true; elmImports.add(elmImport); } @@ -534,7 +535,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { if (isMapContainer) { isPrimitiveType = isPrimitiveDataType(dataType); } - final String baseName = camelize(dataType, true); + final String baseName = org.openapitools.codegen.utils.StringUtils.camelize(dataType, true); String encoderName; String decoderName; if (isPrimitiveType) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java index ed5889a92fd..d202e755268 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java @@ -34,6 +34,7 @@ import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ErlangClientCodegen.class); @@ -203,7 +204,7 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } - return camelize(name) + '_'; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + '_'; } @Override @@ -229,7 +230,7 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String toParamName(String name) { - return camelize(toVarName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toVarName(name)); } @Override @@ -248,17 +249,17 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String toModelName(String name) { - return this.packageName + "_" + underscore(name.replaceAll("-", "_").replaceAll("\\.", "_")); + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name.replaceAll("-", "_").replaceAll("\\.", "_")); } @Override public String toApiName(String name) { - return this.packageName + "_" + underscore(name.replaceAll("-", "_").replaceAll("\\.", "_")); + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name.replaceAll("-", "_").replaceAll("\\.", "_")); } @Override public String toModelFilename(String name) { - return this.packageName + "_" + underscore(name.replaceAll("\\.", "_")); + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name.replaceAll("\\.", "_")); } @Override @@ -268,18 +269,18 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig name = name.replaceAll("-", "_").replaceAll("\\.", "_"); // e.g. PetApi.erl => pet_api.erl - return this.packageName + "_" + underscore(name) + "_api"; + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override public String toOperationId(String operationId) { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId)).replaceAll("\\.", "_")); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId)).replaceAll("\\.", "_")); operationId = "call_" + operationId; } - return underscore(operationId.replaceAll("\\.", "_")); + return org.openapitools.codegen.utils.StringUtils.underscore(operationId.replaceAll("\\.", "_")); } @Override @@ -301,7 +302,7 @@ public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig StringBuffer buffer = new StringBuffer(); while (matcher.find()) { String pathTemplateName = matcher.group(1); - matcher.appendReplacement(buffer, "\", " + camelize(pathTemplateName) + ", \""); + matcher.appendReplacement(buffer, "\", " + org.openapitools.codegen.utils.StringUtils.camelize(pathTemplateName) + ", \""); pathTemplateNames.add(pathTemplateName); } matcher.appendTail(buffer); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangServerCodegen.java index 80349e2d6f8..3abb6e13436 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangServerCodegen.java @@ -32,6 +32,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; + public class ErlangServerCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ErlangServerCodegen.class); @@ -184,7 +185,7 @@ public class ErlangServerCodegen extends DefaultCodegen implements CodegenConfig if (name.length() == 0) { return this.packageName + "_default_handler"; } - return this.packageName + "_" + underscore(name) + "_handler"; + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name) + "_handler"; } /** @@ -212,18 +213,18 @@ public class ErlangServerCodegen extends DefaultCodegen implements CodegenConfig @Override public String toModelName(String name) { - return camelize(toModelFilename(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toModelFilename(name)); } @Override public String toOperationId(String operationId) { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return camelize(operationId); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId); } @Override @@ -258,7 +259,7 @@ public class ErlangServerCodegen extends DefaultCodegen implements CodegenConfig } protected String toModuleName(String name) { - return this.packageName + "_" + underscore(name.replaceAll("-", "_")); + return this.packageName + "_" + org.openapitools.codegen.utils.StringUtils.underscore(name.replaceAll("-", "_")); } protected String toSourceFilePath(String name, String extension) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java index 73ca27fa180..2925a1f893f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/FlashClientCodegen.java @@ -29,6 +29,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Locale; + public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(FlashClientCodegen.class); @@ -264,7 +265,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig // underscore the variable name // petId => pet_id - name = camelize(dropDots(name), true); + name = org.openapitools.codegen.utils.StringUtils.camelize(dropDots(name), true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -294,13 +295,13 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -315,7 +316,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PhoneNumberApi.rb => phone_number_api.rb - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -324,7 +325,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig return "DefaultApi"; } // e.g. phone_number_api => PhoneNumberApi - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -332,7 +333,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig if (name.length() == 0) { return "DefaultApi"; } - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -344,11 +345,11 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return underscore(operationId); + return org.openapitools.codegen.utils.StringUtils.underscore(operationId); } public void setPackageName(String packageName) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java index fdbc171813b..94c89e0843f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GroovyClientCodegen.java @@ -21,6 +21,7 @@ import org.openapitools.codegen.*; import java.io.File; + public class GroovyClientCodegen extends AbstractJavaCodegen { public static final String CONFIG_PACKAGE = "configPackage"; protected String title = "Petstore Server"; @@ -98,7 +99,7 @@ public class GroovyClientCodegen extends AbstractJavaCodegen { return "DefaultApi"; } name = sanitizeName(name); - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } public void setConfigPackage(String configPackage) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java index 418ecd35769..a17db9ebd1e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java @@ -35,6 +35,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(HaskellHttpClientCodegen.class); @@ -616,8 +617,8 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC } op.operationId = uniqueName; op.operationIdLowerCase = uniqueName.toLowerCase(Locale.ROOT); - op.operationIdCamelCase = DefaultCodegen.camelize(uniqueName); - op.operationIdSnakeCase = DefaultCodegen.underscore(uniqueName); + op.operationIdCamelCase = org.openapitools.codegen.utils.StringUtils.camelize(uniqueName); + op.operationIdSnakeCase = org.openapitools.codegen.utils.StringUtils.underscore(uniqueName); opList.add(op); op.baseName = tag; @@ -1077,8 +1078,8 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC public String toVarName(String prefix, String name) { Boolean hasPrefix = !StringUtils.isBlank(prefix); - name = underscore(sanitizeName(name.replaceAll("-", "_"))); - name = camelize(name, !hasPrefix); + name = org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(name.replaceAll("-", "_"))); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, !hasPrefix); if (hasPrefix) { return prefix + name; } else { @@ -1123,7 +1124,7 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC } public String toTypeName(String prefix, String name) { - name = escapeIdentifier(prefix, camelize(sanitizeName(name))); + name = escapeIdentifier(prefix, org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(name))); return name; } @@ -1132,7 +1133,7 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC if (StringUtils.isEmpty(operationId)) { throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - operationId = escapeIdentifier("op", camelize(sanitizeName(operationId), true)); + operationId = escapeIdentifier("op", org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true)); return operationId; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java index 9408d6b8f51..62029b6065a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java @@ -45,6 +45,7 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; + public class HaskellServantCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(HaskellServantCodegen.class); @@ -453,7 +454,7 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf } } else if(op.getHasFormParams()) { // Use the FormX data type, where X is the conglomerate of all things being passed - String formName = "Form" + camelize(op.operationId); + String formName = "Form" + org.openapitools.codegen.utils.StringUtils.camelize(op.operationId); bodyType = formName; path.add("ReqBody '[FormUrlEncoded] " + formName); } @@ -478,7 +479,7 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf // store form parameter name in the vendor extensions for (CodegenParameter param : op.formParams) { - param.vendorExtensions.put("x-formParamName", camelize(param.baseName)); + param.vendorExtensions.put("x-formParamName", org.openapitools.codegen.utils.StringUtils.camelize(param.baseName)); } // Add the HTTP method and return type @@ -494,9 +495,9 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf op.vendorExtensions.put("x-routeType", joinStrings(" :> ", path)); op.vendorExtensions.put("x-clientType", joinStrings(" -> ", type)); - op.vendorExtensions.put("x-formName", "Form" + camelize(op.operationId)); + op.vendorExtensions.put("x-formName", "Form" + org.openapitools.codegen.utils.StringUtils.camelize(op.operationId)); for(CodegenParameter param : op.formParams) { - param.vendorExtensions.put("x-formPrefix", camelize(op.operationId, true)); + param.vendorExtensions.put("x-formPrefix", org.openapitools.codegen.utils.StringUtils.camelize(op.operationId, true)); } return op; } @@ -554,9 +555,9 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf } // From the model name, compute the prefix for the fields. - String prefix = camelize(model.classname, true); + String prefix = org.openapitools.codegen.utils.StringUtils.camelize(model.classname, true); for(CodegenProperty prop : model.vars) { - prop.name = toVarName(prefix + camelize(fixOperatorChars(prop.name))); + prop.name = toVarName(prefix + org.openapitools.codegen.utils.StringUtils.camelize(fixOperatorChars(prop.name))); } // Create newtypes for things with non-object types diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index d5d16a62f8c..fa943553e5f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -438,7 +438,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen for (int i = 0; i < items.length; ++i) { if (items[i].matches("^\\{(.*)\\}$")) { // wrap in {} // camelize path variable - items[i] = "{" + camelize(items[i].substring(1, items[i].length() - 1), true) + "}"; + items[i] = "{" + org.openapitools.codegen.utils.StringUtils.camelize(items[i].substring(1, items[i].length() - 1), true) + "}"; } } op.path = StringUtils.join(items, "/"); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaInflectorServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaInflectorServerCodegen.java index 6cd8ad9815a..30b04743158 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaInflectorServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaInflectorServerCodegen.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + public class JavaInflectorServerCodegen extends AbstractJavaCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(JavaInflectorServerCodegen.class); @@ -226,6 +227,6 @@ public class JavaInflectorServerCodegen extends AbstractJavaCodegen { return "DefaultController"; } name = name.replaceAll("[^a-zA-Z0-9]+", "_"); - return camelize(name) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Controller"; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index e83b438790f..e3459031019 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -33,6 +33,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; + public class JavaJAXRSSpecServerCodegen extends AbstractJavaJAXRSServerCodegen { public static final String INTERFACE_ONLY = "interfaceOnly"; @@ -221,6 +222,6 @@ public class JavaJAXRSSpecServerCodegen extends AbstractJavaJAXRSServerCodegen { return primaryResourceName + "Api"; } computed = sanitizeName(computed); - return camelize(computed) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(computed) + "Api"; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPKMSTServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPKMSTServerCodegen.java index 40932e20231..aa638d5d25e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPKMSTServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPKMSTServerCodegen.java @@ -41,6 +41,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + /** * Created by prokarma on 04/09/17. */ @@ -545,7 +546,7 @@ public class JavaPKMSTServerCodegen extends AbstractJavaCodegen { title = title.substring(0, title.length() - 3); } - this.title = camelize(sanitizeName(title), true); + this.title = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(title), true); } additionalProperties.put(TITLE, this.title); } @@ -594,7 +595,7 @@ public class JavaPKMSTServerCodegen extends AbstractJavaCodegen { return "DefaultApi"; } name = sanitizeName(name); - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPlayFrameworkCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPlayFrameworkCodegen.java index 64b14186654..4fb3905280c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPlayFrameworkCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaPlayFrameworkCodegen.java @@ -35,6 +35,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; + public class JavaPlayFrameworkCodegen extends AbstractJavaCodegen implements BeanValidationFeatures { public static final String TITLE = "title"; @@ -301,7 +302,7 @@ public class JavaPlayFrameworkCodegen extends AbstractJavaCodegen implements Bea Matcher match = pathVariableMatcher.matcher(operation.path); while (match.find()) { String completeMatch = match.group(); - String replacement = ":" + camelize(match.group(1), true); + String replacement = ":" + org.openapitools.codegen.utils.StringUtils.camelize(match.group(1), true); operation.path = operation.path.replace(completeMatch, replacement); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaUndertowServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaUndertowServerCodegen.java index 2be6e497707..5c602bf2ca2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaUndertowServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaUndertowServerCodegen.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + public class JavaUndertowServerCodegen extends AbstractJavaCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(JavaUndertowServerCodegen.class); @@ -201,6 +202,6 @@ public class JavaUndertowServerCodegen extends AbstractJavaCodegen { return "DefaultHandler"; } name = name.replaceAll("[^a-zA-Z0-9]+", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. - return camelize(name) + "Handler"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Handler"; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java index 2991842b88d..e22c37a4504 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java @@ -47,6 +47,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { @SuppressWarnings("hiding") private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); @@ -283,7 +284,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo Info info = openAPI.getInfo(); if (StringUtils.isBlank(projectName) && info.getTitle() != null) { // when projectName is not specified, generate it from info.title - projectName = sanitizeName(dashize(info.getTitle())); + projectName = sanitizeName(org.openapitools.codegen.utils.StringUtils.dashize(info.getTitle())); } if (StringUtils.isBlank(projectVersion)) { // when projectVersion is not specified, use info.version @@ -306,7 +307,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo projectName = "openapi-js-client"; } if (StringUtils.isBlank(moduleName)) { - moduleName = camelize(underscore(projectName)); + moduleName = org.openapitools.codegen.utils.StringUtils.camelize(org.openapitools.codegen.utils.StringUtils.underscore(projectName)); } if (StringUtils.isBlank(projectVersion)) { projectVersion = "1.0.0"; @@ -501,9 +502,9 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo private String getNameUsingModelPropertyNaming(String name) { switch (CodegenConstants.MODEL_PROPERTY_NAMING_TYPE.valueOf(getModelPropertyNaming())) { case original: return name; - case camelCase: return camelize(name, true); - case PascalCase: return camelize(name); - case snake_case: return underscore(name); + case camelCase: return org.openapitools.codegen.utils.StringUtils.camelize(name, true); + case PascalCase: return org.openapitools.codegen.utils.StringUtils.camelize(name); + case snake_case: return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + "'PascalCase' or 'snake_case'"); @@ -556,7 +557,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo // camelize the model name // phone_number => PhoneNumber - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { @@ -825,18 +826,18 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } @@ -1118,7 +1119,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toEnumName(CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java index c756bf8ac9b..6e8182c5077 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java @@ -42,6 +42,7 @@ import java.io.File; import org.apache.commons.lang3.StringUtils; + public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClosureAngularClientCodegen.class); @@ -187,7 +188,7 @@ public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implem // camelize the variable name // pet_id => PetId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) @@ -214,13 +215,13 @@ public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implem // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -304,11 +305,11 @@ public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implem throw new RuntimeException("Empty method/operation name (operationId) not allowed"); } - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize("call_" + operationId, true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize("call_" + operationId, true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptFlowtypedClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptFlowtypedClientCodegen.java index cc0c78c387f..003b2f305ca 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptFlowtypedClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptFlowtypedClientCodegen.java @@ -29,6 +29,7 @@ import org.openapitools.codegen.utils.ModelUtils; import java.text.SimpleDateFormat; import java.util.*; + public class JavascriptFlowtypedClientCodegen extends AbstractTypeScriptClientCodegen { private static final SimpleDateFormat SNAPSHOT_SUFFIX_FORMAT = new SimpleDateFormat("yyyyMMddHHmm", Locale.ROOT); @@ -185,7 +186,7 @@ public class JavascriptFlowtypedClientCodegen extends AbstractTypeScriptClientCo Info info = openAPI.getInfo(); if (StringUtils.isBlank(npmName) && info.getTitle() != null) { // when projectName is not specified, generate it from info.title - npmName = sanitizeName(dashize(info.getTitle())); + npmName = sanitizeName(org.openapitools.codegen.utils.StringUtils.dashize(info.getTitle())); } if (StringUtils.isBlank(npmVersion)) { // when projectVersion is not specified, use info.version diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java index c41deb8be3d..9a345379021 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java @@ -43,6 +43,7 @@ import java.util.ListIterator; import java.util.Locale; import java.util.Map; + public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(LuaClientCodegen.class); @@ -202,7 +203,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } - return camelize(name) + '_'; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + '_'; } @Override @@ -225,7 +226,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { // convert variable name to snake case // PetId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // for reserved word or word starting with number, append _ if (isReservedWord(name)) @@ -272,7 +273,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -281,7 +282,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PetApi.lua => pet_api.lua - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -338,7 +339,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toApiName(String name) { - return underscore(super.toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(super.toApiName(name)); } @Override @@ -390,11 +391,11 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(sanitizedOperationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore("call_" + operationId)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore("call_" + operationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } - return underscore(sanitizedOperationId); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizedOperationId); } @Override @@ -529,7 +530,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -542,7 +543,7 @@ public class LuaClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); // remove [] for array or map of enum enumName = enumName.replace("[]", ""); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java index 6800e3af389..4662fd132cc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java @@ -43,6 +43,9 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + + public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ObjcClientCodegen.class); @@ -429,7 +432,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { // model name starts with number /* no need for the fix below as objc model starts with prefix (e.g. SWG) if (type.matches("^\\d.*")) { - LOGGER.warn(type + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + type)); + LOGGER.warn(type + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + type)); type = "model_" + type; // e.g. 200Response => Model200Response (after camelize) } */ @@ -453,7 +456,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { importMapping.values().contains(type) || defaultIncludes.contains(type) || languageSpecificPrimitives.contains(type)) { - return camelize(type); + return org.openapitools.codegen.utils.StringUtils.camelize(type); } // custom classes else { @@ -465,7 +468,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { type = modelNamePrefix + "_" + type; } - return classPrefix + camelize(type); // add class prefix + return classPrefix + org.openapitools.codegen.utils.StringUtils.camelize(type); // add class prefix } } @@ -526,12 +529,12 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toApiName(String name) { - return classPrefix + camelize(name) + "Api"; + return classPrefix + org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override public String toApiFilename(String name) { - return classPrefix + camelize(name) + "Api"; + return classPrefix + org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -556,7 +559,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { // camelize (lower first character) the variable name // e.g. `pet_id` to `petId` - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, prepend `_` if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -601,11 +604,11 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); operationId = "call_" + operationId; } - return camelize(sanitizeName(operationId), true); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); } public void setClassPrefix(String classPrefix) { @@ -644,7 +647,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { for (CodegenOperation operation : ops) { if (!operation.allParams.isEmpty()) { String firstParamName = operation.allParams.get(0).paramName; - operation.vendorExtensions.put("firstParamAltName", camelize(firstParamName)); + operation.vendorExtensions.put("firstParamAltName", org.openapitools.codegen.utils.StringUtils.camelize(firstParamName)); } } } @@ -654,7 +657,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public void postProcessModelProperty(CodegenModel model, CodegenProperty schema) { super.postProcessModelProperty(model, schema); - schema.vendorExtensions.put("x-uppercaseName", camelize(schema.name)); + schema.vendorExtensions.put("x-uppercaseName", org.openapitools.codegen.utils.StringUtils.camelize(schema.name)); } /** diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java index 21ccb6aad03..1fcf07a9ede 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java @@ -33,6 +33,7 @@ import java.util.regex.Matcher; import org.apache.commons.lang3.StringUtils; + public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(PerlClientCodegen.class); @@ -276,7 +277,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { public String toVarName(String name) { // return the name in underscore style // PhoneNumber => phone_number - name = underscore(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // parameter name starting with number won't compile // need to escape it by appending _ at the beginning @@ -298,13 +299,13 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { // model name cannot use reserved keyword if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } @@ -319,7 +320,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -354,7 +355,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. phone_number_api.rb => PhoneNumberApi.rb - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -363,32 +364,32 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { return "DefaultApi"; } // e.g. phone_number_api => PhoneNumberApi - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override public String toOperationId(String operationId) { //rename to empty_function_name_1 (e.g.) if method name is empty if (StringUtils.isEmpty(operationId)) { - operationId = underscore("empty_function_name_" + emptyFunctionNameCounter++); + operationId = org.openapitools.codegen.utils.StringUtils.underscore("empty_function_name_" + emptyFunctionNameCounter++); LOGGER.warn("Empty method name (operationId) found. Renamed to " + operationId); return operationId; } // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); - return underscore(sanitizeName("call_" + operationId)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId)); } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - //return underscore(operationId).replaceAll("[^A-Za-z0-9_]", ""); - return underscore(sanitizeName(operationId)); + //return org.openapitools.codegen.utils.StringUtils.underscore(operationId).replaceAll("[^A-Za-z0-9_]", ""); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(operationId)); } public void setModuleName(String moduleName) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java index 85bd0497678..5c67685d979 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java @@ -22,6 +22,7 @@ import org.openapitools.codegen.*; import java.io.File; import java.util.*; + public class PhpLaravelServerCodegen extends AbstractPhpCodegen { protected String apiVersion = "1.0.0"; @@ -240,7 +241,7 @@ public class PhpLaravelServerCodegen extends AbstractPhpCodegen { return "DefaultController"; } - return camelize(name, false) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, false) + "Controller"; } protected String controllerFileFolder() { @@ -262,6 +263,6 @@ public class PhpLaravelServerCodegen extends AbstractPhpCodegen { return "DefaultController"; } - return camelize(name, false) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, false) + "Controller"; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java index 84cf10331cc..e8866e05808 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java @@ -36,6 +36,7 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; + public class PhpSilexServerCodegen extends DefaultCodegen implements CodegenConfig { protected String invokerPackage; protected String groupId = "org.openapitools"; @@ -45,7 +46,7 @@ public class PhpSilexServerCodegen extends DefaultCodegen implements CodegenConf public PhpSilexServerCodegen() { super(); - invokerPackage = camelize("OpenAPIServer"); + invokerPackage = org.openapitools.codegen.utils.StringUtils.camelize("OpenAPIServer"); String packageName = "OpenAPIServer"; modelPackage = "lib" + File.separator + "models"; apiPackage = "lib"; @@ -199,7 +200,7 @@ public class PhpSilexServerCodegen extends DefaultCodegen implements CodegenConf public String toVarName(String name) { // return the name in underscore style // PhoneNumber => phone_number - name = underscore(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // parameter name starting with number won't compile // need to escape it by appending _ at the beginning @@ -225,7 +226,7 @@ public class PhpSilexServerCodegen extends DefaultCodegen implements CodegenConf // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -258,7 +259,7 @@ public class PhpSilexServerCodegen extends DefaultCodegen implements CodegenConf for (int i = 0; i < items.length; ++i) { if (items[i].matches("^\\{(.*)\\}$")) { // wrap in {} // camelize path variable - items[i] = "{" + camelize(items[i].substring(1, items[i].length() - 1), true) + "}"; + items[i] = "{" + org.openapitools.codegen.utils.StringUtils.camelize(items[i].substring(1, items[i].length() - 1), true) + "}"; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java index 5baf8b5d731..0714247c8ae 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public class PhpSymfonyServerCodegen extends AbstractPhpCodegen implements CodegenConfig { @SuppressWarnings("hiding") private static final Logger LOGGER = LoggerFactory.getLogger(PhpSymfonyServerCodegen.class); @@ -563,14 +564,14 @@ public class PhpSymfonyServerCodegen extends AbstractPhpCodegen implements Codeg if (name.isEmpty()) { return "DefaultApiInterface"; } - return camelize(name, false) + "ApiInterface"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, false) + "ApiInterface"; } protected String toControllerName(String name) { if (name.isEmpty()) { return "DefaultController"; } - return camelize(name, false) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, false) + "Controller"; } protected String toSymfonyService(String name) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java index f16a7528fa7..86536a3c15a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java @@ -329,19 +329,19 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -406,11 +406,11 @@ public class PowerShellClientCodegen extends DefaultCodegen implements CodegenCo // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return camelize(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId)); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java index 0b8455108e2..94db6594f16 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java @@ -42,6 +42,7 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; + public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(PythonClientCodegen.class); @@ -436,7 +437,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // underscore the variable name // petId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // remove leading underscore name = name.replaceAll("^_*", ""); @@ -468,13 +469,13 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } @@ -488,14 +489,14 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override public String toModelFilename(String name) { // underscore the model file name // PhoneNumber => phone_number - return underscore(dropDots(toModelName(name))); + return org.openapitools.codegen.utils.StringUtils.underscore(dropDots(toModelName(name))); } @Override @@ -509,7 +510,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig name = name.replaceAll("-", "_"); // e.g. PhoneNumberApi.py => phone_number_api.py - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -523,7 +524,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return "DefaultApi"; } // e.g. phone_number_api => PhoneNumberApi - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -531,7 +532,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig if (name.length() == 0) { return "default_api"; } - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -543,17 +544,17 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return underscore(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(operationId)); } public void setPackageName(String packageName) { @@ -583,7 +584,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig */ @SuppressWarnings("static-method") public String generatePackageName(String packageName) { - return underscore(packageName.replaceAll("[^\\w]+", "")); + return org.openapitools.codegen.utils.StringUtils.underscore(packageName.replaceAll("[^\\w]+", "")); } /** diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFlaskConnexionServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFlaskConnexionServerCodegen.java index 009dfeff8ba..a226d786163 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFlaskConnexionServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFlaskConnexionServerCodegen.java @@ -31,10 +31,10 @@ import org.openapitools.codegen.*; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import java.io.File; import java.util.*; + public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(PythonFlaskConnexionServerCodegen.class); @@ -246,12 +246,12 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements if (name == null || name.length() == 0) { return "DefaultController"; } - return camelize(name, false) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, false) + "Controller"; } @Override public String toApiFilename(String name) { - return underscore(toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(toApiName(name)); } @Override @@ -405,7 +405,7 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements // underscore the variable name // petId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // remove leading underscore name = name.replaceAll("^_*", ""); @@ -433,7 +433,7 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements public String toModelFilename(String name) { // underscore the model file name // PhoneNumber => phone_number - return underscore(dropDots(toModelName(name))); + return org.openapitools.codegen.utils.StringUtils.underscore(dropDots(toModelName(name))); } @Override @@ -444,13 +444,13 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } @@ -464,7 +464,7 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -476,11 +476,11 @@ public class PythonFlaskConnexionServerCodegen extends DefaultCodegen implements // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return underscore(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(operationId)); } /** diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java index 6be3b9814d2..49db39f4874 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.util.*; + public class RClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(RClientCodegen.class); @@ -172,7 +173,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { if (this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } - return camelize(name) + '_'; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + '_'; } @Override @@ -195,7 +196,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { // convert variable name to snake case // PetId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // for reserved word or word starting with number, append _ if (isReservedWord(name)) @@ -232,17 +233,17 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override @@ -251,7 +252,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PetApi.r => pet_api.r - return camelize(name + "_api"); + return org.openapitools.codegen.utils.StringUtils.camelize(name + "_api"); } @Override @@ -276,7 +277,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toApiName(String name) { - return camelize(super.toApiName(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(super.toApiName(name)); } @Override @@ -328,11 +329,11 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(sanitizedOperationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore("call_" + operationId)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore("call_" + operationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } - return underscore(sanitizedOperationId); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizedOperationId); } @Override @@ -432,7 +433,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -445,7 +446,7 @@ public class RClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); // remove [] for array or map of enum enumName = enumName.replace("[]", ""); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java index 539dda6d2a6..995d21788c6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java @@ -29,6 +29,7 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; + public class RubyClientCodegen extends AbstractRubyCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(RubyClientCodegen.class); public static final String GEM_NAME = "gemName"; @@ -249,7 +250,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { */ @SuppressWarnings("static-method") public String generateModuleName(String gemName) { - return camelize(gemName.replaceAll("[^\\w]+", "_")); + return org.openapitools.codegen.utils.StringUtils.camelize(gemName.replaceAll("[^\\w]+", "_")); } /** @@ -260,7 +261,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { */ @SuppressWarnings("static-method") public String generateGemName(String moduleName) { - return underscore(moduleName.replaceAll("[^\\w]+", "")); + return org.openapitools.codegen.utils.StringUtils.underscore(moduleName.replaceAll("[^\\w]+", "")); } @Override @@ -327,25 +328,25 @@ public class RubyClientCodegen extends AbstractRubyCodegen { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - String modelName = camelize("Model" + name); + String modelName = org.openapitools.codegen.utils.StringUtils.camelize("Model" + name); LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + modelName); return modelName; } // model name starts with number if (name.matches("^\\d.*")) { - LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override public String toModelFilename(String name) { - return underscore(toModelName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(toModelName(name)); } @Override @@ -359,7 +360,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PhoneNumberApi.rb => phone_number_api.rb - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -383,7 +384,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { return "DefaultApi"; } // e.g. phone_number_api => PhoneNumberApi - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override @@ -411,7 +412,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -424,7 +425,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -445,25 +446,25 @@ public class RubyClientCodegen extends AbstractRubyCodegen { public String toOperationId(String operationId) { // rename to empty_method_name_1 (e.g.) if method name is empty if (StringUtils.isEmpty(operationId)) { - operationId = underscore("empty_method_name_" + emptyMethodNameCounter++); + operationId = org.openapitools.codegen.utils.StringUtils.underscore("empty_method_name_" + emptyMethodNameCounter++); LOGGER.warn("Empty method name (operationId) found. Renamed to " + operationId); return operationId; } // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = underscore("call_" + operationId); + String newOperationId = org.openapitools.codegen.utils.StringUtils.underscore("call_" + operationId); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return underscore(sanitizeName(operationId)); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(operationId)); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyOnRailsServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyOnRailsServerCodegen.java index fe929e0270d..d67b1ad5ce7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyOnRailsServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyOnRailsServerCodegen.java @@ -34,6 +34,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public class RubyOnRailsServerCodegen extends AbstractRubyCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(RubyOnRailsServerCodegen.class); @@ -220,28 +221,28 @@ public class RubyOnRailsServerCodegen extends AbstractRubyCodegen { public String toModelName(String name) { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - String modelName = camelize("Model" + name); + String modelName = org.openapitools.codegen.utils.StringUtils.camelize("Model" + name); LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + modelName); return modelName; } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override public String toModelFilename(String name) { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - String filename = underscore("model_" + name); + String filename = org.openapitools.codegen.utils.StringUtils.underscore("model_" + name); LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + filename); return filename; } // underscore the model file name // PhoneNumber.rb => phone_number.rb - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -250,7 +251,7 @@ public class RubyOnRailsServerCodegen extends AbstractRubyCodegen { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. DefaultController => defaults_controller.rb - return underscore(name) + "_controller"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_controller"; } @Override @@ -260,7 +261,7 @@ public class RubyOnRailsServerCodegen extends AbstractRubyCodegen { } // e.g. PhoneNumber => phone_number - return underscore(sanitizeName(name)); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizeName(name)); } @Override @@ -269,7 +270,7 @@ public class RubyOnRailsServerCodegen extends AbstractRubyCodegen { return "ApiController"; } // e.g. phone_number_controller => PhoneNumberController - return camelize(name) + "Controller"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Controller"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubySinatraServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubySinatraServerCodegen.java index cfedccee553..05ecc9fa4e8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubySinatraServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubySinatraServerCodegen.java @@ -28,6 +28,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public class RubySinatraServerCodegen extends AbstractRubyCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(RubySinatraServerCodegen.class); @@ -109,26 +110,26 @@ public class RubySinatraServerCodegen extends AbstractRubyCodegen { public String toModelName(String name) { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } @Override public String toModelFilename(String name) { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + underscore("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model filename. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } // underscore the model file name // PhoneNumber.rb => phone_number.rb - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -137,7 +138,7 @@ public class RubySinatraServerCodegen extends AbstractRubyCodegen { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PhoneNumberApi.rb => phone_number_api.rb - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -146,7 +147,7 @@ public class RubySinatraServerCodegen extends AbstractRubyCodegen { return "DefaultApi"; } // e.g. phone_number_api => PhoneNumberApi - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustClientCodegen.java index 2625c37d06c..da9763a281f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustClientCodegen.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(RustClientCodegen.class); public static final String PACKAGE_NAME = "packageName"; @@ -208,7 +209,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { return name; // snake_case, e.g. PetId => pet_id - name = underscore(name); + name = org.openapitools.codegen.utils.StringUtils.underscore(name); // for reserved word or word starting with number, append _ if (isReservedWord(name)) @@ -230,7 +231,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { public String toModelName(String name) { // camelize the model name // phone_number => PhoneNumber - return camelize(toModelFilename(name)); + return org.openapitools.codegen.utils.StringUtils.camelize(toModelFilename(name)); } @Override @@ -257,7 +258,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -266,7 +267,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PetApi.rs => pet_api.rs - return underscore(name) + "_api"; + return org.openapitools.codegen.utils.StringUtils.underscore(name) + "_api"; } @Override @@ -339,11 +340,11 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(sanitizedOperationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore("call_" + operationId)); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.underscore("call_" + operationId)); sanitizedOperationId = "call_" + sanitizedOperationId; } - return underscore(sanitizedOperationId); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizedOperationId); } @Override @@ -354,7 +355,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { List operations = (List) objectMap.get("operation"); for (CodegenOperation operation : operations) { // http method verb conversion (e.g. PUT => Put) - operation.httpMethod = camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); + operation.httpMethod = org.openapitools.codegen.utils.StringUtils.camelize(operation.httpMethod.toLowerCase(Locale.ROOT)); // update return type to conform to rust standard /* if (operation.returnType != null) { @@ -470,7 +471,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); @@ -483,7 +484,7 @@ public class RustClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toEnumName(CodegenProperty property) { - String enumName = underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); + String enumName = org.openapitools.codegen.utils.StringUtils.underscore(toModelName(property.name)).toUpperCase(Locale.ROOT); // remove [] for array or map of enum enumName = enumName.replace("[]", ""); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java index 0486327f3e2..d45ce26f0ea 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java @@ -56,6 +56,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; + public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(RustServerCodegen.class); @@ -303,7 +304,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { if (name.length() == 0) { return "default"; } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } /** @@ -333,7 +334,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { public String toModelName(String name) { // camelize the model name // phone_number => PhoneNumber - String camelizedName = camelize(toModelFilename(name)); + String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(toModelFilename(name)); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { @@ -366,18 +367,18 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { sanitizedName = escapeReservedWord(sanitizedName); } - return underscore(sanitizedName); + return org.openapitools.codegen.utils.StringUtils.underscore(sanitizedName); } @Override public String toOperationId(String operationId) { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId))); + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId))); operationId = "call_" + operationId; } - return camelize(operationId); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId); } @Override @@ -394,16 +395,16 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize("model_" + name)); name = "model_" + name; // e.g. return => ModelReturn (after camelize) } - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override public String toEnumName(CodegenProperty property) { - return sanitizeName(camelize(property.name)) + "Enum"; + return sanitizeName(org.openapitools.codegen.utils.StringUtils.camelize(property.name)) + "Enum"; } @Override @@ -454,7 +455,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // e.g. PetApi.go => pet_api.go - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); } @Override @@ -520,8 +521,8 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { pathSetMap.put(pathId, pathSetEntry); } - op.vendorExtensions.put("operation_id", underscore(op.operationId)); - op.vendorExtensions.put("uppercase_operation_id", underscore(op.operationId).toUpperCase(Locale.ROOT)); + op.vendorExtensions.put("operation_id", org.openapitools.codegen.utils.StringUtils.underscore(op.operationId)); + op.vendorExtensions.put("uppercase_operation_id", org.openapitools.codegen.utils.StringUtils.underscore(op.operationId).toUpperCase(Locale.ROOT)); op.vendorExtensions.put("path", op.path.replace("{", ":").replace("}", "")); op.vendorExtensions.put("PATH_ID", pathId); op.vendorExtensions.put("hasPathParams", !op.pathParams.isEmpty()); @@ -598,13 +599,13 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { if (rsp.vendorExtensions.containsKey("x-responseId")) { responseId = (String) rsp.vendorExtensions.get("x-responseId"); } else if (words.length != 0) { - responseId = camelize(words[0].replace(" ", "_")); + responseId = org.openapitools.codegen.utils.StringUtils.camelize(words[0].replace(" ", "_")); } else { responseId = "Status" + rsp.code; } rsp.vendorExtensions.put("x-responseId", responseId); - rsp.vendorExtensions.put("x-uppercaseResponseId", underscore(responseId).toUpperCase(Locale.ROOT)); - rsp.vendorExtensions.put("uppercase_operation_id", underscore(op.operationId).toUpperCase(Locale.ROOT)); + rsp.vendorExtensions.put("x-uppercaseResponseId", org.openapitools.codegen.utils.StringUtils.underscore(responseId).toUpperCase(Locale.ROOT)); + rsp.vendorExtensions.put("uppercase_operation_id", org.openapitools.codegen.utils.StringUtils.underscore(op.operationId).toUpperCase(Locale.ROOT)); if (rsp.dataType != null) { rsp.vendorExtensions.put("uppercase_data_type", (rsp.dataType.replace("models::", "")).toUpperCase(Locale.ROOT)); @@ -675,7 +676,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { if (op.bodyParam != null) { // Default to consuming json - op.bodyParam.vendorExtensions.put("uppercase_operation_id", underscore(op.operationId).toUpperCase(Locale.ROOT)); + op.bodyParam.vendorExtensions.put("uppercase_operation_id", org.openapitools.codegen.utils.StringUtils.underscore(op.operationId).toUpperCase(Locale.ROOT)); if (consumesXml) { op.bodyParam.vendorExtensions.put("consumesXml", true); } else if (consumesPlainText) { @@ -688,7 +689,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { for (CodegenParameter param : op.bodyParams) { processParam(param, op); - param.vendorExtensions.put("uppercase_operation_id", underscore(op.operationId).toUpperCase(Locale.ROOT)); + param.vendorExtensions.put("uppercase_operation_id", org.openapitools.codegen.utils.StringUtils.underscore(op.operationId).toUpperCase(Locale.ROOT)); // Default to producing json if nothing else is specified if (consumesXml) { @@ -926,9 +927,9 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { // If we use a more qualified model name, then only camelize the actual type, not the qualifier. if (property.dataType.contains(":")) { int position = property.dataType.lastIndexOf(":"); - property.dataType = property.dataType.substring(0, position) + camelize(property.dataType.substring(position)); + property.dataType = property.dataType.substring(0, position) + org.openapitools.codegen.utils.StringUtils.camelize(property.dataType.substring(position)); } else { - property.dataType = camelize(property.dataType, false); + property.dataType = org.openapitools.codegen.utils.StringUtils.camelize(property.dataType, false); } } @@ -976,7 +977,7 @@ public class RustServerCodegen extends DefaultCodegen implements CodegenConfig { } } - property.name = underscore(property.name); + property.name = org.openapitools.codegen.utils.StringUtils.underscore(property.name); if (!property.required) { property.defaultValue = (property.defaultValue != null) ? "Some(" + property.defaultValue + ")" : "None"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java index d3a42542a8f..ba8ea0062dd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java @@ -35,6 +35,7 @@ import java.io.StringWriter; import java.io.Writer; import java.util.*; + public class ScalaAkkaClientCodegen extends AbstractScalaCodegen implements CodegenConfig { protected String mainPackage = "org.openapitools.client"; protected String groupId = "org.openapitools"; @@ -335,7 +336,7 @@ public class ScalaAkkaClientCodegen extends AbstractScalaCodegen implements Code @Override public String formatFragment(String fragment) { - return camelize(fragment, !capitalizeFirst); + return org.openapitools.codegen.utils.StringUtils.camelize(fragment, !capitalizeFirst); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttpClientCodegen.java index b23a7f75ce1..f02d21d289f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttpClientCodegen.java @@ -26,6 +26,7 @@ import java.io.File; import java.util.Arrays; import java.util.HashMap; + public class ScalaHttpClientCodegen extends AbstractScalaCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ScalaHttpClientCodegen.class); @@ -184,11 +185,11 @@ public class ScalaHttpClientCodegen extends AbstractScalaCodegen implements Code case original: return name; case camelCase: - return camelize(name, true); + return org.openapitools.codegen.utils.StringUtils.camelize(name, true); case PascalCase: - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); case snake_case: - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + @@ -226,7 +227,7 @@ public class ScalaHttpClientCodegen extends AbstractScalaCodegen implements Code throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); } - return camelize(operationId, true); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId, true); } @Override @@ -235,7 +236,7 @@ public class ScalaHttpClientCodegen extends AbstractScalaCodegen implements Code // camelize the model name // phone_number => PhoneNumber - final String camelizedName = camelize(sanitizedName); + final String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(sanitizedName); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaLagomServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaLagomServerCodegen.java index e8f9be4d39d..1b8272a262e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaLagomServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaLagomServerCodegen.java @@ -24,6 +24,7 @@ import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public class ScalaLagomServerCodegen extends AbstractScalaCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ScalaLagomServerCodegen.class); @@ -166,11 +167,11 @@ public class ScalaLagomServerCodegen extends AbstractScalaCodegen implements Cod case original: return name; case camelCase: - return camelize(name, true); + return org.openapitools.codegen.utils.StringUtils.camelize(name, true); case PascalCase: - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); case snake_case: - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + @@ -206,7 +207,7 @@ public class ScalaLagomServerCodegen extends AbstractScalaCodegen implements Cod throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); } - return camelize(operationId, true); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId, true); } @Override @@ -215,7 +216,7 @@ public class ScalaLagomServerCodegen extends AbstractScalaCodegen implements Cod // camelize the model name // phone_number => PhoneNumber - final String camelizedName = camelize(sanitizedName); + final String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(sanitizedName); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalazClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalazClientCodegen.java index 0e55600fa65..6936e6df867 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalazClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalazClientCodegen.java @@ -31,6 +31,7 @@ import java.io.Writer; import java.util.Arrays; import java.util.HashMap; + public class ScalazClientCodegen extends AbstractScalaCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(ScalazClientCodegen.class); @@ -163,11 +164,11 @@ public class ScalazClientCodegen extends AbstractScalaCodegen implements Codegen case original: return name; case camelCase: - return camelize(name, true); + return org.openapitools.codegen.utils.StringUtils.camelize(name, true); case PascalCase: - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); case snake_case: - return underscore(name); + return org.openapitools.codegen.utils.StringUtils.underscore(name); default: throw new IllegalArgumentException("Invalid model property naming '" + name + "'. Must be 'original', 'camelCase', " + @@ -203,7 +204,7 @@ public class ScalazClientCodegen extends AbstractScalaCodegen implements Codegen throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); } - return camelize(operationId, true); + return org.openapitools.codegen.utils.StringUtils.camelize(operationId, true); } @Override @@ -212,7 +213,7 @@ public class ScalazClientCodegen extends AbstractScalaCodegen implements Codegen // camelize the model name // phone_number => PhoneNumber - final String camelizedName = camelize(sanitizedName); + final String camelizedName = org.openapitools.codegen.utils.StringUtils.camelize(sanitizedName); // model name cannot use reserved keyword, e.g. return if (isReservedWord(camelizedName)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 5e6f269880e..e88c976d901 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -49,6 +49,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.stream.Collectors; + public class SpringCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures { private static final Logger LOGGER = LoggerFactory.getLogger(SpringCodegen.class); @@ -441,7 +442,7 @@ public class SpringCodegen extends AbstractJavaCodegen title = title.substring(0, title.length() - 3); } - this.title = camelize(sanitizeName(title), true); + this.title = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(title), true); } additionalProperties.put(TITLE, this.title); } @@ -591,7 +592,7 @@ public class SpringCodegen extends AbstractJavaCodegen List authMethods = (List) objs.get("authMethods"); if (authMethods != null) { for (CodegenSecurity authMethod : authMethods) { - authMethod.name = camelize(sanitizeName(authMethod.name), true); + authMethod.name = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(authMethod.name), true); } } } @@ -604,7 +605,7 @@ public class SpringCodegen extends AbstractJavaCodegen return "DefaultApi"; } name = sanitizeName(name); - return camelize(name) + "Api"; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + "Api"; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/StaticHtml2Generator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/StaticHtml2Generator.java index a975cf63bd7..e220f906343 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/StaticHtml2Generator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/StaticHtml2Generator.java @@ -45,6 +45,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; + public class StaticHtml2Generator extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(StaticHtml2Generator.class); @@ -161,7 +162,7 @@ public class StaticHtml2Generator extends DefaultCodegen implements CodegenConfi Info info = openAPI.getInfo(); if (StringUtils.isBlank(jsProjectName) && info.getTitle() != null) { // when jsProjectName is not specified, generate it from info.title - jsProjectName = sanitizeName(dashize(info.getTitle())); + jsProjectName = sanitizeName(org.openapitools.codegen.utils.StringUtils.dashize(info.getTitle())); } } @@ -170,7 +171,7 @@ public class StaticHtml2Generator extends DefaultCodegen implements CodegenConfi jsProjectName = "openapi-js-client"; } if (StringUtils.isBlank(jsModuleName)) { - jsModuleName = camelize(underscore(jsProjectName)); + jsModuleName = org.openapitools.codegen.utils.StringUtils.camelize(org.openapitools.codegen.utils.StringUtils.underscore(jsProjectName)); } additionalProperties.put("jsProjectName", jsProjectName); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift3Codegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift3Codegen.java index a8b3f0d64e5..1140d25ecc2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift3Codegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift3Codegen.java @@ -32,6 +32,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(Swift3Codegen.class); @@ -382,7 +383,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { // camelize the model name // phone_number => PhoneNumber - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { @@ -440,7 +441,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { @Override public String toOperationId(String operationId) { - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // throw exception if method name is empty. This should not happen but keep the check just in case if (StringUtils.isEmpty(operationId)) { @@ -449,15 +450,15 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize(("call_" + operationId), true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize(("call_" + operationId), true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); - operationId = camelize(sanitizeName("call_" + operationId), true); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true); } return operationId; @@ -475,7 +476,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { // camelize the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -498,9 +499,9 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { return name; } - // camelize(lower) the variable name + // org.openapitools.codegen.utils.StringUtils.camelize(lower) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -579,18 +580,18 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { String startingNumbers = startWithNumberMatcher.group(0); String nameWithoutStartingNumbers = name.substring(startingNumbers.length()); - return "_" + startingNumbers + camelize(nameWithoutStartingNumbers, true); + return "_" + startingNumbers + org.openapitools.codegen.utils.StringUtils.camelize(nameWithoutStartingNumbers, true); } // for symbol, e.g. $, # if (getSymbolName(name) != null) { - return camelize(WordUtils.capitalizeFully(getSymbolName(name).toUpperCase(Locale.ROOT)), true); + return org.openapitools.codegen.utils.StringUtils.camelize(WordUtils.capitalizeFully(getSymbolName(name).toUpperCase(Locale.ROOT)), true); } // Camelize only when we have a structure defined below Boolean camelized = false; if (name.matches("[A-Z][a-z0-9]+[a-zA-Z0-9]*")) { - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); camelized = true; } @@ -603,7 +604,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { // Check for numerical conversions if ("Int".equals(datatype) || "Int32".equals(datatype) || "Int64".equals(datatype) || "Float".equals(datatype) || "Double".equals(datatype)) { - String varName = "number" + camelize(name); + String varName = "number" + org.openapitools.codegen.utils.StringUtils.camelize(name); varName = varName.replaceAll("-", "minus"); varName = varName.replaceAll("\\+", "plus"); varName = varName.replaceAll("\\.", "dot"); @@ -617,7 +618,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { } char[] separators = {'-', '_', ' ', ':', '(', ')'}; - return camelize(WordUtils.capitalizeFully(StringUtils.lowerCase(name), separators).replaceAll("[-_ :\\(\\)]", ""), true); + return org.openapitools.codegen.utils.StringUtils.camelize(WordUtils.capitalizeFully(StringUtils.lowerCase(name), separators).replaceAll("[-_ :\\(\\)]", ""), true); } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java index 76e2b0602bd..99f2a83bd94 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java @@ -32,6 +32,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(Swift4Codegen.class); @@ -472,7 +473,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { // camelize the model name // phone_number => PhoneNumber - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { @@ -543,7 +544,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { @Override public String toOperationId(String operationId) { - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // Throw exception if method name is empty. // This should not happen but keep the check just in case @@ -553,7 +554,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize(("call_" + operationId), true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize(("call_" + operationId), true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name." + " Renamed to " + newOperationId); return newOperationId; @@ -561,8 +562,8 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); - operationId = camelize(sanitizeName("call_" + operationId), true); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true); } @@ -581,7 +582,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { // camelize the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -604,9 +605,9 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { return name; } - // camelize(lower) the variable name + // org.openapitools.codegen.utils.StringUtils.camelize(lower) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -692,18 +693,18 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { String startingNumbers = startWithNumberMatcher.group(0); String nameWithoutStartingNumbers = name.substring(startingNumbers.length()); - return "_" + startingNumbers + camelize(nameWithoutStartingNumbers, true); + return "_" + startingNumbers + org.openapitools.codegen.utils.StringUtils.camelize(nameWithoutStartingNumbers, true); } // for symbol, e.g. $, # if (getSymbolName(name) != null) { - return camelize(WordUtils.capitalizeFully(getSymbolName(name).toUpperCase(Locale.ROOT)), true); + return org.openapitools.codegen.utils.StringUtils.camelize(WordUtils.capitalizeFully(getSymbolName(name).toUpperCase(Locale.ROOT)), true); } // Camelize only when we have a structure defined below Boolean camelized = false; if (name.matches("[A-Z][a-z0-9]+[a-zA-Z0-9]*")) { - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); camelized = true; } @@ -716,7 +717,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { // Check for numerical conversions if ("Int".equals(datatype) || "Int32".equals(datatype) || "Int64".equals(datatype) || "Float".equals(datatype) || "Double".equals(datatype)) { - String varName = "number" + camelize(name); + String varName = "number" + org.openapitools.codegen.utils.StringUtils.camelize(name); varName = varName.replaceAll("-", "minus"); varName = varName.replaceAll("\\+", "plus"); varName = varName.replaceAll("\\.", "dot"); @@ -730,7 +731,7 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { } char[] separators = {'-', '_', ' ', ':', '(', ')'}; - return camelize(WordUtils.capitalizeFully(StringUtils.lowerCase(name), separators) + return org.openapitools.codegen.utils.StringUtils.camelize(WordUtils.capitalizeFully(StringUtils.lowerCase(name), separators) .replaceAll("[-_ :\\(\\)]", ""), true); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftClientCodegen.java index 97aeb0479b2..775694c5e09 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftClientCodegen.java @@ -34,6 +34,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; + /** * Swift (2.x) generator is no longer actively maintained. Please use * 'swift3' or 'swift4' generator instead. @@ -319,7 +320,7 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig // camelize the model name // phone_number => PhoneNumber - name = camelize(name); + name = org.openapitools.codegen.utils.StringUtils.camelize(name); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { @@ -436,7 +437,7 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String toOperationId(String operationId) { - operationId = camelize(sanitizeName(operationId), true); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName(operationId), true); // throw exception if method name is empty. This should not happen but keep the check just in case if (StringUtils.isEmpty(operationId)) { @@ -445,15 +446,15 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig // method name cannot use reserved keyword, e.g. return if (isReservedWord(operationId)) { - String newOperationId = camelize(("call_" + operationId), true); + String newOperationId = org.openapitools.codegen.utils.StringUtils.camelize(("call_" + operationId), true); LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + newOperationId); return newOperationId; } // operationId starts with a number if (operationId.matches("^\\d.*")) { - LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); - operationId = camelize(sanitizeName("call_" + operationId), true); + LOGGER.warn(operationId + " (starting with a number) cannot be used as method name. Renamed to " + org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true)); + operationId = org.openapitools.codegen.utils.StringUtils.camelize(sanitizeName("call_" + operationId), true); } return operationId; @@ -471,7 +472,7 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig // camelize the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -494,9 +495,9 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig return name; } - // camelize(lower) the variable name + // org.openapitools.codegen.utils.StringUtils.camelize(lower) the variable name // pet_id => petId - name = camelize(name, true); + name = org.openapitools.codegen.utils.StringUtils.camelize(name, true); // for reserved word or word starting with number, append _ if (isReservedWord(name) || name.matches("^\\d.*")) { @@ -524,7 +525,7 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig builder.append(stringBeforeMatch); String group = matcher.group().substring(1, matcher.group().length() - 1); - group = camelize(group, true); + group = org.openapitools.codegen.utils.StringUtils.camelize(group, true); builder .append("{") .append(group) @@ -583,7 +584,7 @@ public class SwiftClientCodegen extends DefaultCodegen implements CodegenConfig } // string - String enumName = sanitizeName(underscore(name).toUpperCase(Locale.ROOT)); + String enumName = sanitizeName(org.openapitools.codegen.utils.StringUtils.underscore(name).toUpperCase(Locale.ROOT)); enumName = enumName.replaceFirst("^_", ""); enumName = enumName.replaceFirst("_$", ""); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java index c08a980a339..4ae97530cc4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java @@ -29,6 +29,7 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.*; + public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(TypeScriptAngularClientCodegen.class); @@ -455,7 +456,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode if (name.length() == 0) { return "default.service"; } - return camelize(removeModelSuffixIfNecessary(name), true) + serviceFileSuffix; + return org.openapitools.codegen.utils.StringUtils.camelize(removeModelSuffixIfNecessary(name), true) + serviceFileSuffix; } @Override @@ -466,7 +467,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode @Override public String toModelFilename(String name) { String modelName = toModelName(name); - return camelize(removeModelSuffixIfNecessary(modelName), true) + modelFileSuffix; + return org.openapitools.codegen.utils.StringUtils.camelize(removeModelSuffixIfNecessary(modelName), true) + modelFileSuffix; } @Override @@ -511,7 +512,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode if (modelFileSuffix.length() > 0) { name = name.substring(0, name.length() - modelFileSuffix.length()); } - return camelize(name) + modelSuffix; + return org.openapitools.codegen.utils.StringUtils.camelize(name) + modelSuffix; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptInversifyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptInversifyClientCodegen.java index 28259a7dcdb..9ca446c5a80 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptInversifyClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptInversifyClientCodegen.java @@ -29,6 +29,7 @@ import java.text.SimpleDateFormat; import java.util.*; + public class TypeScriptInversifyClientCodegen extends AbstractTypeScriptClientCodegen { private static final SimpleDateFormat SNAPSHOT_SUFFIX_FORMAT = new SimpleDateFormat("yyyyMMddHHmm", Locale.ROOT); private static final String X_DISCRIMINATOR_TYPE = "x-discriminator-value"; @@ -326,7 +327,7 @@ public class TypeScriptInversifyClientCodegen extends AbstractTypeScriptClientCo if (name.length() == 0) { return "default.service"; } - return camelize(name, true) + ".service"; + return org.openapitools.codegen.utils.StringUtils.camelize(name, true) + ".service"; } @Override @@ -336,7 +337,7 @@ public class TypeScriptInversifyClientCodegen extends AbstractTypeScriptClientCo @Override public String toModelFilename(String name) { - return camelize(toModelName(name), true); + return org.openapitools.codegen.utils.StringUtils.camelize(toModelName(name), true); } @Override @@ -375,7 +376,7 @@ public class TypeScriptInversifyClientCodegen extends AbstractTypeScriptClientCo private String getModelnameFromModelFilename(String filename) { String name = filename.substring((modelPackage() + "/").length()); - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java index 3e6b1848f01..6021187cd04 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java @@ -29,6 +29,7 @@ import java.io.File; import java.text.SimpleDateFormat; import java.util.*; + public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen { private static final Logger LOGGER = LoggerFactory.getLogger(TypeScriptNodeClientCodegen.class); private static final SimpleDateFormat SNAPSHOT_SUFFIX_FORMAT = new SimpleDateFormat("yyyyMMddHHmm", Locale.ROOT); @@ -106,7 +107,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen if (name.length() == 0) { return "default" + apiSuffix; } - return camelize(name, true) + apiSuffix; + return org.openapitools.codegen.utils.StringUtils.camelize(name, true) + apiSuffix; } @Override @@ -116,7 +117,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen @Override public String toModelFilename(String name) { - return camelize(toModelName(name), true); + return org.openapitools.codegen.utils.StringUtils.camelize(toModelName(name), true); } @Override @@ -295,6 +296,6 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen private String getModelnameFromModelFilename(String filename) { String name = filename.substring((modelPackage() + File.separator).length()); - return camelize(name); + return org.openapitools.codegen.utils.StringUtils.camelize(name); } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java index 5dcfde31d80..f67b0e848a2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java @@ -17,17 +17,16 @@ package org.openapitools.codegen.mustache; -import com.google.common.base.CaseFormat; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; import org.openapitools.codegen.CodegenConfig; -import org.openapitools.codegen.DefaultCodegen; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.text.WordUtils; import java.io.IOException; import java.io.Writer; +import static org.openapitools.codegen.utils.StringUtils.camelize; + + /** * Converts text in a fragment to camelCase. * @@ -61,7 +60,7 @@ public class CamelCaseLambda implements Mustache.Lambda { @Override public void execute(Template.Fragment fragment, Writer writer) throws IOException { - String text = DefaultCodegen.camelize(fragment.execute(), true); + String text = camelize(fragment.execute(), true); if (generator != null) { text = generator.sanitizeName(text); if (generator.reservedWords().contains(text)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/StringUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/StringUtils.java new file mode 100644 index 00000000000..47679a6f8f2 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/StringUtils.java @@ -0,0 +1,165 @@ +package org.openapitools.codegen.utils; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class StringUtils { + /** + * Underscore the given word. + * Copied from Twitter elephant bird + * https://github.com/twitter/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/util/Strings.java + * + * @param word The word + * @return The underscored version of the word + */ + public static String underscore(String word) { + String firstPattern = "([A-Z]+)([A-Z][a-z])"; + String secondPattern = "([a-z\\d])([A-Z])"; + String replacementPattern = "$1_$2"; + // Replace package separator with slash. + word = word.replaceAll("\\.", "/"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + // Replace $ with two underscores for inner classes. + word = word.replaceAll("\\$", "__"); + // Replace capital letter with _ plus lowercase letter. + word = word.replaceAll(firstPattern, replacementPattern); + word = word.replaceAll(secondPattern, replacementPattern); + word = word.replace('-', '_'); + // replace space with underscore + word = word.replace(' ', '_'); + word = word.toLowerCase(Locale.ROOT); + return word; + } + + /** + * Dashize the given word. + * + * @param word The word + * @return The dashized version of the word, e.g. "my-name" + */ + public static String dashize(String word) { + return underscore(word).replaceAll("[_ ]", "-"); + } + + /** + * Camelize name (parameter, property, method, etc) with upper case for first letter + * copied from Twitter elephant bird + * https://github.com/twitter/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/util/Strings.java + * + * @param word string to be camelize + * @return camelized string + */ + public static String camelize(String word) { + return camelize(word, false); + } + + /** + * Camelize name (parameter, property, method, etc) + * + * @param word string to be camelize + * @param lowercaseFirstLetter lower case for first letter if set to true + * @return camelized string + */ + public static String camelize(String word, boolean lowercaseFirstLetter) { + // Replace all slashes with dots (package separator) + Pattern p = Pattern.compile("\\/(.?)"); + Matcher m = p.matcher(word); + while (m.find()) { + word = m.replaceFirst("." + m.group(1)/*.toUpperCase()*/); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + m = p.matcher(word); + } + + // case out dots + String[] parts = word.split("\\."); + StringBuilder f = new StringBuilder(); + for (String z : parts) { + if (z.length() > 0) { + f.append(Character.toUpperCase(z.charAt(0))).append(z.substring(1)); + } + } + word = f.toString(); + + m = p.matcher(word); + while (m.find()) { + word = m.replaceFirst("" + Character.toUpperCase(m.group(1).charAt(0)) + m.group(1).substring(1)/*.toUpperCase()*/); + m = p.matcher(word); + } + + // Uppercase the class name. + p = Pattern.compile("(\\.?)(\\w)([^\\.]*)$"); + m = p.matcher(word); + if (m.find()) { + String rep = m.group(1) + m.group(2).toUpperCase(Locale.ROOT) + m.group(3); + rep = rep.replaceAll("\\$", "\\\\\\$"); + word = m.replaceAll(rep); + } + + // Remove all underscores (underscore_case to camelCase) + p = Pattern.compile("(_)(.)"); + m = p.matcher(word); + while (m.find()) { + String original = m.group(2); + String upperCase = original.toUpperCase(Locale.ROOT); + if (original.equals(upperCase)) { + word = word.replaceFirst("_", ""); + } else { + word = m.replaceFirst(upperCase); + } + m = p.matcher(word); + } + + // Remove all hyphens (hyphen-case to camelCase) + p = Pattern.compile("(-)(.)"); + m = p.matcher(word); + while (m.find()) { + word = m.replaceFirst(m.group(2).toUpperCase(Locale.ROOT)); + m = p.matcher(word); + } + + if (lowercaseFirstLetter && word.length() > 0) { + int i = 0; + char charAt = word.charAt(i); + while (i + 1 < word.length() && !((charAt >= 'a' && charAt <= 'z') || (charAt >= 'A' && charAt <= 'Z'))) { + i = i + 1; + charAt = word.charAt(i); + } + i = i + 1; + word = word.substring(0, i).toLowerCase(Locale.ROOT) + word.substring(i); + } + + // remove all underscore + word = word.replaceAll("_", ""); + + return word; + } + + /** + * Return the name with escaped characters. + * + * @param name the name to be escaped + * @param replacementMap map of replacement characters for non-allowed characters + * @param charactersToAllow characters that are not escaped + * @param appendToReplacement String to append to replaced characters. + * @return the escaped word + *

+ * throws Runtime exception as word is not escaped properly. + */ + public static String escape(String name, Map replacementMap, + List charactersToAllow, String appendToReplacement) { + String result = name.chars().mapToObj(c -> { + String character = "" + (char) c; + if (charactersToAllow != null && charactersToAllow.contains(character)) { + return character; + } else if (replacementMap.containsKey(character)) { + return replacementMap.get(character) + (appendToReplacement != null ? appendToReplacement: ""); + } else { + return character; + } + }).reduce( (c1, c2) -> "" + c1 + c2).orElse(null); + + if (result != null) return result; + throw new RuntimeException("Word '" + name + "' could not be escaped."); + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 425eb7a23ab..672dd0be08a 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -41,25 +41,9 @@ import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; + public class DefaultCodegenTest { - @Test - public void testCamelize() throws Exception { - Assert.assertEquals(DefaultCodegen.camelize("abcd"), "Abcd"); - Assert.assertEquals(DefaultCodegen.camelize("some-value"), "SomeValue"); - Assert.assertEquals(DefaultCodegen.camelize("some_value"), "SomeValue"); - Assert.assertEquals(DefaultCodegen.camelize("$type"), "$Type"); - - Assert.assertEquals(DefaultCodegen.camelize("abcd", true), "abcd"); - Assert.assertEquals(DefaultCodegen.camelize("some-value", true), "someValue"); - Assert.assertEquals(DefaultCodegen.camelize("some_value", true), "someValue"); - Assert.assertEquals(DefaultCodegen.camelize("Abcd", true), "abcd"); - Assert.assertEquals(DefaultCodegen.camelize("$type", true), "$type"); - - Assert.assertEquals(DefaultCodegen.camelize("123", true), "123"); - Assert.assertEquals(DefaultCodegen.camelize("$123", true), "$123"); - } - @Test public void testHasBodyParameter() throws Exception { final Schema refSchema = new Schema<>().$ref("#/components/schemas/Pet"); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/StringUtilsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/StringUtilsTest.java new file mode 100644 index 00000000000..cc920b9c6b6 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/StringUtilsTest.java @@ -0,0 +1,34 @@ +package org.openapitools.codegen.utils; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import static org.openapitools.codegen.utils.StringUtils.*; + +public class StringUtilsTest { + // we'll assume that underscore (Twitter elephant bird) works fine + + @Test + public void testCamelize() throws Exception { + Assert.assertEquals(camelize("abcd"), "Abcd"); + Assert.assertEquals(camelize("some-value"), "SomeValue"); + Assert.assertEquals(camelize("some_value"), "SomeValue"); + Assert.assertEquals(camelize("$type"), "$Type"); + + Assert.assertEquals(camelize("abcd", true), "abcd"); + Assert.assertEquals(camelize("some-value", true), "someValue"); + Assert.assertEquals(camelize("some_value", true), "someValue"); + Assert.assertEquals(camelize("Abcd", true), "abcd"); + Assert.assertEquals(camelize("$type", true), "$type"); + + Assert.assertEquals(camelize("123", true), "123"); + Assert.assertEquals(camelize("$123", true), "$123"); + } + + @Test + public void testDashize() { + Assert.assertEquals(dashize("abcd"), "abcd"); + Assert.assertEquals(dashize("some-value"), "some-value"); + Assert.assertEquals(dashize("some_value"), "some-value"); + } +} From 5745f6df704579986ed2ad97f41e3ed7d73e1442 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 30 Aug 2018 19:08:03 +0800 Subject: [PATCH 20/74] Prepare 3.2.3 release (#935) * update release version, disabled ensure up to date script * update release table * update stable version to 3.2.3 * update samples/meta-codegen/lib/pom.xml and release_version_update.sh --- CI/pom.xml.bash | 2 +- CI/pom.xml.circleci | 2 +- CI/pom.xml.circleci.java7 | 2 +- CI/pom.xml.ios | 2 +- README.md | 13 ++++++------- bin/utils/release_version_update.sh | 1 + modules/openapi-generator-cli/pom.xml | 2 +- modules/openapi-generator-gradle-plugin/README.adoc | 2 +- .../gradle.properties | 2 +- modules/openapi-generator-gradle-plugin/pom.xml | 2 +- .../samples/local-spec/README.md | 2 +- .../samples/local-spec/gradle.properties | 2 +- modules/openapi-generator-maven-plugin/README.md | 2 +- .../examples/java-client.xml | 2 +- .../examples/non-java-invalid-spec.xml | 2 +- .../examples/non-java.xml | 2 +- modules/openapi-generator-maven-plugin/pom.xml | 2 +- modules/openapi-generator-online/pom.xml | 2 +- modules/openapi-generator/pom.xml | 2 +- pom.xml | 2 +- samples/meta-codegen/lib/pom.xml | 2 +- shippable.yml | 2 +- 22 files changed, 27 insertions(+), 27 deletions(-) diff --git a/CI/pom.xml.bash b/CI/pom.xml.bash index 20c9a7cbcec..3b8c40db5c3 100644 --- a/CI/pom.xml.bash +++ b/CI/pom.xml.bash @@ -9,7 +9,7 @@ openapi-generator-project pom openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 https://github.com/openapi-tools/openapi-generator scm:git:git@github.com:openapi-tools/openapi-generator.git diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index 072235afd59..ce3d4f9515b 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -10,7 +10,7 @@ openapi-generator-project pom openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 https://github.com/openapitools/openapi-generator scm:git:git@github.com:openapitools/openapi-generator.git diff --git a/CI/pom.xml.circleci.java7 b/CI/pom.xml.circleci.java7 index b4567fa1aa0..2c9d1848a21 100644 --- a/CI/pom.xml.circleci.java7 +++ b/CI/pom.xml.circleci.java7 @@ -10,7 +10,7 @@ openapi-generator-project pom openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 https://github.com/openapitools/openapi-generator scm:git:git@github.com:openapitools/openapi-generator.git diff --git a/CI/pom.xml.ios b/CI/pom.xml.ios index 227f808f771..9e8a49f2a79 100644 --- a/CI/pom.xml.ios +++ b/CI/pom.xml.ios @@ -9,7 +9,7 @@ openapi-generator-project pom openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 https://github.com/openapitools/openapi-generator scm:git:git@github.com:openapitools/openapi-generator.git diff --git a/README.md b/README.md index 8352b8529b9..57aadbcb366 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

-[Master](https://github.com/OpenAPITools/openapi-generator/tree/master) (`3.2.3`): [![Build Status](https://img.shields.io/travis/OpenAPITools/openapi-generator/master.svg?label=Integration%20Test)](https://travis-ci.org/OpenAPITools/openapi-generator) +[Master](https://github.com/OpenAPITools/openapi-generator/tree/master) (`3.3.0`): [![Build Status](https://img.shields.io/travis/OpenAPITools/openapi-generator/master.svg?label=Integration%20Test)](https://travis-ci.org/OpenAPITools/openapi-generator) [![Integration Test2](https://circleci.com/gh/OpenAPITools/openapi-generator.svg?style=shield)](https://circleci.com/gh/OpenAPITools/openapi-generator) [![Run Status](https://api.shippable.com/projects/5af6bf74e790f4070084a115/badge?branch=master)](https://app.shippable.com/github/OpenAPITools/openapi-generator) [![Windows Test](https://ci.appveyor.com/api/projects/status/github/openapitools/openapi-generator?branch=master&svg=true&passingText=Windows%20Test%20-%20OK&failingText=Windows%20Test%20-%20Fails)](https://ci.appveyor.com/project/WilliamCheng/openapi-generator-wh2wu) @@ -83,9 +83,8 @@ The OpenAPI Specification has undergone 3 revisions since initial creation in 20 OpenAPI Generator Version | Release Date | Notes ---------------------------- | ------------ | ----- 4.0.0 (upcoming major release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/4.0.0-SNAPSHOT/)| TBD | Major release with breaking changes (no fallback) -3.3.0 (upcoming minor release)| TBD | Minor release (breaking changes with fallbacks) -3.2.3 (current master, upcoming patch release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/3.2.3-SNAPSHOT/)| TBD | Bugfix release -[3.2.2](https://github.com/OpenAPITools/openapi-generator/releases/tag/v3.2.2) (latest stable release) | 22.08.2018 | Bugfix release +3.3.0 (current master, upcoming minor release) [SNAPSHOT](https://oss.sonatype.org/content/repositories/snapshots/org/openapitools/openapi-generator-cli/3.3.0-SNAPSHOT/) | 07.09.2018 | Minor release (breaking changes with fallbacks) +[3.2.3](https://github.com/OpenAPITools/openapi-generator/releases/tag/v3.2.3) (latest stable release) | 30.08.2018 | Bugfix release OpenAPI Spec compatibility: 1.0, 1.1, 1.2, 2.0, 3.0 @@ -141,16 +140,16 @@ See the different versions of the [openapi-generator-cli](https://mvnrepository. If you're looking for the latest stable version, you can grab it directly from Maven.org (Java 8 runtime at a minimum): -JAR location: `http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.2/openapi-generator-cli-3.2.2.jar` +JAR location: `http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.3/openapi-generator-cli-3.2.3.jar` For **Mac/Linux** users: ```sh -wget http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.2/openapi-generator-cli-3.2.2.jar -O openapi-generator-cli.jar +wget http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.3/openapi-generator-cli-3.2.3.jar -O openapi-generator-cli.jar ``` For **Windows** users, you will need to install [wget](http://gnuwin32.sourceforge.net/packages/wget.htm) or you can use Invoke-WebRequest in PowerShell (3.0+), e.g. ``` -Invoke-WebRequest -OutFile openapi-generator-cli.jar http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.2/openapi-generator-cli-3.2.2.jar +Invoke-WebRequest -OutFile openapi-generator-cli.jar http://central.maven.org/maven2/org/openapitools/openapi-generator-cli/3.2.3/openapi-generator-cli-3.2.3.jar ``` After downloading the JAR, run `java -jar openapi-generator-cli.jar help` to show the usage. diff --git a/bin/utils/release_version_update.sh b/bin/utils/release_version_update.sh index 9705da54b94..bdc155fd439 100755 --- a/bin/utils/release_version_update.sh +++ b/bin/utils/release_version_update.sh @@ -45,6 +45,7 @@ declare -a files=("CI/pom.xml.bash" "modules/openapi-generator-maven-plugin/pom.xml" "modules/openapi-generator-online/pom.xml" "modules/openapi-generator/pom.xml" + "samples/meta-codegen/lib/pom.xml" "pom.xml") for filename in "${files[@]}"; do diff --git a/modules/openapi-generator-cli/pom.xml b/modules/openapi-generator-cli/pom.xml index 669f9ff0301..6b33c203c38 100644 --- a/modules/openapi-generator-cli/pom.xml +++ b/modules/openapi-generator-cli/pom.xml @@ -3,7 +3,7 @@ org.openapitools openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 ../.. 4.0.0 diff --git a/modules/openapi-generator-gradle-plugin/README.adoc b/modules/openapi-generator-gradle-plugin/README.adoc index c1fb0d0b8d2..0a57f093d37 100644 --- a/modules/openapi-generator-gradle-plugin/README.adoc +++ b/modules/openapi-generator-gradle-plugin/README.adoc @@ -48,7 +48,7 @@ buildscript { mavenCentral() } dependencies { - classpath "org.openapitools:openapi-generator-gradle-plugin:3.2.2" + classpath "org.openapitools:openapi-generator-gradle-plugin:3.2.3" } } diff --git a/modules/openapi-generator-gradle-plugin/gradle.properties b/modules/openapi-generator-gradle-plugin/gradle.properties index bad04d6f7ed..62489054e7a 100644 --- a/modules/openapi-generator-gradle-plugin/gradle.properties +++ b/modules/openapi-generator-gradle-plugin/gradle.properties @@ -1,4 +1,4 @@ -openApiGeneratorVersion=3.2.3-SNAPSHOT +openApiGeneratorVersion=3.2.3 # BEGIN placeholders # these are just placeholders to allow contributors to build directly diff --git a/modules/openapi-generator-gradle-plugin/pom.xml b/modules/openapi-generator-gradle-plugin/pom.xml index 3e46c5fd2f9..735c199de7f 100644 --- a/modules/openapi-generator-gradle-plugin/pom.xml +++ b/modules/openapi-generator-gradle-plugin/pom.xml @@ -3,7 +3,7 @@ org.openapitools openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 ../.. 4.0.0 diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md index 13889d521b8..c55e8814d87 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md @@ -17,5 +17,5 @@ gradle generateGoWithInvalidSpec The samples can be tested against other versions of the plugin using the `openApiGeneratorVersion` property. For example: ```bash -gradle -PopenApiGeneratorVersion=3.2.2 openApiValidate +gradle -PopenApiGeneratorVersion=3.2.3 openApiValidate ``` diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties b/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties index ed174a94c40..8d4fd896594 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/gradle.properties @@ -1 +1 @@ -openApiGeneratorVersion=3.2.2 +openApiGeneratorVersion=3.2.3 diff --git a/modules/openapi-generator-maven-plugin/README.md b/modules/openapi-generator-maven-plugin/README.md index 299ebbab346..6d07d84409b 100644 --- a/modules/openapi-generator-maven-plugin/README.md +++ b/modules/openapi-generator-maven-plugin/README.md @@ -11,7 +11,7 @@ Add to your `build->plugins` section (default phase is `generate-sources` phase) org.openapitools openapi-generator-maven-plugin - 3.2.2 + 3.2.3 diff --git a/modules/openapi-generator-maven-plugin/examples/java-client.xml b/modules/openapi-generator-maven-plugin/examples/java-client.xml index 05b285d9ce8..980ef564204 100644 --- a/modules/openapi-generator-maven-plugin/examples/java-client.xml +++ b/modules/openapi-generator-maven-plugin/examples/java-client.xml @@ -12,7 +12,7 @@ org.openapitools openapi-generator-maven-plugin - 3.2.2 + 3.2.3 diff --git a/modules/openapi-generator-maven-plugin/examples/non-java-invalid-spec.xml b/modules/openapi-generator-maven-plugin/examples/non-java-invalid-spec.xml index 35e5ce02e4a..d47a5b0899a 100644 --- a/modules/openapi-generator-maven-plugin/examples/non-java-invalid-spec.xml +++ b/modules/openapi-generator-maven-plugin/examples/non-java-invalid-spec.xml @@ -12,7 +12,7 @@ org.openapitools openapi-generator-maven-plugin - 3.2.2 + 3.2.3 diff --git a/modules/openapi-generator-maven-plugin/examples/non-java.xml b/modules/openapi-generator-maven-plugin/examples/non-java.xml index eece8d6efbe..919b933e9fc 100644 --- a/modules/openapi-generator-maven-plugin/examples/non-java.xml +++ b/modules/openapi-generator-maven-plugin/examples/non-java.xml @@ -12,7 +12,7 @@ org.openapitools openapi-generator-maven-plugin - 3.2.2 + 3.2.3 diff --git a/modules/openapi-generator-maven-plugin/pom.xml b/modules/openapi-generator-maven-plugin/pom.xml index c409c303d80..d3571b6b60d 100644 --- a/modules/openapi-generator-maven-plugin/pom.xml +++ b/modules/openapi-generator-maven-plugin/pom.xml @@ -4,7 +4,7 @@ org.openapitools openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 ../.. openapi-generator-maven-plugin diff --git a/modules/openapi-generator-online/pom.xml b/modules/openapi-generator-online/pom.xml index a2c07d1aa5a..ff300fce23c 100644 --- a/modules/openapi-generator-online/pom.xml +++ b/modules/openapi-generator-online/pom.xml @@ -3,7 +3,7 @@ org.openapitools openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 ../.. openapi-generator-online diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index 95266bfd356..d51d7ce8c5a 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -3,7 +3,7 @@ org.openapitools openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 ../.. 4.0.0 diff --git a/pom.xml b/pom.xml index 20f4aced9db..4b811858e55 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ openapi-generator-project pom openapi-generator-project - 3.2.3-SNAPSHOT + 3.2.3 https://github.com/openapitools/openapi-generator scm:git:git@github.com:openapitools/openapi-generator.git diff --git a/samples/meta-codegen/lib/pom.xml b/samples/meta-codegen/lib/pom.xml index 91bb6efc757..b2d69d52510 100644 --- a/samples/meta-codegen/lib/pom.xml +++ b/samples/meta-codegen/lib/pom.xml @@ -116,7 +116,7 @@ UTF-8 - 3.2.3-SNAPSHOT + 3.2.3 1.0.0 4.8.1 diff --git a/shippable.yml b/shippable.yml index efb7e072864..21476c33af7 100644 --- a/shippable.yml +++ b/shippable.yml @@ -12,7 +12,7 @@ build: ci: - mvn --quiet clean install # ensure all modifications created by 'mature' generators are in the git repo - - ./bin/utils/ensure-up-to-date + #- ./bin/utils/ensure-up-to-date # prepare environment for tests - sudo apt-get update -qq # install stack From f664938d8e508bc2bd199225c2128704178d09f0 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 30 Aug 2018 19:57:22 +0800 Subject: [PATCH 21/74] add back phplint tool: e75b115 --- .../src/main/resources/php-slim-server/README.mustache | 3 +++ .../src/main/resources/php-slim-server/composer.mustache | 3 ++- samples/server/petstore-security-test/php-slim/README.md | 3 +++ samples/server/petstore-security-test/php-slim/composer.json | 3 ++- samples/server/petstore/php-slim/README.md | 3 +++ samples/server/petstore/php-slim/composer.json | 3 ++- 6 files changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache index e7f587c78df..dfb808782b0 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/README.mustache @@ -34,6 +34,7 @@ This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check sour [Test folder]({{testBasePath}}) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- @@ -41,6 +42,8 @@ Command | Tool | Target `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests `$ composer run phpcs` | PHP CodeSniffer | All files +`$ composer run phplint` | phplint | All files + {{#generateApiDocs}} ## API Endpoints diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache index 1d47870e21c..66eca2a3088 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache @@ -22,6 +22,7 @@ ], "test-apis": "phpunit --testsuite Apis", "test-models": "phpunit --testsuite Models", - "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard={{phpcsStandard}}" + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard={{phpcsStandard}}", + "phplint": "phplint ./ --exclude=vendor" } } diff --git a/samples/server/petstore-security-test/php-slim/README.md b/samples/server/petstore-security-test/php-slim/README.md index af6b7748eff..20eb0877e19 100644 --- a/samples/server/petstore-security-test/php-slim/README.md +++ b/samples/server/petstore-security-test/php-slim/README.md @@ -34,6 +34,7 @@ This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check sour [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- @@ -41,6 +42,8 @@ Command | Tool | Target `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests `$ composer run phpcs` | PHP CodeSniffer | All files +`$ composer run phplint` | phplint | All files + ## API Endpoints diff --git a/samples/server/petstore-security-test/php-slim/composer.json b/samples/server/petstore-security-test/php-slim/composer.json index 6aea6b9b7c9..55c9498f40c 100644 --- a/samples/server/petstore-security-test/php-slim/composer.json +++ b/samples/server/petstore-security-test/php-slim/composer.json @@ -22,6 +22,7 @@ ], "test-apis": "phpunit --testsuite Apis", "test-models": "phpunit --testsuite Models", - "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12" + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12", + "phplint": "phplint ./ --exclude=vendor" } } diff --git a/samples/server/petstore/php-slim/README.md b/samples/server/petstore/php-slim/README.md index f898f384063..ff2ac3a4e68 100644 --- a/samples/server/petstore/php-slim/README.md +++ b/samples/server/petstore/php-slim/README.md @@ -34,6 +34,7 @@ This package uses PHPUnit 4.8 for unit testing and PHP Codesniffer to check sour [Test folder](test) contains templates which you can fill with real test assertions. How to write tests read at [PHPUnit Manual - Chapter 2. Writing Tests for PHPUnit](https://phpunit.de/manual/4.8/en/writing-tests-for-phpunit.html). How to configure PHP CodeSniffer read at [PHP CodeSniffer Documentation](https://github.com/squizlabs/PHP_CodeSniffer/wiki). +There is [phplint](https://github.com/overtrue/phplint) tool to check php syntax automatically. Command | Tool | Target ---- | ---- | ---- @@ -41,6 +42,8 @@ Command | Tool | Target `$ composer run test-apis` | PHPUnit | Apis tests `$ composer run test-models` | PHPUnit | Models tests `$ composer run phpcs` | PHP CodeSniffer | All files +`$ composer run phplint` | phplint | All files + ## API Endpoints diff --git a/samples/server/petstore/php-slim/composer.json b/samples/server/petstore/php-slim/composer.json index 6aea6b9b7c9..55c9498f40c 100644 --- a/samples/server/petstore/php-slim/composer.json +++ b/samples/server/petstore/php-slim/composer.json @@ -22,6 +22,7 @@ ], "test-apis": "phpunit --testsuite Apis", "test-models": "phpunit --testsuite Models", - "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12" + "phpcs": "phpcs ./ --ignore=vendor --warning-severity=0 --standard=PSR12", + "phplint": "phplint ./ --exclude=vendor" } } From fd83b2d4912a67db7ace3366209f5b54f279e836 Mon Sep 17 00:00:00 2001 From: cbornet Date: Thu, 30 Aug 2018 13:20:30 +0200 Subject: [PATCH 22/74] Make release script cross-compatible between Mac and Linux --- bin/utils/release_version_update.sh | 9 ++++++--- bin/utils/release_version_update_docs.sh | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/bin/utils/release_version_update.sh b/bin/utils/release_version_update.sh index bdc155fd439..72df433aa65 100755 --- a/bin/utils/release_version_update.sh +++ b/bin/utils/release_version_update.sh @@ -31,8 +31,6 @@ else exit 1; fi - -echo "IMPORTANT: this script works on Mac only" echo "Release preparation: replacing $FROM with $TO in different files" declare -a files=("CI/pom.xml.bash" @@ -48,10 +46,15 @@ declare -a files=("CI/pom.xml.bash" "samples/meta-codegen/lib/pom.xml" "pom.xml") +sedi () { + # Cross-platform version of sed -i that works both on Mac and Linux + sed --version >/dev/null 2>&1 && sed -i -e "$@" || sed -i "" "$@" +} + for filename in "${files[@]}"; do # e.g. sed -i '' "s/3.0.1-SNAPSHOT/3.0.1/g" CI/pom.xml.bash #echo "Running command: sed -i '' "s/$FROM/$TO/g" $filename" - if sed -i '' "s/$FROM/$TO/g" $filename; then + if sedi "s/$FROM/$TO/g" $filename; then echo "Updated $filename successfully!" else echo "ERROR: Failed to update $filename with the following command" diff --git a/bin/utils/release_version_update_docs.sh b/bin/utils/release_version_update_docs.sh index 0209e837a62..b77ad27c416 100755 --- a/bin/utils/release_version_update_docs.sh +++ b/bin/utils/release_version_update_docs.sh @@ -31,8 +31,6 @@ else exit 1; fi - -echo "IMPORTANT: this script works on Mac only" echo "Release preparation: replacing $FROM with $TO in different files" declare -a files=("modules/openapi-generator-maven-plugin/README.md" @@ -45,10 +43,15 @@ declare -a files=("modules/openapi-generator-maven-plugin/README.md" "modules/openapi-generator-gradle-plugin/samples/local-spec/README.md" "README.md") +sedi () { + # Cross-platform version of sed -i that works both on Mac and Linux + sed --version >/dev/null 2>&1 && sed -i -e "$@" || sed -i "" "$@" +} + for filename in "${files[@]}"; do # e.g. sed -i '' "s/3.0.1-SNAPSHOT/3.0.1/g" CI/pom.xml.bash #echo "Running command: sed -i '' "s/$FROM/$TO/g" $filename" - if sed -i '' "s/$FROM/$TO/g" $filename; then + if sedi "s/$FROM/$TO/g" $filename; then echo "Updated $filename successfully!" else echo "ERROR: Failed to update $filename with the following command" From e7c05f16db468c12da796e49f44f5b7b88ab0e9a Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 30 Aug 2018 20:25:56 +0800 Subject: [PATCH 23/74] update samples, re-enable ensure-up-to-date --- .../petstore/java/retrofit2-play26/.openapi-generator/VERSION | 2 +- samples/meta-codegen/lib/pom.xml | 2 +- samples/meta-codegen/usage/.openapi-generator/VERSION | 2 +- shippable.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION b/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION +++ b/samples/client/petstore/java/retrofit2-play26/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/meta-codegen/lib/pom.xml b/samples/meta-codegen/lib/pom.xml index b2d69d52510..ead5db52eaa 100644 --- a/samples/meta-codegen/lib/pom.xml +++ b/samples/meta-codegen/lib/pom.xml @@ -116,7 +116,7 @@ UTF-8 - 3.2.3 + 3.3.0-SNAPSHOT 1.0.0 4.8.1 diff --git a/samples/meta-codegen/usage/.openapi-generator/VERSION b/samples/meta-codegen/usage/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/meta-codegen/usage/.openapi-generator/VERSION +++ b/samples/meta-codegen/usage/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/shippable.yml b/shippable.yml index 21476c33af7..efb7e072864 100644 --- a/shippable.yml +++ b/shippable.yml @@ -12,7 +12,7 @@ build: ci: - mvn --quiet clean install # ensure all modifications created by 'mature' generators are in the git repo - #- ./bin/utils/ensure-up-to-date + - ./bin/utils/ensure-up-to-date # prepare environment for tests - sudo apt-get update -qq # install stack From f95dfbef75f516ba23064585bae3b06c6c1871ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Fri, 31 Aug 2018 09:16:41 +0200 Subject: [PATCH 24/74] Move "ensure-up-to-date" execution to CircleCI (#944) --- CI/circle_parallel.sh | 3 +++ circle.yml | 2 +- shippable.yml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CI/circle_parallel.sh b/CI/circle_parallel.sh index 3487a09bf6e..95b47adcebc 100755 --- a/CI/circle_parallel.sh +++ b/CI/circle_parallel.sh @@ -8,6 +8,9 @@ if [ "$NODE_INDEX" = "1" ]; then cp CI/pom.xml.circleci pom.xml java -version mvn --quiet verify -Psamples +elif [ "$NODE_INDEX" = "2" ]; then + echo "Running node $NODE_INDEX to test ensure-up-to-date" + ./bin/utils/ensure-up-to-date else echo "Running node $NODE_INDEX to test CI/pom.xml.circleci.java7 ..." sudo update-java-alternatives -s java-1.7.0-openjdk-amd64 diff --git a/circle.yml b/circle.yml index bfbe40bcedd..cd331d259d7 100644 --- a/circle.yml +++ b/circle.yml @@ -10,7 +10,7 @@ jobs: machine: docker_layer_caching: true working_directory: ~/OpenAPITools/openapi-generator - parallelism: 2 + parallelism: 3 shell: /bin/bash --login environment: CIRCLE_ARTIFACTS: /tmp/circleci-artifacts diff --git a/shippable.yml b/shippable.yml index efb7e072864..7b48208fe8c 100644 --- a/shippable.yml +++ b/shippable.yml @@ -12,7 +12,7 @@ build: ci: - mvn --quiet clean install # ensure all modifications created by 'mature' generators are in the git repo - - ./bin/utils/ensure-up-to-date + # moved to CircleCI ./bin/utils/ensure-up-to-date # prepare environment for tests - sudo apt-get update -qq # install stack From dd35acdb92486a96c214dd7e1bcef51e02f93809 Mon Sep 17 00:00:00 2001 From: Jeremie Bresson Date: Fri, 31 Aug 2018 10:26:10 +0200 Subject: [PATCH 25/74] Remove version in the copied jar Modification introduced on "master" was dropped in "3.3.x" with merge commit 3b2951b305b40f3de5361474c845c9902fed3394 --- modules/openapi-generator-online/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator-online/Dockerfile b/modules/openapi-generator-online/Dockerfile index 7d6fa53218e..59cc5813555 100644 --- a/modules/openapi-generator-online/Dockerfile +++ b/modules/openapi-generator-online/Dockerfile @@ -2,7 +2,7 @@ FROM openjdk:8-jre-alpine WORKDIR /generator -COPY target/openapi-generator-online-3.3.0-SNAPSHOT.jar /generator/openapi-generator-online.jar +COPY target/openapi-generator-online.jar /generator/openapi-generator-online.jar ENV GENERATOR_HOST=http://localhost From 5ad471cc6e85b01303c8021f292e001fbfb8734b Mon Sep 17 00:00:00 2001 From: William Cheng Date: Fri, 31 Aug 2018 20:34:06 +0800 Subject: [PATCH 26/74] add back overtrue/phplint to php slim --- .../src/main/resources/php-slim-server/composer.mustache | 1 + samples/server/petstore-security-test/php-slim/composer.json | 1 + samples/server/petstore/php-slim/composer.json | 1 + 3 files changed, 3 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache index 66eca2a3088..90e61d50f0f 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/composer.mustache @@ -7,6 +7,7 @@ }, "require-dev": { "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0", "squizlabs/php_codesniffer": "^3.0" }, "autoload": { diff --git a/samples/server/petstore-security-test/php-slim/composer.json b/samples/server/petstore-security-test/php-slim/composer.json index 55c9498f40c..1c4e6a790f8 100644 --- a/samples/server/petstore-security-test/php-slim/composer.json +++ b/samples/server/petstore-security-test/php-slim/composer.json @@ -7,6 +7,7 @@ }, "require-dev": { "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0", "squizlabs/php_codesniffer": "^3.0" }, "autoload": { diff --git a/samples/server/petstore/php-slim/composer.json b/samples/server/petstore/php-slim/composer.json index 55c9498f40c..1c4e6a790f8 100644 --- a/samples/server/petstore/php-slim/composer.json +++ b/samples/server/petstore/php-slim/composer.json @@ -7,6 +7,7 @@ }, "require-dev": { "phpunit/phpunit": "^4.8", + "overtrue/phplint": "^1.0", "squizlabs/php_codesniffer": "^3.0" }, "autoload": { From 6bc3c7011545c447b4036a35f325e0b761b430eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthieu=20Berthom=C3=A9?= Date: Fri, 31 Aug 2018 15:35:37 +0200 Subject: [PATCH 27/74] [PYTHON] Api doc python with multiple authentications (#928) * [PYTHON] better code snippet for API usage with authentication * update python samples --- .../main/resources/python/api_doc.mustache | 43 +++---------------- .../resources/python/api_doc_example.mustache | 40 +++++++++++++++++ .../python-asyncio/.openapi-generator/VERSION | 2 +- .../petstore/python-asyncio/docs/FakeApi.md | 2 + .../docs/FakeClassnameTags123Api.md | 2 + .../petstore/python-asyncio/docs/PetApi.md | 18 ++++++++ .../petstore/python-asyncio/docs/StoreApi.md | 2 + .../python-tornado/.openapi-generator/VERSION | 2 +- .../petstore/python-tornado/docs/FakeApi.md | 2 + .../docs/FakeClassnameTags123Api.md | 2 + .../petstore/python-tornado/docs/PetApi.md | 18 ++++++++ .../petstore/python-tornado/docs/StoreApi.md | 2 + .../python/.openapi-generator/VERSION | 2 +- .../client/petstore/python/docs/FakeApi.md | 2 + .../python/docs/FakeClassnameTags123Api.md | 2 + samples/client/petstore/python/docs/PetApi.md | 18 ++++++++ .../client/petstore/python/docs/StoreApi.md | 2 + 17 files changed, 120 insertions(+), 41 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/python/api_doc_example.mustache diff --git a/modules/openapi-generator/src/main/resources/python/api_doc.mustache b/modules/openapi-generator/src/main/resources/python/api_doc.mustache index 32c26d929d1..c16779a5f96 100644 --- a/modules/openapi-generator/src/main/resources/python/api_doc.mustache +++ b/modules/openapi-generator/src/main/resources/python/api_doc.mustache @@ -18,47 +18,14 @@ Method | HTTP request | Description {{{notes}}}{{/notes}} ### Example -```python -from __future__ import print_function -import time -import {{{packageName}}} -from {{{packageName}}}.rest import ApiException -from pprint import pprint -{{#hasAuthMethods}}{{#authMethods}}{{#isBasic}} -# Configure HTTP basic authorization: {{{name}}} -configuration = {{{packageName}}}.Configuration() -configuration.username = 'YOUR_USERNAME' -configuration.password = 'YOUR_PASSWORD'{{/isBasic}}{{#isApiKey}} -# Configure API key authorization: {{{name}}} -configuration = {{{packageName}}}.Configuration() -configuration.api_key['{{{keyParamName}}}'] = 'YOUR_API_KEY' -# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed -# configuration.api_key_prefix['{{{keyParamName}}}'] = 'Bearer'{{/isApiKey}}{{#isOAuth}} -# Configure OAuth2 access token for authorization: {{{name}}} -configuration = {{{packageName}}}.Configuration() -configuration.access_token = 'YOUR_ACCESS_TOKEN'{{/isOAuth}}{{/authMethods}} - -# create an instance of the API class -api_instance = {{{packageName}}}.{{{classname}}}({{{packageName}}}.ApiClient(configuration)) -{{#allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{^required}} (optional){{/required}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}} -{{/allParams}} +{{#hasAuthMethods}}{{#authMethods}} +{{#isBasic}}* Basic Authentication ({{name}}): {{/isBasic }}{{#isApiKey}}* Api Key Authentication ({{name}}): {{/isApiKey }}{{#isOAuth}}* OAuth Authentication ({{name}}): {{/isOAuth }} +{{> api_doc_example }} +{{/authMethods}} {{/hasAuthMethods}} {{^hasAuthMethods}} - -# create an instance of the API class -api_instance = {{{packageName}}}.{{{classname}}}() -{{#allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{^required}} (optional){{/required}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}} -{{/allParams}} +{{> api_doc_example }} {{/hasAuthMethods}} - -try: -{{#summary}} # {{{.}}} -{{/summary}} {{#returnType}}api_response = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{#required}}{{paramName}}{{/required}}{{^required}}{{paramName}}={{paramName}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}){{#returnType}} - pprint(api_response){{/returnType}} -except ApiException as e: - print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e) -``` - ### Parameters {{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}} Name | Type | Description | Notes diff --git a/modules/openapi-generator/src/main/resources/python/api_doc_example.mustache b/modules/openapi-generator/src/main/resources/python/api_doc_example.mustache new file mode 100644 index 00000000000..42e0f32bf73 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/python/api_doc_example.mustache @@ -0,0 +1,40 @@ +```python +from __future__ import print_function +import time +import {{{packageName}}} +from {{{packageName}}}.rest import ApiException +from pprint import pprint +{{#hasAuthMethods}}{{#isBasic}} +# Configure HTTP basic authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.username = 'YOUR_USERNAME' +configuration.password = 'YOUR_PASSWORD'{{/isBasic}}{{#isApiKey}} +# Configure API key authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.api_key['{{{keyParamName}}}'] = 'YOUR_API_KEY' +# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed +# configuration.api_key_prefix['{{{keyParamName}}}'] = 'Bearer'{{/isApiKey}}{{#isOAuth}} +# Configure OAuth2 access token for authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.access_token = 'YOUR_ACCESS_TOKEN'{{/isOAuth}} + +# create an instance of the API class +api_instance = {{{packageName}}}.{{{classname}}}({{{packageName}}}.ApiClient(configuration)) +{{#allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{^required}} (optional){{/required}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}} +{{/allParams}} +{{/hasAuthMethods}} +{{^hasAuthMethods}} + +# create an instance of the API class +api_instance = {{{packageName}}}.{{{classname}}}() +{{#allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{^required}} (optional){{/required}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}} +{{/allParams}} +{{/hasAuthMethods}} + +try: +{{#summary}} # {{{.}}} +{{/summary}} {{#returnType}}api_response = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{#required}}{{paramName}}{{/required}}{{^required}}{{paramName}}={{paramName}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}){{#returnType}} + pprint(api_response){{/returnType}} +except ApiException as e: + print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e) +``` diff --git a/samples/client/petstore/python-asyncio/.openapi-generator/VERSION b/samples/client/petstore/python-asyncio/.openapi-generator/VERSION index c791c986fbb..105bb87d77b 100644 --- a/samples/client/petstore/python-asyncio/.openapi-generator/VERSION +++ b/samples/client/petstore/python-asyncio/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/python-asyncio/docs/FakeApi.md b/samples/client/petstore/python-asyncio/docs/FakeApi.md index 3510abda8b7..57cf9937d36 100644 --- a/samples/client/petstore/python-asyncio/docs/FakeApi.md +++ b/samples/client/petstore/python-asyncio/docs/FakeApi.md @@ -353,6 +353,8 @@ Fake endpoint for testing various parameters 假端點 偽のエンドポイン Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ### Example + +* Basic Authentication (http_basic_test): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-asyncio/docs/FakeClassnameTags123Api.md b/samples/client/petstore/python-asyncio/docs/FakeClassnameTags123Api.md index 34d44991ff9..3180674a077 100644 --- a/samples/client/petstore/python-asyncio/docs/FakeClassnameTags123Api.md +++ b/samples/client/petstore/python-asyncio/docs/FakeClassnameTags123Api.md @@ -15,6 +15,8 @@ To test class name in snake case To test class name in snake case ### Example + +* Api Key Authentication (api_key_query): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-asyncio/docs/PetApi.md b/samples/client/petstore/python-asyncio/docs/PetApi.md index 9b8fd577a52..726db4708d7 100644 --- a/samples/client/petstore/python-asyncio/docs/PetApi.md +++ b/samples/client/petstore/python-asyncio/docs/PetApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description Add a new pet to the store ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -70,6 +72,8 @@ void (empty response body) Deletes a pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -123,6 +127,8 @@ Finds Pets by status Multiple status values can be provided with comma separated strings ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -175,6 +181,8 @@ Finds Pets by tags Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -227,6 +235,8 @@ Find pet by ID Returns a single pet ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time @@ -279,6 +289,8 @@ Name | Type | Description | Notes Update an existing pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -328,6 +340,8 @@ void (empty response body) Updates a pet in the store with form data ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -381,6 +395,8 @@ void (empty response body) uploads an image ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -435,6 +451,8 @@ Name | Type | Description | Notes uploads an image (required) ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-asyncio/docs/StoreApi.md b/samples/client/petstore/python-asyncio/docs/StoreApi.md index e4d6a7a8885..ab342460f86 100644 --- a/samples/client/petstore/python-asyncio/docs/StoreApi.md +++ b/samples/client/petstore/python-asyncio/docs/StoreApi.md @@ -65,6 +65,8 @@ Returns pet inventories by status Returns a map of status codes to quantities ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-tornado/.openapi-generator/VERSION b/samples/client/petstore/python-tornado/.openapi-generator/VERSION index c791c986fbb..105bb87d77b 100644 --- a/samples/client/petstore/python-tornado/.openapi-generator/VERSION +++ b/samples/client/petstore/python-tornado/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/python-tornado/docs/FakeApi.md b/samples/client/petstore/python-tornado/docs/FakeApi.md index 3510abda8b7..57cf9937d36 100644 --- a/samples/client/petstore/python-tornado/docs/FakeApi.md +++ b/samples/client/petstore/python-tornado/docs/FakeApi.md @@ -353,6 +353,8 @@ Fake endpoint for testing various parameters 假端點 偽のエンドポイン Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ### Example + +* Basic Authentication (http_basic_test): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-tornado/docs/FakeClassnameTags123Api.md b/samples/client/petstore/python-tornado/docs/FakeClassnameTags123Api.md index 34d44991ff9..3180674a077 100644 --- a/samples/client/petstore/python-tornado/docs/FakeClassnameTags123Api.md +++ b/samples/client/petstore/python-tornado/docs/FakeClassnameTags123Api.md @@ -15,6 +15,8 @@ To test class name in snake case To test class name in snake case ### Example + +* Api Key Authentication (api_key_query): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-tornado/docs/PetApi.md b/samples/client/petstore/python-tornado/docs/PetApi.md index 9b8fd577a52..726db4708d7 100644 --- a/samples/client/petstore/python-tornado/docs/PetApi.md +++ b/samples/client/petstore/python-tornado/docs/PetApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description Add a new pet to the store ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -70,6 +72,8 @@ void (empty response body) Deletes a pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -123,6 +127,8 @@ Finds Pets by status Multiple status values can be provided with comma separated strings ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -175,6 +181,8 @@ Finds Pets by tags Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -227,6 +235,8 @@ Find pet by ID Returns a single pet ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time @@ -279,6 +289,8 @@ Name | Type | Description | Notes Update an existing pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -328,6 +340,8 @@ void (empty response body) Updates a pet in the store with form data ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -381,6 +395,8 @@ void (empty response body) uploads an image ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -435,6 +451,8 @@ Name | Type | Description | Notes uploads an image (required) ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python-tornado/docs/StoreApi.md b/samples/client/petstore/python-tornado/docs/StoreApi.md index e4d6a7a8885..ab342460f86 100644 --- a/samples/client/petstore/python-tornado/docs/StoreApi.md +++ b/samples/client/petstore/python-tornado/docs/StoreApi.md @@ -65,6 +65,8 @@ Returns pet inventories by status Returns a map of status codes to quantities ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python/.openapi-generator/VERSION b/samples/client/petstore/python/.openapi-generator/VERSION index c791c986fbb..105bb87d77b 100644 --- a/samples/client/petstore/python/.openapi-generator/VERSION +++ b/samples/client/petstore/python/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/python/docs/FakeApi.md b/samples/client/petstore/python/docs/FakeApi.md index 3510abda8b7..57cf9937d36 100644 --- a/samples/client/petstore/python/docs/FakeApi.md +++ b/samples/client/petstore/python/docs/FakeApi.md @@ -353,6 +353,8 @@ Fake endpoint for testing various parameters 假端點 偽のエンドポイン Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ### Example + +* Basic Authentication (http_basic_test): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python/docs/FakeClassnameTags123Api.md b/samples/client/petstore/python/docs/FakeClassnameTags123Api.md index 34d44991ff9..3180674a077 100644 --- a/samples/client/petstore/python/docs/FakeClassnameTags123Api.md +++ b/samples/client/petstore/python/docs/FakeClassnameTags123Api.md @@ -15,6 +15,8 @@ To test class name in snake case To test class name in snake case ### Example + +* Api Key Authentication (api_key_query): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python/docs/PetApi.md b/samples/client/petstore/python/docs/PetApi.md index 9b8fd577a52..726db4708d7 100644 --- a/samples/client/petstore/python/docs/PetApi.md +++ b/samples/client/petstore/python/docs/PetApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description Add a new pet to the store ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -70,6 +72,8 @@ void (empty response body) Deletes a pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -123,6 +127,8 @@ Finds Pets by status Multiple status values can be provided with comma separated strings ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -175,6 +181,8 @@ Finds Pets by tags Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -227,6 +235,8 @@ Find pet by ID Returns a single pet ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time @@ -279,6 +289,8 @@ Name | Type | Description | Notes Update an existing pet ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -328,6 +340,8 @@ void (empty response body) Updates a pet in the store with form data ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -381,6 +395,8 @@ void (empty response body) uploads an image ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time @@ -435,6 +451,8 @@ Name | Type | Description | Notes uploads an image (required) ### Example + +* OAuth Authentication (petstore_auth): ```python from __future__ import print_function import time diff --git a/samples/client/petstore/python/docs/StoreApi.md b/samples/client/petstore/python/docs/StoreApi.md index e4d6a7a8885..ab342460f86 100644 --- a/samples/client/petstore/python/docs/StoreApi.md +++ b/samples/client/petstore/python/docs/StoreApi.md @@ -65,6 +65,8 @@ Returns pet inventories by status Returns a map of status codes to quantities ### Example + +* Api Key Authentication (api_key): ```python from __future__ import print_function import time From 31149a5a6965f3b23329afcc7682259ce0dc7da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Fri, 31 Aug 2018 16:00:27 +0200 Subject: [PATCH 28/74] Publish documentation for the generators (#932) --- bin/utils/ensure-up-to-date | 1 + bin/utils/export_docs_generators.sh | 11 ++ bin/utils/export_generator.sh | 17 ++ bin/utils/export_generators_readme.sh | 8 + docs/generators/README.md | 109 +++++++++++ docs/generators/ada-server.md | 19 ++ docs/generators/ada.md | 19 ++ docs/generators/android.md | 57 ++++++ docs/generators/apache2.md | 19 ++ docs/generators/apex.md | 28 +++ docs/generators/aspnetcore.md | 31 ++++ docs/generators/bash.md | 40 +++++ docs/generators/clojure.md | 37 ++++ docs/generators/cpp-pistache-server.md | 7 + docs/generators/cpp-qt5-qhttpengine-server.md | 19 ++ docs/generators/cpp-qt5.md | 22 +++ docs/generators/cpp-restbed-server.md | 19 ++ docs/generators/cpp-restsdk.md | 22 +++ docs/generators/cpp-tizen.md | 16 ++ docs/generators/csharp-dotnet2.md | 13 ++ docs/generators/csharp-nancyfx.md | 46 +++++ docs/generators/csharp.md | 72 ++++++++ docs/generators/cwiki.md | 46 +++++ docs/generators/dart.md | 34 ++++ docs/generators/dynamic-html.md | 28 +++ docs/generators/eiffel.md | 13 ++ docs/generators/elixir.md | 25 +++ docs/generators/elm.md | 4 + docs/generators/erlang-client.md | 10 ++ docs/generators/erlang-server.md | 7 + docs/generators/flash.md | 16 ++ docs/generators/go-server.md | 10 ++ docs/generators/go.md | 22 +++ docs/generators/groovy.md | 110 ++++++++++++ docs/generators/haskell-http-client.md | 73 ++++++++ docs/generators/haskell.md | 22 +++ docs/generators/html.md | 46 +++++ docs/generators/html2.md | 58 ++++++ docs/generators/java-inflector.md | 107 +++++++++++ docs/generators/java-msf4j.md | 124 +++++++++++++ docs/generators/java-pkmst.md | 137 ++++++++++++++ docs/generators/java-play-framework.md | 134 ++++++++++++++ docs/generators/java-undertow-server.md | 107 +++++++++++ docs/generators/java-vertx.md | 113 ++++++++++++ docs/generators/java.md | 152 ++++++++++++++++ docs/generators/javascript-closure-angular.md | 22 +++ docs/generators/javascript-flowtyped.md | 34 ++++ docs/generators/javascript.md | 67 +++++++ docs/generators/jaxrs-cxf-cdi.md | 138 ++++++++++++++ docs/generators/jaxrs-cxf-client.md | 119 ++++++++++++ docs/generators/jaxrs-cxf.md | 170 ++++++++++++++++++ docs/generators/jaxrs-jersey.md | 130 ++++++++++++++ docs/generators/jaxrs-resteasy-eap.md | 128 +++++++++++++ docs/generators/jaxrs-resteasy.md | 122 +++++++++++++ docs/generators/jaxrs-spec.md | 135 ++++++++++++++ docs/generators/jmeter.md | 16 ++ docs/generators/kotlin-server.md | 41 +++++ docs/generators/kotlin-spring.md | 59 ++++++ docs/generators/kotlin.md | 28 +++ docs/generators/lua.md | 13 ++ docs/generators/nodejs-server.md | 25 +++ docs/generators/objc.md | 28 +++ docs/generators/openapi-yaml.md | 19 ++ docs/generators/openapi.md | 16 ++ docs/generators/perl.md | 22 +++ docs/generators/php-laravel.md | 43 +++++ docs/generators/php-lumen.md | 43 +++++ docs/generators/php-silex.md | 16 ++ docs/generators/php-slim.md | 46 +++++ docs/generators/php-symfony.md | 58 ++++++ docs/generators/php-ze-ph.md | 43 +++++ docs/generators/php.md | 52 ++++++ docs/generators/powershell.md | 13 ++ docs/generators/python-flask.md | 34 ++++ docs/generators/python.md | 28 +++ docs/generators/r.md | 13 ++ docs/generators/ruby-on-rails.md | 7 + docs/generators/ruby-sinatra.md | 4 + docs/generators/ruby.md | 49 +++++ docs/generators/rust-server.md | 10 ++ docs/generators/rust.md | 13 ++ docs/generators/scala-akka.md | 28 +++ docs/generators/scala-finch.md | 13 ++ docs/generators/scala-gatling.md | 25 +++ docs/generators/scala-httpclient.md | 28 +++ docs/generators/scala-lagom-server.md | 28 +++ docs/generators/scalatra.md | 25 +++ docs/generators/scalaz.md | 28 +++ docs/generators/spring.md | 161 +++++++++++++++++ docs/generators/swift2-deprecated.md | 64 +++++++ docs/generators/swift3.md | 70 ++++++++ docs/generators/swift4.md | 70 ++++++++ docs/generators/typescript-angular.md | 58 ++++++ docs/generators/typescript-angularjs.md | 22 +++ docs/generators/typescript-aurelia.md | 28 +++ docs/generators/typescript-fetch.md | 37 ++++ docs/generators/typescript-inversify.md | 43 +++++ docs/generators/typescript-jquery.md | 37 ++++ docs/generators/typescript-node.md | 34 ++++ 99 files changed, 4633 insertions(+) create mode 100755 bin/utils/export_docs_generators.sh create mode 100755 bin/utils/export_generator.sh create mode 100755 bin/utils/export_generators_readme.sh create mode 100644 docs/generators/README.md create mode 100644 docs/generators/ada-server.md create mode 100644 docs/generators/ada.md create mode 100644 docs/generators/android.md create mode 100644 docs/generators/apache2.md create mode 100644 docs/generators/apex.md create mode 100644 docs/generators/aspnetcore.md create mode 100644 docs/generators/bash.md create mode 100644 docs/generators/clojure.md create mode 100644 docs/generators/cpp-pistache-server.md create mode 100644 docs/generators/cpp-qt5-qhttpengine-server.md create mode 100644 docs/generators/cpp-qt5.md create mode 100644 docs/generators/cpp-restbed-server.md create mode 100644 docs/generators/cpp-restsdk.md create mode 100644 docs/generators/cpp-tizen.md create mode 100644 docs/generators/csharp-dotnet2.md create mode 100644 docs/generators/csharp-nancyfx.md create mode 100644 docs/generators/csharp.md create mode 100644 docs/generators/cwiki.md create mode 100644 docs/generators/dart.md create mode 100644 docs/generators/dynamic-html.md create mode 100644 docs/generators/eiffel.md create mode 100644 docs/generators/elixir.md create mode 100644 docs/generators/elm.md create mode 100644 docs/generators/erlang-client.md create mode 100644 docs/generators/erlang-server.md create mode 100644 docs/generators/flash.md create mode 100644 docs/generators/go-server.md create mode 100644 docs/generators/go.md create mode 100644 docs/generators/groovy.md create mode 100644 docs/generators/haskell-http-client.md create mode 100644 docs/generators/haskell.md create mode 100644 docs/generators/html.md create mode 100644 docs/generators/html2.md create mode 100644 docs/generators/java-inflector.md create mode 100644 docs/generators/java-msf4j.md create mode 100644 docs/generators/java-pkmst.md create mode 100644 docs/generators/java-play-framework.md create mode 100644 docs/generators/java-undertow-server.md create mode 100644 docs/generators/java-vertx.md create mode 100644 docs/generators/java.md create mode 100644 docs/generators/javascript-closure-angular.md create mode 100644 docs/generators/javascript-flowtyped.md create mode 100644 docs/generators/javascript.md create mode 100644 docs/generators/jaxrs-cxf-cdi.md create mode 100644 docs/generators/jaxrs-cxf-client.md create mode 100644 docs/generators/jaxrs-cxf.md create mode 100644 docs/generators/jaxrs-jersey.md create mode 100644 docs/generators/jaxrs-resteasy-eap.md create mode 100644 docs/generators/jaxrs-resteasy.md create mode 100644 docs/generators/jaxrs-spec.md create mode 100644 docs/generators/jmeter.md create mode 100644 docs/generators/kotlin-server.md create mode 100644 docs/generators/kotlin-spring.md create mode 100644 docs/generators/kotlin.md create mode 100644 docs/generators/lua.md create mode 100644 docs/generators/nodejs-server.md create mode 100644 docs/generators/objc.md create mode 100644 docs/generators/openapi-yaml.md create mode 100644 docs/generators/openapi.md create mode 100644 docs/generators/perl.md create mode 100644 docs/generators/php-laravel.md create mode 100644 docs/generators/php-lumen.md create mode 100644 docs/generators/php-silex.md create mode 100644 docs/generators/php-slim.md create mode 100644 docs/generators/php-symfony.md create mode 100644 docs/generators/php-ze-ph.md create mode 100644 docs/generators/php.md create mode 100644 docs/generators/powershell.md create mode 100644 docs/generators/python-flask.md create mode 100644 docs/generators/python.md create mode 100644 docs/generators/r.md create mode 100644 docs/generators/ruby-on-rails.md create mode 100644 docs/generators/ruby-sinatra.md create mode 100644 docs/generators/ruby.md create mode 100644 docs/generators/rust-server.md create mode 100644 docs/generators/rust.md create mode 100644 docs/generators/scala-akka.md create mode 100644 docs/generators/scala-finch.md create mode 100644 docs/generators/scala-gatling.md create mode 100644 docs/generators/scala-httpclient.md create mode 100644 docs/generators/scala-lagom-server.md create mode 100644 docs/generators/scalatra.md create mode 100644 docs/generators/scalaz.md create mode 100644 docs/generators/spring.md create mode 100644 docs/generators/swift2-deprecated.md create mode 100644 docs/generators/swift3.md create mode 100644 docs/generators/swift4.md create mode 100644 docs/generators/typescript-angular.md create mode 100644 docs/generators/typescript-angularjs.md create mode 100644 docs/generators/typescript-aurelia.md create mode 100644 docs/generators/typescript-fetch.md create mode 100644 docs/generators/typescript-inversify.md create mode 100644 docs/generators/typescript-jquery.md create mode 100644 docs/generators/typescript-node.md diff --git a/bin/utils/ensure-up-to-date b/bin/utils/ensure-up-to-date index e29fed7643c..4f8e213f976 100755 --- a/bin/utils/ensure-up-to-date +++ b/bin/utils/ensure-up-to-date @@ -33,6 +33,7 @@ sleep 5 ./bin/openapi3/haskell-http-client-petstore.sh > /dev/null 2>&1 ./bin/csharp-petstore.sh > /dev/null 2>&1 ./bin/meta-codegen.sh > /dev/null 2>&1 +./bin/utils/export_docs_generators.sh > /dev/null 2>&1 # Check: if [ -n "$(git status --porcelain)" ]; then diff --git a/bin/utils/export_docs_generators.sh b/bin/utils/export_docs_generators.sh new file mode 100755 index 00000000000..00683182493 --- /dev/null +++ b/bin/utils/export_docs_generators.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +for GENERATOR in $(java -jar $executable list --short | sed -e 's/,/\'$'\n''/g') +do + ./bin/utils/export_generator.sh $GENERATOR +done \ No newline at end of file diff --git a/bin/utils/export_generator.sh b/bin/utils/export_generator.sh new file mode 100755 index 00000000000..d23912ae669 --- /dev/null +++ b/bin/utils/export_generator.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +if [[ "$1" != "" ]]; then + NAME="$1" +else + echo "Missing argument. Usage e.g.: ./bin/utils/export-generator.sh jaxrs-jersey" + exit 1; +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +java -jar $executable config-help -g $NAME | sed -e 's/CONFIG OPTIONS/CONFIG OPTIONS for \'$NAME'\'$'\n''/g' > docs/generators/$NAME.md + +echo "Back to the [generators list](README.md)" >> docs/generators/$NAME.md \ No newline at end of file diff --git a/bin/utils/export_generators_readme.sh b/bin/utils/export_generators_readme.sh new file mode 100755 index 00000000000..716528d1668 --- /dev/null +++ b/bin/utils/export_generators_readme.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +java -jar $executable list | sed -e 's/\([A-Z]*\) generators:/* \1 generators:/g' -e 's/- \([a-z0-9\-]*\)/- [\1]\(\1.md\)/g' > docs/generators/README.md diff --git a/docs/generators/README.md b/docs/generators/README.md new file mode 100644 index 00000000000..9d698abac42 --- /dev/null +++ b/docs/generators/README.md @@ -0,0 +1,109 @@ +The following generators are available: + +* CLIENT generators: + - [ada](ada.md) + - [android](android.md) + - [apex](apex.md) + - [bash](bash.md) + - [clojure](clojure.md) + - [cpp-qt5](cpp-qt5.md) + - [cpp-restsdk](cpp-restsdk.md) + - [cpp-tizen](cpp-tizen.md) + - [csharp](csharp.md) + - [csharp-dotnet2](csharp-dotnet2.md) + - [dart](dart.md) + - [eiffel](eiffel.md) + - [elixir](elixir.md) + - [elm](elm.md) + - [erlang-client](erlang-client.md) + - [flash](flash.md) + - [go](go.md) + - [groovy](groovy.md) + - [haskell-http-client](haskell-http-client.md) + - [java](java.md) + - [javascript](javascript.md) + - [javascript-closure-angular](javascript-closure-angular.md) + - [javascript-flowtyped](javascript-flowtyped.md) + - [jaxrs-cxf-client](jaxrs-cxf-client.md) + - [jmeter](jmeter.md) + - [kotlin](kotlin.md) + - [lua](lua.md) + - [objc](objc.md) + - [perl](perl.md) + - [php](php.md) + - [powershell](powershell.md) + - [python](python.md) + - [r](r.md) + - [ruby](ruby.md) + - [rust](rust.md) + - [scala-akka](scala-akka.md) + - [scala-gatling](scala-gatling.md) + - [scala-httpclient](scala-httpclient.md) + - [scalaz](scalaz.md) + - [swift2-deprecated](swift2-deprecated.md) + - [swift3](swift3.md) + - [swift4](swift4.md) + - [typescript-angular](typescript-angular.md) + - [typescript-angularjs](typescript-angularjs.md) + - [typescript-aurelia](typescript-aurelia.md) + - [typescript-fetch](typescript-fetch.md) + - [typescript-inversify](typescript-inversify.md) + - [typescript-jquery](typescript-jquery.md) + - [typescript-node](typescript-node.md) + + +* SERVER generators: + - [ada-server](ada-server.md) + - [aspnetcore](aspnetcore.md) + - [cpp-pistache-server](cpp-pistache-server.md) + - [cpp-qt5-qhttpengine-server](cpp-qt5-qhttpengine-server.md) + - [cpp-restbed-server](cpp-restbed-server.md) + - [csharp-nancyfx](csharp-nancyfx.md) + - [erlang-server](erlang-server.md) + - [go-server](go-server.md) + - [haskell](haskell.md) + - [java-inflector](java-inflector.md) + - [java-msf4j](java-msf4j.md) + - [java-pkmst](java-pkmst.md) + - [java-play-framework](java-play-framework.md) + - [java-undertow-server](java-undertow-server.md) + - [java-vertx](java-vertx.md) + - [jaxrs-cxf](jaxrs-cxf.md) + - [jaxrs-cxf-cdi](jaxrs-cxf-cdi.md) + - [jaxrs-jersey](jaxrs-jersey.md) + - [jaxrs-resteasy](jaxrs-resteasy.md) + - [jaxrs-resteasy-eap](jaxrs-resteasy-eap.md) + - [jaxrs-spec](jaxrs-spec.md) + - [kotlin-server](kotlin-server.md) + - [kotlin-spring](kotlin-spring.md) + - [nodejs-server](nodejs-server.md) + - [php-laravel](php-laravel.md) + - [php-lumen](php-lumen.md) + - [php-silex](php-silex.md) + - [php-slim](php-slim.md) + - [php-symfony](php-symfony.md) + - [php-ze-ph](php-ze-ph.md) + - [python-flask](python-flask.md) + - [ruby-on-rails](ruby-on-rails.md) + - [ruby-sinatra](ruby-sinatra.md) + - [rust-server](rust-server.md) + - [scala-finch](scala-finch.md) + - [scala-lagom-server](scala-lagom-server.md) + - [scalatra](scalatra.md) + - [spring](spring.md) + + +* DOCUMENTATION generators: + - [cwiki](cwiki.md) + - [dynamic-html](dynamic-html.md) + - [html](html.md) + - [html2](html2.md) + - [openapi](openapi.md) + - [openapi-yaml](openapi-yaml.md) + + +* CONFIG generators: + - [apache2](apache2.md) + + + diff --git a/docs/generators/ada-server.md b/docs/generators/ada-server.md new file mode 100644 index 00000000000..0cc25355702 --- /dev/null +++ b/docs/generators/ada-server.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for ada-server + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + GNAT project name (Default: defaultProject) + +Back to the [generators list](README.md) diff --git a/docs/generators/ada.md b/docs/generators/ada.md new file mode 100644 index 00000000000..d26a2a3a492 --- /dev/null +++ b/docs/generators/ada.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for ada + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + GNAT project name (Default: defaultProject) + +Back to the [generators list](README.md) diff --git a/docs/generators/android.md b/docs/generators/android.md new file mode 100644 index 00000000000..591cf0159dc --- /dev/null +++ b/docs/generators/android.md @@ -0,0 +1,57 @@ + +CONFIG OPTIONS for android + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId for use in the generated build.gradle and pom.xml + + artifactId + artifactId for use in the generated build.gradle and pom.xml + + artifactVersion + artifact version for use in the generated build.gradle and pom.xml + + sourceFolder + source folder for generated code + + useAndroidMavenGradlePlugin + A flag to toggle android-maven gradle plugin. (Default: true) + + androidGradleVersion + gradleVersion version for use in the generated build.gradle + + androidSdkVersion + compileSdkVersion version for use in the generated build.gradle + + androidBuildToolsVersion + buildToolsVersion version for use in the generated build.gradle + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + library + library template (sub-template) to use + volley - HTTP client: Volley 1.0.19 (default) + httpclient - HTTP client: Apache HttpClient 4.3.6. JSON processing: Gson 2.3.1. IMPORTANT: Android client using HttpClient is not actively maintained and will be depecreated in the next major release. + +Back to the [generators list](README.md) diff --git a/docs/generators/apache2.md b/docs/generators/apache2.md new file mode 100644 index 00000000000..da09b39bdda --- /dev/null +++ b/docs/generators/apache2.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for apache2 + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + userInfoPath + Path to the user and group files + +Back to the [generators list](README.md) diff --git a/docs/generators/apex.md b/docs/generators/apex.md new file mode 100644 index 00000000000..f9b7dd5b9bb --- /dev/null +++ b/docs/generators/apex.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for apex + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + classPrefix + Prefix for generated classes. Set this to avoid overwriting existing classes in your org. + + apiVersion + The Metadata API version number to use for components in this package. + + buildMethod + The build method for this package. + + namedCredential + The named credential name for the HTTP callouts + +Back to the [generators list](README.md) diff --git a/docs/generators/aspnetcore.md b/docs/generators/aspnetcore.md new file mode 100644 index 00000000000..1307004f988 --- /dev/null +++ b/docs/generators/aspnetcore.md @@ -0,0 +1,31 @@ + +CONFIG OPTIONS for aspnetcore + + packageName + C# package name (convention: Title.Case). (Default: Org.OpenAPITools) + + packageVersion + C# package version. (Default: 1.0.0) + + packageGuid + The GUID that will be associated with the C# project + + sourceFolder + source folder for generated code (Default: src) + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + useDateTimeOffset + Use DateTimeOffset to model date-time properties (Default: false) + + useCollection + Deserialize array types to Collection instead of List. (Default: false) + + returnICollection + Return ICollection instead of the concrete type. (Default: false) + + useSwashbuckle + Uses the Swashbuckle.AspNetCore NuGet package for documentation. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/bash.md b/docs/generators/bash.md new file mode 100644 index 00000000000..853512c85e0 --- /dev/null +++ b/docs/generators/bash.md @@ -0,0 +1,40 @@ + +CONFIG OPTIONS for bash + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + curlOptions + Default cURL options + + processMarkdown + Convert all Markdown Markup into terminal formatting (Default: false) + + scriptName + The name of the script that will be generated (e.g. petstore-cli) + + generateBashCompletion + Whether to generate the Bash completion script (Default: false) + + generateZshCompletion + Whether to generate the Zsh completion script (Default: false) + + hostEnvironmentVariable + Name of environment variable where host can be defined (e.g. PETSTORE_HOST='http://api.openapitools.org:8080') + + basicAuthEnvironmentVariable + Name of environment variable where username and password can be defined (e.g. PETSTORE_CREDS='username:password') + + apiKeyAuthEnvironmentVariable + Name of environment variable where API key can be defined (e.g. PETSTORE_APIKEY='kjhasdGASDa5asdASD') (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/clojure.md b/docs/generators/clojure.md new file mode 100644 index 00000000000..fd0b6856794 --- /dev/null +++ b/docs/generators/clojure.md @@ -0,0 +1,37 @@ + +CONFIG OPTIONS for clojure + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + name of the project (Default: generated from info.title or "openapi-clj-client") + + projectDescription + description of the project (Default: using info.description or "Client library of ") + + projectVersion + version of the project (Default: using info.version or "1.0.0") + + projectUrl + URL of the project (Default: using info.contact.url or not included in project.clj) + + projectLicenseName + name of the license the project uses (Default: using info.license.name or not included in project.clj) + + projectLicenseUrl + URL of the license the project uses (Default: using info.license.url or not included in project.clj) + + baseNamespace + the base/top namespace (Default: generated from projectName) + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-pistache-server.md b/docs/generators/cpp-pistache-server.md new file mode 100644 index 00000000000..7cc58fe304b --- /dev/null +++ b/docs/generators/cpp-pistache-server.md @@ -0,0 +1,7 @@ + +CONFIG OPTIONS for cpp-pistache-server + + addExternalLibs + Add the Possibility to fetch and compile external Libraries needed by this Framework. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-qt5-qhttpengine-server.md b/docs/generators/cpp-qt5-qhttpengine-server.md new file mode 100644 index 00000000000..4d0427ee2d5 --- /dev/null +++ b/docs/generators/cpp-qt5-qhttpengine-server.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for cpp-qt5-qhttpengine-server + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + cppNamespace + C++ namespace (convention: name::space::for::api). (Default: OpenAPI) + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-qt5.md b/docs/generators/cpp-qt5.md new file mode 100644 index 00000000000..924187fc8e4 --- /dev/null +++ b/docs/generators/cpp-qt5.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for cpp-qt5 + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + cppNamespace + C++ namespace (convention: name::space::for::api). (Default: OpenAPI) + + optionalProjectFile + Generate client.pri. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-restbed-server.md b/docs/generators/cpp-restbed-server.md new file mode 100644 index 00000000000..0ef5dfddf05 --- /dev/null +++ b/docs/generators/cpp-restbed-server.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for cpp-restbed-server + + modelPackage + C++ namespace for models (convention: name.space.model). (Default: org.openapitools.server.model) + + apiPackage + C++ namespace for apis (convention: name.space.api). (Default: org.openapitools.server.api) + + packageVersion + C++ package version. (Default: 1.0.0) + + declspec + C++ preprocessor to place before the class name for handling dllexport/dllimport. (Default: ) + + defaultInclude + The default include statement that should be placed in all headers for including things like the declspec (convention: #include "Commons.h" (Default: ) + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-restsdk.md b/docs/generators/cpp-restsdk.md new file mode 100644 index 00000000000..9ada7842d0d --- /dev/null +++ b/docs/generators/cpp-restsdk.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for cpp-restsdk + + modelPackage + C++ namespace for models (convention: name.space.model). (Default: org.openapitools.client.model) + + apiPackage + C++ namespace for apis (convention: name.space.api). (Default: org.openapitools.client.api) + + packageVersion + C++ package version. (Default: 1.0.0) + + declspec + C++ preprocessor to place before the class name for handling dllexport/dllimport. (Default: ) + + defaultInclude + The default include statement that should be placed in all headers for including things like the declspec (convention: #include "Commons.h" (Default: ) + + generateGMocksForApis + Generate Google Mock classes for APIs. + +Back to the [generators list](README.md) diff --git a/docs/generators/cpp-tizen.md b/docs/generators/cpp-tizen.md new file mode 100644 index 00000000000..a9f5e3db24f --- /dev/null +++ b/docs/generators/cpp-tizen.md @@ -0,0 +1,16 @@ + +CONFIG OPTIONS for cpp-tizen + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/csharp-dotnet2.md b/docs/generators/csharp-dotnet2.md new file mode 100644 index 00000000000..79ce829f9c2 --- /dev/null +++ b/docs/generators/csharp-dotnet2.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for csharp-dotnet2 + + packageName + C# package name (convention: Camel.Case). (Default: Org.OpenAPITools) + + packageVersion + C# package version. (Default: 1.0.0) + + clientPackage + C# client package name (convention: Camel.Case). (Default: Org.OpenAPITools.Client) + +Back to the [generators list](README.md) diff --git a/docs/generators/csharp-nancyfx.md b/docs/generators/csharp-nancyfx.md new file mode 100644 index 00000000000..209951d9f2d --- /dev/null +++ b/docs/generators/csharp-nancyfx.md @@ -0,0 +1,46 @@ + +CONFIG OPTIONS for csharp-nancyfx + + packageName + C# package name (convention: Title.Case). (Default: Org.OpenAPITools) + + packageVersion + C# package version. (Default: 1.0.0) + + sourceFolder + source folder for generated code (Default: src) + + interfacePrefix + Prefix interfaces with a community standard or widely accepted prefix. (Default: ) + + packageGuid + The GUID that will be associated with the C# project + + packageContext + Optionally overrides the PackageContext which determines the namespace (namespace=packageName.packageContext). If not set, packageContext will default to basePath. + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + optionalProjectFile + Generate {PackageName}.csproj. (Default: true) + + useDateTimeOffset + Use DateTimeOffset to model date-time properties (Default: false) + + useCollection + Deserialize array types to Collection instead of List. (Default: false) + + returnICollection + Return ICollection instead of the concrete type. (Default: false) + + immutable + Enabled by default. If disabled generates model classes with setters (Default: true) + + writeModulePath + Enabled by default. If disabled, module paths will not mirror api base path (Default: true) + + asyncServer + Set to true to enable the generation of async routes/endpoints. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/csharp.md b/docs/generators/csharp.md new file mode 100644 index 00000000000..4cf223a515e --- /dev/null +++ b/docs/generators/csharp.md @@ -0,0 +1,72 @@ + +CONFIG OPTIONS for csharp + + packageName + C# package name (convention: Title.Case). (Default: Org.OpenAPITools) + + packageVersion + C# package version. (Default: 1.0.0) + + sourceFolder + source folder for generated code (Default: src) + + packageGuid + The GUID that will be associated with the C# project + + interfacePrefix + Prefix interfaces with a community standard or widely accepted prefix. (Default: I) + + targetFramework + The target .NET framework version. (Default: v4.5) + v3.5 - .NET Framework 3.5 compatible + v4.0 - .NET Framework 4.0 compatible + v4.5 - .NET Framework 4.5+ compatible + v5.0 - .NET Standard 1.3 compatible + uwp - Universal Windows Platform (IMPORTANT: this will be decommissioned and replaced by v5.0) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: PascalCase) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + useDateTimeOffset + Use DateTimeOffset to model date-time properties (Default: false) + + useCollection + Deserialize array types to Collection instead of List. (Default: false) + + returnICollection + Return ICollection instead of the concrete type. (Default: false) + + optionalMethodArgument + C# Optional method argument, e.g. void square(int x=10) (.net 4.0+ only). (Default: true) + + optionalAssemblyInfo + Generate AssemblyInfo.cs. (Default: true) + + optionalProjectFile + Generate {PackageName}.csproj. (Default: true) + + optionalEmitDefaultValues + Set DataMember's EmitDefaultValue. (Default: false) + + generatePropertyChanged + Specifies a AssemblyDescription for the .NET Framework global assembly attributes stored in the AssemblyInfo file. (Default: false) + + nonPublicApi + Generates code with reduced access modifiers; allows embedding elsewhere without exposing non-public API calls to consumers. (Default: false) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + netCoreProjectFile + Use the new format (.NET Core) for .NET project files (.csproj). (Default: false) + + validatable + Generates self-validatable models. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/cwiki.md b/docs/generators/cwiki.md new file mode 100644 index 00000000000..3af892ada70 --- /dev/null +++ b/docs/generators/cwiki.md @@ -0,0 +1,46 @@ + +CONFIG OPTIONS for cwiki + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + appName + short name of the application + + appDescription + description of the application + + infoUrl + a URL where users can get more information about the application + + infoEmail + an email address to contact for inquiries about the application + + licenseInfo + a short description of the license + + licenseUrl + a URL pointing to the full license + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + +Back to the [generators list](README.md) diff --git a/docs/generators/dart.md b/docs/generators/dart.md new file mode 100644 index 00000000000..8c25a604594 --- /dev/null +++ b/docs/generators/dart.md @@ -0,0 +1,34 @@ + +CONFIG OPTIONS for dart + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + browserClient + Is the client browser based + + pubName + Name in generated pubspec + + pubVersion + Version in generated pubspec + + pubDescription + Description in generated pubspec + + useEnumExtension + Allow the 'x-enum-values' extension for enums + + sourceFolder + source folder for generated code + +Back to the [generators list](README.md) diff --git a/docs/generators/dynamic-html.md b/docs/generators/dynamic-html.md new file mode 100644 index 00000000000..e6f20ff0247 --- /dev/null +++ b/docs/generators/dynamic-html.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for dynamic-html + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + +Back to the [generators list](README.md) diff --git a/docs/generators/eiffel.md b/docs/generators/eiffel.md new file mode 100644 index 00000000000..5c806df6adc --- /dev/null +++ b/docs/generators/eiffel.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for eiffel + + packageName + Eiffel Cluster name (convention: lowercase). (Default: openapi) + + packageVersion + Eiffel package version. (Default: 1.0.0) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/elixir.md b/docs/generators/elixir.md new file mode 100644 index 00000000000..92dad5e3c0e --- /dev/null +++ b/docs/generators/elixir.md @@ -0,0 +1,25 @@ + +CONFIG OPTIONS for elixir + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + invokerPackage + The main namespace to use for all classes. e.g. Yay.Pets + + licenseHeader + The license header to prepend to the top of all source files. + + packageName + Elixir package name (convention: lowercase). + +Back to the [generators list](README.md) diff --git a/docs/generators/elm.md b/docs/generators/elm.md new file mode 100644 index 00000000000..525c751beaa --- /dev/null +++ b/docs/generators/elm.md @@ -0,0 +1,4 @@ + +CONFIG OPTIONS for elm + +Back to the [generators list](README.md) diff --git a/docs/generators/erlang-client.md b/docs/generators/erlang-client.md new file mode 100644 index 00000000000..e3a2aa7ce69 --- /dev/null +++ b/docs/generators/erlang-client.md @@ -0,0 +1,10 @@ + +CONFIG OPTIONS for erlang-client + + packageName + Erlang application name (convention: lowercase). (Default: openapi) + + packageName + Erlang application version (Default: 1.0.0) + +Back to the [generators list](README.md) diff --git a/docs/generators/erlang-server.md b/docs/generators/erlang-server.md new file mode 100644 index 00000000000..29c7d51313d --- /dev/null +++ b/docs/generators/erlang-server.md @@ -0,0 +1,7 @@ + +CONFIG OPTIONS for erlang-server + + packageName + Erlang package name (convention: lowercase). (Default: openapi) + +Back to the [generators list](README.md) diff --git a/docs/generators/flash.md b/docs/generators/flash.md new file mode 100644 index 00000000000..4c84604c40a --- /dev/null +++ b/docs/generators/flash.md @@ -0,0 +1,16 @@ + +CONFIG OPTIONS for flash + + packageName + flash package name (convention: package.name) (Default: org.openapitools) + + packageVersion + flash package version (Default: 1.0.0) + + invokerPackage + root package for generated code + + sourceFolder + source folder for generated code. e.g. flash + +Back to the [generators list](README.md) diff --git a/docs/generators/go-server.md b/docs/generators/go-server.md new file mode 100644 index 00000000000..462aed9db17 --- /dev/null +++ b/docs/generators/go-server.md @@ -0,0 +1,10 @@ + +CONFIG OPTIONS for go-server + + packageName + Go package name (convention: lowercase). (Default: openapi) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/go.md b/docs/generators/go.md new file mode 100644 index 00000000000..f5b1c1ae9a9 --- /dev/null +++ b/docs/generators/go.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for go + + packageName + Go package name (convention: lowercase). (Default: openapi) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + packageVersion + Go package version. (Default: 1.0.0) + + withGoCodegenComment + whether to include Go codegen comment to disable Go Lint and collapse by default GitHub in PRs and diffs (Default: 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) (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/groovy.md b/docs/generators/groovy.md new file mode 100644 index 00000000000..f0e10ee89ad --- /dev/null +++ b/docs/generators/groovy.md @@ -0,0 +1,110 @@ + +CONFIG OPTIONS for groovy + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + configPackage + configuration package for generated code + +Back to the [generators list](README.md) diff --git a/docs/generators/haskell-http-client.md b/docs/generators/haskell-http-client.md new file mode 100644 index 00000000000..af303d7cd44 --- /dev/null +++ b/docs/generators/haskell-http-client.md @@ -0,0 +1,73 @@ + +CONFIG OPTIONS for haskell-http-client + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + cabalPackage + Set the cabal package name, which consists of one or more alphanumeric words separated by hyphens + + cabalVersion + Set the cabal version number, consisting of a sequence of one or more integers separated by dots + + baseModule + Set the base module namespace + + requestType + Set the name of the type used to generate requests + + configType + Set the name of the type used for configuration + + allowFromJsonNulls + allow JSON Null during model decoding from JSON (Default: true) + + allowToJsonNulls + allow emitting JSON Null during model encoding to JSON (Default: false) + + allowNonUniqueOperationIds + allow different API modules to contain the same operationId. Each API must be imported qualified (Default: false) + + generateLenses + Generate Lens optics for Models (Default: true) + + generateModelConstructors + Generate smart constructors (only supply required fields) for models (Default: true) + + generateEnums + Generate specific datatypes for OpenAPI enums (Default: true) + + generateFormUrlEncodedInstances + Generate FromForm/ToForm instances for models that are used by operations that produce or consume application/x-www-form-urlencoded (Default: true) + + inlineMimeTypes + Inline (hardcode) the content-type and accept parameters on operations, when there is only 1 option (Default: true) + + modelDeriving + Additional classes to include in the deriving() clause of Models + + strictFields + Add strictness annotations to all model fields (Default: true) + + useMonadLogger + Use the monad-logger package to provide logging (if false, use the katip logging package) (Default: false) + + dateTimeFormat + format string used to parse/render a datetime + + dateFormat + format string used to parse/render a date (Default: %Y-%m-%d) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/haskell.md b/docs/generators/haskell.md new file mode 100644 index 00000000000..3fbbb3f5aee --- /dev/null +++ b/docs/generators/haskell.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for haskell + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + +Back to the [generators list](README.md) diff --git a/docs/generators/html.md b/docs/generators/html.md new file mode 100644 index 00000000000..61384bb6c20 --- /dev/null +++ b/docs/generators/html.md @@ -0,0 +1,46 @@ + +CONFIG OPTIONS for html + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + appName + short name of the application + + appDescription + description of the application + + infoUrl + a URL where users can get more information about the application + + infoEmail + an email address to contact for inquiries about the application + + licenseInfo + a short description of the license + + licenseUrl + a URL pointing to the full license + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + +Back to the [generators list](README.md) diff --git a/docs/generators/html2.md b/docs/generators/html2.md new file mode 100644 index 00000000000..3e17d693122 --- /dev/null +++ b/docs/generators/html2.md @@ -0,0 +1,58 @@ + +CONFIG OPTIONS for html2 + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + appName + short name of the application + + appDescription + description of the application + + infoUrl + a URL where users can get more information about the application + + infoEmail + an email address to contact for inquiries about the application + + licenseInfo + a short description of the license + + licenseUrl + a URL pointing to the full license + + invokerPackage + root package for generated code + + phpInvokerPackage + root package for generated php code + + perlModuleName + root module name for generated perl code + + pythonPackageName + package name for generated python code + + packageName + C# package name + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + +Back to the [generators list](README.md) diff --git a/docs/generators/java-inflector.md b/docs/generators/java-inflector.md new file mode 100644 index 00000000000..ee6caf04eb3 --- /dev/null +++ b/docs/generators/java-inflector.md @@ -0,0 +1,107 @@ + +CONFIG OPTIONS for java-inflector + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + +Back to the [generators list](README.md) diff --git a/docs/generators/java-msf4j.md b/docs/generators/java-msf4j.md new file mode 100644 index 00000000000..ae07769bc0a --- /dev/null +++ b/docs/generators/java-msf4j.md @@ -0,0 +1,124 @@ + +CONFIG OPTIONS for java-msf4j + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + library + library template (sub-template) to use (Default: jersey2) + jersey1 - Jersey core 1.x + jersey2 - Jersey core 2.x + +Back to the [generators list](README.md) diff --git a/docs/generators/java-pkmst.md b/docs/generators/java-pkmst.md new file mode 100644 index 00000000000..0dd350488ca --- /dev/null +++ b/docs/generators/java-pkmst.md @@ -0,0 +1,137 @@ + +CONFIG OPTIONS for java-pkmst + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + basePackage + base package for java source code + + serviceName + Service Name + + title + server title name or client service name + + eurekaUri + Eureka URI + + zipkinUri + Zipkin URI + + springBootAdminUri + Spring-Boot URI + + pkmstInterceptor + PKMST Interceptor + +Back to the [generators list](README.md) diff --git a/docs/generators/java-play-framework.md b/docs/generators/java-play-framework.md new file mode 100644 index 00000000000..b03f80be645 --- /dev/null +++ b/docs/generators/java-play-framework.md @@ -0,0 +1,134 @@ + +CONFIG OPTIONS for java-play-framework + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + title + server title name or client service name + + configPackage + configuration package for generated code + + basePackage + base package for generated code + + controllerOnly + Whether to generate only API interface stubs without the server files. (Default: false) + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + useInterfaces + Makes the controllerImp implements an interface to facilitate automatic completion when updating from version x to y of your spec (Default: true) + + handleExceptions + Add a 'throw exception' to each controller function. Add also a custom error handler where you can put your custom logic (Default: true) + + wrapCalls + Add a wrapper to each controller function to handle things like metrics, response modification, etc.. (Default: true) + + useSwaggerUI + Add a route to /api which show your documentation in swagger-ui. Will also import needed dependencies (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/java-undertow-server.md b/docs/generators/java-undertow-server.md new file mode 100644 index 00000000000..c0af154ee89 --- /dev/null +++ b/docs/generators/java-undertow-server.md @@ -0,0 +1,107 @@ + +CONFIG OPTIONS for java-undertow-server + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + +Back to the [generators list](README.md) diff --git a/docs/generators/java-vertx.md b/docs/generators/java-vertx.md new file mode 100644 index 00000000000..b1a5ca63826 --- /dev/null +++ b/docs/generators/java-vertx.md @@ -0,0 +1,113 @@ + +CONFIG OPTIONS for java-vertx + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + rxInterface + When specified, API interfaces are generated with RX and methods return Single<> and Comparable. (Default: false) + + vertxSwaggerRouterVersion + Specify the version of the swagger router library + +Back to the [generators list](README.md) diff --git a/docs/generators/java.md b/docs/generators/java.md new file mode 100644 index 00000000000..3e9353b55a8 --- /dev/null +++ b/docs/generators/java.md @@ -0,0 +1,152 @@ + +CONFIG OPTIONS for java + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + useRxJava + Whether to use the RxJava adapter with the retrofit2 library. (Default: false) + + useRxJava2 + Whether to use the RxJava2 adapter with the retrofit2 library. (Default: false) + + parcelableModel + Whether to generate models for Android that implement Parcelable with the okhttp-gson library. (Default: false) + + usePlayWS + Use Play! Async HTTP client (Play WS API) (Default: false) + + playVersion + Version of Play! Framework (possible values "play24", "play25") + + supportJava6 + Whether to support Java6 with the Jersey1 library. (Default: false) + + useBeanValidation + Use BeanValidation API annotations (Default: false) + + performBeanValidation + Perform BeanValidation (Default: false) + + useGzipFeature + Send gzip-encoded requests (Default: false) + + useRuntimeException + Use RuntimeException instead of Exception (Default: false) + + library + library template (sub-template) to use (Default: okhttp-gson) + jersey1 - HTTP client: Jersey client 1.19.4. JSON processing: Jackson 2.8.9. Enable Java6 support using '-DsupportJava6=true'. Enable gzip request encoding using '-DuseGzipFeature=true'. + feign - HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.8.9 + jersey2 - HTTP client: Jersey client 2.25.1. JSON processing: Jackson 2.8.9 + okhttp-gson - HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.8.1. Enable Parcelable models on Android using '-DparcelableModel=true'. Enable gzip request encoding using '-DuseGzipFeature=true'. + retrofit - HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.3.1 (Retrofit 1.9.0). IMPORTANT NOTE: retrofit1.x is no longer actively maintained so please upgrade to 'retrofit2' instead. + retrofit2 - HTTP client: OkHttp 3.8.0. JSON processing: Gson 2.6.1 (Retrofit 2.3.0). Enable the RxJava adapter using '-DuseRxJava[2]=true'. (RxJava 1.x or 2.x) + resttemplate - HTTP client: Spring RestTemplate 4.3.9-RELEASE. JSON processing: Jackson 2.8.9 + webclient - HTTP client: Spring WebClient 5.0.7-RELEASE. JSON processing: Jackson 2.9.5 + resteasy - HTTP client: Resteasy client 3.1.3.Final. JSON processing: Jackson 2.8.9 + vertx - HTTP client: VertX client 3.2.4. JSON processing: Jackson 2.8.9 + google-api-client - HTTP client: Google API client 1.23.0. JSON processing: Jackson 2.8.9 + rest-assured - HTTP client: rest-assured : 3.1.0. JSON processing: Gson 2.6.1. Only for Java8 + +Back to the [generators list](README.md) diff --git a/docs/generators/javascript-closure-angular.md b/docs/generators/javascript-closure-angular.md new file mode 100644 index 00000000000..69f68a35840 --- /dev/null +++ b/docs/generators/javascript-closure-angular.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for javascript-closure-angular + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + useEs6 + use ES6 templates (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/javascript-flowtyped.md b/docs/generators/javascript-flowtyped.md new file mode 100644 index 00000000000..242bde62238 --- /dev/null +++ b/docs/generators/javascript-flowtyped.md @@ -0,0 +1,34 @@ + +CONFIG OPTIONS for javascript-flowtyped + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/javascript.md b/docs/generators/javascript.md new file mode 100644 index 00000000000..e8d9df4c650 --- /dev/null +++ b/docs/generators/javascript.md @@ -0,0 +1,67 @@ + +CONFIG OPTIONS for javascript + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + sourceFolder + source folder for generated code (Default: src) + + localVariablePrefix + prefix for generated code members and local variables + + invokerPackage + root package for generated code + + apiPackage + package for generated api classes + + modelPackage + package for generated models + + projectName + name of the project (Default: generated from info.title or "openapi-js-client") + + moduleName + module name for AMD, Node or globals (Default: generated from ) + + projectDescription + description of the project (Default: using info.description or "Client library of ") + + projectVersion + version of the project (Default: using info.version or "1.0.0") + + licenseName + name of the license the project uses (Default: using info.license.name) + + usePromises + use Promises as return values from the client API, instead of superagent callbacks (Default: false) + + emitModelMethods + generate getters and setters for model properties (Default: false) + + emitJSDoc + generate JSDoc comments (Default: true) + + useInheritance + use JavaScript prototype chains & delegation for inheritance (Default: true) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + useES6 + use JavaScript ES6 (ECMAScript 6) (beta). Default is ES5. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-cxf-cdi.md b/docs/generators/jaxrs-cxf-cdi.md new file mode 100644 index 00000000000..20e9a3b3e1a --- /dev/null +++ b/docs/generators/jaxrs-cxf-cdi.md @@ -0,0 +1,138 @@ + +CONFIG OPTIONS for jaxrs-cxf-cdi + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + library + library template (sub-template) to use (Default: ) + - JAXRS + + generatePom + Whether to generate pom.xml if the file does not already exist. (Default: true) + + interfaceOnly + Whether to generate only API interface stubs without the server files. (Default: false) + + returnResponse + Whether generate API interface should return javax.ws.rs.core.Response instead of a deserialized entity. Only useful if interfaceOnly is true. (Default: false) + + useSwaggerAnnotations + Whether to generate Swagger annotations. (Default: true) + + useBeanValidation + Use BeanValidation API annotations (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-cxf-client.md b/docs/generators/jaxrs-cxf-client.md new file mode 100644 index 00000000000..79677413ac1 --- /dev/null +++ b/docs/generators/jaxrs-cxf-client.md @@ -0,0 +1,119 @@ + +CONFIG OPTIONS for jaxrs-cxf-client + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + useBeanValidation + Use BeanValidation API annotations (Default: false) + + useGzipFeatureForTests + Use Gzip Feature for tests (Default: false) + + useLoggingFeatureForTests + Use Logging Feature for tests (Default: false) + + useGenericResponse + Use generic response (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-cxf.md b/docs/generators/jaxrs-cxf.md new file mode 100644 index 00000000000..580e9f7b01d --- /dev/null +++ b/docs/generators/jaxrs-cxf.md @@ -0,0 +1,170 @@ + +CONFIG OPTIONS for jaxrs-cxf + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + generateSpringApplication + Generate Spring application (Default: false) + + useSpringAnnotationConfig + Use Spring Annotation Config (Default: false) + + useSwaggerFeature + Use Swagger Feature (Default: false) + + useSwaggerUI + Use Swagger UI (Default: false) + + useWadlFeature + Use WADL Feature (Default: false) + + useMultipartFeature + Use Multipart Feature (Default: false) + + useGzipFeature + Use Gzip Feature (Default: false) + + useGzipFeatureForTests + Use Gzip Feature for tests (Default: false) + + useBeanValidationFeature + Use BeanValidation Feature (Default: false) + + useLoggingFeature + Use Logging Feature (Default: false) + + useLoggingFeatureForTests + Use Logging Feature for tests (Default: false) + + generateSpringBootApplication + Generate Spring Boot application (Default: false) + + generateJbossDeploymentDescriptor + Generate Jboss Deployment Descriptor (Default: false) + + addConsumesProducesJson + Add @Consumes/@Produces Json to API interface (Default: false) + + useAnnotatedBasePath + Use @Path annotations for basePath (Default: false) + + generateNonSpringApplication + Generate non-Spring application (Default: false) + + useGenericResponse + Use generic response (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-jersey.md b/docs/generators/jaxrs-jersey.md new file mode 100644 index 00000000000..d945cbf9111 --- /dev/null +++ b/docs/generators/jaxrs-jersey.md @@ -0,0 +1,130 @@ + +CONFIG OPTIONS for jaxrs-jersey + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + library + library template (sub-template) to use (Default: jersey2) + jersey1 - Jersey core 1.x + jersey2 - Jersey core 2.x + + supportJava6 + Whether to support Java6 with the Jersey1/2 library. (Default: false) + + useTags + use tags for creating interface and controller classnames (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-resteasy-eap.md b/docs/generators/jaxrs-resteasy-eap.md new file mode 100644 index 00000000000..58069dee7f5 --- /dev/null +++ b/docs/generators/jaxrs-resteasy-eap.md @@ -0,0 +1,128 @@ + +CONFIG OPTIONS for jaxrs-resteasy-eap + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + generateJbossDeploymentDescriptor + Generate Jboss Deployment Descriptor (Default: true) + + useSwaggerFeature + Use dynamic Swagger generator (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-resteasy.md b/docs/generators/jaxrs-resteasy.md new file mode 100644 index 00000000000..d0ce94efa1a --- /dev/null +++ b/docs/generators/jaxrs-resteasy.md @@ -0,0 +1,122 @@ + +CONFIG OPTIONS for jaxrs-resteasy + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + generateJbossDeploymentDescriptor + Generate Jboss Deployment Descriptor (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/jaxrs-spec.md b/docs/generators/jaxrs-spec.md new file mode 100644 index 00000000000..ac8041b97ec --- /dev/null +++ b/docs/generators/jaxrs-spec.md @@ -0,0 +1,135 @@ + +CONFIG OPTIONS for jaxrs-spec + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + implFolder + folder for generated implementation code + + title + a title describing the application + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + serverPort + The port on which the server should be started + + library + library template (sub-template) to use (Default: ) + - JAXRS + + generatePom + Whether to generate pom.xml if the file does not already exist. (Default: true) + + interfaceOnly + Whether to generate only API interface stubs without the server files. (Default: false) + + returnResponse + Whether generate API interface should return javax.ws.rs.core.Response instead of a deserialized entity. Only useful if interfaceOnly is true. (Default: false) + + useSwaggerAnnotations + Whether to generate Swagger annotations. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/jmeter.md b/docs/generators/jmeter.md new file mode 100644 index 00000000000..c9a8d2a0e9f --- /dev/null +++ b/docs/generators/jmeter.md @@ -0,0 +1,16 @@ + +CONFIG OPTIONS for jmeter + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/kotlin-server.md b/docs/generators/kotlin-server.md new file mode 100644 index 00000000000..08b3996237f --- /dev/null +++ b/docs/generators/kotlin-server.md @@ -0,0 +1,41 @@ + +CONFIG OPTIONS for kotlin-server + + sourceFolder + source folder for generated code (Default: src/main/kotlin) + + packageName + Generated artifact package name (e.g. io.swagger). + + groupId + Generated artifact package's organization (i.e. maven groupId). (Default: org.openapitools) + + artifactId + Generated artifact id (name of jar). + + artifactVersion + Generated artifact's package version. (Default: 1.0.0) + + enumPropertyNaming + Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original' (Default: camelCase) + + library + library template (sub-template) to use (Default: ktor) + ktor - ktor framework + + featureAutoHead + Automatically provide responses to HEAD requests for existing routes that have the GET verb defined. (Default: true) + + featureConditionalHeaders + Avoid sending content if client already has same content, by checking ETag or LastModified properties. (Default: false) + + featureHSTS + Avoid sending content if client already has same content, by checking ETag or LastModified properties. (Default: true) + + featureCORS + Ktor by default provides an interceptor for implementing proper support for Cross-Origin Resource Sharing (CORS). See enable-cors.org. (Default: false) + + featureCompression + Adds ability to compress outgoing content using gzip, deflate or custom encoder and thus reduce size of the response. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/kotlin-spring.md b/docs/generators/kotlin-spring.md new file mode 100644 index 00000000000..9803e25e0d9 --- /dev/null +++ b/docs/generators/kotlin-spring.md @@ -0,0 +1,59 @@ + +CONFIG OPTIONS for kotlin-spring + + sourceFolder + source folder for generated code (Default: src/main/kotlin) + + packageName + Generated artifact package name (e.g. io.swagger). + + groupId + Generated artifact package's organization (i.e. maven groupId). (Default: org.openapitools) + + artifactId + Generated artifact id (name of jar). + + artifactVersion + Generated artifact's package version. (Default: 1.0.0) + + enumPropertyNaming + Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original' (Default: camelCase) + + title + server title name or client service name (Default: OpenAPI Kotlin Spring) + + basePackage + base package for generated code (Default: org.openapitools) + + serverPort + configuration the port in which the sever is to run on (Default: 8080) + + modelPackage + model package for generated code (Default: org.openapitools.model) + + apiPackage + api package for generated code (Default: org.openapitools.api) + + exceptionHandler + generate default global exception handlers (Default: true) + + gradleBuildFile + generate a gradle build file using the Kotlin DSL (Default: true) + + swaggerAnnotations + generate swagger annotations to go alongside controllers and models (Default: false) + + serviceInterface + generate service interfaces to go alongside controllers. In most cases this option would be used to update an existing project, so not to override implementations. Useful to help facilitate the generation gap pattern (Default: false) + + serviceImplementation + generate stub service implementations that extends service interfaces. If this is set to true service interfaces will also be generated (Default: false) + + useBeanValidation + Use BeanValidation API annotations to validate data types (Default: true) + + library + library template (sub-template) to use (Default: spring-boot) + spring-boot - Spring-boot Server application. + +Back to the [generators list](README.md) diff --git a/docs/generators/kotlin.md b/docs/generators/kotlin.md new file mode 100644 index 00000000000..e2184b546bf --- /dev/null +++ b/docs/generators/kotlin.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for kotlin + + sourceFolder + source folder for generated code (Default: src/main/kotlin) + + packageName + Generated artifact package name (e.g. io.swagger). + + groupId + Generated artifact package's organization (i.e. maven groupId). (Default: org.openapitools) + + artifactId + Generated artifact id (name of jar). + + artifactVersion + Generated artifact's package version. (Default: 1.0.0) + + enumPropertyNaming + Naming convention for enum properties: 'camelCase', 'PascalCase', 'snake_case', 'UPPERCASE', and 'original' (Default: camelCase) + + dateLibrary + Option. Date library to use + string - String + java8 - Java 8 native JSR310 + threetenbp - Threetenbp + +Back to the [generators list](README.md) diff --git a/docs/generators/lua.md b/docs/generators/lua.md new file mode 100644 index 00000000000..721da77eddf --- /dev/null +++ b/docs/generators/lua.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for lua + + packageName + Lua package name (convention: lowercase). (Default: swagger-client) + + packageVersion + Lua package version. (Default: 1.0.0-1) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/nodejs-server.md b/docs/generators/nodejs-server.md new file mode 100644 index 00000000000..c7a2ce24d44 --- /dev/null +++ b/docs/generators/nodejs-server.md @@ -0,0 +1,25 @@ + +CONFIG OPTIONS for nodejs-server + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + googleCloudFunctions + When specified, it will generate the code which runs within Google Cloud Functions instead of standalone Node.JS server. See https://cloud.google.com/functions/docs/quickstart for the details of how to deploy the generated code. (Default: false) + + exportedName + When the generated code will be deployed to Google Cloud Functions, this option can be used to update the name of the exported function. By default, it refers to the basePath. This does not affect normal standalone nodejs server code. + + serverPort + TCP port to listen on. + +Back to the [generators list](README.md) diff --git a/docs/generators/objc.md b/docs/generators/objc.md new file mode 100644 index 00000000000..4ef100c93cb --- /dev/null +++ b/docs/generators/objc.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for objc + + coreData + Should generate core data models (Default: false) + + classPrefix + prefix for generated classes (convention: Abbreviation of pod name e.g. `HN` for `HackerNews`).` (Default: OAI) + + podName + cocoapods package name (convention: CameCase). (Default: OpenAPIClient) + + podVersion + cocoapods package version. (Default: 1.0.0) + + authorName + Name to use in the podspec file. (Default: OpenAPI) + + authorEmail + Email to use in the podspec file. (Default: team@openapitools.org) + + gitRepoURL + URL for the git repo where this podspec should point to. (Default: https://github.com/openapitools/openapi-generator) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/openapi-yaml.md b/docs/generators/openapi-yaml.md new file mode 100644 index 00000000000..1bdbb8771f8 --- /dev/null +++ b/docs/generators/openapi-yaml.md @@ -0,0 +1,19 @@ + +CONFIG OPTIONS for openapi-yaml + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + outputFile + output filename + +Back to the [generators list](README.md) diff --git a/docs/generators/openapi.md b/docs/generators/openapi.md new file mode 100644 index 00000000000..8e8bb15a425 --- /dev/null +++ b/docs/generators/openapi.md @@ -0,0 +1,16 @@ + +CONFIG OPTIONS for openapi + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/perl.md b/docs/generators/perl.md new file mode 100644 index 00000000000..75beaed1d1f --- /dev/null +++ b/docs/generators/perl.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for perl + + moduleName + Perl module name (convention: CamelCase or Long::Module). (Default: OpenAPIClient) + + moduleVersion + Perl module version. (Default: 1.0.0) + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/php-laravel.md b/docs/generators/php-laravel.md new file mode 100644 index 00000000000..7a4ae180b58 --- /dev/null +++ b/docs/generators/php-laravel.md @@ -0,0 +1,43 @@ + +CONFIG OPTIONS for php-laravel + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: snake_case) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + +Back to the [generators list](README.md) diff --git a/docs/generators/php-lumen.md b/docs/generators/php-lumen.md new file mode 100644 index 00000000000..10d0a3af209 --- /dev/null +++ b/docs/generators/php-lumen.md @@ -0,0 +1,43 @@ + +CONFIG OPTIONS for php-lumen + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: snake_case) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + +Back to the [generators list](README.md) diff --git a/docs/generators/php-silex.md b/docs/generators/php-silex.md new file mode 100644 index 00000000000..c7c8705b294 --- /dev/null +++ b/docs/generators/php-silex.md @@ -0,0 +1,16 @@ + +CONFIG OPTIONS for php-silex + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/php-slim.md b/docs/generators/php-slim.md new file mode 100644 index 00000000000..629056bb928 --- /dev/null +++ b/docs/generators/php-slim.md @@ -0,0 +1,46 @@ + +CONFIG OPTIONS for php-slim + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: camelCase) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + + phpcsStandard + PHP CodeSniffer option. Accepts name or path of the coding standard to use. (Default: PSR12) + +Back to the [generators list](README.md) diff --git a/docs/generators/php-symfony.md b/docs/generators/php-symfony.md new file mode 100644 index 00000000000..f85157e9c15 --- /dev/null +++ b/docs/generators/php-symfony.md @@ -0,0 +1,58 @@ + +CONFIG OPTIONS for php-symfony + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: snake_case) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + + composerVendorName + The vendor name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. yaypets + + bundleName + The name of the Symfony bundle. The template uses {{bundleName}} + + composerProjectName + The project name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. petstore-client + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + phpLegacySupport + Should the generated code be compatible with PHP 5.x? (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/php-ze-ph.md b/docs/generators/php-ze-ph.md new file mode 100644 index 00000000000..c920817d2aa --- /dev/null +++ b/docs/generators/php-ze-ph.md @@ -0,0 +1,43 @@ + +CONFIG OPTIONS for php-ze-ph + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: snake_case) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + +Back to the [generators list](README.md) diff --git a/docs/generators/php.md b/docs/generators/php.md new file mode 100644 index 00000000000..8604127fd83 --- /dev/null +++ b/docs/generators/php.md @@ -0,0 +1,52 @@ + +CONFIG OPTIONS for php + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + variableNamingConvention + naming convention of variable name, e.g. camelCase. (Default: snake_case) + + invokerPackage + The main namespace to use for all classes. e.g. Yay\Pets + + packageName + The main package name for classes. e.g. GeneratedPetstore + + srcBasePath + The directory to serve as source root. + + gitUserId + Git user ID, e.g. openapitools. + + gitRepoId + Git repo ID, e.g. openapi-generator. + + artifactVersion + The version to use in the composer package version field. e.g. 1.2.3 + + composerVendorName + The vendor name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. yaypets. IMPORTANT NOTE (2016/03): composerVendorName will be deprecated and replaced by gitUserId in the next openapi-generator release + + composerProjectName + The project name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. petstore-client. IMPORTANT NOTE (2016/03): composerProjectName will be deprecated and replaced by gitRepoId in the next openapi-generator release + + hideGenerationTimestamp + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/powershell.md b/docs/generators/powershell.md new file mode 100644 index 00000000000..8fdc4171cc6 --- /dev/null +++ b/docs/generators/powershell.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for powershell + + packageName + Client package name (e.g. org.openapitools.client). (Default: Org.OpenAPITools) + + packageGuid + GUID for PowerShell module (e.g. a27b908d-2a20-467f-bc32-af6f3a654ac5). A random GUID will be generated by default. + + csharpClientPath + Path to the C# API client generated by OpenAPI Generator, e.g. $ScriptDir\..\csharp\OpenAPIClient where $ScriptDir is the current directory. NOTE: you will need to generate the C# API client separately. (Default: $ScriptDir\csharp\OpenAPIClient) + +Back to the [generators list](README.md) diff --git a/docs/generators/python-flask.md b/docs/generators/python-flask.md new file mode 100644 index 00000000000..113916f815e --- /dev/null +++ b/docs/generators/python-flask.md @@ -0,0 +1,34 @@ + +CONFIG OPTIONS for python-flask + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + packageName + python package name (convention: snake_case). (Default: openapi_server) + + packageVersion + python package version. (Default: 1.0.0) + + controllerPackage + controller package (Default: controllers) + + defaultController + default controller (Default: default_controller) + + supportPython2 + support python2 (Default: false) + + serverPort + TCP port to listen to in app.run (Default: 8080) + +Back to the [generators list](README.md) diff --git a/docs/generators/python.md b/docs/generators/python.md new file mode 100644 index 00000000000..7eebca2137d --- /dev/null +++ b/docs/generators/python.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for python + + packageName + python package name (convention: snake_case). (Default: openapi_client) + + projectName + python project name in setup.py (e.g. petstore-api). + + packageVersion + python package version. (Default: 1.0.0) + + packageUrl + python package URL. + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + generateSourceCodeOnly + Specifies that only a library source code is to be generated. (Default: false) + + library + library template (sub-template) to use: asyncio, tornado, urllib3 (Default: urllib3) + +Back to the [generators list](README.md) diff --git a/docs/generators/r.md b/docs/generators/r.md new file mode 100644 index 00000000000..8253566f41f --- /dev/null +++ b/docs/generators/r.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for r + + packageName + R package name (convention: lowercase). (Default: openapi) + + packageVersion + R package version. (Default: 1.0.0) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/ruby-on-rails.md b/docs/generators/ruby-on-rails.md new file mode 100644 index 00000000000..b32fc0a017e --- /dev/null +++ b/docs/generators/ruby-on-rails.md @@ -0,0 +1,7 @@ + +CONFIG OPTIONS for ruby-on-rails + + databaseAdapter + The adapter for database (e.g. mysql, sqlite). Default: sqlite (Default: sqlite) + +Back to the [generators list](README.md) diff --git a/docs/generators/ruby-sinatra.md b/docs/generators/ruby-sinatra.md new file mode 100644 index 00000000000..9603ad75618 --- /dev/null +++ b/docs/generators/ruby-sinatra.md @@ -0,0 +1,4 @@ + +CONFIG OPTIONS for ruby-sinatra + +Back to the [generators list](README.md) diff --git a/docs/generators/ruby.md b/docs/generators/ruby.md new file mode 100644 index 00000000000..97719919a72 --- /dev/null +++ b/docs/generators/ruby.md @@ -0,0 +1,49 @@ + +CONFIG OPTIONS for ruby + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + gemName + gem name (convention: underscore_case). (Default: openapi_client) + + moduleName + top module name (convention: CamelCase, usually corresponding to gem name). (Default: OpenAPIClient) + + gemVersion + gem version. (Default: 1.0.0) + + gemLicense + gem license. (Default: proprietary) + + gemRequiredRubyVersion + gem required Ruby version. (Default: >= 1.9) + + gemHomepage + gem homepage. (Default: http://org.openapitools) + + gemSummary + gem summary. (Default: A ruby wrapper for the REST APIs) + + gemDescription + gem description. (Default: This gem maps to a REST API) + + gemAuthor + gem author (only one is supported). + + gemAuthorEmail + gem author email (only one is supported). + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/rust-server.md b/docs/generators/rust-server.md new file mode 100644 index 00000000000..7e7b340a990 --- /dev/null +++ b/docs/generators/rust-server.md @@ -0,0 +1,10 @@ + +CONFIG OPTIONS for rust-server + + packageName + Rust crate name (convention: snake_case). (Default: swagger_client) + + packageVersion + Rust crate version. (Default: 1.0.0) + +Back to the [generators list](README.md) diff --git a/docs/generators/rust.md b/docs/generators/rust.md new file mode 100644 index 00000000000..c8779939a30 --- /dev/null +++ b/docs/generators/rust.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for rust + + packageName + Rust package name (convention: lowercase). (Default: openapi) + + packageVersion + Rust package version. (Default: 1.0.0) + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/scala-akka.md b/docs/generators/scala-akka.md new file mode 100644 index 00000000000..4c53a0dbcb7 --- /dev/null +++ b/docs/generators/scala-akka.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for scala-akka + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + + mainPackage + Top-level package name, which defines 'apiPackage', 'modelPackage', 'invokerPackage' (Default: org.openapitools.client) + +Back to the [generators list](README.md) diff --git a/docs/generators/scala-finch.md b/docs/generators/scala-finch.md new file mode 100644 index 00000000000..a6f40be09f3 --- /dev/null +++ b/docs/generators/scala-finch.md @@ -0,0 +1,13 @@ + +CONFIG OPTIONS for scala-finch + + packageName + Finch package name (e.g. org.openapitools). (Default: org.openapitools) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + +Back to the [generators list](README.md) diff --git a/docs/generators/scala-gatling.md b/docs/generators/scala-gatling.md new file mode 100644 index 00000000000..e12674ccd2c --- /dev/null +++ b/docs/generators/scala-gatling.md @@ -0,0 +1,25 @@ + +CONFIG OPTIONS for scala-gatling + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + +Back to the [generators list](README.md) diff --git a/docs/generators/scala-httpclient.md b/docs/generators/scala-httpclient.md new file mode 100644 index 00000000000..a21cee7caa3 --- /dev/null +++ b/docs/generators/scala-httpclient.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for scala-httpclient + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + +Back to the [generators list](README.md) diff --git a/docs/generators/scala-lagom-server.md b/docs/generators/scala-lagom-server.md new file mode 100644 index 00000000000..3c9beeb4961 --- /dev/null +++ b/docs/generators/scala-lagom-server.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for scala-lagom-server + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + +Back to the [generators list](README.md) diff --git a/docs/generators/scalatra.md b/docs/generators/scalatra.md new file mode 100644 index 00000000000..b512627bfce --- /dev/null +++ b/docs/generators/scalatra.md @@ -0,0 +1,25 @@ + +CONFIG OPTIONS for scalatra + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + +Back to the [generators list](README.md) diff --git a/docs/generators/scalaz.md b/docs/generators/scalaz.md new file mode 100644 index 00000000000..eec98a7a7c5 --- /dev/null +++ b/docs/generators/scalaz.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for scalaz + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + sourceFolder + source folder for generated code + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + +Back to the [generators list](README.md) diff --git a/docs/generators/spring.md b/docs/generators/spring.md new file mode 100644 index 00000000000..dd284679cd7 --- /dev/null +++ b/docs/generators/spring.md @@ -0,0 +1,161 @@ + +CONFIG OPTIONS for spring + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPackage + package for generated models + + apiPackage + package for generated api classes + + invokerPackage + root package for generated code + + groupId + groupId in generated pom.xml + + artifactId + artifactId in generated pom.xml + + artifactVersion + artifact version in generated pom.xml + + artifactUrl + artifact URL in generated pom.xml + + artifactDescription + artifact description in generated pom.xml + + scmConnection + SCM connection in generated pom.xml + + scmDeveloperConnection + SCM developer connection in generated pom.xml + + scmUrl + SCM URL in generated pom.xml + + developerName + developer name in generated pom.xml + + developerEmail + developer email in generated pom.xml + + developerOrganization + developer organization in generated pom.xml + + developerOrganizationUrl + developer organization URL in generated pom.xml + + licenseName + The name of the license + + licenseUrl + The URL of the license + + sourceFolder + source folder for generated code + + localVariablePrefix + prefix for generated code members and local variables + + serializableModel + boolean - toggle "implements Serializable" for generated models (Default: false) + + bigDecimalAsString + Treat BigDecimal values as Strings to avoid precision loss. (Default: false) + + fullJavaUtil + whether to use fully qualified name for classes under java.util. This option only works for Java API client (Default: false) + + hideGenerationTimestamp + hides the timestamp when files were generated + + 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) (Default: false) + + dateLibrary + Option. Date library to use + joda - Joda (for legacy app only) + legacy - Legacy java.util.Date (if you really have a good reason not to use threetenbp + java8-localdatetime - Java 8 using LocalDateTime (for legacy app only) + java8 - Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets "java8" to true + threetenbp - Backport of JSR310 (preferred for jdk < 1.8) + + java8 + Option. Use Java8 classes instead of third party equivalents + true - Use Java 8 classes such as Base64 + false - Various third party libraries as needed + + disableHtmlEscaping + Disable HTML escaping of JSON strings when using gson (needed to avoid problems with byte[] fields) (Default: false) + + booleanGetterPrefix + Set booleanGetterPrefix (default value 'get') + + title + server title name or client service name + + configPackage + configuration package for generated code + + basePackage + base package (invokerPackage) for generated code + + interfaceOnly + Whether to generate only API interface stubs without the server files. (Default: false) + + delegatePattern + Whether to generate the server files using the delegate pattern (Default: false) + + singleContentTypes + Whether to select only one produces/consumes content-type by operation. (Default: false) + + java8 + use java8 default interface (Default: true) + + async + use async Callable controllers (Default: false) + + reactive + wrap responses in Mono/Flux Reactor types (spring-boot only) (Default: false) + + responseWrapper + wrap the responses in given type (Future,Callable,CompletableFuture,ListenableFuture,DeferredResult,HystrixCommand,RxObservable,RxSingle or fully qualified type) + + useTags + use tags for creating interface and controller classnames (Default: false) + + useBeanValidation + Use BeanValidation API annotations (Default: true) + + implicitHeaders + Use of @ApiImplicitParams for headers. (Default: false) + + swaggerDocketConfig + Generate Spring OpenAPI Docket configuration class. (Default: false) + + apiFirst + Generate the API from the OAI spec at server compile time (API first approach) (Default: false) + + useOptional + Use Optional container for optional parameters (Default: false) + + library + library template (sub-template) to use (Default: spring-boot) + spring-boot - Spring-boot Server application using the SpringFox integration. + spring-mvc - Spring-MVC Server application using the SpringFox integration. + spring-cloud - Spring-Cloud-Feign client with Spring-Boot auto-configured settings. + +Back to the [generators list](README.md) diff --git a/docs/generators/swift2-deprecated.md b/docs/generators/swift2-deprecated.md new file mode 100644 index 00000000000..630a0e1a2e0 --- /dev/null +++ b/docs/generators/swift2-deprecated.md @@ -0,0 +1,64 @@ + +CONFIG OPTIONS for swift2-deprecated + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + Project name in Xcode + + responseAs + Optionally use libraries to manage response. Currently PromiseKit, RxSwift are available. + + unwrapRequired + Treat 'required' properties in response as non-optional (which would crash the app if api returns null as opposed to required option specified in json schema + + podSource + Source information used for Podspec + + podVersion + Version used for Podspec + + podAuthors + Authors used for Podspec + + podSocialMediaURL + Social Media URL used for Podspec + + podDocsetURL + Docset URL used for Podspec + + podLicense + License used for Podspec + + podHomepage + Homepage used for Podspec + + podSummary + Summary used for Podspec + + podDescription + Description used for Podspec + + podScreenshots + Screenshots used for Podspec + + podDocumentationURL + Documentation URL used for Podspec + + swiftUseApiNamespace + Flag to make all the API classes inner-class of {{projectName}}API + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + +Back to the [generators list](README.md) diff --git a/docs/generators/swift3.md b/docs/generators/swift3.md new file mode 100644 index 00000000000..42674fdb262 --- /dev/null +++ b/docs/generators/swift3.md @@ -0,0 +1,70 @@ + +CONFIG OPTIONS for swift3 + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + Project name in Xcode + + responseAs + Optionally use libraries to manage response. Currently PromiseKit, RxSwift are available. + + unwrapRequired + Treat 'required' properties in response as non-optional (which would crash the app if api returns null as opposed to required option specified in json schema + + objcCompatible + Add additional properties and methods for Objective-C compatibility (default: false) + + podSource + Source information used for Podspec + + podVersion + Version used for Podspec + + podAuthors + Authors used for Podspec + + podSocialMediaURL + Social Media URL used for Podspec + + podDocsetURL + Docset URL used for Podspec + + podLicense + License used for Podspec + + podHomepage + Homepage used for Podspec + + podSummary + Summary used for Podspec + + podDescription + Description used for Podspec + + podScreenshots + Screenshots used for Podspec + + podDocumentationURL + Documentation URL used for Podspec + + swiftUseApiNamespace + Flag to make all the API classes inner-class of {{projectName}}API + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + lenientTypeCast + Accept and cast values for simple types (string->bool, string->int, int->string) (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/swift4.md b/docs/generators/swift4.md new file mode 100644 index 00000000000..6e824970759 --- /dev/null +++ b/docs/generators/swift4.md @@ -0,0 +1,70 @@ + +CONFIG OPTIONS for swift4 + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + projectName + Project name in Xcode + + responseAs + Optionally use libraries to manage response. Currently PromiseKit, RxSwift are available. + + unwrapRequired + Treat 'required' properties in response as non-optional (which would crash the app if api returns null as opposed to required option specified in json schema + + objcCompatible + Add additional properties and methods for Objective-C compatibility (default: false) + + podSource + Source information used for Podspec + + podVersion + Version used for Podspec + + podAuthors + Authors used for Podspec + + podSocialMediaURL + Social Media URL used for Podspec + + podDocsetURL + Docset URL used for Podspec + + podLicense + License used for Podspec + + podHomepage + Homepage used for Podspec + + podSummary + Summary used for Podspec + + podDescription + Description used for Podspec + + podScreenshots + Screenshots used for Podspec + + podDocumentationURL + Documentation URL used for Podspec + + swiftUseApiNamespace + Flag to make all the API classes inner-class of {{projectName}}API + + hideGenerationTimestamp + Hides the generation timestamp when files are generated. (Default: true) + + lenientTypeCast + Accept and cast values for simple types (string->bool, string->int, int->string) (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-angular.md b/docs/generators/typescript-angular.md new file mode 100644 index 00000000000..fcb59bebbb8 --- /dev/null +++ b/docs/generators/typescript-angular.md @@ -0,0 +1,58 @@ + +CONFIG OPTIONS for typescript-angular + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package. Required to generate a full angular package + + npmVersion + The version of your npm package. Default is '1.0.0' + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + + withInterfaces + Setting this property to true will generate interfaces next to the default class implementations. (Default: false) + + taggedUnions + Use discriminators to create tagged unions instead of extending interfaces. (Default: false) + + providedInRoot + Use this property to provide Injectables in root (it is only valid in angular version greater or equal to 6.0.0). (Default: false) + + ngVersion + The version of Angular. Default is '4.3' + + serviceSuffix + The suffix of the generated service. Default is 'Service'. + + serviceFileSuffix + The suffix of the file of the generated service (service.ts). Default is '.service'. + + modelSuffix + The suffix of the generated model. Default is ''. + + modelFileSuffix + The suffix of the file of the generated model (model.ts). Default is ''. + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-angularjs.md b/docs/generators/typescript-angularjs.md new file mode 100644 index 00000000000..7f8fd7720c0 --- /dev/null +++ b/docs/generators/typescript-angularjs.md @@ -0,0 +1,22 @@ + +CONFIG OPTIONS for typescript-angularjs + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-aurelia.md b/docs/generators/typescript-aurelia.md new file mode 100644 index 00000000000..dd9c7f14e2f --- /dev/null +++ b/docs/generators/typescript-aurelia.md @@ -0,0 +1,28 @@ + +CONFIG OPTIONS for typescript-aurelia + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-fetch.md b/docs/generators/typescript-fetch.md new file mode 100644 index 00000000000..97633d03ebf --- /dev/null +++ b/docs/generators/typescript-fetch.md @@ -0,0 +1,37 @@ + +CONFIG OPTIONS for typescript-fetch + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + + withInterfaces + Setting this property to true will generate interfaces next to the default class implementations. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-inversify.md b/docs/generators/typescript-inversify.md new file mode 100644 index 00000000000..9354cd8b4a6 --- /dev/null +++ b/docs/generators/typescript-inversify.md @@ -0,0 +1,43 @@ + +CONFIG OPTIONS for typescript-inversify + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + + withInterfaces + Setting this property to true will generate interfaces next to the default class implementations. (Default: false) + + usePromise + Setting this property to use promise instead of observable inside every service. (Default: false) + + taggedUnions + Use discriminators to create tagged unions instead of extending interfaces. (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-jquery.md b/docs/generators/typescript-jquery.md new file mode 100644 index 00000000000..eeef27289c0 --- /dev/null +++ b/docs/generators/typescript-jquery.md @@ -0,0 +1,37 @@ + +CONFIG OPTIONS for typescript-jquery + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + + jqueryAlreadyImported + When using this in legacy app using mix of typescript and javascript, this will only declare jquery and not import it (Default: false) + +Back to the [generators list](README.md) diff --git a/docs/generators/typescript-node.md b/docs/generators/typescript-node.md new file mode 100644 index 00000000000..008dae08c09 --- /dev/null +++ b/docs/generators/typescript-node.md @@ -0,0 +1,34 @@ + +CONFIG OPTIONS for typescript-node + + sortParamsByRequiredFlag + Sort method arguments to place required parameters before optional parameters. (Default: true) + + ensureUniqueParams + Whether to ensure parameter names are unique in an operation (rename parameters that are not). (Default: true) + + allowUnicodeIdentifiers + boolean, toggles whether unicode identifiers are allowed in names or not, default is false (Default: false) + + prependFormOrBodyParameters + Add form or body parameters to the beginning of the parameter list. (Default: false) + + modelPropertyNaming + Naming convention for the property: 'camelCase', 'PascalCase', 'snake_case' and 'original', which keeps the original name (Default: camelCase) + + supportsES6 + Generate code that conforms to ES6. (Default: false) + + npmName + The name under which you want to publish generated npm package + + npmVersion + The version of your npm package + + npmRepository + Use this property to set an url your private npmRepo in the package.json + + snapshot + When setting this property to true the version will be suffixed with -SNAPSHOT.yyyyMMddHHmm (Default: false) + +Back to the [generators list](README.md) From d327c5be464d02aa31e24d2ef6eae959e0563a86 Mon Sep 17 00:00:00 2001 From: Yimin Lin Date: Sat, 1 Sep 2018 01:49:18 +0800 Subject: [PATCH 29/74] [Dart 2] Add support for Dart 2 (#754) * Add an option for Dart2 * add dart2 samples, update travis * fix dart installation * Upper constraints on the SDK version * Update dependencies * supportDart2 option can now be passed through --additional-properties * Update petstore tests * Update dart2-petstore.sh * Running tests on Dart VM * Fixed JSON deserialization bugs * Fixed missing initialization of postBody * Run bin/dart2-petstore.sh to regenerate libraries * Update pom.xml * Added SDK version constraints in pubspec.mustache * Run bin/dart2-petstore.sh to regenerate libraries * move dart2 test to the end --- .travis.yml | 12 +- bin/dart2-petstore.sh | 50 ++ .../codegen/languages/DartClientCodegen.java | 10 +- .../src/main/resources/dart2/README.mustache | 133 +++++ .../src/main/resources/dart2/api.mustache | 117 ++++ .../main/resources/dart2/api_client.mustache | 164 ++++++ .../src/main/resources/dart2/api_doc.mustache | 86 +++ .../resources/dart2/api_exception.mustache | 23 + .../main/resources/dart2/api_helper.mustache | 52 ++ .../src/main/resources/dart2/apilib.mustache | 21 + .../dart2/auth/api_key_auth.mustache | 27 + .../dart2/auth/authentication.mustache | 7 + .../dart2/auth/http_basic_auth.mustache | 14 + .../main/resources/dart2/auth/oauth.mustache | 18 + .../src/main/resources/dart2/class.mustache | 82 +++ .../src/main/resources/dart2/enum.mustache | 36 ++ .../main/resources/dart2/git_push.sh.mustache | 52 ++ .../main/resources/dart2/gitignore.mustache | 27 + .../src/main/resources/dart2/model.mustache | 12 + .../main/resources/dart2/object_doc.mustache | 16 + .../src/main/resources/dart2/pubspec.mustache | 7 + .../options/DartClientOptionsProvider.java | 1 + pom.xml | 1 + .../openapi/.analysis_options | 2 + .../dart2/flutter_petstore/openapi/.gitignore | 27 + .../openapi/.openapi-generator-ignore | 23 + .../openapi/.openapi-generator/VERSION | 1 + .../dart2/flutter_petstore/openapi/README.md | 121 ++++ .../openapi/docs/ApiResponse.md | 17 + .../flutter_petstore/openapi/docs/Category.md | 16 + .../flutter_petstore/openapi/docs/Order.md | 20 + .../flutter_petstore/openapi/docs/Pet.md | 20 + .../flutter_petstore/openapi/docs/PetApi.md | 379 +++++++++++++ .../flutter_petstore/openapi/docs/StoreApi.md | 186 +++++++ .../flutter_petstore/openapi/docs/Tag.md | 16 + .../flutter_petstore/openapi/docs/User.md | 22 + .../flutter_petstore/openapi/docs/UserApi.md | 349 ++++++++++++ .../flutter_petstore/openapi/git_push.sh | 52 ++ .../flutter_petstore/openapi/lib/api.dart | 27 + .../openapi/lib/api/pet_api.dart | 432 +++++++++++++++ .../openapi/lib/api/store_api.dart | 207 +++++++ .../openapi/lib/api/user_api.dart | 409 ++++++++++++++ .../openapi/lib/api_client.dart | 160 ++++++ .../openapi/lib/api_exception.dart | 23 + .../openapi/lib/api_helper.dart | 44 ++ .../openapi/lib/auth/api_key_auth.dart | 27 + .../openapi/lib/auth/authentication.dart | 7 + .../openapi/lib/auth/http_basic_auth.dart | 14 + .../openapi/lib/auth/oauth.dart | 18 + .../openapi/lib/model/api_response.dart | 44 ++ .../openapi/lib/model/category.dart | 40 ++ .../openapi/lib/model/order.dart | 57 ++ .../openapi/lib/model/pet.dart | 57 ++ .../openapi/lib/model/tag.dart | 40 ++ .../openapi/lib/model/user.dart | 64 +++ .../flutter_petstore/openapi/pubspec.yaml | 7 + .../openapi-browser-client/.analysis_options | 2 + .../dart2/openapi-browser-client/.gitignore | 27 + .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../dart2/openapi-browser-client/README.md | 121 ++++ .../docs/ApiResponse.md | 17 + .../openapi-browser-client/docs/Category.md | 16 + .../openapi-browser-client/docs/Order.md | 20 + .../dart2/openapi-browser-client/docs/Pet.md | 20 + .../openapi-browser-client/docs/PetApi.md | 379 +++++++++++++ .../openapi-browser-client/docs/StoreApi.md | 186 +++++++ .../dart2/openapi-browser-client/docs/Tag.md | 16 + .../dart2/openapi-browser-client/docs/User.md | 22 + .../openapi-browser-client/docs/UserApi.md | 349 ++++++++++++ .../dart2/openapi-browser-client/git_push.sh | 52 ++ .../dart2/openapi-browser-client/lib/api.dart | 28 + .../lib/api/pet_api.dart | 432 +++++++++++++++ .../lib/api/store_api.dart | 207 +++++++ .../lib/api/user_api.dart | 409 ++++++++++++++ .../lib/api_client.dart | 160 ++++++ .../lib/api_exception.dart | 23 + .../lib/api_helper.dart | 44 ++ .../lib/auth/api_key_auth.dart | 27 + .../lib/auth/authentication.dart | 7 + .../lib/auth/http_basic_auth.dart | 14 + .../lib/auth/oauth.dart | 18 + .../lib/model/api_response.dart | 44 ++ .../lib/model/category.dart | 40 ++ .../lib/model/order.dart | 57 ++ .../openapi-browser-client/lib/model/pet.dart | 57 ++ .../openapi-browser-client/lib/model/tag.dart | 40 ++ .../lib/model/user.dart | 64 +++ .../dart2/openapi-browser-client/pubspec.yaml | 7 + .../petstore/dart2/openapi/.analysis_options | 2 + .../client/petstore/dart2/openapi/.gitignore | 27 + .../dart2/openapi/.openapi-generator-ignore | 23 + .../dart2/openapi/.openapi-generator/VERSION | 1 + .../client/petstore/dart2/openapi/README.md | 121 ++++ .../dart2/openapi/docs/ApiResponse.md | 17 + .../petstore/dart2/openapi/docs/Category.md | 16 + .../petstore/dart2/openapi/docs/Order.md | 20 + .../client/petstore/dart2/openapi/docs/Pet.md | 20 + .../petstore/dart2/openapi/docs/PetApi.md | 379 +++++++++++++ .../petstore/dart2/openapi/docs/StoreApi.md | 186 +++++++ .../client/petstore/dart2/openapi/docs/Tag.md | 16 + .../petstore/dart2/openapi/docs/User.md | 22 + .../petstore/dart2/openapi/docs/UserApi.md | 349 ++++++++++++ .../client/petstore/dart2/openapi/git_push.sh | 52 ++ .../petstore/dart2/openapi/lib/api.dart | 27 + .../dart2/openapi/lib/api/pet_api.dart | 432 +++++++++++++++ .../dart2/openapi/lib/api/store_api.dart | 207 +++++++ .../dart2/openapi/lib/api/user_api.dart | 409 ++++++++++++++ .../dart2/openapi/lib/api_client.dart | 160 ++++++ .../dart2/openapi/lib/api_exception.dart | 23 + .../dart2/openapi/lib/api_helper.dart | 44 ++ .../dart2/openapi/lib/auth/api_key_auth.dart | 27 + .../openapi/lib/auth/authentication.dart | 7 + .../openapi/lib/auth/http_basic_auth.dart | 14 + .../dart2/openapi/lib/auth/oauth.dart | 18 + .../dart2/openapi/lib/model/api_response.dart | 44 ++ .../dart2/openapi/lib/model/category.dart | 40 ++ .../dart2/openapi/lib/model/order.dart | 57 ++ .../petstore/dart2/openapi/lib/model/pet.dart | 57 ++ .../petstore/dart2/openapi/lib/model/tag.dart | 40 ++ .../dart2/openapi/lib/model/user.dart | 64 +++ .../petstore/dart2/openapi/pubspec.yaml | 7 + .../petstore/dart2/petstore/.analysis_options | 2 + .../client/petstore/dart2/petstore/README.md | 58 ++ .../client/petstore/dart2/petstore/pom.xml | 61 +++ .../petstore/dart2/petstore/pubspec.lock | 516 ++++++++++++++++++ .../petstore/dart2/petstore/pubspec.yaml | 13 + .../dart2/petstore/test/pet_test.dart | 86 +++ .../dart2/petstore/test/random_id.dart | 7 + .../dart2/petstore/test/store_test.dart | 31 ++ .../dart2/petstore/test/user_test.dart | 79 +++ 131 files changed, 10604 insertions(+), 2 deletions(-) create mode 100755 bin/dart2-petstore.sh create mode 100644 modules/openapi-generator/src/main/resources/dart2/README.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/api.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/api_client.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/api_doc.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/api_exception.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/api_helper.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/apilib.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/auth/api_key_auth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/auth/authentication.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/auth/http_basic_auth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/auth/oauth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/class.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/enum.mustache create mode 100755 modules/openapi-generator/src/main/resources/dart2/git_push.sh.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/gitignore.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/object_doc.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart2/pubspec.mustache create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/.analysis_options create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/.gitignore create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator-ignore create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/README.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/ApiResponse.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/Category.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/Order.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/Pet.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/PetApi.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/StoreApi.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/Tag.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/User.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/docs/UserApi.md create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/git_push.sh create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart create mode 100644 samples/client/petstore/dart2/flutter_petstore/openapi/pubspec.yaml create mode 100644 samples/client/petstore/dart2/openapi-browser-client/.analysis_options create mode 100644 samples/client/petstore/dart2/openapi-browser-client/.gitignore create mode 100644 samples/client/petstore/dart2/openapi-browser-client/.openapi-generator-ignore create mode 100644 samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION create mode 100644 samples/client/petstore/dart2/openapi-browser-client/README.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/ApiResponse.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/Category.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/Order.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/Pet.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/PetApi.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/StoreApi.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/Tag.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/User.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/docs/UserApi.md create mode 100644 samples/client/petstore/dart2/openapi-browser-client/git_push.sh create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart create mode 100644 samples/client/petstore/dart2/openapi-browser-client/pubspec.yaml create mode 100644 samples/client/petstore/dart2/openapi/.analysis_options create mode 100644 samples/client/petstore/dart2/openapi/.gitignore create mode 100644 samples/client/petstore/dart2/openapi/.openapi-generator-ignore create mode 100644 samples/client/petstore/dart2/openapi/.openapi-generator/VERSION create mode 100644 samples/client/petstore/dart2/openapi/README.md create mode 100644 samples/client/petstore/dart2/openapi/docs/ApiResponse.md create mode 100644 samples/client/petstore/dart2/openapi/docs/Category.md create mode 100644 samples/client/petstore/dart2/openapi/docs/Order.md create mode 100644 samples/client/petstore/dart2/openapi/docs/Pet.md create mode 100644 samples/client/petstore/dart2/openapi/docs/PetApi.md create mode 100644 samples/client/petstore/dart2/openapi/docs/StoreApi.md create mode 100644 samples/client/petstore/dart2/openapi/docs/Tag.md create mode 100644 samples/client/petstore/dart2/openapi/docs/User.md create mode 100644 samples/client/petstore/dart2/openapi/docs/UserApi.md create mode 100644 samples/client/petstore/dart2/openapi/git_push.sh create mode 100644 samples/client/petstore/dart2/openapi/lib/api.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api/pet_api.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api/store_api.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api/user_api.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api_client.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api_exception.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/api_helper.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/auth/authentication.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/auth/oauth.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/api_response.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/category.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/order.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/pet.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/tag.dart create mode 100644 samples/client/petstore/dart2/openapi/lib/model/user.dart create mode 100644 samples/client/petstore/dart2/openapi/pubspec.yaml create mode 100644 samples/client/petstore/dart2/petstore/.analysis_options create mode 100644 samples/client/petstore/dart2/petstore/README.md create mode 100644 samples/client/petstore/dart2/petstore/pom.xml create mode 100644 samples/client/petstore/dart2/petstore/pubspec.lock create mode 100644 samples/client/petstore/dart2/petstore/pubspec.yaml create mode 100644 samples/client/petstore/dart2/petstore/test/pet_test.dart create mode 100644 samples/client/petstore/dart2/petstore/test/random_id.dart create mode 100644 samples/client/petstore/dart2/petstore/test/store_test.dart create mode 100644 samples/client/petstore/dart2/petstore/test/user_test.dart diff --git a/.travis.yml b/.travis.yml index 51d8c4a6b7f..af7d9a2d910 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,7 @@ cache: - $HOME/perl5 - $HOME/.cargo - $HOME/.stack + - $HOME/.pub-cache - $HOME/samples/server/petstore/cpp-pistache/pistache - $HOME/.npm - $HOME/.rvm/gems/ruby-2.4.1 @@ -72,6 +73,13 @@ before_install: - sudo apt-get update -qq - sudo apt-get install -qq bats - sudo apt-get install -qq curl + # install dart + #- sudo apt-get update + - sudo apt-get install apt-transport-https + - sudo sh -c 'curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' + - sudo sh -c 'curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list' + - sudo apt-get update + - sudo apt-get install dart # install perl module #- cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) #- cpanm Test::Exception Test::More Log::Any LWP::UserAgent JSON URI:Query Module::Runtime DateTime Module::Find Moose::Role @@ -96,11 +104,13 @@ install: # Add Godeps dependencies to GOPATH and PATH #- eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.4 bash)" #- export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace" - - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$HOME/.cargo/bin:$PATH" + - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$HOME/.cargo/bin:$PATH:/usr/lib/dart/bin" #- go version - gcc -v - echo $CC - echo $CXX + - pub version + - dart --version script: # fail fast diff --git a/bin/dart2-petstore.sh b/bin/dart2-petstore.sh new file mode 100755 index 00000000000..7160d1c38b0 --- /dev/null +++ b/bin/dart2-petstore.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" + +# Generate non-browserClient +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=true $@" + +# then options to generate the library for vm would be: +#ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi_vm -DbrowserClient=false -DpubName=openapi_vm $@" +java $JAVA_OPTS -jar $executable $ags + +# Generate browserClient +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi-browser-client -DhideGenerationTimestamp=true -DbrowserClient=true --additional-properties supportDart2=true $@" +java $JAVA_OPTS -jar $executable $ags + +# Generate non-browserClient and put it to the flutter sample app +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/flutter_petstore/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=true $@" +java $JAVA_OPTS -jar $executable $ags + +# There is a proposal to allow importing different libraries depending on the environment: +# https://github.com/munificent/dep-interface-libraries +# When this is implemented there will only be one library. + +# The current petstore test will then work for both: the browser library and the vm library. diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java index a041bda543a..55cf82bde52 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java @@ -28,6 +28,7 @@ import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.utils.ModelUtils; import io.swagger.v3.oas.models.media.*; +import io.swagger.v3.parser.util.SchemaTypeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,6 +49,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { public static final String PUB_VERSION = "pubVersion"; public static final String PUB_DESCRIPTION = "pubDescription"; public static final String USE_ENUM_EXTENSION = "useEnumExtension"; + public static final String SUPPORT_DART2 = "supportDart2"; protected boolean browserClient = true; protected String pubName = "openapi"; protected String pubVersion = "1.0.0"; @@ -125,6 +127,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(PUB_DESCRIPTION, "Description in generated pubspec")); cliOptions.add(new CliOption(USE_ENUM_EXTENSION, "Allow the 'x-enum-values' extension for enums")); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "source folder for generated code")); + cliOptions.add(CliOption.newBoolean(SUPPORT_DART2, "support dart2").defaultValue(Boolean.FALSE.toString())); } @Override @@ -189,9 +192,14 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { additionalProperties.put("apiDocPath", apiDocPath); additionalProperties.put("modelDocPath", modelDocPath); + final Object isSupportDart2 = additionalProperties.get(SUPPORT_DART2); + if (Boolean.TRUE.equals(isSupportDart2) || (isSupportDart2 instanceof String && Boolean.parseBoolean((String)isSupportDart2))) { + embeddedTemplateDir = templateDir = "dart2"; + } else { + supportingFiles.add(new SupportingFile("analysis_options.mustache", "", ".analysis_options")); + } final String libFolder = sourceFolder + File.separator + "lib"; supportingFiles.add(new SupportingFile("pubspec.mustache", "", "pubspec.yaml")); - supportingFiles.add(new SupportingFile("analysis_options.mustache", "", ".analysis_options")); supportingFiles.add(new SupportingFile("api_client.mustache", libFolder, "api_client.dart")); supportingFiles.add(new SupportingFile("api_exception.mustache", libFolder, "api_exception.dart")); supportingFiles.add(new SupportingFile("api_helper.mustache", libFolder, "api_helper.dart")); diff --git a/modules/openapi-generator/src/main/resources/dart2/README.mustache b/modules/openapi-generator/src/main/resources/dart2/README.mustache new file mode 100644 index 00000000000..1766ea72105 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/README.mustache @@ -0,0 +1,133 @@ +# {{pubName}} +{{#appDescription}} +{{{appDescription}}} +{{/appDescription}} + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: {{appVersion}} +{{#artifactVersion}} +- Package version: {{artifactVersion}} +{{/artifactVersion}} +{{^hideGenerationTimestamp}} +- Build date: {{generatedDate}} +{{/hideGenerationTimestamp}} +- Build package: {{generatorClass}} +{{#infoUrl}} +For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}) +{{/infoUrl}} + +## Requirements + +Dart 1.20.0 or later OR Flutter 0.0.20 or later + +## 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://github.com/{{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}} + +var api_instance = new {{classname}}(); +{{#allParams}} +var {{paramName}} = {{#isListContainer}}[{{/isListContainer}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isListContainer}}]{{/isListContainer}}; // {{{dataType}}} | {{{description}}} +{{/allParams}} + +try { + {{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/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}}{{summary}}{{/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}}{{^hasMore}}{{infoEmail}} +{{/hasMore}}{{/apis}}{{/apiInfo}} + diff --git a/modules/openapi-generator/src/main/resources/dart2/api.mustache b/modules/openapi-generator/src/main/resources/dart2/api.mustache new file mode 100644 index 00000000000..76797fa2ddc --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/api.mustache @@ -0,0 +1,117 @@ +part of {{pubName}}.api; + +{{#operations}} + + +class {{classname}} { + final ApiClient apiClient; + + {{classname}}([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + {{#operation}} + /// {{summary}} + /// + /// {{notes}} + {{#returnType}}Future<{{{returnType}}}> {{/returnType}}{{^returnType}}Future {{/returnType}}{{nickname}}({{#allParams}}{{#required}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/allParams}}{{#hasOptionalParams}}{ {{#allParams}}{{^required}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/allParams}} }{{/hasOptionalParams}}) async { + Object postBody{{#bodyParam}} = {{paramName}}{{/bodyParam}}; + + // verify required params are set + {{#allParams}} + {{#required}} + if({{paramName}} == null) { + throw new ApiException(400, "Missing required param: {{paramName}}"); + } + {{/required}} + {{/allParams}} + + // create path and map variables + String path = "{{{path}}}".replaceAll("{format}","json"){{#pathParams}}.replaceAll("{" + "{{baseName}}" + "}", {{{paramName}}}.toString()){{/pathParams}}; + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + {{#queryParams}} + {{^required}} + if({{paramName}} != null) { + {{/required}} + queryParams.addAll(_convertParametersForCollectionFormat("{{collectionFormat}}", "{{baseName}}", {{paramName}})); + {{^required}} + } + {{/required}} + {{/queryParams}} + {{#headerParams}} + headerParams["{{baseName}}"] = {{paramName}}; + {{/headerParams}} + + List contentTypes = [{{#consumes}}"{{{mediaType}}}"{{#hasMore}},{{/hasMore}}{{/consumes}}]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = [{{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}}]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + {{#formParams}} + {{^isFile}} + if ({{paramName}} != null) { + hasFields = true; + mp.fields['{{baseName}}'] = parameterToString({{paramName}}); + } + {{/isFile}} + {{#isFile}} + if ({{paramName}} != null) { + hasFields = true; + mp.fields['{{baseName}}'] = {{paramName}}.field; + mp.files.add({{paramName}}); + } + {{/isFile}} + {{/formParams}} + if(hasFields) + postBody = mp; + } + else { + {{#formParams}} + {{^isFile}} + if ({{paramName}} != null) + formParams['{{baseName}}'] = parameterToString({{paramName}}); + {{/isFile}} + {{/formParams}} + } + + var response = await apiClient.invokeAPI(path, + '{{httpMethod}}', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + {{#isListContainer}} + {{#returnType}} + return (apiClient.deserialize(response.body, '{{{returnType}}}') as List).map((item) => item as {{returnBaseType}}).toList(); + {{/returnType}} + {{/isListContainer}} + {{^isListContainer}} + {{#isMapContainer}} + {{#returnType}} + return new {{{returnType}}}.from(apiClient.deserialize(response.body, '{{{returnType}}}')); + {{/returnType}}; + {{/isMapContainer}} + {{^isMapContainer}} + {{#returnType}} + return apiClient.deserialize(response.body, '{{{returnType}}}') as {{{returnType}}}; + {{/returnType}} + {{/isMapContainer}} + {{/isListContainer}} + } else { + return{{#returnType}} null{{/returnType}}; + } + } + {{/operation}} +} +{{/operations}} diff --git a/modules/openapi-generator/src/main/resources/dart2/api_client.mustache b/modules/openapi-generator/src/main/resources/dart2/api_client.mustache new file mode 100644 index 00000000000..9b83baf71dd --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/api_client.mustache @@ -0,0 +1,164 @@ +part of {{pubName}}.api; + +class QueryParam { + String name; + String value; + + QueryParam(this.name, this.value); +} + +class ApiClient { + + String basePath; + var client = {{#browserClient}}Browser{{/browserClient}}Client(); + + Map _defaultHeaderMap = {}; + Map _authentications = {}; + + final _regList = RegExp(r'^List<(.*)>$'); + final _regMap = RegExp(r'^Map$'); + + ApiClient({this.basePath: "{{{basePath}}}"}) { + // Setup authentications (key: authentication name, value: authentication).{{#authMethods}}{{#isBasic}} + _authentications['{{name}}'] = HttpBasicAuth();{{/isBasic}}{{#isApiKey}} + _authentications['{{name}}'] = ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{^isKeyInHeader}}"query"{{/isKeyInHeader}}, "{{keyParamName}}");{{/isApiKey}}{{#isOAuth}} + _authentications['{{name}}'] = OAuth();{{/isOAuth}}{{/authMethods}} + } + + void addDefaultHeader(String key, String value) { + _defaultHeaderMap[key] = value; + } + + dynamic _deserialize(dynamic value, String targetType) { + try { + switch (targetType) { + case 'String': + return '$value'; + case 'int': + return value is int ? value : int.parse('$value'); + case 'bool': + return value is bool ? value : '$value'.toLowerCase() == 'true'; + case 'double': + return value is double ? value : double.parse('$value'); + {{#models}} + {{#model}} + case '{{classname}}': + {{#isEnum}} + // Enclose the value in a list so that Dartson can use a transformer + // to decode it. + final listValue = [value]; + final List listResult = dson.map(listValue, []); + return listResult[0]; + {{/isEnum}} + {{^isEnum}} + return {{classname}}.fromJson(value); + {{/isEnum}} + {{/model}} + {{/models}} + default: + { + Match match; + if (value is List && + (match = _regList.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return value.map((v) => _deserialize(v, newTargetType)).toList(); + } else if (value is Map && + (match = _regMap.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return Map.fromIterables(value.keys, + value.values.map((v) => _deserialize(v, newTargetType))); + } + } + } + } catch (e, stack) { + throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + } + throw ApiException(500, 'Could not find a suitable class for deserialization'); + } + + dynamic deserialize(String json, String targetType) { + // Remove all spaces. Necessary for reg expressions as well. + targetType = targetType.replaceAll(' ', ''); + + if (targetType == 'String') return json; + + var decodedJson = jsonDecode(json); + return _deserialize(decodedJson, targetType); + } + + String serialize(Object obj) { + String serialized = ''; + if (obj == null) { + serialized = ''; + } else { + serialized = json.encode(obj); + } + return serialized; + } + + // We don't use a Map for queryParams. + // If collectionFormat is 'multi' a key might appear multiple times. + Future invokeAPI(String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { + + _updateParamsForAuth(authNames, queryParams, headerParams); + + var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? + '?' + ps.join('&') : + ''; + + String url = basePath + path + queryString; + + headerParams.addAll(_defaultHeaderMap); + headerParams['Content-Type'] = contentType; + + if(body is MultipartRequest) { + var request = MultipartRequest(method, Uri.parse(url)); + request.fields.addAll(body.fields); + request.files.addAll(body.files); + request.headers.addAll(body.headers); + request.headers.addAll(headerParams); + var response = await client.send(request); + return Response.fromStream(response); + } else { + var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); + switch(method) { + case "POST": + return client.post(url, headers: headerParams, body: msgBody); + case "PUT": + return client.put(url, headers: headerParams, body: msgBody); + case "DELETE": + return client.delete(url, headers: headerParams); + case "PATCH": + return client.patch(url, headers: headerParams, body: msgBody); + default: + return client.get(url, headers: headerParams); + } + } + } + + /// Update query and header parameters based on authentication settings. + /// @param authNames The authentications to apply + void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + authNames.forEach((authName) { + Authentication auth = _authentications[authName]; + if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + }); + } + + void setAccessToken(String accessToken) { + _authentications.forEach((key, auth) { + if (auth is OAuth) { + auth.setAccessToken(accessToken); + } + }); + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/api_doc.mustache b/modules/openapi-generator/src/main/resources/dart2/api_doc.mustache new file mode 100644 index 00000000000..c7c10a817a1 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/api_doc.mustache @@ -0,0 +1,86 @@ +# {{pubName}}.api.{{classname}}{{#description}} +{{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}}{{summary}}{{/summary}} +{{/operation}}{{/operations}} + +{{#operations}} +{{#operation}} +# **{{{operationId}}}** +> {{#returnType}}{{{returnType}}} {{/returnType}}{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + +{{{summary}}}{{#notes}} + +{{{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}} = {{#isListContainer}}[{{/isListContainer}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isListContainer}}]{{/isListContainer}}; // {{{dataType}}} | {{{description}}} +{{/allParams}} + +try { + {{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/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}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{dataType}}**]({{baseType}}.md){{/isPrimitiveType}}| {{description}} | {{^required}}[optional] {{/required}}{{#defaultValue}}[default to {{defaultValue}}]{{/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}}}{{#hasMore}}, {{/hasMore}}{{/consumes}}{{^consumes}}Not defined{{/consumes}} + - **Accept**: {{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/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}} diff --git a/modules/openapi-generator/src/main/resources/dart2/api_exception.mustache b/modules/openapi-generator/src/main/resources/dart2/api_exception.mustache new file mode 100644 index 00000000000..5964f88f93d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/api_exception.mustache @@ -0,0 +1,23 @@ +part of {{pubName}}.api; + +class ApiException implements Exception { + int code = 0; + String message; + Exception innerException; + StackTrace stackTrace; + + ApiException(this.code, this.message); + + ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + + String toString() { + if (message == null) return "ApiException"; + + if (innerException == null) { + return "ApiException $code: $message"; + } + + return "ApiException $code: $message (Inner exception: $innerException)\n\n" + + stackTrace.toString(); + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/api_helper.mustache b/modules/openapi-generator/src/main/resources/dart2/api_helper.mustache new file mode 100644 index 00000000000..1e554bede4b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/api_helper.mustache @@ -0,0 +1,52 @@ +part of {{pubName}}.api; + +const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; + +// port from Java version +Iterable _convertParametersForCollectionFormat( + String collectionFormat, String name, dynamic value) { + var params = []; + + // preconditions + if (name == null || name.isEmpty || value == null) return params; + + if (value is! List) { + params.add(QueryParam(name, parameterToString(value))); + return params; + } + + List values = value as List; + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) + ? "csv" + : collectionFormat; // default: csv + + if (collectionFormat == "multi") { + return values.map((v) => QueryParam(name, parameterToString(v))); + } + + String delimiter = _delimiters[collectionFormat] ?? ","; + + params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + return params; +} + +/// Format the given parameter object into string. +String parameterToString(dynamic value) { + if (value == null) { + return ''; + } else if (value is DateTime) { + return value.toUtc().toIso8601String(); + {{#models}} + {{#model}} + {{#isEnum}} + } else if (value is {{classname}}) { + return {{classname}}TypeTransformer().encode(value).toString(); + {{/isEnum}} + {{/model}} + {{/models}} + } else { + return value.toString(); + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/apilib.mustache b/modules/openapi-generator/src/main/resources/dart2/apilib.mustache new file mode 100644 index 00000000000..577330e54cb --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/apilib.mustache @@ -0,0 +1,21 @@ +library {{pubName}}.api; + +import 'dart:async'; +import 'dart:convert';{{#browserClient}} +import 'package:http/browser_client.dart';{{/browserClient}} +import 'package:http/http.dart'; + +part 'api_client.dart'; +part 'api_helper.dart'; +part 'api_exception.dart'; +part 'auth/authentication.dart'; +part 'auth/api_key_auth.dart'; +part 'auth/oauth.dart'; +part 'auth/http_basic_auth.dart'; + +{{#apiInfo}}{{#apis}}part 'api/{{classFilename}}.dart'; +{{/apis}}{{/apiInfo}} +{{#models}}{{#model}}part 'model/{{classFilename}}.dart'; +{{/model}}{{/models}} + +ApiClient defaultApiClient = ApiClient(); diff --git a/modules/openapi-generator/src/main/resources/dart2/auth/api_key_auth.mustache b/modules/openapi-generator/src/main/resources/dart2/auth/api_key_auth.mustache new file mode 100644 index 00000000000..1e62a7902e4 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/auth/api_key_auth.mustache @@ -0,0 +1,27 @@ +part of {{pubName}}.api; + +class ApiKeyAuth implements Authentication { + + final String location; + final String paramName; + String apiKey; + String apiKeyPrefix; + + ApiKeyAuth(this.location, this.paramName); + + @override + void applyToParams(List queryParams, Map headerParams) { + String value; + if (apiKeyPrefix != null) { + value = '$apiKeyPrefix $apiKey'; + } else { + value = apiKey; + } + + if (location == 'query' && value != null) { + queryParams.add(QueryParam(paramName, value)); + } else if (location == 'header' && value != null) { + headerParams[paramName] = value; + } + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/auth/authentication.mustache b/modules/openapi-generator/src/main/resources/dart2/auth/authentication.mustache new file mode 100644 index 00000000000..00bbbf09746 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/auth/authentication.mustache @@ -0,0 +1,7 @@ +part of {{pubName}}.api; + +abstract class Authentication { + + /// Apply authentication settings to header and query params. + void applyToParams(List queryParams, Map headerParams); +} diff --git a/modules/openapi-generator/src/main/resources/dart2/auth/http_basic_auth.mustache b/modules/openapi-generator/src/main/resources/dart2/auth/http_basic_auth.mustache new file mode 100644 index 00000000000..89b3926ed79 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/auth/http_basic_auth.mustache @@ -0,0 +1,14 @@ +part of {{pubName}}.api; + +class HttpBasicAuth implements Authentication { + + String username; + String password; + + @override + void applyToParams(List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); + } + +} diff --git a/modules/openapi-generator/src/main/resources/dart2/auth/oauth.mustache b/modules/openapi-generator/src/main/resources/dart2/auth/oauth.mustache new file mode 100644 index 00000000000..07a25e5f6dc --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/auth/oauth.mustache @@ -0,0 +1,18 @@ +part of {{pubName}}.api; + +class OAuth implements Authentication { + String accessToken; + + OAuth({this.accessToken}); + + @override + void applyToParams(List queryParams, Map headerParams) { + if (accessToken != null) { + headerParams["Authorization"] = "Bearer " + accessToken; + } + } + + void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/class.mustache b/modules/openapi-generator/src/main/resources/dart2/class.mustache new file mode 100644 index 00000000000..43c1c0725ce --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/class.mustache @@ -0,0 +1,82 @@ +class {{classname}} { + {{#vars}} + {{#description}}/* {{{description}}} */{{/description}} + {{{dataType}}} {{name}} = {{{defaultValue}}}; + {{#allowableValues}} + {{#min}} // range from {{min}} to {{max}}{{/min}}//{{^min}}enum {{name}}Enum { {{#values}} {{.}}, {{/values}} };{{/min}}{ + {{/allowableValues}} + {{/vars}} + {{classname}}(); + + @override + String toString() { + return '{{classname}}[{{#vars}}{{name}}=${{name}}, {{/vars}}]'; + } + + {{classname}}.fromJson(Map json) { + if (json == null) return; + {{#vars}} + {{#isDateTime}} + {{name}} = json['{{baseName}}'] == null ? null : DateTime.parse(json['{{baseName}}']); + {{/isDateTime}} + {{#isDate}} + {{name}} = json['{{baseName}}'] == null ? null : DateTime.parse(json['{{baseName}}']); + {{/isDate}} + {{^isDateTime}} + {{^isDate}} + {{#complexType}} + {{#isListContainer}} + {{name}} = {{complexType}}.listFromJson(json['{{baseName}}']); + {{/isListContainer}} + {{^isListContainer}} + {{#isMapContainer}} + {{name}} = {{complexType}}.mapFromJson(json['{{baseName}}']); + {{/isMapContainer}} + {{^isMapContainer}} + {{name}} = new {{complexType}}.fromJson(json['{{baseName}}']); + {{/isMapContainer}} + {{/isListContainer}} + {{/complexType}} + {{^complexType}} + {{#isListContainer}} + {{name}} = ((json['{{baseName}}'] ?? []) as List).map((item) => item as {{items.datatype}}).toList(); + {{/isListContainer}} + {{^isListContainer}} + {{name}} = json['{{baseName}}']; + {{/isListContainer}} + {{/complexType}} + {{/isDate}} + {{/isDateTime}} + {{/vars}} + } + + Map toJson() { + return { + {{#vars}} + {{#isDateTime}} + '{{baseName}}': {{name}} == null ? '' : {{name}}.toUtc().toIso8601String(){{^-last}},{{/-last}} + {{/isDateTime}} + {{#isDate}} + '{{baseName}}': {{name}} == null ? '' : {{name}}.toUtc().toIso8601String(){{^-last}},{{/-last}} + {{/isDate}} + {{^isDateTime}} + {{^isDate}} + '{{baseName}}': {{name}}{{^-last}},{{/-last}} + {{/isDate}} + {{/isDateTime}} + {{/vars}} + }; + } + + static List<{{classname}}> listFromJson(List json) { + return json == null ? new List<{{classname}}>() : json.map((value) => new {{classname}}.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new {{classname}}.fromJson(value)); + } + return map; + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/enum.mustache b/modules/openapi-generator/src/main/resources/dart2/enum.mustache new file mode 100644 index 00000000000..debb73bbcec --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/enum.mustache @@ -0,0 +1,36 @@ +@Entity() +class {{classname}} { + /// The underlying value of this enum member. + final {{dataType}} value; + + const {{classname}}._internal(this.value); + + {{#allowableValues}} + {{#enumVars}} + {{#description}} + /// {{description}} + {{/description}} + static const {{classname}} {{name}} = const {{classname}}._internal({{value}}); + {{/enumVars}} + {{/allowableValues}} +} + +class {{classname}}TypeTransformer extends TypeTransformer<{{classname}}> { + + @override + dynamic encode({{classname}} data) { + return data.value; + } + + @override + {{classname}} decode(dynamic data) { + switch (data) { + {{#allowableValues}} + {{#enumVars}} + case {{value}}: return {{classname}}.{{name}}; + {{/enumVars}} + {{/allowableValues}} + default: throw('Unknown enum value to decode: $data'); + } + } +} diff --git a/modules/openapi-generator/src/main/resources/dart2/git_push.sh.mustache b/modules/openapi-generator/src/main/resources/dart2/git_push.sh.mustache new file mode 100755 index 00000000000..8a32e53995d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/git_push.sh.mustache @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/modules/openapi-generator/src/main/resources/dart2/gitignore.mustache b/modules/openapi-generator/src/main/resources/dart2/gitignore.mustache new file mode 100644 index 00000000000..7c280441649 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/gitignore.mustache @@ -0,0 +1,27 @@ +# 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 diff --git a/modules/openapi-generator/src/main/resources/dart2/model.mustache b/modules/openapi-generator/src/main/resources/dart2/model.mustache new file mode 100644 index 00000000000..37b030ab034 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/model.mustache @@ -0,0 +1,12 @@ +part of {{pubName}}.api; + +{{#models}} +{{#model}} +{{#isEnum}} +{{>enum}} +{{/isEnum}} +{{^isEnum}} +{{>class}} +{{/isEnum}} +{{/model}} +{{/models}} diff --git a/modules/openapi-generator/src/main/resources/dart2/object_doc.mustache b/modules/openapi-generator/src/main/resources/dart2/object_doc.mustache new file mode 100644 index 00000000000..657f84d8905 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/object_doc.mustache @@ -0,0 +1,16 @@ +{{#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}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{defaultValue}}]{{/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}} diff --git a/modules/openapi-generator/src/main/resources/dart2/pubspec.mustache b/modules/openapi-generator/src/main/resources/dart2/pubspec.mustache new file mode 100644 index 00000000000..388572afe62 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart2/pubspec.mustache @@ -0,0 +1,7 @@ +name: {{pubName}} +version: {{pubVersion}} +description: {{pubDescription}} +environment: + sdk: '>=2.0.0 <3.0.0' +dependencies: + http: '>=0.11.1 <0.12.0' diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/DartClientOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/DartClientOptionsProvider.java index b23cf14f227..42167695ec8 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/DartClientOptionsProvider.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/DartClientOptionsProvider.java @@ -54,6 +54,7 @@ public class DartClientOptionsProvider implements OptionsProvider { .put(DartClientCodegen.USE_ENUM_EXTENSION, USE_ENUM_EXTENSION) .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(CodegenConstants.PREPEND_FORM_OR_BODY_PARAMETERS, PREPEND_FORM_OR_BODY_PARAMETERS_VALUE) + .put(DartClientCodegen.SUPPORT_DART2, "false") .build(); } diff --git a/pom.xml b/pom.xml index 7dbe747ac63..c84aa75062c 100644 --- a/pom.xml +++ b/pom.xml @@ -1036,6 +1036,7 @@ samples/client/petstore/ruby samples/server/petstore/rust-server + samples/client/petstore/dart2/petstore diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/.analysis_options b/samples/client/petstore/dart2/flutter_petstore/openapi/.analysis_options new file mode 100644 index 00000000000..518eb901a6f --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/.analysis_options @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true \ No newline at end of file diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/.gitignore b/samples/client/petstore/dart2/flutter_petstore/openapi/.gitignore new file mode 100644 index 00000000000..7c280441649 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/.gitignore @@ -0,0 +1,27 @@ +# 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 diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator-ignore b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION new file mode 100644 index 00000000000..105bb87d77b --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/README.md b/samples/client/petstore/dart2/flutter_petstore/openapi/README.md new file mode 100644 index 00000000000..5f3fe054784 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/README.md @@ -0,0 +1,121 @@ +# openapi +This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 +- Build package: org.openapitools.codegen.languages.DartClientCodegen + +## Requirements + +Dart 1.20.0 or later OR Flutter 0.0.20 or later + +## Installation & Usage + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +``` +name: openapi +version: 1.0.0 +description: OpenAPI API client +dependencies: + openapi: + git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + version: 'any' +``` + +### Local +To use the package in your local drive, please include the following in pubspec.yaml +``` +dependencies: + openapi: + path: /path/to/openapi +``` + +## Tests + +TODO + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:openapi/api.dart'; + +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://petstore.swagger.io/v2* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PetApi* | [**addPet**](docs//PetApi.md#addpet) | **POST** /pet | Add a new pet to the store +*PetApi* | [**deletePet**](docs//PetApi.md#deletepet) | **DELETE** /pet/{petId} | Deletes a pet +*PetApi* | [**findPetsByStatus**](docs//PetApi.md#findpetsbystatus) | **GET** /pet/findByStatus | Finds Pets by status +*PetApi* | [**findPetsByTags**](docs//PetApi.md#findpetsbytags) | **GET** /pet/findByTags | Finds Pets by tags +*PetApi* | [**getPetById**](docs//PetApi.md#getpetbyid) | **GET** /pet/{petId} | Find pet by ID +*PetApi* | [**updatePet**](docs//PetApi.md#updatepet) | **PUT** /pet | Update an existing pet +*PetApi* | [**updatePetWithForm**](docs//PetApi.md#updatepetwithform) | **POST** /pet/{petId} | Updates a pet in the store with form data +*PetApi* | [**uploadFile**](docs//PetApi.md#uploadfile) | **POST** /pet/{petId}/uploadImage | uploads an image +*StoreApi* | [**deleteOrder**](docs//StoreApi.md#deleteorder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +*StoreApi* | [**getInventory**](docs//StoreApi.md#getinventory) | **GET** /store/inventory | Returns pet inventories by status +*StoreApi* | [**getOrderById**](docs//StoreApi.md#getorderbyid) | **GET** /store/order/{orderId} | Find purchase order by ID +*StoreApi* | [**placeOrder**](docs//StoreApi.md#placeorder) | **POST** /store/order | Place an order for a pet +*UserApi* | [**createUser**](docs//UserApi.md#createuser) | **POST** /user | Create user +*UserApi* | [**createUsersWithArrayInput**](docs//UserApi.md#createuserswitharrayinput) | **POST** /user/createWithArray | Creates list of users with given input array +*UserApi* | [**createUsersWithListInput**](docs//UserApi.md#createuserswithlistinput) | **POST** /user/createWithList | Creates list of users with given input array +*UserApi* | [**deleteUser**](docs//UserApi.md#deleteuser) | **DELETE** /user/{username} | Delete user +*UserApi* | [**getUserByName**](docs//UserApi.md#getuserbyname) | **GET** /user/{username} | Get user by user name +*UserApi* | [**loginUser**](docs//UserApi.md#loginuser) | **GET** /user/login | Logs user into the system +*UserApi* | [**logoutUser**](docs//UserApi.md#logoutuser) | **GET** /user/logout | Logs out current logged in user session +*UserApi* | [**updateUser**](docs//UserApi.md#updateuser) | **PUT** /user/{username} | Updated user + + +## Documentation For Models + + - [ApiResponse](docs//ApiResponse.md) + - [Category](docs//Category.md) + - [Order](docs//Order.md) + - [Pet](docs//Pet.md) + - [Tag](docs//Tag.md) + - [User](docs//User.md) + + +## Documentation For Authorization + + +## api_key + +- **Type**: API key +- **API key parameter name**: api_key +- **Location**: HTTP header + +## petstore_auth + +- **Type**: OAuth +- **Flow**: implicit +- **Authorization URL**: http://petstore.swagger.io/api/oauth/dialog +- **Scopes**: + - **write:pets**: modify pets in your account + - **read:pets**: read your pets + + +## Author + + + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/ApiResponse.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/ApiResponse.md new file mode 100644 index 00000000000..92422f0f446 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/ApiResponse.md @@ -0,0 +1,17 @@ +# openapi.model.ApiResponse + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **int** | | [optional] [default to null] +**type** | **String** | | [optional] [default to null] +**message** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Category.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Category.md new file mode 100644 index 00000000000..cc0d1633b59 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Category.md @@ -0,0 +1,16 @@ +# openapi.model.Category + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Order.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Order.md new file mode 100644 index 00000000000..310ce6c65be --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Order.md @@ -0,0 +1,20 @@ +# openapi.model.Order + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**petId** | **int** | | [optional] [default to null] +**quantity** | **int** | | [optional] [default to null] +**shipDate** | [**DateTime**](DateTime.md) | | [optional] [default to null] +**status** | **String** | Order Status | [optional] [default to null] +**complete** | **bool** | | [optional] [default to false] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Pet.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Pet.md new file mode 100644 index 00000000000..191e1fc66a9 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Pet.md @@ -0,0 +1,20 @@ +# openapi.model.Pet + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**category** | [**Category**](Category.md) | | [optional] [default to null] +**name** | **String** | | [default to null] +**photoUrls** | **List<String>** | | [default to []] +**tags** | [**List<Tag>**](Tag.md) | | [optional] [default to []] +**status** | **String** | pet status in the store | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/PetApi.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/PetApi.md new file mode 100644 index 00000000000..6fa9abf67ae --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/PetApi.md @@ -0,0 +1,379 @@ +# openapi.api.PetApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**addPet**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store +[**deletePet**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet +[**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status +[**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags +[**getPetById**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID +[**updatePet**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet +[**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data +[**uploadFile**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image + + +# **addPet** +> addPet(pet) + +Add a new pet to the store + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **deletePet** +> deletePet(petId, apiKey) + +Deletes a pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | Pet id to delete +var apiKey = apiKey_example; // String | + +try { + api_instance.deletePet(petId, apiKey); +} catch (e) { + print("Exception when calling PetApi->deletePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| Pet id to delete | + **apiKey** | **String**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **findPetsByStatus** +> List findPetsByStatus(status) + +Finds Pets by status + +Multiple status values can be provided with comma separated strings + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var status = []; // List | Status values that need to be considered for filter + +try { + var result = api_instance.findPetsByStatus(status); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByStatus: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **findPetsByTags** +> List findPetsByTags(tags) + +Finds Pets by tags + +Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var tags = []; // List | Tags to filter by + +try { + var result = api_instance.findPetsByTags(tags); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByTags: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tags** | [**List<String>**](String.md)| Tags to filter by | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **getPetById** +> Pet getPetById(petId) + +Find pet by ID + +Returns a single pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to return + +try { + var result = api_instance.getPetById(petId); + print(result); +} catch (e) { + print("Exception when calling PetApi->getPetById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to return | + +### Return type + +[**Pet**](Pet.md) + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **updatePet** +> updatePet(pet) + +Update an existing pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.updatePet(pet); +} catch (e) { + print("Exception when calling PetApi->updatePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **updatePetWithForm** +> updatePetWithForm(petId, name, status) + +Updates a pet in the store with form data + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet that needs to be updated +var name = name_example; // String | Updated name of the pet +var status = status_example; // String | Updated status of the pet + +try { + api_instance.updatePetWithForm(petId, name, status); +} catch (e) { + print("Exception when calling PetApi->updatePetWithForm: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet that needs to be updated | + **name** | **String**| Updated name of the pet | [optional] [default to null] + **status** | **String**| Updated status of the pet | [optional] [default to null] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + +[[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) + +# **uploadFile** +> ApiResponse uploadFile(petId, additionalMetadata, file) + +uploads an image + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to update +var additionalMetadata = additionalMetadata_example; // String | Additional data to pass to server +var file = BINARY_DATA_HERE; // MultipartFile | file to upload + +try { + var result = api_instance.uploadFile(petId, additionalMetadata, file); + print(result); +} catch (e) { + print("Exception when calling PetApi->uploadFile: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to update | + **additionalMetadata** | **String**| Additional data to pass to server | [optional] [default to null] + **file** | **MultipartFile**| file to upload | [optional] [default to null] + +### Return type + +[**ApiResponse**](ApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + +[[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) + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/StoreApi.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/StoreApi.md new file mode 100644 index 00000000000..cc0c2ac2d35 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/StoreApi.md @@ -0,0 +1,186 @@ +# openapi.api.StoreApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +[**getInventory**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status +[**getOrderById**](StoreApi.md#getOrderById) | **GET** /store/order/{orderId} | Find purchase order by ID +[**placeOrder**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet + + +# **deleteOrder** +> deleteOrder(orderId) + +Delete purchase order by ID + +For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = orderId_example; // String | ID of the order that needs to be deleted + +try { + api_instance.deleteOrder(orderId); +} catch (e) { + print("Exception when calling StoreApi->deleteOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **String**| ID of the order that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getInventory** +> Map getInventory() + +Returns pet inventories by status + +Returns a map of status codes to quantities + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new StoreApi(); + +try { + var result = api_instance.getInventory(); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getInventory: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**Map** + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[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) + +# **getOrderById** +> Order getOrderById(orderId) + +Find purchase order by ID + +For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = 789; // int | ID of pet that needs to be fetched + +try { + var result = api_instance.getOrderById(orderId); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getOrderById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **int**| ID of pet that needs to be fetched | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **placeOrder** +> Order placeOrder(order) + +Place an order for a pet + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var order = new Order(); // Order | order placed for purchasing the pet + +try { + var result = api_instance.placeOrder(order); + print(result); +} catch (e) { + print("Exception when calling StoreApi->placeOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **order** | [**Order**](Order.md)| order placed for purchasing the pet | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Tag.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Tag.md new file mode 100644 index 00000000000..ded7b32ac3d --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/Tag.md @@ -0,0 +1,16 @@ +# openapi.model.Tag + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/User.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/User.md new file mode 100644 index 00000000000..3761b70cf0b --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/User.md @@ -0,0 +1,22 @@ +# openapi.model.User + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**username** | **String** | | [optional] [default to null] +**firstName** | **String** | | [optional] [default to null] +**lastName** | **String** | | [optional] [default to null] +**email** | **String** | | [optional] [default to null] +**password** | **String** | | [optional] [default to null] +**phone** | **String** | | [optional] [default to null] +**userStatus** | **int** | User Status | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/docs/UserApi.md b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/UserApi.md new file mode 100644 index 00000000000..0dec271be5c --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/docs/UserApi.md @@ -0,0 +1,349 @@ +# openapi.api.UserApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createUser**](UserApi.md#createUser) | **POST** /user | Create user +[**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array +[**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array +[**deleteUser**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user +[**getUserByName**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name +[**loginUser**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system +[**logoutUser**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session +[**updateUser**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user + + +# **createUser** +> createUser(user) + +Create user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = new User(); // User | Created user object + +try { + api_instance.createUser(user); +} catch (e) { + print("Exception when calling UserApi->createUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**User**](User.md)| Created user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithArrayInput** +> createUsersWithArrayInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithArrayInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithArrayInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithListInput** +> createUsersWithListInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithListInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithListInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **deleteUser** +> deleteUser(username) + +Delete user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be deleted + +try { + api_instance.deleteUser(username); +} catch (e) { + print("Exception when calling UserApi->deleteUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getUserByName** +> User getUserByName(username) + +Get user by user name + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be fetched. Use user1 for testing. + +try { + var result = api_instance.getUserByName(username); + print(result); +} catch (e) { + print("Exception when calling UserApi->getUserByName: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be fetched. Use user1 for testing. | + +### Return type + +[**User**](User.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **loginUser** +> String loginUser(username, password) + +Logs user into the system + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The user name for login +var password = password_example; // String | The password for login in clear text + +try { + var result = api_instance.loginUser(username, password); + print(result); +} catch (e) { + print("Exception when calling UserApi->loginUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The user name for login | + **password** | **String**| The password for login in clear text | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **logoutUser** +> logoutUser() + +Logs out current logged in user session + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); + +try { + api_instance.logoutUser(); +} catch (e) { + print("Exception when calling UserApi->logoutUser: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **updateUser** +> updateUser(username, user) + +Updated user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | name that need to be deleted +var user = new User(); // User | Updated user object + +try { + api_instance.updateUser(username, user); +} catch (e) { + print("Exception when calling UserApi->updateUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| name that need to be deleted | + **user** | [**User**](User.md)| Updated user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/git_push.sh b/samples/client/petstore/dart2/flutter_petstore/openapi/git_push.sh new file mode 100644 index 00000000000..8442b80bb44 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart new file mode 100644 index 00000000000..69c3ecd2e15 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart @@ -0,0 +1,27 @@ +library openapi.api; + +import 'dart:async'; +import 'dart:convert'; +import 'package:http/http.dart'; + +part 'api_client.dart'; +part 'api_helper.dart'; +part 'api_exception.dart'; +part 'auth/authentication.dart'; +part 'auth/api_key_auth.dart'; +part 'auth/oauth.dart'; +part 'auth/http_basic_auth.dart'; + +part 'api/pet_api.dart'; +part 'api/store_api.dart'; +part 'api/user_api.dart'; + +part 'model/api_response.dart'; +part 'model/category.dart'; +part 'model/order.dart'; +part 'model/pet.dart'; +part 'model/tag.dart'; +part 'model/user.dart'; + + +ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart new file mode 100644 index 00000000000..8e6c815ec2b --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart @@ -0,0 +1,432 @@ +part of openapi.api; + + + +class PetApi { + final ApiClient apiClient; + + PetApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Add a new pet to the store + /// + /// + Future addPet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Deletes a pet + /// + /// + Future deletePet(int petId, { String apiKey }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + headerParams["api_key"] = apiKey; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Finds Pets by status + /// + /// Multiple status values can be provided with comma separated strings + Future> findPetsByStatus(List status) async { + Object postBody; + + // verify required params are set + if(status == null) { + throw new ApiException(400, "Missing required param: status"); + } + + // create path and map variables + String path = "/pet/findByStatus".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Finds Pets by tags + /// + /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + Future> findPetsByTags(List tags) async { + Object postBody; + + // verify required params are set + if(tags == null) { + throw new ApiException(400, "Missing required param: tags"); + } + + // create path and map variables + String path = "/pet/findByTags".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Find pet by ID + /// + /// Returns a single pet + Future getPetById(int petId) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Pet') as Pet; + } else { + return null; + } + } + /// Update an existing pet + /// + /// + Future updatePet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updates a pet in the store with form data + /// + /// + Future updatePetWithForm(int petId, { String name, String status }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/x-www-form-urlencoded"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (name != null) { + hasFields = true; + mp.fields['name'] = parameterToString(name); + } + if (status != null) { + hasFields = true; + mp.fields['status'] = parameterToString(status); + } + if(hasFields) + postBody = mp; + } + else { + if (name != null) + formParams['name'] = parameterToString(name); + if (status != null) + formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// uploads an image + /// + /// + Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["multipart/form-data"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (additionalMetadata != null) { + hasFields = true; + mp.fields['additionalMetadata'] = parameterToString(additionalMetadata); + } + if (file != null) { + hasFields = true; + mp.fields['file'] = file.field; + mp.files.add(file); + } + if(hasFields) + postBody = mp; + } + else { + if (additionalMetadata != null) + formParams['additionalMetadata'] = parameterToString(additionalMetadata); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart new file mode 100644 index 00000000000..38fe10d4450 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart @@ -0,0 +1,207 @@ +part of openapi.api; + + + +class StoreApi { + final ApiClient apiClient; + + StoreApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Delete purchase order by ID + /// + /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + Future deleteOrder(String orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Returns pet inventories by status + /// + /// Returns a map of status codes to quantities + Future> getInventory() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/store/inventory".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return new Map.from(apiClient.deserialize(response.body, 'Map')); + ; + } else { + return null; + } + } + /// Find purchase order by ID + /// + /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + Future getOrderById(int orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } + /// Place an order for a pet + /// + /// + Future placeOrder(Order order) async { + Object postBody = order; + + // verify required params are set + if(order == null) { + throw new ApiException(400, "Missing required param: order"); + } + + // create path and map variables + String path = "/store/order".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart new file mode 100644 index 00000000000..9d3eb116e61 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart @@ -0,0 +1,409 @@ +part of openapi.api; + + + +class UserApi { + final ApiClient apiClient; + + UserApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Create user + /// + /// This can only be done by the logged in user. + Future createUser(User user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithArrayInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithArray".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithListInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithList".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Delete user + /// + /// This can only be done by the logged in user. + Future deleteUser(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Get user by user name + /// + /// + Future getUserByName(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'User') as User; + } else { + return null; + } + } + /// Logs user into the system + /// + /// + Future loginUser(String username, String password) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(password == null) { + throw new ApiException(400, "Missing required param: password"); + } + + // create path and map variables + String path = "/user/login".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'String') as String; + } else { + return null; + } + } + /// Logs out current logged in user session + /// + /// + Future logoutUser() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/user/logout".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updated user + /// + /// This can only be done by the logged in user. + Future updateUser(String username, User user) async { + Object postBody = user; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart new file mode 100644 index 00000000000..f1e49792f90 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart @@ -0,0 +1,160 @@ +part of openapi.api; + +class QueryParam { + String name; + String value; + + QueryParam(this.name, this.value); +} + +class ApiClient { + + String basePath; + var client = Client(); + + Map _defaultHeaderMap = {}; + Map _authentications = {}; + + final _regList = RegExp(r'^List<(.*)>$'); + final _regMap = RegExp(r'^Map$'); + + ApiClient({this.basePath: "http://petstore.swagger.io/v2"}) { + // Setup authentications (key: authentication name, value: authentication). + _authentications['api_key'] = ApiKeyAuth("header", "api_key"); + _authentications['petstore_auth'] = OAuth(); + } + + void addDefaultHeader(String key, String value) { + _defaultHeaderMap[key] = value; + } + + dynamic _deserialize(dynamic value, String targetType) { + try { + switch (targetType) { + case 'String': + return '$value'; + case 'int': + return value is int ? value : int.parse('$value'); + case 'bool': + return value is bool ? value : '$value'.toLowerCase() == 'true'; + case 'double': + return value is double ? value : double.parse('$value'); + case 'ApiResponse': + return ApiResponse.fromJson(value); + case 'Category': + return Category.fromJson(value); + case 'Order': + return Order.fromJson(value); + case 'Pet': + return Pet.fromJson(value); + case 'Tag': + return Tag.fromJson(value); + case 'User': + return User.fromJson(value); + default: + { + Match match; + if (value is List && + (match = _regList.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return value.map((v) => _deserialize(v, newTargetType)).toList(); + } else if (value is Map && + (match = _regMap.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return Map.fromIterables(value.keys, + value.values.map((v) => _deserialize(v, newTargetType))); + } + } + } + } catch (e, stack) { + throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + } + throw ApiException(500, 'Could not find a suitable class for deserialization'); + } + + dynamic deserialize(String json, String targetType) { + // Remove all spaces. Necessary for reg expressions as well. + targetType = targetType.replaceAll(' ', ''); + + if (targetType == 'String') return json; + + var decodedJson = jsonDecode(json); + return _deserialize(decodedJson, targetType); + } + + String serialize(Object obj) { + String serialized = ''; + if (obj == null) { + serialized = ''; + } else { + serialized = json.encode(obj); + } + return serialized; + } + + // We don't use a Map for queryParams. + // If collectionFormat is 'multi' a key might appear multiple times. + Future invokeAPI(String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { + + _updateParamsForAuth(authNames, queryParams, headerParams); + + var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? + '?' + ps.join('&') : + ''; + + String url = basePath + path + queryString; + + headerParams.addAll(_defaultHeaderMap); + headerParams['Content-Type'] = contentType; + + if(body is MultipartRequest) { + var request = MultipartRequest(method, Uri.parse(url)); + request.fields.addAll(body.fields); + request.files.addAll(body.files); + request.headers.addAll(body.headers); + request.headers.addAll(headerParams); + var response = await client.send(request); + return Response.fromStream(response); + } else { + var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); + switch(method) { + case "POST": + return client.post(url, headers: headerParams, body: msgBody); + case "PUT": + return client.put(url, headers: headerParams, body: msgBody); + case "DELETE": + return client.delete(url, headers: headerParams); + case "PATCH": + return client.patch(url, headers: headerParams, body: msgBody); + default: + return client.get(url, headers: headerParams); + } + } + } + + /// Update query and header parameters based on authentication settings. + /// @param authNames The authentications to apply + void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + authNames.forEach((authName) { + Authentication auth = _authentications[authName]; + if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + }); + } + + void setAccessToken(String accessToken) { + _authentications.forEach((key, auth) { + if (auth is OAuth) { + auth.setAccessToken(accessToken); + } + }); + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart new file mode 100644 index 00000000000..668abe2c96b --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart @@ -0,0 +1,23 @@ +part of openapi.api; + +class ApiException implements Exception { + int code = 0; + String message; + Exception innerException; + StackTrace stackTrace; + + ApiException(this.code, this.message); + + ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + + String toString() { + if (message == null) return "ApiException"; + + if (innerException == null) { + return "ApiException $code: $message"; + } + + return "ApiException $code: $message (Inner exception: $innerException)\n\n" + + stackTrace.toString(); + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart new file mode 100644 index 00000000000..a516a68d264 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; + +// port from Java version +Iterable _convertParametersForCollectionFormat( + String collectionFormat, String name, dynamic value) { + var params = []; + + // preconditions + if (name == null || name.isEmpty || value == null) return params; + + if (value is! List) { + params.add(QueryParam(name, parameterToString(value))); + return params; + } + + List values = value as List; + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) + ? "csv" + : collectionFormat; // default: csv + + if (collectionFormat == "multi") { + return values.map((v) => QueryParam(name, parameterToString(v))); + } + + String delimiter = _delimiters[collectionFormat] ?? ","; + + params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + return params; +} + +/// Format the given parameter object into string. +String parameterToString(dynamic value) { + if (value == null) { + return ''; + } else if (value is DateTime) { + return value.toUtc().toIso8601String(); + } else { + return value.toString(); + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart new file mode 100644 index 00000000000..8caf6ab5eba --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart @@ -0,0 +1,27 @@ +part of openapi.api; + +class ApiKeyAuth implements Authentication { + + final String location; + final String paramName; + String apiKey; + String apiKeyPrefix; + + ApiKeyAuth(this.location, this.paramName); + + @override + void applyToParams(List queryParams, Map headerParams) { + String value; + if (apiKeyPrefix != null) { + value = '$apiKeyPrefix $apiKey'; + } else { + value = apiKey; + } + + if (location == 'query' && value != null) { + queryParams.add(QueryParam(paramName, value)); + } else if (location == 'header' && value != null) { + headerParams[paramName] = value; + } + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart new file mode 100644 index 00000000000..abd5e2fe68a --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart @@ -0,0 +1,7 @@ +part of openapi.api; + +abstract class Authentication { + + /// Apply authentication settings to header and query params. + void applyToParams(List queryParams, Map headerParams); +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart new file mode 100644 index 00000000000..6342d886689 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart @@ -0,0 +1,14 @@ +part of openapi.api; + +class HttpBasicAuth implements Authentication { + + String username; + String password; + + @override + void applyToParams(List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); + } + +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart new file mode 100644 index 00000000000..aa08e5cdb4d --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart @@ -0,0 +1,18 @@ +part of openapi.api; + +class OAuth implements Authentication { + String accessToken; + + OAuth({this.accessToken}); + + @override + void applyToParams(List queryParams, Map headerParams) { + if (accessToken != null) { + headerParams["Authorization"] = "Bearer " + accessToken; + } + } + + void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart new file mode 100644 index 00000000000..a39d9500b29 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +class ApiResponse { + + int code = null; + + String type = null; + + String message = null; + ApiResponse(); + + @override + String toString() { + return 'ApiResponse[code=$code, type=$type, message=$message, ]'; + } + + ApiResponse.fromJson(Map json) { + if (json == null) return; + code = json['code']; + type = json['type']; + message = json['message']; + } + + Map toJson() { + return { + 'code': code, + 'type': type, + 'message': message + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart new file mode 100644 index 00000000000..b9b2481dd29 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Category { + + int id = null; + + String name = null; + Category(); + + @override + String toString() { + return 'Category[id=$id, name=$name, ]'; + } + + Category.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart new file mode 100644 index 00000000000..4e264a183ef --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Order { + + int id = null; + + int petId = null; + + int quantity = null; + + DateTime shipDate = null; + /* Order Status */ + String status = null; + //enum statusEnum { placed, approved, delivered, };{ + + bool complete = false; + Order(); + + @override + String toString() { + return 'Order[id=$id, petId=$petId, quantity=$quantity, shipDate=$shipDate, status=$status, complete=$complete, ]'; + } + + Order.fromJson(Map json) { + if (json == null) return; + id = json['id']; + petId = json['petId']; + quantity = json['quantity']; + shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + status = json['status']; + complete = json['complete']; + } + + Map toJson() { + return { + 'id': id, + 'petId': petId, + 'quantity': quantity, + 'shipDate': shipDate == null ? '' : shipDate.toUtc().toIso8601String(), + 'status': status, + 'complete': complete + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart new file mode 100644 index 00000000000..da9de49b678 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Pet { + + int id = null; + + Category category = null; + + String name = null; + + List photoUrls = []; + + List tags = []; + /* pet status in the store */ + String status = null; + //enum statusEnum { available, pending, sold, };{ + Pet(); + + @override + String toString() { + return 'Pet[id=$id, category=$category, name=$name, photoUrls=$photoUrls, tags=$tags, status=$status, ]'; + } + + Pet.fromJson(Map json) { + if (json == null) return; + id = json['id']; + category = new Category.fromJson(json['category']); + name = json['name']; + photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + tags = Tag.listFromJson(json['tags']); + status = json['status']; + } + + Map toJson() { + return { + 'id': id, + 'category': category, + 'name': name, + 'photoUrls': photoUrls, + 'tags': tags, + 'status': status + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart new file mode 100644 index 00000000000..315a326adb7 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Tag { + + int id = null; + + String name = null; + Tag(); + + @override + String toString() { + return 'Tag[id=$id, name=$name, ]'; + } + + Tag.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart new file mode 100644 index 00000000000..0e4cc2104c7 --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart @@ -0,0 +1,64 @@ +part of openapi.api; + +class User { + + int id = null; + + String username = null; + + String firstName = null; + + String lastName = null; + + String email = null; + + String password = null; + + String phone = null; + /* User Status */ + int userStatus = null; + User(); + + @override + String toString() { + return 'User[id=$id, username=$username, firstName=$firstName, lastName=$lastName, email=$email, password=$password, phone=$phone, userStatus=$userStatus, ]'; + } + + User.fromJson(Map json) { + if (json == null) return; + id = json['id']; + username = json['username']; + firstName = json['firstName']; + lastName = json['lastName']; + email = json['email']; + password = json['password']; + phone = json['phone']; + userStatus = json['userStatus']; + } + + Map toJson() { + return { + 'id': id, + 'username': username, + 'firstName': firstName, + 'lastName': lastName, + 'email': email, + 'password': password, + 'phone': phone, + 'userStatus': userStatus + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/pubspec.yaml b/samples/client/petstore/dart2/flutter_petstore/openapi/pubspec.yaml new file mode 100644 index 00000000000..9ccf0e524ad --- /dev/null +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/pubspec.yaml @@ -0,0 +1,7 @@ +name: openapi +version: 1.0.0 +description: OpenAPI API client +environment: + sdk: '>=2.0.0 <3.0.0' +dependencies: + http: '>=0.11.1 <0.12.0' diff --git a/samples/client/petstore/dart2/openapi-browser-client/.analysis_options b/samples/client/petstore/dart2/openapi-browser-client/.analysis_options new file mode 100644 index 00000000000..518eb901a6f --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/.analysis_options @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi-browser-client/.gitignore b/samples/client/petstore/dart2/openapi-browser-client/.gitignore new file mode 100644 index 00000000000..7c280441649 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/.gitignore @@ -0,0 +1,27 @@ +# 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 diff --git a/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator-ignore b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION new file mode 100644 index 00000000000..105bb87d77b --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi-browser-client/README.md b/samples/client/petstore/dart2/openapi-browser-client/README.md new file mode 100644 index 00000000000..5f3fe054784 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/README.md @@ -0,0 +1,121 @@ +# openapi +This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 +- Build package: org.openapitools.codegen.languages.DartClientCodegen + +## Requirements + +Dart 1.20.0 or later OR Flutter 0.0.20 or later + +## Installation & Usage + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +``` +name: openapi +version: 1.0.0 +description: OpenAPI API client +dependencies: + openapi: + git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + version: 'any' +``` + +### Local +To use the package in your local drive, please include the following in pubspec.yaml +``` +dependencies: + openapi: + path: /path/to/openapi +``` + +## Tests + +TODO + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:openapi/api.dart'; + +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://petstore.swagger.io/v2* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PetApi* | [**addPet**](docs//PetApi.md#addpet) | **POST** /pet | Add a new pet to the store +*PetApi* | [**deletePet**](docs//PetApi.md#deletepet) | **DELETE** /pet/{petId} | Deletes a pet +*PetApi* | [**findPetsByStatus**](docs//PetApi.md#findpetsbystatus) | **GET** /pet/findByStatus | Finds Pets by status +*PetApi* | [**findPetsByTags**](docs//PetApi.md#findpetsbytags) | **GET** /pet/findByTags | Finds Pets by tags +*PetApi* | [**getPetById**](docs//PetApi.md#getpetbyid) | **GET** /pet/{petId} | Find pet by ID +*PetApi* | [**updatePet**](docs//PetApi.md#updatepet) | **PUT** /pet | Update an existing pet +*PetApi* | [**updatePetWithForm**](docs//PetApi.md#updatepetwithform) | **POST** /pet/{petId} | Updates a pet in the store with form data +*PetApi* | [**uploadFile**](docs//PetApi.md#uploadfile) | **POST** /pet/{petId}/uploadImage | uploads an image +*StoreApi* | [**deleteOrder**](docs//StoreApi.md#deleteorder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +*StoreApi* | [**getInventory**](docs//StoreApi.md#getinventory) | **GET** /store/inventory | Returns pet inventories by status +*StoreApi* | [**getOrderById**](docs//StoreApi.md#getorderbyid) | **GET** /store/order/{orderId} | Find purchase order by ID +*StoreApi* | [**placeOrder**](docs//StoreApi.md#placeorder) | **POST** /store/order | Place an order for a pet +*UserApi* | [**createUser**](docs//UserApi.md#createuser) | **POST** /user | Create user +*UserApi* | [**createUsersWithArrayInput**](docs//UserApi.md#createuserswitharrayinput) | **POST** /user/createWithArray | Creates list of users with given input array +*UserApi* | [**createUsersWithListInput**](docs//UserApi.md#createuserswithlistinput) | **POST** /user/createWithList | Creates list of users with given input array +*UserApi* | [**deleteUser**](docs//UserApi.md#deleteuser) | **DELETE** /user/{username} | Delete user +*UserApi* | [**getUserByName**](docs//UserApi.md#getuserbyname) | **GET** /user/{username} | Get user by user name +*UserApi* | [**loginUser**](docs//UserApi.md#loginuser) | **GET** /user/login | Logs user into the system +*UserApi* | [**logoutUser**](docs//UserApi.md#logoutuser) | **GET** /user/logout | Logs out current logged in user session +*UserApi* | [**updateUser**](docs//UserApi.md#updateuser) | **PUT** /user/{username} | Updated user + + +## Documentation For Models + + - [ApiResponse](docs//ApiResponse.md) + - [Category](docs//Category.md) + - [Order](docs//Order.md) + - [Pet](docs//Pet.md) + - [Tag](docs//Tag.md) + - [User](docs//User.md) + + +## Documentation For Authorization + + +## api_key + +- **Type**: API key +- **API key parameter name**: api_key +- **Location**: HTTP header + +## petstore_auth + +- **Type**: OAuth +- **Flow**: implicit +- **Authorization URL**: http://petstore.swagger.io/api/oauth/dialog +- **Scopes**: + - **write:pets**: modify pets in your account + - **read:pets**: read your pets + + +## Author + + + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/ApiResponse.md b/samples/client/petstore/dart2/openapi-browser-client/docs/ApiResponse.md new file mode 100644 index 00000000000..92422f0f446 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/ApiResponse.md @@ -0,0 +1,17 @@ +# openapi.model.ApiResponse + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **int** | | [optional] [default to null] +**type** | **String** | | [optional] [default to null] +**message** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/Category.md b/samples/client/petstore/dart2/openapi-browser-client/docs/Category.md new file mode 100644 index 00000000000..cc0d1633b59 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/Category.md @@ -0,0 +1,16 @@ +# openapi.model.Category + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/Order.md b/samples/client/petstore/dart2/openapi-browser-client/docs/Order.md new file mode 100644 index 00000000000..310ce6c65be --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/Order.md @@ -0,0 +1,20 @@ +# openapi.model.Order + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**petId** | **int** | | [optional] [default to null] +**quantity** | **int** | | [optional] [default to null] +**shipDate** | [**DateTime**](DateTime.md) | | [optional] [default to null] +**status** | **String** | Order Status | [optional] [default to null] +**complete** | **bool** | | [optional] [default to false] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/Pet.md b/samples/client/petstore/dart2/openapi-browser-client/docs/Pet.md new file mode 100644 index 00000000000..191e1fc66a9 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/Pet.md @@ -0,0 +1,20 @@ +# openapi.model.Pet + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**category** | [**Category**](Category.md) | | [optional] [default to null] +**name** | **String** | | [default to null] +**photoUrls** | **List<String>** | | [default to []] +**tags** | [**List<Tag>**](Tag.md) | | [optional] [default to []] +**status** | **String** | pet status in the store | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/PetApi.md b/samples/client/petstore/dart2/openapi-browser-client/docs/PetApi.md new file mode 100644 index 00000000000..6fa9abf67ae --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/PetApi.md @@ -0,0 +1,379 @@ +# openapi.api.PetApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**addPet**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store +[**deletePet**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet +[**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status +[**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags +[**getPetById**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID +[**updatePet**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet +[**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data +[**uploadFile**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image + + +# **addPet** +> addPet(pet) + +Add a new pet to the store + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **deletePet** +> deletePet(petId, apiKey) + +Deletes a pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | Pet id to delete +var apiKey = apiKey_example; // String | + +try { + api_instance.deletePet(petId, apiKey); +} catch (e) { + print("Exception when calling PetApi->deletePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| Pet id to delete | + **apiKey** | **String**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **findPetsByStatus** +> List findPetsByStatus(status) + +Finds Pets by status + +Multiple status values can be provided with comma separated strings + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var status = []; // List | Status values that need to be considered for filter + +try { + var result = api_instance.findPetsByStatus(status); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByStatus: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **findPetsByTags** +> List findPetsByTags(tags) + +Finds Pets by tags + +Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var tags = []; // List | Tags to filter by + +try { + var result = api_instance.findPetsByTags(tags); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByTags: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tags** | [**List<String>**](String.md)| Tags to filter by | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **getPetById** +> Pet getPetById(petId) + +Find pet by ID + +Returns a single pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to return + +try { + var result = api_instance.getPetById(petId); + print(result); +} catch (e) { + print("Exception when calling PetApi->getPetById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to return | + +### Return type + +[**Pet**](Pet.md) + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **updatePet** +> updatePet(pet) + +Update an existing pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.updatePet(pet); +} catch (e) { + print("Exception when calling PetApi->updatePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **updatePetWithForm** +> updatePetWithForm(petId, name, status) + +Updates a pet in the store with form data + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet that needs to be updated +var name = name_example; // String | Updated name of the pet +var status = status_example; // String | Updated status of the pet + +try { + api_instance.updatePetWithForm(petId, name, status); +} catch (e) { + print("Exception when calling PetApi->updatePetWithForm: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet that needs to be updated | + **name** | **String**| Updated name of the pet | [optional] [default to null] + **status** | **String**| Updated status of the pet | [optional] [default to null] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + +[[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) + +# **uploadFile** +> ApiResponse uploadFile(petId, additionalMetadata, file) + +uploads an image + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to update +var additionalMetadata = additionalMetadata_example; // String | Additional data to pass to server +var file = BINARY_DATA_HERE; // MultipartFile | file to upload + +try { + var result = api_instance.uploadFile(petId, additionalMetadata, file); + print(result); +} catch (e) { + print("Exception when calling PetApi->uploadFile: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to update | + **additionalMetadata** | **String**| Additional data to pass to server | [optional] [default to null] + **file** | **MultipartFile**| file to upload | [optional] [default to null] + +### Return type + +[**ApiResponse**](ApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + +[[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) + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/StoreApi.md b/samples/client/petstore/dart2/openapi-browser-client/docs/StoreApi.md new file mode 100644 index 00000000000..cc0c2ac2d35 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/StoreApi.md @@ -0,0 +1,186 @@ +# openapi.api.StoreApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +[**getInventory**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status +[**getOrderById**](StoreApi.md#getOrderById) | **GET** /store/order/{orderId} | Find purchase order by ID +[**placeOrder**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet + + +# **deleteOrder** +> deleteOrder(orderId) + +Delete purchase order by ID + +For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = orderId_example; // String | ID of the order that needs to be deleted + +try { + api_instance.deleteOrder(orderId); +} catch (e) { + print("Exception when calling StoreApi->deleteOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **String**| ID of the order that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getInventory** +> Map getInventory() + +Returns pet inventories by status + +Returns a map of status codes to quantities + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new StoreApi(); + +try { + var result = api_instance.getInventory(); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getInventory: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**Map** + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[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) + +# **getOrderById** +> Order getOrderById(orderId) + +Find purchase order by ID + +For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = 789; // int | ID of pet that needs to be fetched + +try { + var result = api_instance.getOrderById(orderId); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getOrderById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **int**| ID of pet that needs to be fetched | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **placeOrder** +> Order placeOrder(order) + +Place an order for a pet + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var order = new Order(); // Order | order placed for purchasing the pet + +try { + var result = api_instance.placeOrder(order); + print(result); +} catch (e) { + print("Exception when calling StoreApi->placeOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **order** | [**Order**](Order.md)| order placed for purchasing the pet | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/Tag.md b/samples/client/petstore/dart2/openapi-browser-client/docs/Tag.md new file mode 100644 index 00000000000..ded7b32ac3d --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/Tag.md @@ -0,0 +1,16 @@ +# openapi.model.Tag + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/User.md b/samples/client/petstore/dart2/openapi-browser-client/docs/User.md new file mode 100644 index 00000000000..3761b70cf0b --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/User.md @@ -0,0 +1,22 @@ +# openapi.model.User + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**username** | **String** | | [optional] [default to null] +**firstName** | **String** | | [optional] [default to null] +**lastName** | **String** | | [optional] [default to null] +**email** | **String** | | [optional] [default to null] +**password** | **String** | | [optional] [default to null] +**phone** | **String** | | [optional] [default to null] +**userStatus** | **int** | User Status | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi-browser-client/docs/UserApi.md b/samples/client/petstore/dart2/openapi-browser-client/docs/UserApi.md new file mode 100644 index 00000000000..0dec271be5c --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/docs/UserApi.md @@ -0,0 +1,349 @@ +# openapi.api.UserApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createUser**](UserApi.md#createUser) | **POST** /user | Create user +[**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array +[**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array +[**deleteUser**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user +[**getUserByName**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name +[**loginUser**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system +[**logoutUser**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session +[**updateUser**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user + + +# **createUser** +> createUser(user) + +Create user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = new User(); // User | Created user object + +try { + api_instance.createUser(user); +} catch (e) { + print("Exception when calling UserApi->createUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**User**](User.md)| Created user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithArrayInput** +> createUsersWithArrayInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithArrayInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithArrayInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithListInput** +> createUsersWithListInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithListInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithListInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **deleteUser** +> deleteUser(username) + +Delete user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be deleted + +try { + api_instance.deleteUser(username); +} catch (e) { + print("Exception when calling UserApi->deleteUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getUserByName** +> User getUserByName(username) + +Get user by user name + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be fetched. Use user1 for testing. + +try { + var result = api_instance.getUserByName(username); + print(result); +} catch (e) { + print("Exception when calling UserApi->getUserByName: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be fetched. Use user1 for testing. | + +### Return type + +[**User**](User.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **loginUser** +> String loginUser(username, password) + +Logs user into the system + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The user name for login +var password = password_example; // String | The password for login in clear text + +try { + var result = api_instance.loginUser(username, password); + print(result); +} catch (e) { + print("Exception when calling UserApi->loginUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The user name for login | + **password** | **String**| The password for login in clear text | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **logoutUser** +> logoutUser() + +Logs out current logged in user session + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); + +try { + api_instance.logoutUser(); +} catch (e) { + print("Exception when calling UserApi->logoutUser: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **updateUser** +> updateUser(username, user) + +Updated user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | name that need to be deleted +var user = new User(); // User | Updated user object + +try { + api_instance.updateUser(username, user); +} catch (e) { + print("Exception when calling UserApi->updateUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| name that need to be deleted | + **user** | [**User**](User.md)| Updated user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + diff --git a/samples/client/petstore/dart2/openapi-browser-client/git_push.sh b/samples/client/petstore/dart2/openapi-browser-client/git_push.sh new file mode 100644 index 00000000000..8442b80bb44 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart new file mode 100644 index 00000000000..4e43a1c2083 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart @@ -0,0 +1,28 @@ +library openapi.api; + +import 'dart:async'; +import 'dart:convert'; +import 'package:http/browser_client.dart'; +import 'package:http/http.dart'; + +part 'api_client.dart'; +part 'api_helper.dart'; +part 'api_exception.dart'; +part 'auth/authentication.dart'; +part 'auth/api_key_auth.dart'; +part 'auth/oauth.dart'; +part 'auth/http_basic_auth.dart'; + +part 'api/pet_api.dart'; +part 'api/store_api.dart'; +part 'api/user_api.dart'; + +part 'model/api_response.dart'; +part 'model/category.dart'; +part 'model/order.dart'; +part 'model/pet.dart'; +part 'model/tag.dart'; +part 'model/user.dart'; + + +ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart new file mode 100644 index 00000000000..8e6c815ec2b --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart @@ -0,0 +1,432 @@ +part of openapi.api; + + + +class PetApi { + final ApiClient apiClient; + + PetApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Add a new pet to the store + /// + /// + Future addPet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Deletes a pet + /// + /// + Future deletePet(int petId, { String apiKey }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + headerParams["api_key"] = apiKey; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Finds Pets by status + /// + /// Multiple status values can be provided with comma separated strings + Future> findPetsByStatus(List status) async { + Object postBody; + + // verify required params are set + if(status == null) { + throw new ApiException(400, "Missing required param: status"); + } + + // create path and map variables + String path = "/pet/findByStatus".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Finds Pets by tags + /// + /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + Future> findPetsByTags(List tags) async { + Object postBody; + + // verify required params are set + if(tags == null) { + throw new ApiException(400, "Missing required param: tags"); + } + + // create path and map variables + String path = "/pet/findByTags".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Find pet by ID + /// + /// Returns a single pet + Future getPetById(int petId) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Pet') as Pet; + } else { + return null; + } + } + /// Update an existing pet + /// + /// + Future updatePet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updates a pet in the store with form data + /// + /// + Future updatePetWithForm(int petId, { String name, String status }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/x-www-form-urlencoded"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (name != null) { + hasFields = true; + mp.fields['name'] = parameterToString(name); + } + if (status != null) { + hasFields = true; + mp.fields['status'] = parameterToString(status); + } + if(hasFields) + postBody = mp; + } + else { + if (name != null) + formParams['name'] = parameterToString(name); + if (status != null) + formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// uploads an image + /// + /// + Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["multipart/form-data"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (additionalMetadata != null) { + hasFields = true; + mp.fields['additionalMetadata'] = parameterToString(additionalMetadata); + } + if (file != null) { + hasFields = true; + mp.fields['file'] = file.field; + mp.files.add(file); + } + if(hasFields) + postBody = mp; + } + else { + if (additionalMetadata != null) + formParams['additionalMetadata'] = parameterToString(additionalMetadata); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart new file mode 100644 index 00000000000..38fe10d4450 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart @@ -0,0 +1,207 @@ +part of openapi.api; + + + +class StoreApi { + final ApiClient apiClient; + + StoreApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Delete purchase order by ID + /// + /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + Future deleteOrder(String orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Returns pet inventories by status + /// + /// Returns a map of status codes to quantities + Future> getInventory() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/store/inventory".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return new Map.from(apiClient.deserialize(response.body, 'Map')); + ; + } else { + return null; + } + } + /// Find purchase order by ID + /// + /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + Future getOrderById(int orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } + /// Place an order for a pet + /// + /// + Future placeOrder(Order order) async { + Object postBody = order; + + // verify required params are set + if(order == null) { + throw new ApiException(400, "Missing required param: order"); + } + + // create path and map variables + String path = "/store/order".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart new file mode 100644 index 00000000000..9d3eb116e61 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart @@ -0,0 +1,409 @@ +part of openapi.api; + + + +class UserApi { + final ApiClient apiClient; + + UserApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Create user + /// + /// This can only be done by the logged in user. + Future createUser(User user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithArrayInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithArray".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithListInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithList".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Delete user + /// + /// This can only be done by the logged in user. + Future deleteUser(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Get user by user name + /// + /// + Future getUserByName(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'User') as User; + } else { + return null; + } + } + /// Logs user into the system + /// + /// + Future loginUser(String username, String password) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(password == null) { + throw new ApiException(400, "Missing required param: password"); + } + + // create path and map variables + String path = "/user/login".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'String') as String; + } else { + return null; + } + } + /// Logs out current logged in user session + /// + /// + Future logoutUser() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/user/logout".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updated user + /// + /// This can only be done by the logged in user. + Future updateUser(String username, User user) async { + Object postBody = user; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart new file mode 100644 index 00000000000..2ffa4e695a5 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart @@ -0,0 +1,160 @@ +part of openapi.api; + +class QueryParam { + String name; + String value; + + QueryParam(this.name, this.value); +} + +class ApiClient { + + String basePath; + var client = BrowserClient(); + + Map _defaultHeaderMap = {}; + Map _authentications = {}; + + final _regList = RegExp(r'^List<(.*)>$'); + final _regMap = RegExp(r'^Map$'); + + ApiClient({this.basePath: "http://petstore.swagger.io/v2"}) { + // Setup authentications (key: authentication name, value: authentication). + _authentications['api_key'] = ApiKeyAuth("header", "api_key"); + _authentications['petstore_auth'] = OAuth(); + } + + void addDefaultHeader(String key, String value) { + _defaultHeaderMap[key] = value; + } + + dynamic _deserialize(dynamic value, String targetType) { + try { + switch (targetType) { + case 'String': + return '$value'; + case 'int': + return value is int ? value : int.parse('$value'); + case 'bool': + return value is bool ? value : '$value'.toLowerCase() == 'true'; + case 'double': + return value is double ? value : double.parse('$value'); + case 'ApiResponse': + return ApiResponse.fromJson(value); + case 'Category': + return Category.fromJson(value); + case 'Order': + return Order.fromJson(value); + case 'Pet': + return Pet.fromJson(value); + case 'Tag': + return Tag.fromJson(value); + case 'User': + return User.fromJson(value); + default: + { + Match match; + if (value is List && + (match = _regList.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return value.map((v) => _deserialize(v, newTargetType)).toList(); + } else if (value is Map && + (match = _regMap.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return Map.fromIterables(value.keys, + value.values.map((v) => _deserialize(v, newTargetType))); + } + } + } + } catch (e, stack) { + throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + } + throw ApiException(500, 'Could not find a suitable class for deserialization'); + } + + dynamic deserialize(String json, String targetType) { + // Remove all spaces. Necessary for reg expressions as well. + targetType = targetType.replaceAll(' ', ''); + + if (targetType == 'String') return json; + + var decodedJson = jsonDecode(json); + return _deserialize(decodedJson, targetType); + } + + String serialize(Object obj) { + String serialized = ''; + if (obj == null) { + serialized = ''; + } else { + serialized = json.encode(obj); + } + return serialized; + } + + // We don't use a Map for queryParams. + // If collectionFormat is 'multi' a key might appear multiple times. + Future invokeAPI(String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { + + _updateParamsForAuth(authNames, queryParams, headerParams); + + var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? + '?' + ps.join('&') : + ''; + + String url = basePath + path + queryString; + + headerParams.addAll(_defaultHeaderMap); + headerParams['Content-Type'] = contentType; + + if(body is MultipartRequest) { + var request = MultipartRequest(method, Uri.parse(url)); + request.fields.addAll(body.fields); + request.files.addAll(body.files); + request.headers.addAll(body.headers); + request.headers.addAll(headerParams); + var response = await client.send(request); + return Response.fromStream(response); + } else { + var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); + switch(method) { + case "POST": + return client.post(url, headers: headerParams, body: msgBody); + case "PUT": + return client.put(url, headers: headerParams, body: msgBody); + case "DELETE": + return client.delete(url, headers: headerParams); + case "PATCH": + return client.patch(url, headers: headerParams, body: msgBody); + default: + return client.get(url, headers: headerParams); + } + } + } + + /// Update query and header parameters based on authentication settings. + /// @param authNames The authentications to apply + void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + authNames.forEach((authName) { + Authentication auth = _authentications[authName]; + if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + }); + } + + void setAccessToken(String accessToken) { + _authentications.forEach((key, auth) { + if (auth is OAuth) { + auth.setAccessToken(accessToken); + } + }); + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart new file mode 100644 index 00000000000..668abe2c96b --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart @@ -0,0 +1,23 @@ +part of openapi.api; + +class ApiException implements Exception { + int code = 0; + String message; + Exception innerException; + StackTrace stackTrace; + + ApiException(this.code, this.message); + + ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + + String toString() { + if (message == null) return "ApiException"; + + if (innerException == null) { + return "ApiException $code: $message"; + } + + return "ApiException $code: $message (Inner exception: $innerException)\n\n" + + stackTrace.toString(); + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart new file mode 100644 index 00000000000..a516a68d264 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; + +// port from Java version +Iterable _convertParametersForCollectionFormat( + String collectionFormat, String name, dynamic value) { + var params = []; + + // preconditions + if (name == null || name.isEmpty || value == null) return params; + + if (value is! List) { + params.add(QueryParam(name, parameterToString(value))); + return params; + } + + List values = value as List; + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) + ? "csv" + : collectionFormat; // default: csv + + if (collectionFormat == "multi") { + return values.map((v) => QueryParam(name, parameterToString(v))); + } + + String delimiter = _delimiters[collectionFormat] ?? ","; + + params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + return params; +} + +/// Format the given parameter object into string. +String parameterToString(dynamic value) { + if (value == null) { + return ''; + } else if (value is DateTime) { + return value.toUtc().toIso8601String(); + } else { + return value.toString(); + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart new file mode 100644 index 00000000000..8caf6ab5eba --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart @@ -0,0 +1,27 @@ +part of openapi.api; + +class ApiKeyAuth implements Authentication { + + final String location; + final String paramName; + String apiKey; + String apiKeyPrefix; + + ApiKeyAuth(this.location, this.paramName); + + @override + void applyToParams(List queryParams, Map headerParams) { + String value; + if (apiKeyPrefix != null) { + value = '$apiKeyPrefix $apiKey'; + } else { + value = apiKey; + } + + if (location == 'query' && value != null) { + queryParams.add(QueryParam(paramName, value)); + } else if (location == 'header' && value != null) { + headerParams[paramName] = value; + } + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart new file mode 100644 index 00000000000..abd5e2fe68a --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart @@ -0,0 +1,7 @@ +part of openapi.api; + +abstract class Authentication { + + /// Apply authentication settings to header and query params. + void applyToParams(List queryParams, Map headerParams); +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart new file mode 100644 index 00000000000..6342d886689 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart @@ -0,0 +1,14 @@ +part of openapi.api; + +class HttpBasicAuth implements Authentication { + + String username; + String password; + + @override + void applyToParams(List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); + } + +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart new file mode 100644 index 00000000000..aa08e5cdb4d --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart @@ -0,0 +1,18 @@ +part of openapi.api; + +class OAuth implements Authentication { + String accessToken; + + OAuth({this.accessToken}); + + @override + void applyToParams(List queryParams, Map headerParams) { + if (accessToken != null) { + headerParams["Authorization"] = "Bearer " + accessToken; + } + } + + void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart new file mode 100644 index 00000000000..a39d9500b29 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +class ApiResponse { + + int code = null; + + String type = null; + + String message = null; + ApiResponse(); + + @override + String toString() { + return 'ApiResponse[code=$code, type=$type, message=$message, ]'; + } + + ApiResponse.fromJson(Map json) { + if (json == null) return; + code = json['code']; + type = json['type']; + message = json['message']; + } + + Map toJson() { + return { + 'code': code, + 'type': type, + 'message': message + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart new file mode 100644 index 00000000000..b9b2481dd29 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Category { + + int id = null; + + String name = null; + Category(); + + @override + String toString() { + return 'Category[id=$id, name=$name, ]'; + } + + Category.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart new file mode 100644 index 00000000000..4e264a183ef --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Order { + + int id = null; + + int petId = null; + + int quantity = null; + + DateTime shipDate = null; + /* Order Status */ + String status = null; + //enum statusEnum { placed, approved, delivered, };{ + + bool complete = false; + Order(); + + @override + String toString() { + return 'Order[id=$id, petId=$petId, quantity=$quantity, shipDate=$shipDate, status=$status, complete=$complete, ]'; + } + + Order.fromJson(Map json) { + if (json == null) return; + id = json['id']; + petId = json['petId']; + quantity = json['quantity']; + shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + status = json['status']; + complete = json['complete']; + } + + Map toJson() { + return { + 'id': id, + 'petId': petId, + 'quantity': quantity, + 'shipDate': shipDate == null ? '' : shipDate.toUtc().toIso8601String(), + 'status': status, + 'complete': complete + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart new file mode 100644 index 00000000000..da9de49b678 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Pet { + + int id = null; + + Category category = null; + + String name = null; + + List photoUrls = []; + + List tags = []; + /* pet status in the store */ + String status = null; + //enum statusEnum { available, pending, sold, };{ + Pet(); + + @override + String toString() { + return 'Pet[id=$id, category=$category, name=$name, photoUrls=$photoUrls, tags=$tags, status=$status, ]'; + } + + Pet.fromJson(Map json) { + if (json == null) return; + id = json['id']; + category = new Category.fromJson(json['category']); + name = json['name']; + photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + tags = Tag.listFromJson(json['tags']); + status = json['status']; + } + + Map toJson() { + return { + 'id': id, + 'category': category, + 'name': name, + 'photoUrls': photoUrls, + 'tags': tags, + 'status': status + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart new file mode 100644 index 00000000000..315a326adb7 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Tag { + + int id = null; + + String name = null; + Tag(); + + @override + String toString() { + return 'Tag[id=$id, name=$name, ]'; + } + + Tag.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart new file mode 100644 index 00000000000..0e4cc2104c7 --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart @@ -0,0 +1,64 @@ +part of openapi.api; + +class User { + + int id = null; + + String username = null; + + String firstName = null; + + String lastName = null; + + String email = null; + + String password = null; + + String phone = null; + /* User Status */ + int userStatus = null; + User(); + + @override + String toString() { + return 'User[id=$id, username=$username, firstName=$firstName, lastName=$lastName, email=$email, password=$password, phone=$phone, userStatus=$userStatus, ]'; + } + + User.fromJson(Map json) { + if (json == null) return; + id = json['id']; + username = json['username']; + firstName = json['firstName']; + lastName = json['lastName']; + email = json['email']; + password = json['password']; + phone = json['phone']; + userStatus = json['userStatus']; + } + + Map toJson() { + return { + 'id': id, + 'username': username, + 'firstName': firstName, + 'lastName': lastName, + 'email': email, + 'password': password, + 'phone': phone, + 'userStatus': userStatus + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi-browser-client/pubspec.yaml b/samples/client/petstore/dart2/openapi-browser-client/pubspec.yaml new file mode 100644 index 00000000000..9ccf0e524ad --- /dev/null +++ b/samples/client/petstore/dart2/openapi-browser-client/pubspec.yaml @@ -0,0 +1,7 @@ +name: openapi +version: 1.0.0 +description: OpenAPI API client +environment: + sdk: '>=2.0.0 <3.0.0' +dependencies: + http: '>=0.11.1 <0.12.0' diff --git a/samples/client/petstore/dart2/openapi/.analysis_options b/samples/client/petstore/dart2/openapi/.analysis_options new file mode 100644 index 00000000000..518eb901a6f --- /dev/null +++ b/samples/client/petstore/dart2/openapi/.analysis_options @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi/.gitignore b/samples/client/petstore/dart2/openapi/.gitignore new file mode 100644 index 00000000000..7c280441649 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/.gitignore @@ -0,0 +1,27 @@ +# 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 diff --git a/samples/client/petstore/dart2/openapi/.openapi-generator-ignore b/samples/client/petstore/dart2/openapi/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION new file mode 100644 index 00000000000..105bb87d77b --- /dev/null +++ b/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.2-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi/README.md b/samples/client/petstore/dart2/openapi/README.md new file mode 100644 index 00000000000..5f3fe054784 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/README.md @@ -0,0 +1,121 @@ +# openapi +This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 +- Build package: org.openapitools.codegen.languages.DartClientCodegen + +## Requirements + +Dart 1.20.0 or later OR Flutter 0.0.20 or later + +## Installation & Usage + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +``` +name: openapi +version: 1.0.0 +description: OpenAPI API client +dependencies: + openapi: + git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + version: 'any' +``` + +### Local +To use the package in your local drive, please include the following in pubspec.yaml +``` +dependencies: + openapi: + path: /path/to/openapi +``` + +## Tests + +TODO + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:openapi/api.dart'; + +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://petstore.swagger.io/v2* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PetApi* | [**addPet**](docs//PetApi.md#addpet) | **POST** /pet | Add a new pet to the store +*PetApi* | [**deletePet**](docs//PetApi.md#deletepet) | **DELETE** /pet/{petId} | Deletes a pet +*PetApi* | [**findPetsByStatus**](docs//PetApi.md#findpetsbystatus) | **GET** /pet/findByStatus | Finds Pets by status +*PetApi* | [**findPetsByTags**](docs//PetApi.md#findpetsbytags) | **GET** /pet/findByTags | Finds Pets by tags +*PetApi* | [**getPetById**](docs//PetApi.md#getpetbyid) | **GET** /pet/{petId} | Find pet by ID +*PetApi* | [**updatePet**](docs//PetApi.md#updatepet) | **PUT** /pet | Update an existing pet +*PetApi* | [**updatePetWithForm**](docs//PetApi.md#updatepetwithform) | **POST** /pet/{petId} | Updates a pet in the store with form data +*PetApi* | [**uploadFile**](docs//PetApi.md#uploadfile) | **POST** /pet/{petId}/uploadImage | uploads an image +*StoreApi* | [**deleteOrder**](docs//StoreApi.md#deleteorder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +*StoreApi* | [**getInventory**](docs//StoreApi.md#getinventory) | **GET** /store/inventory | Returns pet inventories by status +*StoreApi* | [**getOrderById**](docs//StoreApi.md#getorderbyid) | **GET** /store/order/{orderId} | Find purchase order by ID +*StoreApi* | [**placeOrder**](docs//StoreApi.md#placeorder) | **POST** /store/order | Place an order for a pet +*UserApi* | [**createUser**](docs//UserApi.md#createuser) | **POST** /user | Create user +*UserApi* | [**createUsersWithArrayInput**](docs//UserApi.md#createuserswitharrayinput) | **POST** /user/createWithArray | Creates list of users with given input array +*UserApi* | [**createUsersWithListInput**](docs//UserApi.md#createuserswithlistinput) | **POST** /user/createWithList | Creates list of users with given input array +*UserApi* | [**deleteUser**](docs//UserApi.md#deleteuser) | **DELETE** /user/{username} | Delete user +*UserApi* | [**getUserByName**](docs//UserApi.md#getuserbyname) | **GET** /user/{username} | Get user by user name +*UserApi* | [**loginUser**](docs//UserApi.md#loginuser) | **GET** /user/login | Logs user into the system +*UserApi* | [**logoutUser**](docs//UserApi.md#logoutuser) | **GET** /user/logout | Logs out current logged in user session +*UserApi* | [**updateUser**](docs//UserApi.md#updateuser) | **PUT** /user/{username} | Updated user + + +## Documentation For Models + + - [ApiResponse](docs//ApiResponse.md) + - [Category](docs//Category.md) + - [Order](docs//Order.md) + - [Pet](docs//Pet.md) + - [Tag](docs//Tag.md) + - [User](docs//User.md) + + +## Documentation For Authorization + + +## api_key + +- **Type**: API key +- **API key parameter name**: api_key +- **Location**: HTTP header + +## petstore_auth + +- **Type**: OAuth +- **Flow**: implicit +- **Authorization URL**: http://petstore.swagger.io/api/oauth/dialog +- **Scopes**: + - **write:pets**: modify pets in your account + - **read:pets**: read your pets + + +## Author + + + + diff --git a/samples/client/petstore/dart2/openapi/docs/ApiResponse.md b/samples/client/petstore/dart2/openapi/docs/ApiResponse.md new file mode 100644 index 00000000000..92422f0f446 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/ApiResponse.md @@ -0,0 +1,17 @@ +# openapi.model.ApiResponse + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**code** | **int** | | [optional] [default to null] +**type** | **String** | | [optional] [default to null] +**message** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/Category.md b/samples/client/petstore/dart2/openapi/docs/Category.md new file mode 100644 index 00000000000..cc0d1633b59 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/Category.md @@ -0,0 +1,16 @@ +# openapi.model.Category + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/Order.md b/samples/client/petstore/dart2/openapi/docs/Order.md new file mode 100644 index 00000000000..310ce6c65be --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/Order.md @@ -0,0 +1,20 @@ +# openapi.model.Order + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**petId** | **int** | | [optional] [default to null] +**quantity** | **int** | | [optional] [default to null] +**shipDate** | [**DateTime**](DateTime.md) | | [optional] [default to null] +**status** | **String** | Order Status | [optional] [default to null] +**complete** | **bool** | | [optional] [default to false] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/Pet.md b/samples/client/petstore/dart2/openapi/docs/Pet.md new file mode 100644 index 00000000000..191e1fc66a9 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/Pet.md @@ -0,0 +1,20 @@ +# openapi.model.Pet + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**category** | [**Category**](Category.md) | | [optional] [default to null] +**name** | **String** | | [default to null] +**photoUrls** | **List<String>** | | [default to []] +**tags** | [**List<Tag>**](Tag.md) | | [optional] [default to []] +**status** | **String** | pet status in the store | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/PetApi.md b/samples/client/petstore/dart2/openapi/docs/PetApi.md new file mode 100644 index 00000000000..6fa9abf67ae --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/PetApi.md @@ -0,0 +1,379 @@ +# openapi.api.PetApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**addPet**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store +[**deletePet**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet +[**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status +[**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags +[**getPetById**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID +[**updatePet**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet +[**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data +[**uploadFile**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image + + +# **addPet** +> addPet(pet) + +Add a new pet to the store + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.addPet(pet); +} catch (e) { + print("Exception when calling PetApi->addPet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **deletePet** +> deletePet(petId, apiKey) + +Deletes a pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | Pet id to delete +var apiKey = apiKey_example; // String | + +try { + api_instance.deletePet(petId, apiKey); +} catch (e) { + print("Exception when calling PetApi->deletePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| Pet id to delete | + **apiKey** | **String**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **findPetsByStatus** +> List findPetsByStatus(status) + +Finds Pets by status + +Multiple status values can be provided with comma separated strings + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var status = []; // List | Status values that need to be considered for filter + +try { + var result = api_instance.findPetsByStatus(status); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByStatus: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **findPetsByTags** +> List findPetsByTags(tags) + +Finds Pets by tags + +Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var tags = []; // List | Tags to filter by + +try { + var result = api_instance.findPetsByTags(tags); + print(result); +} catch (e) { + print("Exception when calling PetApi->findPetsByTags: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tags** | [**List<String>**](String.md)| Tags to filter by | + +### Return type + +[**List**](Pet.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **getPetById** +> Pet getPetById(petId) + +Find pet by ID + +Returns a single pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to return + +try { + var result = api_instance.getPetById(petId); + print(result); +} catch (e) { + print("Exception when calling PetApi->getPetById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to return | + +### Return type + +[**Pet**](Pet.md) + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **updatePet** +> updatePet(pet) + +Update an existing pet + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var pet = new Pet(); // Pet | Pet object that needs to be added to the store + +try { + api_instance.updatePet(pet); +} catch (e) { + print("Exception when calling PetApi->updatePet: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/json, application/xml + - **Accept**: Not defined + +[[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) + +# **updatePetWithForm** +> updatePetWithForm(petId, name, status) + +Updates a pet in the store with form data + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet that needs to be updated +var name = name_example; // String | Updated name of the pet +var status = status_example; // String | Updated status of the pet + +try { + api_instance.updatePetWithForm(petId, name, status); +} catch (e) { + print("Exception when calling PetApi->updatePetWithForm: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet that needs to be updated | + **name** | **String**| Updated name of the pet | [optional] [default to null] + **status** | **String**| Updated status of the pet | [optional] [default to null] + +### Return type + +void (empty response body) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: application/x-www-form-urlencoded + - **Accept**: Not defined + +[[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) + +# **uploadFile** +> ApiResponse uploadFile(petId, additionalMetadata, file) + +uploads an image + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure OAuth2 access token for authorization: petstore_auth +//openapi.api.Configuration.accessToken = 'YOUR_ACCESS_TOKEN'; + +var api_instance = new PetApi(); +var petId = 789; // int | ID of pet to update +var additionalMetadata = additionalMetadata_example; // String | Additional data to pass to server +var file = BINARY_DATA_HERE; // MultipartFile | file to upload + +try { + var result = api_instance.uploadFile(petId, additionalMetadata, file); + print(result); +} catch (e) { + print("Exception when calling PetApi->uploadFile: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **petId** | **int**| ID of pet to update | + **additionalMetadata** | **String**| Additional data to pass to server | [optional] [default to null] + **file** | **MultipartFile**| file to upload | [optional] [default to null] + +### Return type + +[**ApiResponse**](ApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + +[[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) + diff --git a/samples/client/petstore/dart2/openapi/docs/StoreApi.md b/samples/client/petstore/dart2/openapi/docs/StoreApi.md new file mode 100644 index 00000000000..cc0c2ac2d35 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/StoreApi.md @@ -0,0 +1,186 @@ +# openapi.api.StoreApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +[**getInventory**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status +[**getOrderById**](StoreApi.md#getOrderById) | **GET** /store/order/{orderId} | Find purchase order by ID +[**placeOrder**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet + + +# **deleteOrder** +> deleteOrder(orderId) + +Delete purchase order by ID + +For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = orderId_example; // String | ID of the order that needs to be deleted + +try { + api_instance.deleteOrder(orderId); +} catch (e) { + print("Exception when calling StoreApi->deleteOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **String**| ID of the order that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getInventory** +> Map getInventory() + +Returns pet inventories by status + +Returns a map of status codes to quantities + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: api_key +//openapi.api.Configuration.apiKey{'api_key'} = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//openapi.api.Configuration.apiKeyPrefix{'api_key'} = "Bearer"; + +var api_instance = new StoreApi(); + +try { + var result = api_instance.getInventory(); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getInventory: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +**Map** + +### Authorization + +[api_key](../README.md#api_key) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[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) + +# **getOrderById** +> Order getOrderById(orderId) + +Find purchase order by ID + +For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var orderId = 789; // int | ID of pet that needs to be fetched + +try { + var result = api_instance.getOrderById(orderId); + print(result); +} catch (e) { + print("Exception when calling StoreApi->getOrderById: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **orderId** | **int**| ID of pet that needs to be fetched | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **placeOrder** +> Order placeOrder(order) + +Place an order for a pet + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new StoreApi(); +var order = new Order(); // Order | order placed for purchasing the pet + +try { + var result = api_instance.placeOrder(order); + print(result); +} catch (e) { + print("Exception when calling StoreApi->placeOrder: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **order** | [**Order**](Order.md)| order placed for purchasing the pet | + +### Return type + +[**Order**](Order.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + diff --git a/samples/client/petstore/dart2/openapi/docs/Tag.md b/samples/client/petstore/dart2/openapi/docs/Tag.md new file mode 100644 index 00000000000..ded7b32ac3d --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/Tag.md @@ -0,0 +1,16 @@ +# openapi.model.Tag + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**name** | **String** | | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/User.md b/samples/client/petstore/dart2/openapi/docs/User.md new file mode 100644 index 00000000000..3761b70cf0b --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/User.md @@ -0,0 +1,22 @@ +# openapi.model.User + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | [optional] [default to null] +**username** | **String** | | [optional] [default to null] +**firstName** | **String** | | [optional] [default to null] +**lastName** | **String** | | [optional] [default to null] +**email** | **String** | | [optional] [default to null] +**password** | **String** | | [optional] [default to null] +**phone** | **String** | | [optional] [default to null] +**userStatus** | **int** | User Status | [optional] [default to null] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/dart2/openapi/docs/UserApi.md b/samples/client/petstore/dart2/openapi/docs/UserApi.md new file mode 100644 index 00000000000..0dec271be5c --- /dev/null +++ b/samples/client/petstore/dart2/openapi/docs/UserApi.md @@ -0,0 +1,349 @@ +# openapi.api.UserApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://petstore.swagger.io/v2* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**createUser**](UserApi.md#createUser) | **POST** /user | Create user +[**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array +[**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array +[**deleteUser**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user +[**getUserByName**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name +[**loginUser**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system +[**logoutUser**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session +[**updateUser**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user + + +# **createUser** +> createUser(user) + +Create user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = new User(); // User | Created user object + +try { + api_instance.createUser(user); +} catch (e) { + print("Exception when calling UserApi->createUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**User**](User.md)| Created user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithArrayInput** +> createUsersWithArrayInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithArrayInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithArrayInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **createUsersWithListInput** +> createUsersWithListInput(user) + +Creates list of users with given input array + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var user = [new List<User>()]; // List | List of user object + +try { + api_instance.createUsersWithListInput(user); +} catch (e) { + print("Exception when calling UserApi->createUsersWithListInput: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user** | [**List<User>**](List.md)| List of user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **deleteUser** +> deleteUser(username) + +Delete user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be deleted + +try { + api_instance.deleteUser(username); +} catch (e) { + print("Exception when calling UserApi->deleteUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be deleted | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **getUserByName** +> User getUserByName(username) + +Get user by user name + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The name that needs to be fetched. Use user1 for testing. + +try { + var result = api_instance.getUserByName(username); + print(result); +} catch (e) { + print("Exception when calling UserApi->getUserByName: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The name that needs to be fetched. Use user1 for testing. | + +### Return type + +[**User**](User.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **loginUser** +> String loginUser(username, password) + +Logs user into the system + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | The user name for login +var password = password_example; // String | The password for login in clear text + +try { + var result = api_instance.loginUser(username, password); + print(result); +} catch (e) { + print("Exception when calling UserApi->loginUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| The user name for login | + **password** | **String**| The password for login in clear text | + +### Return type + +**String** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/xml, application/json + +[[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) + +# **logoutUser** +> logoutUser() + +Logs out current logged in user session + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); + +try { + api_instance.logoutUser(); +} catch (e) { + print("Exception when calling UserApi->logoutUser: $e\n"); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + +# **updateUser** +> updateUser(username, user) + +Updated user + +This can only be done by the logged in user. + +### Example +```dart +import 'package:openapi/api.dart'; + +var api_instance = new UserApi(); +var username = username_example; // String | name that need to be deleted +var user = new User(); // User | Updated user object + +try { + api_instance.updateUser(username, user); +} catch (e) { + print("Exception when calling UserApi->updateUser: $e\n"); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **username** | **String**| name that need to be deleted | + **user** | [**User**](User.md)| Updated user object | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +[[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) + diff --git a/samples/client/petstore/dart2/openapi/git_push.sh b/samples/client/petstore/dart2/openapi/git_push.sh new file mode 100644 index 00000000000..8442b80bb44 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore/dart2/openapi/lib/api.dart b/samples/client/petstore/dart2/openapi/lib/api.dart new file mode 100644 index 00000000000..69c3ecd2e15 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api.dart @@ -0,0 +1,27 @@ +library openapi.api; + +import 'dart:async'; +import 'dart:convert'; +import 'package:http/http.dart'; + +part 'api_client.dart'; +part 'api_helper.dart'; +part 'api_exception.dart'; +part 'auth/authentication.dart'; +part 'auth/api_key_auth.dart'; +part 'auth/oauth.dart'; +part 'auth/http_basic_auth.dart'; + +part 'api/pet_api.dart'; +part 'api/store_api.dart'; +part 'api/user_api.dart'; + +part 'model/api_response.dart'; +part 'model/category.dart'; +part 'model/order.dart'; +part 'model/pet.dart'; +part 'model/tag.dart'; +part 'model/user.dart'; + + +ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart new file mode 100644 index 00000000000..8e6c815ec2b --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart @@ -0,0 +1,432 @@ +part of openapi.api; + + + +class PetApi { + final ApiClient apiClient; + + PetApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Add a new pet to the store + /// + /// + Future addPet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Deletes a pet + /// + /// + Future deletePet(int petId, { String apiKey }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + headerParams["api_key"] = apiKey; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Finds Pets by status + /// + /// Multiple status values can be provided with comma separated strings + Future> findPetsByStatus(List status) async { + Object postBody; + + // verify required params are set + if(status == null) { + throw new ApiException(400, "Missing required param: status"); + } + + // create path and map variables + String path = "/pet/findByStatus".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Finds Pets by tags + /// + /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + Future> findPetsByTags(List tags) async { + Object postBody; + + // verify required params are set + if(tags == null) { + throw new ApiException(400, "Missing required param: tags"); + } + + // create path and map variables + String path = "/pet/findByTags".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else { + return null; + } + } + /// Find pet by ID + /// + /// Returns a single pet + Future getPetById(int petId) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Pet') as Pet; + } else { + return null; + } + } + /// Update an existing pet + /// + /// + Future updatePet(Pet pet) async { + Object postBody = pet; + + // verify required params are set + if(pet == null) { + throw new ApiException(400, "Missing required param: pet"); + } + + // create path and map variables + String path = "/pet".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/json","application/xml"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updates a pet in the store with form data + /// + /// + Future updatePetWithForm(int petId, { String name, String status }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["application/x-www-form-urlencoded"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (name != null) { + hasFields = true; + mp.fields['name'] = parameterToString(name); + } + if (status != null) { + hasFields = true; + mp.fields['status'] = parameterToString(status); + } + if(hasFields) + postBody = mp; + } + else { + if (name != null) + formParams['name'] = parameterToString(name); + if (status != null) + formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// uploads an image + /// + /// + Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + Object postBody; + + // verify required params are set + if(petId == null) { + throw new ApiException(400, "Missing required param: petId"); + } + + // create path and map variables + String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = ["multipart/form-data"]; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["petstore_auth"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if (additionalMetadata != null) { + hasFields = true; + mp.fields['additionalMetadata'] = parameterToString(additionalMetadata); + } + if (file != null) { + hasFields = true; + mp.fields['file'] = file.field; + mp.files.add(file); + } + if(hasFields) + postBody = mp; + } + else { + if (additionalMetadata != null) + formParams['additionalMetadata'] = parameterToString(additionalMetadata); + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart new file mode 100644 index 00000000000..38fe10d4450 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart @@ -0,0 +1,207 @@ +part of openapi.api; + + + +class StoreApi { + final ApiClient apiClient; + + StoreApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Delete purchase order by ID + /// + /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + Future deleteOrder(String orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Returns pet inventories by status + /// + /// Returns a map of status codes to quantities + Future> getInventory() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/store/inventory".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = ["api_key"]; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return new Map.from(apiClient.deserialize(response.body, 'Map')); + ; + } else { + return null; + } + } + /// Find purchase order by ID + /// + /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + Future getOrderById(int orderId) async { + Object postBody; + + // verify required params are set + if(orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); + } + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } + /// Place an order for a pet + /// + /// + Future placeOrder(Order order) async { + Object postBody = order; + + // verify required params are set + if(order == null) { + throw new ApiException(400, "Missing required param: order"); + } + + // create path and map variables + String path = "/store/order".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'Order') as Order; + } else { + return null; + } + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart new file mode 100644 index 00000000000..9d3eb116e61 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart @@ -0,0 +1,409 @@ +part of openapi.api; + + + +class UserApi { + final ApiClient apiClient; + + UserApi([ApiClient apiClient]) : apiClient = apiClient ?? defaultApiClient; + + /// Create user + /// + /// This can only be done by the logged in user. + Future createUser(User user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithArrayInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithArray".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Creates list of users with given input array + /// + /// + Future createUsersWithListInput(List user) async { + Object postBody = user; + + // verify required params are set + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/createWithList".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Delete user + /// + /// This can only be done by the logged in user. + Future deleteUser(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Get user by user name + /// + /// + Future getUserByName(String username) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'User') as User; + } else { + return null; + } + } + /// Logs user into the system + /// + /// + Future loginUser(String username, String password) async { + Object postBody; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(password == null) { + throw new ApiException(400, "Missing required param: password"); + } + + // create path and map variables + String path = "/user/login".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + return apiClient.deserialize(response.body, 'String') as String; + } else { + return null; + } + } + /// Logs out current logged in user session + /// + /// + Future logoutUser() async { + Object postBody; + + // verify required params are set + + // create path and map variables + String path = "/user/logout".replaceAll("{format}","json"); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } + /// Updated user + /// + /// This can only be done by the logged in user. + Future updateUser(String username, User user) async { + Object postBody = user; + + // verify required params are set + if(username == null) { + throw new ApiException(400, "Missing required param: username"); + } + if(user == null) { + throw new ApiException(400, "Missing required param: user"); + } + + // create path and map variables + String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + + // query params + List queryParams = []; + Map headerParams = {}; + Map formParams = {}; + + List contentTypes = []; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + List authNames = []; + + if(contentType.startsWith("multipart/form-data")) { + bool hasFields = false; + MultipartRequest mp = new MultipartRequest(null, null); + if(hasFields) + postBody = mp; + } + else { + } + + var response = await apiClient.invokeAPI(path, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentType, + authNames); + + if(response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if(response.body != null) { + } else { + return; + } + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/api_client.dart b/samples/client/petstore/dart2/openapi/lib/api_client.dart new file mode 100644 index 00000000000..f1e49792f90 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api_client.dart @@ -0,0 +1,160 @@ +part of openapi.api; + +class QueryParam { + String name; + String value; + + QueryParam(this.name, this.value); +} + +class ApiClient { + + String basePath; + var client = Client(); + + Map _defaultHeaderMap = {}; + Map _authentications = {}; + + final _regList = RegExp(r'^List<(.*)>$'); + final _regMap = RegExp(r'^Map$'); + + ApiClient({this.basePath: "http://petstore.swagger.io/v2"}) { + // Setup authentications (key: authentication name, value: authentication). + _authentications['api_key'] = ApiKeyAuth("header", "api_key"); + _authentications['petstore_auth'] = OAuth(); + } + + void addDefaultHeader(String key, String value) { + _defaultHeaderMap[key] = value; + } + + dynamic _deserialize(dynamic value, String targetType) { + try { + switch (targetType) { + case 'String': + return '$value'; + case 'int': + return value is int ? value : int.parse('$value'); + case 'bool': + return value is bool ? value : '$value'.toLowerCase() == 'true'; + case 'double': + return value is double ? value : double.parse('$value'); + case 'ApiResponse': + return ApiResponse.fromJson(value); + case 'Category': + return Category.fromJson(value); + case 'Order': + return Order.fromJson(value); + case 'Pet': + return Pet.fromJson(value); + case 'Tag': + return Tag.fromJson(value); + case 'User': + return User.fromJson(value); + default: + { + Match match; + if (value is List && + (match = _regList.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return value.map((v) => _deserialize(v, newTargetType)).toList(); + } else if (value is Map && + (match = _regMap.firstMatch(targetType)) != null) { + var newTargetType = match[1]; + return Map.fromIterables(value.keys, + value.values.map((v) => _deserialize(v, newTargetType))); + } + } + } + } catch (e, stack) { + throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + } + throw ApiException(500, 'Could not find a suitable class for deserialization'); + } + + dynamic deserialize(String json, String targetType) { + // Remove all spaces. Necessary for reg expressions as well. + targetType = targetType.replaceAll(' ', ''); + + if (targetType == 'String') return json; + + var decodedJson = jsonDecode(json); + return _deserialize(decodedJson, targetType); + } + + String serialize(Object obj) { + String serialized = ''; + if (obj == null) { + serialized = ''; + } else { + serialized = json.encode(obj); + } + return serialized; + } + + // We don't use a Map for queryParams. + // If collectionFormat is 'multi' a key might appear multiple times. + Future invokeAPI(String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { + + _updateParamsForAuth(authNames, queryParams, headerParams); + + var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? + '?' + ps.join('&') : + ''; + + String url = basePath + path + queryString; + + headerParams.addAll(_defaultHeaderMap); + headerParams['Content-Type'] = contentType; + + if(body is MultipartRequest) { + var request = MultipartRequest(method, Uri.parse(url)); + request.fields.addAll(body.fields); + request.files.addAll(body.files); + request.headers.addAll(body.headers); + request.headers.addAll(headerParams); + var response = await client.send(request); + return Response.fromStream(response); + } else { + var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); + switch(method) { + case "POST": + return client.post(url, headers: headerParams, body: msgBody); + case "PUT": + return client.put(url, headers: headerParams, body: msgBody); + case "DELETE": + return client.delete(url, headers: headerParams); + case "PATCH": + return client.patch(url, headers: headerParams, body: msgBody); + default: + return client.get(url, headers: headerParams); + } + } + } + + /// Update query and header parameters based on authentication settings. + /// @param authNames The authentications to apply + void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + authNames.forEach((authName) { + Authentication auth = _authentications[authName]; + if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + }); + } + + void setAccessToken(String accessToken) { + _authentications.forEach((key, auth) { + if (auth is OAuth) { + auth.setAccessToken(accessToken); + } + }); + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/api_exception.dart b/samples/client/petstore/dart2/openapi/lib/api_exception.dart new file mode 100644 index 00000000000..668abe2c96b --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api_exception.dart @@ -0,0 +1,23 @@ +part of openapi.api; + +class ApiException implements Exception { + int code = 0; + String message; + Exception innerException; + StackTrace stackTrace; + + ApiException(this.code, this.message); + + ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + + String toString() { + if (message == null) return "ApiException"; + + if (innerException == null) { + return "ApiException $code: $message"; + } + + return "ApiException $code: $message (Inner exception: $innerException)\n\n" + + stackTrace.toString(); + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/api_helper.dart b/samples/client/petstore/dart2/openapi/lib/api_helper.dart new file mode 100644 index 00000000000..a516a68d264 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/api_helper.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; + +// port from Java version +Iterable _convertParametersForCollectionFormat( + String collectionFormat, String name, dynamic value) { + var params = []; + + // preconditions + if (name == null || name.isEmpty || value == null) return params; + + if (value is! List) { + params.add(QueryParam(name, parameterToString(value))); + return params; + } + + List values = value as List; + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) + ? "csv" + : collectionFormat; // default: csv + + if (collectionFormat == "multi") { + return values.map((v) => QueryParam(name, parameterToString(v))); + } + + String delimiter = _delimiters[collectionFormat] ?? ","; + + params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + return params; +} + +/// Format the given parameter object into string. +String parameterToString(dynamic value) { + if (value == null) { + return ''; + } else if (value is DateTime) { + return value.toUtc().toIso8601String(); + } else { + return value.toString(); + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart new file mode 100644 index 00000000000..8caf6ab5eba --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart @@ -0,0 +1,27 @@ +part of openapi.api; + +class ApiKeyAuth implements Authentication { + + final String location; + final String paramName; + String apiKey; + String apiKeyPrefix; + + ApiKeyAuth(this.location, this.paramName); + + @override + void applyToParams(List queryParams, Map headerParams) { + String value; + if (apiKeyPrefix != null) { + value = '$apiKeyPrefix $apiKey'; + } else { + value = apiKey; + } + + if (location == 'query' && value != null) { + queryParams.add(QueryParam(paramName, value)); + } else if (location == 'header' && value != null) { + headerParams[paramName] = value; + } + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart new file mode 100644 index 00000000000..abd5e2fe68a --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart @@ -0,0 +1,7 @@ +part of openapi.api; + +abstract class Authentication { + + /// Apply authentication settings to header and query params. + void applyToParams(List queryParams, Map headerParams); +} diff --git a/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart new file mode 100644 index 00000000000..6342d886689 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart @@ -0,0 +1,14 @@ +part of openapi.api; + +class HttpBasicAuth implements Authentication { + + String username; + String password; + + @override + void applyToParams(List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); + } + +} diff --git a/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart new file mode 100644 index 00000000000..aa08e5cdb4d --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart @@ -0,0 +1,18 @@ +part of openapi.api; + +class OAuth implements Authentication { + String accessToken; + + OAuth({this.accessToken}); + + @override + void applyToParams(List queryParams, Map headerParams) { + if (accessToken != null) { + headerParams["Authorization"] = "Bearer " + accessToken; + } + } + + void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/samples/client/petstore/dart2/openapi/lib/model/api_response.dart b/samples/client/petstore/dart2/openapi/lib/model/api_response.dart new file mode 100644 index 00000000000..a39d9500b29 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/api_response.dart @@ -0,0 +1,44 @@ +part of openapi.api; + +class ApiResponse { + + int code = null; + + String type = null; + + String message = null; + ApiResponse(); + + @override + String toString() { + return 'ApiResponse[code=$code, type=$type, message=$message, ]'; + } + + ApiResponse.fromJson(Map json) { + if (json == null) return; + code = json['code']; + type = json['type']; + message = json['message']; + } + + Map toJson() { + return { + 'code': code, + 'type': type, + 'message': message + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/lib/model/category.dart b/samples/client/petstore/dart2/openapi/lib/model/category.dart new file mode 100644 index 00000000000..b9b2481dd29 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/category.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Category { + + int id = null; + + String name = null; + Category(); + + @override + String toString() { + return 'Category[id=$id, name=$name, ]'; + } + + Category.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/lib/model/order.dart b/samples/client/petstore/dart2/openapi/lib/model/order.dart new file mode 100644 index 00000000000..4e264a183ef --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/order.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Order { + + int id = null; + + int petId = null; + + int quantity = null; + + DateTime shipDate = null; + /* Order Status */ + String status = null; + //enum statusEnum { placed, approved, delivered, };{ + + bool complete = false; + Order(); + + @override + String toString() { + return 'Order[id=$id, petId=$petId, quantity=$quantity, shipDate=$shipDate, status=$status, complete=$complete, ]'; + } + + Order.fromJson(Map json) { + if (json == null) return; + id = json['id']; + petId = json['petId']; + quantity = json['quantity']; + shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + status = json['status']; + complete = json['complete']; + } + + Map toJson() { + return { + 'id': id, + 'petId': petId, + 'quantity': quantity, + 'shipDate': shipDate == null ? '' : shipDate.toUtc().toIso8601String(), + 'status': status, + 'complete': complete + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/lib/model/pet.dart b/samples/client/petstore/dart2/openapi/lib/model/pet.dart new file mode 100644 index 00000000000..da9de49b678 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/pet.dart @@ -0,0 +1,57 @@ +part of openapi.api; + +class Pet { + + int id = null; + + Category category = null; + + String name = null; + + List photoUrls = []; + + List tags = []; + /* pet status in the store */ + String status = null; + //enum statusEnum { available, pending, sold, };{ + Pet(); + + @override + String toString() { + return 'Pet[id=$id, category=$category, name=$name, photoUrls=$photoUrls, tags=$tags, status=$status, ]'; + } + + Pet.fromJson(Map json) { + if (json == null) return; + id = json['id']; + category = new Category.fromJson(json['category']); + name = json['name']; + photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + tags = Tag.listFromJson(json['tags']); + status = json['status']; + } + + Map toJson() { + return { + 'id': id, + 'category': category, + 'name': name, + 'photoUrls': photoUrls, + 'tags': tags, + 'status': status + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/lib/model/tag.dart b/samples/client/petstore/dart2/openapi/lib/model/tag.dart new file mode 100644 index 00000000000..315a326adb7 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/tag.dart @@ -0,0 +1,40 @@ +part of openapi.api; + +class Tag { + + int id = null; + + String name = null; + Tag(); + + @override + String toString() { + return 'Tag[id=$id, name=$name, ]'; + } + + Tag.fromJson(Map json) { + if (json == null) return; + id = json['id']; + name = json['name']; + } + + Map toJson() { + return { + 'id': id, + 'name': name + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/lib/model/user.dart b/samples/client/petstore/dart2/openapi/lib/model/user.dart new file mode 100644 index 00000000000..0e4cc2104c7 --- /dev/null +++ b/samples/client/petstore/dart2/openapi/lib/model/user.dart @@ -0,0 +1,64 @@ +part of openapi.api; + +class User { + + int id = null; + + String username = null; + + String firstName = null; + + String lastName = null; + + String email = null; + + String password = null; + + String phone = null; + /* User Status */ + int userStatus = null; + User(); + + @override + String toString() { + return 'User[id=$id, username=$username, firstName=$firstName, lastName=$lastName, email=$email, password=$password, phone=$phone, userStatus=$userStatus, ]'; + } + + User.fromJson(Map json) { + if (json == null) return; + id = json['id']; + username = json['username']; + firstName = json['firstName']; + lastName = json['lastName']; + email = json['email']; + password = json['password']; + phone = json['phone']; + userStatus = json['userStatus']; + } + + Map toJson() { + return { + 'id': id, + 'username': username, + 'firstName': firstName, + 'lastName': lastName, + 'email': email, + 'password': password, + 'phone': phone, + 'userStatus': userStatus + }; + } + + static List listFromJson(List json) { + return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + } + + static Map mapFromJson(Map> json) { + var map = new Map(); + if (json != null && json.length > 0) { + json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + } + return map; + } +} + diff --git a/samples/client/petstore/dart2/openapi/pubspec.yaml b/samples/client/petstore/dart2/openapi/pubspec.yaml new file mode 100644 index 00000000000..9ccf0e524ad --- /dev/null +++ b/samples/client/petstore/dart2/openapi/pubspec.yaml @@ -0,0 +1,7 @@ +name: openapi +version: 1.0.0 +description: OpenAPI API client +environment: + sdk: '>=2.0.0 <3.0.0' +dependencies: + http: '>=0.11.1 <0.12.0' diff --git a/samples/client/petstore/dart2/petstore/.analysis_options b/samples/client/petstore/dart2/petstore/.analysis_options new file mode 100644 index 00000000000..a10d4c5a05c --- /dev/null +++ b/samples/client/petstore/dart2/petstore/.analysis_options @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true diff --git a/samples/client/petstore/dart2/petstore/README.md b/samples/client/petstore/dart2/petstore/README.md new file mode 100644 index 00000000000..17343a5c026 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/README.md @@ -0,0 +1,58 @@ +# To run these tests: + +Simply start the dart server: `pub serve` + +then open http://127.0.0.1:8080/tests.html + + +This already starts the tests. There is _NO_ feedback! + +Open the javascript / dart console of your browser to verify all tests +passed successfully. + +You should have the following output: +``` +Observatory listening at http://127.0.0.1:39067/ +unittest-suite-wait-for-done +GET http://petstore.swagger.io/v2/pet/957639 404 (Not Found) +GET http://petstore.swagger.io/v2/pet/525946 404 (Not Found) +GET http://petstore.swagger.io/v2/store/order/29756 404 (Not Found) +GET http://petstore.swagger.io/v2/user/Riddlem325 404 (Not Found) +PASS: Pet API adds a new pet and gets it by id +PASS: Pet API doesn't get non-existing pet by id +PASS: Pet API deletes existing pet by id +PASS: Pet API updates pet with form +PASS: Pet API updates existing pet +PASS: Pet API finds pets by status +PASS: Pet API finds pets by tag +PASS: Pet API uploads a pet image +PASS: Store API places an order and gets it by id +PASS: Store API deletes an order +PASS: Store API gets the store inventory +PASS: User API creates a user +PASS: User API creates users with list input +PASS: User API updates a user +PASS: User API deletes a user +PASS: User API logs a user in + +All 16 tests passed. +unittest-suite-success +``` + + +You may also run the tests in the dart vm. + +Either generate the test-package for a vm: +- change bin/dart-petstore.sh and uncomment the vm options line +- run bin/dart-petstore.sh + +or + +- in `lib/api_client.dart` change `new BrowserClient()` to `new Client()` +- in `lib/api.dart` remove the line `import 'package:http/browser_client.dart';` + + + +Then run `test/tests.dart`. + +Have fun. \ No newline at end of file diff --git a/samples/client/petstore/dart2/petstore/pom.xml b/samples/client/petstore/dart2/petstore/pom.xml new file mode 100644 index 00000000000..bec050a7944 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + org.openapitools + Dart2PetstoreClientTests + pom + 1.0.0-SNAPSHOT + Dart2 Petstore Client + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory} + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + pub-get + pre-integration-test + + exec + + + pub + + get + + + + + pub-test + integration-test + + exec + + + pub + + run + build_runner + test + + + + + + + + diff --git a/samples/client/petstore/dart2/petstore/pubspec.lock b/samples/client/petstore/dart2/petstore/pubspec.lock new file mode 100644 index 00000000000..f077e1d4423 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/pubspec.lock @@ -0,0 +1,516 @@ +# Generated by pub +# See https://www.dartlang.org/tools/pub/glossary#lockfile +packages: + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "0.32.4" + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + bazel_worker: + dependency: transitive + description: + name: bazel_worker + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.12" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.7+3" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1+2" + build_modules: + dependency: transitive + description: + name: build_modules + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.2+3" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.1+1" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.1+4" + build_test: + dependency: "direct dev" + description: + name: build_test + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.3+1" + build_web_compilers: + dependency: "direct dev" + description: + name: build_web_compilers + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.2+2" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "5.5.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3+2" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.5" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.3" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.8" + front_end: + dependency: transitive + description: + name: front_end + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.7" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+1" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.3+3" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.3+17" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1+1" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + json_rpc_2: + dependency: transitive + description: + name: json_rpc_2 + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + kernel: + dependency: transitive + description: + name: kernel + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.4" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.3+2" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.3+1" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.6+2" + multi_server_socket: + dependency: transitive + description: + name: multi_server_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + node_preamble: + dependency: transitive + description: + name: node_preamble + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" + openapi: + dependency: "direct main" + description: + path: "../openapi" + relative: true + source: path + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_resolver: + dependency: transitive + description: + name: package_resolver + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + plugin: + dependency: transitive + description: + name: plugin + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+3" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.6" + protobuf: + dependency: transitive + description: + name: protobuf + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.2" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+2" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0+1" + scratch_space: + dependency: transitive + description: + name: scratch_space + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.3+1" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.3+3" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + shelf_static: + dependency: transitive + description: + name: shelf_static + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.8" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.2+4" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.5" + source_maps: + dependency: transitive + description: + name: source_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.7" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.8" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.14+1" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + test: + dependency: "direct main" + description: + name: test + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + utf: + dependency: transitive + description: + name: utf + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.0+5" + vm_service_client: + dependency: transitive + description: + name: vm_service_client + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.6" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7+10" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.9" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.15" +sdks: + dart: ">=2.0.0 <3.0.0" diff --git a/samples/client/petstore/dart2/petstore/pubspec.yaml b/samples/client/petstore/dart2/petstore/pubspec.yaml new file mode 100644 index 00000000000..d84c7ac3202 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/pubspec.yaml @@ -0,0 +1,13 @@ +name: petstore_client +version: 1.0.0 +description: Petstore client using OpenAPI library +environment: + sdk: '>=2.0.0 <3.0.0' +dependencies: + openapi: + path: ../openapi + test: ^1.3.0 +dev_dependencies: + build_runner: ^0.10.1+1 + build_test: ^0.10.3+1 + build_web_compilers: ^0.4.2+2 diff --git a/samples/client/petstore/dart2/petstore/test/pet_test.dart b/samples/client/petstore/dart2/petstore/test/pet_test.dart new file mode 100644 index 00000000000..866e621657e --- /dev/null +++ b/samples/client/petstore/dart2/petstore/test/pet_test.dart @@ -0,0 +1,86 @@ +import 'dart:async'; + +import 'package:http/http.dart'; +import 'package:openapi/api.dart'; +import 'package:test/test.dart'; + +import 'random_id.dart'; + +void main() { + var petApi = new PetApi(); + + group('Pet API ', () { + test('adds a new pet and gets it by id', () async { + var id = newId(); + + await petApi.addPet(new Pet()..id = id); + var pet = await petApi.getPetById(id); + expect(pet.id, equals(id)); + }); + + test('doesn\'t get non-existing pet by id', () { + expect(petApi.getPetById(newId()), throwsA(equals(TypeMatcher()))); + }); + + test('deletes existing pet by id', () async { + var id = newId(); + await petApi.addPet(new Pet()..id = id); + await petApi.deletePet(id, apiKey: 'special-key'); + expect(petApi.getPetById(id), throwsA(equals(TypeMatcher()))); + }); + + test('updates pet with form', () async { + var id = newId(); + await petApi.addPet(new Pet() + ..id = id + ..name = 'Snowy'); + await petApi.updatePetWithForm(id, name: 'Doge', status: ''); + var pet = await petApi.getPetById(id); + expect(pet.name, equals('Doge')); + }); + + test('updates existing pet', () async { + var id = newId(); + var name = 'Snowy'; + + await petApi.addPet(new Pet()..id = id); + await petApi.updatePet(new Pet() + ..id = id + ..name = name); + var pet = await petApi.getPetById(id); + expect(pet.name, equals(name)); + }); + + test('finds pets by status', () async { + var id1 = newId(); + var id2 = newId(); + var id3 = newId(); + var status = 'available'; + + return Future.wait([ + petApi.addPet(new Pet() + ..id = id1 + ..status = status), + petApi.addPet(new Pet() + ..id = id2 + ..status = status), + petApi.addPet(new Pet() + ..id = id3 + ..status = 'sold') + ]).then((_) async { + var pets = await petApi.findPetsByStatus([status]); + var petIds = pets.map((pet) => pet.id).toList(); + expect(petIds, contains(id1)); + expect(petIds, contains(id2)); + expect(petIds, isNot(contains(id3))); + }); + }); + + test('uploads a pet image', () async { + var id = newId(); + await petApi.addPet(new Pet()..id = id); + var file = new MultipartFile.fromBytes('file', [104, 101, 108, 108, 111]); + await petApi.uploadFile(id, additionalMetadata: '', file: file); + }); + }); +} diff --git a/samples/client/petstore/dart2/petstore/test/random_id.dart b/samples/client/petstore/dart2/petstore/test/random_id.dart new file mode 100644 index 00000000000..0457428c7dd --- /dev/null +++ b/samples/client/petstore/dart2/petstore/test/random_id.dart @@ -0,0 +1,7 @@ +import 'dart:math'; + +final _random = new Random(); + +int newId() { + return _random.nextInt(999999); +} \ No newline at end of file diff --git a/samples/client/petstore/dart2/petstore/test/store_test.dart b/samples/client/petstore/dart2/petstore/test/store_test.dart new file mode 100644 index 00000000000..b6ebc8b9b59 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/test/store_test.dart @@ -0,0 +1,31 @@ +import 'package:openapi/api.dart'; +import 'package:test/test.dart'; + +import 'random_id.dart'; + +void main() { + var storeApi = new StoreApi(); + + group('Store API ', () { + test('places an order and gets it by id', () async { + var id = newId(); + + await storeApi.placeOrder(new Order()..id = id); + var order = await storeApi.getOrderById(id); + expect(order.id, equals(id)); + }); + + test('deletes an order', () async { + var id = newId(); + + await storeApi.placeOrder(new Order()..id = id); + await storeApi.deleteOrder(id.toString()); + expect(storeApi.getOrderById(id), throwsA(equals(TypeMatcher()))); + }); + + test('gets the store inventory', () async { + Map inventory = await storeApi.getInventory(); + expect(inventory.length, isNot(equals(0))); + }); + }); +} diff --git a/samples/client/petstore/dart2/petstore/test/user_test.dart b/samples/client/petstore/dart2/petstore/test/user_test.dart new file mode 100644 index 00000000000..909c4af13e5 --- /dev/null +++ b/samples/client/petstore/dart2/petstore/test/user_test.dart @@ -0,0 +1,79 @@ +import 'package:openapi/api.dart'; +import 'package:test/test.dart'; + +import 'random_id.dart'; + +void main() { + var userApi = new UserApi(); + + group('User API ', () { + test('creates a user', () async { + var id = newId(); + var username = 'Mally45'; + await userApi.createUser(new User() + ..id = id + ..username = username); + var user = await userApi.getUserByName(username); + expect(user.id, equals(id)); + }); + + test('creates users with list input', () async { + var firstId = newId(); + var joe = 'Joe'; + + var sally = 'Sally'; + var secondId = newId(); + + var users = [ + new User() + ..id = firstId + ..username = joe, + new User() + ..id = secondId + ..username = sally + ]; + + await userApi.createUsersWithListInput(users); + var firstUser = await userApi.getUserByName(joe); + var secondUser = await userApi.getUserByName(sally); + expect(firstUser.id, equals(firstId)); + expect(secondUser.id, equals(secondId)); + }); + + test('updates a user', () async { + var username = 'Arkjam89'; + var email = 'test@example.com'; + var user = new User() + ..id = newId() + ..username = username; + + await userApi.createUser(user); + user.email = email; + await userApi.updateUser(username, user); + var foundUser = await userApi.getUserByName(username); + expect(foundUser.email, equals(email)); + }); + + test('deletes a user', () async { + var username = 'Riddlem325'; + await userApi.createUser(new User() + ..id = newId() + ..username = username); + await userApi.deleteUser(username); + expect(userApi.getUserByName(username), throwsA(TypeMatcher())); + }); + + test('logs a user in', () async { + var username = 'sgarad625'; + var password = 'lokimoki1'; + var user = new User() + ..id = newId() + ..username = username + ..password = password; + + await userApi.createUser(user); + var result = await userApi.loginUser(username, password); + expect(result, contains('logged in user session:')); + }); + }); +} From e5244e8c3d389bbcae73d5cedf1a6399f9234724 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 1 Sep 2018 21:02:28 +0800 Subject: [PATCH 30/74] Add postProcessFile, implement in Go generators to run gofmt (#929) * add postProcessFile, implement in Go generators to run gofmt * minor fix to docstring * update parallel job to 3 --- CI/circle_parallel.sh | 1 + .../openapitools/codegen/CodegenConfig.java | 3 + .../openapitools/codegen/DefaultCodegen.java | 14 ++ .../codegen/DefaultGenerator.java | 46 +++-- .../codegen/languages/AbstractGoCodegen.java | 37 ++++ .../codegen/languages/GoClientCodegen.java | 9 + .../codegen/languages/GoServerCodegen.java | 9 + .../.openapi-generator/VERSION | 2 +- .../petstore/go/go-petstore-withXml/README.md | 2 +- .../go/go-petstore-withXml/api/openapi.yaml | 4 +- .../go-petstore-withXml/api_another_fake.go | 24 +-- .../go/go-petstore-withXml/api_fake.go | 178 +++++++++--------- .../api_fake_classname_tags123.go | 20 +- .../go/go-petstore-withXml/api_pet.go | 138 +++++++------- .../go/go-petstore-withXml/api_store.go | 66 +++---- .../go/go-petstore-withXml/api_user.go | 66 +++---- .../petstore/go/go-petstore-withXml/client.go | 22 +-- .../docs/AnotherFakeApi.md | 8 +- .../go-petstore-withXml/model_200_response.go | 2 +- .../model_additional_properties_class.go | 2 +- .../go/go-petstore-withXml/model_animal.go | 2 +- .../go-petstore-withXml/model_api_response.go | 4 +- .../go-petstore-withXml/model_array_test_.go | 6 +- .../model_capitalization.go | 10 +- .../go/go-petstore-withXml/model_cat.go | 4 +- .../go/go-petstore-withXml/model_category.go | 2 +- .../go/go-petstore-withXml/model_dog.go | 4 +- .../go-petstore-withXml/model_enum_arrays.go | 4 +- .../go-petstore-withXml/model_enum_class.go | 3 +- .../go-petstore-withXml/model_enum_test_.go | 10 +- .../model_file_schema_test_class.go | 2 +- .../go-petstore-withXml/model_format_test_.go | 25 +-- .../go/go-petstore-withXml/model_map_test_.go | 8 +- ...perties_and_additional_properties_class.go | 7 +- .../go/go-petstore-withXml/model_name.go | 8 +- .../go/go-petstore-withXml/model_order.go | 11 +- .../model_outer_composite.go | 6 +- .../go-petstore-withXml/model_outer_enum.go | 7 +- .../go/go-petstore-withXml/model_pet.go | 8 +- .../go/go-petstore-withXml/model_tag.go | 2 +- .../go/go-petstore-withXml/model_user.go | 12 +- .../go/go-petstore/.openapi-generator/VERSION | 2 +- .../go/go-petstore/api_another_fake.go | 20 +- .../petstore/go/go-petstore/api_fake.go | 178 +++++++++--------- .../go-petstore/api_fake_classname_tags123.go | 20 +- .../client/petstore/go/go-petstore/api_pet.go | 138 +++++++------- .../petstore/go/go-petstore/api_store.go | 66 +++---- .../petstore/go/go-petstore/api_user.go | 66 +++---- .../client/petstore/go/go-petstore/client.go | 22 +-- .../go/go-petstore/model_200_response.go | 2 +- .../model_additional_properties_class.go | 2 +- .../petstore/go/go-petstore/model_animal.go | 2 +- .../go/go-petstore/model_api_response.go | 4 +- .../go/go-petstore/model_array_test_.go | 6 +- .../go/go-petstore/model_capitalization.go | 10 +- .../petstore/go/go-petstore/model_cat.go | 4 +- .../petstore/go/go-petstore/model_category.go | 2 +- .../petstore/go/go-petstore/model_dog.go | 4 +- .../go/go-petstore/model_enum_arrays.go | 4 +- .../go/go-petstore/model_enum_class.go | 3 +- .../go/go-petstore/model_enum_test_.go | 10 +- .../model_file_schema_test_class.go | 2 +- .../go/go-petstore/model_format_test_.go | 25 +-- .../go/go-petstore/model_map_test_.go | 8 +- ...perties_and_additional_properties_class.go | 7 +- .../petstore/go/go-petstore/model_name.go | 8 +- .../petstore/go/go-petstore/model_order.go | 11 +- .../go/go-petstore/model_outer_composite.go | 6 +- .../go/go-petstore/model_outer_enum.go | 7 +- .../petstore/go/go-petstore/model_pet.go | 8 +- .../petstore/go/go-petstore/model_tag.go | 2 +- .../petstore/go/go-petstore/model_user.go | 12 +- .../go-api-server/.openapi-generator/VERSION | 2 +- .../go-api-server/go/model_api_response.go | 1 - .../go-api-server/go/model_category.go | 1 - .../petstore/go-api-server/go/model_order.go | 1 - .../petstore/go-api-server/go/model_pet.go | 1 - .../petstore/go-api-server/go/model_tag.go | 1 - .../petstore/go-api-server/go/model_user.go | 1 - shippable.yml | 2 +- 80 files changed, 782 insertions(+), 687 deletions(-) diff --git a/CI/circle_parallel.sh b/CI/circle_parallel.sh index 95b47adcebc..88d9a4ee7d8 100755 --- a/CI/circle_parallel.sh +++ b/CI/circle_parallel.sh @@ -10,6 +10,7 @@ if [ "$NODE_INDEX" = "1" ]; then mvn --quiet verify -Psamples elif [ "$NODE_INDEX" = "2" ]; then echo "Running node $NODE_INDEX to test ensure-up-to-date" + export GO_FMT_PATH=`which gofmt` ./bin/utils/ensure-up-to-date else echo "Running node $NODE_INDEX to test CI/pom.xml.circleci.java7 ..." diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index 61b98db1bef..a89e849944c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.oas.models.servers.ServerVariable; +import java.io.File; import java.util.List; import java.util.Map; import java.util.Set; @@ -254,4 +255,6 @@ public interface CodegenConfig { String sanitizeName(String name); + void postProcessFile(File file, String fileType); + } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index c7adcd0b368..a062e301350 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4688,4 +4688,18 @@ public class DefaultCodegen implements CodegenConfig { private void setParameterNullable(CodegenParameter parameter, CodegenProperty property) { parameter.isNullable = property.isNullable; } + + /** + * Post-process the auto-generated file, e.g. using go-fmt to format the Go code. The file type can be "model-test", + * "model-doc", "model", "api", "api-test", "api-doc", "supporting-mustache", "supporting-common", + * "openapi-generator-ignore", "openapi-generator-version" + * + * TODO: store these values in enum instead + * + * @param file file to be processed + * @param fileType file type + */ + public void postProcessFile(File file, String fileType) { + LOGGER.info("Post processing file {} ({})", file, fileType); + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 71e90105422..f4a05610abc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -279,6 +279,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { File written = processTemplateToFile(models, templateName, filename); if (written != null) { files.add(written); + config.postProcessFile(written, "model-test"); } } } @@ -295,6 +296,23 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { File written = processTemplateToFile(models, templateName, filename); if (written != null) { files.add(written); + config.postProcessFile(written, "model-doc"); + } + } + } + + private void generateModel(List files, Map models, String modelName) throws IOException { + for (String templateName : config.modelTemplateFiles().keySet()) { + String suffix = config.modelTemplateFiles().get(templateName); + String filename = config.modelFileFolder() + File.separator + config.toModelFilename(modelName) + suffix; + if (!config.shouldOverwrite(filename)) { + LOGGER.info("Skipped overwriting " + filename); + continue; + } + File written = processTemplateToFile(models, templateName, filename); + if (written != null) { + files.add(written); + config.postProcessFile(written, "model"); } } } @@ -442,19 +460,11 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { allModels.add(modelTemplate); - for (String templateName : config.modelTemplateFiles().keySet()) { - String suffix = config.modelTemplateFiles().get(templateName); - String filename = config.modelFileFolder() + File.separator + config.toModelFilename(modelName) + suffix; - if (!config.shouldOverwrite(filename)) { - LOGGER.info("Skipped overwriting " + filename); - continue; - } - File written = processTemplateToFile(models, templateName, filename); - if (written != null) { - files.add(written); - } - } + // to generate model files + generateModel(files, models, modelName); + if (generateModelTests) { + // to generate model test files generateModelTests(files, models, modelName); } if (generateModelDocumentation) { @@ -548,6 +558,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { File written = processTemplateToFile(operation, templateName, filename); if (written != null) { files.add(written); + config.postProcessFile(written, "api"); } } @@ -564,6 +575,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { File written = processTemplateToFile(operation, templateName, filename); if (written != null) { files.add(written); + config.postProcessFile(written, "api-test"); } } } @@ -581,6 +593,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { File written = processTemplateToFile(operation, templateName, filename); if (written != null) { files.add(written); + config.postProcessFile(written, "api-doc"); } } } @@ -651,7 +664,9 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { .compile(template); writeToFile(outputFilename, tmpl.execute(bundle)); - files.add(new File(outputFilename)); + File written = new File(outputFilename); + files.add(written); + config.postProcessFile(written, "supporting-mustache"); } else { InputStream in = null; @@ -665,6 +680,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } File outputFile = writeInputStreamToFile(outputFilename, in, templateFile); files.add(outputFile); + config.postProcessFile(outputFile, "supporting-common"); } } else { LOGGER.info("Skipped generation of " + outputFilename + " due to rule in .openapi-generator-ignore"); @@ -688,6 +704,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { throw new RuntimeException("Could not generate supporting file '" + openapiGeneratorIgnore + "'", e); } files.add(ignoreFile); + config.postProcessFile(ignoreFile, "openapi-generator-ignore"); } if (generateMetadata) { @@ -696,6 +713,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { try { writeToFile(versionMetadata, ImplementationVersion.read()); files.add(versionMetadataFile); + config.postProcessFile(ignoreFile, "openapi-generator-version"); } catch (IOException e) { throw new RuntimeException("Could not generate supporting file '" + versionMetadata + "'", e); } @@ -762,7 +780,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { bundle.put("authMethods", authMethods); bundle.put("hasAuthMethods", true); } - + List servers = config.fromServers(openAPI.getServers()); if (servers != null && !servers.isEmpty()) { bundle.put("servers", servers); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java index 3a274341d55..d896e9050e2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java @@ -20,11 +20,14 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.FilenameUtils; import org.openapitools.codegen.*; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.IOException; import java.util.*; public abstract class AbstractGoCodegen extends DefaultCodegen implements CodegenConfig { @@ -603,4 +606,38 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege return null; } } + + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + // only procees the following type (or we can simply rely on the file extension to check if it's a Go file) + Set supportedFileType = new HashSet( + Arrays.asList( + "supporting-mustache", + "model-test", + "model", + "api-test", + "api")); + if (!supportedFileType.contains(fileType)) { + return; + } + + String goFmtPath = System.getenv("GO_FMT_PATH"); + + // only process files with go extension + if ("go".equals(FilenameUtils.getExtension(file.toString()))) { + // currently only support "gofmt -w yourcode.go" + // another way is "go fmt path/to/your/package" + String command = goFmtPath + " -w " + file.toString(); + try { + Runtime.getRuntime().exec(command); + } catch (IOException e) { + LOGGER.error("Error running the command: " + command); + } + LOGGER.info("Successfully executed: " + command); + } + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java index dd173e43ccb..abdf447104c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java @@ -17,16 +17,21 @@ package org.openapitools.codegen.languages; +import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.util.Arrays; public class GoClientCodegen extends AbstractGoCodegen { + private static final Logger LOGGER = LoggerFactory.getLogger(GoClientCodegen.class); + protected String packageVersion = "1.0.0"; protected String apiDocPath = "docs/"; protected String modelDocPath = "docs/"; @@ -66,6 +71,10 @@ public class GoClientCodegen extends AbstractGoCodegen { public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("GO_FMT_PATH"))) { + LOGGER.info("Environment variable GO_FMT_PATH not defined so Go code may not be properly formatted. To define it, try 'export GO_FMT_PATH=/usr/local/bin/gofmt' (Linux/Mac)"); + } + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); } else { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoServerCodegen.java index 6e650b9ad56..ed6cfc92b0d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoServerCodegen.java @@ -17,15 +17,20 @@ package org.openapitools.codegen.languages; +import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.util.Arrays; public class GoServerCodegen extends AbstractGoCodegen { + private static final Logger LOGGER = LoggerFactory.getLogger(GoServerCodegen.class); + protected String apiVersion = "1.0.0"; protected int serverPort = 8080; protected String projectName = "openapi-server"; @@ -85,6 +90,10 @@ public class GoServerCodegen extends AbstractGoCodegen { public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("GO_FMT_PATH"))) { + LOGGER.info("Environment variable GO_FMT_PATH not defined so Go code may not be properly formatted. To define it, try 'export GO_FMT_PATH=/usr/local/bin/gofmt' (Linux/Mac)"); + } + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); } else { diff --git a/samples/client/petstore/go/go-petstore-withXml/.openapi-generator/VERSION b/samples/client/petstore/go/go-petstore-withXml/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/go/go-petstore-withXml/.openapi-generator/VERSION +++ b/samples/client/petstore/go/go-petstore-withXml/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/go/go-petstore-withXml/README.md b/samples/client/petstore/go/go-petstore-withXml/README.md index 79673db9e37..610174ac2a8 100644 --- a/samples/client/petstore/go/go-petstore-withXml/README.md +++ b/samples/client/petstore/go/go-petstore-withXml/README.md @@ -30,7 +30,7 @@ All URIs are relative to *http://petstore.swagger.io:80/v2* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*AnotherFakeApi* | [**TestSpecialTags**](docs/AnotherFakeApi.md#testspecialtags) | **Patch** /another-fake/dummy | To test special tags +*AnotherFakeApi* | [**Call123TestSpecialTags**](docs/AnotherFakeApi.md#call123testspecialtags) | **Patch** /another-fake/dummy | To test special tags *FakeApi* | [**FakeOuterBooleanSerialize**](docs/FakeApi.md#fakeouterbooleanserialize) | **Post** /fake/outer/boolean | *FakeApi* | [**FakeOuterCompositeSerialize**](docs/FakeApi.md#fakeoutercompositeserialize) | **Post** /fake/outer/composite | *FakeApi* | [**FakeOuterNumberSerialize**](docs/FakeApi.md#fakeouternumberserialize) | **Post** /fake/outer/number | diff --git a/samples/client/petstore/go/go-petstore-withXml/api/openapi.yaml b/samples/client/petstore/go/go-petstore-withXml/api/openapi.yaml index 1843427a4fc..1ccb557da3b 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api/openapi.yaml +++ b/samples/client/petstore/go/go-petstore-withXml/api/openapi.yaml @@ -954,8 +954,8 @@ paths: - fake /another-fake/dummy: patch: - description: To test special tags - operationId: test_special_tags + description: To test special tags and operation ID starting with number + operationId: 123_test_@#$%_special_tags requestBody: content: application/json: diff --git a/samples/client/petstore/go/go-petstore-withXml/api_another_fake.go b/samples/client/petstore/go/go-petstore-withXml/api_another_fake.go index 947356f0b8c..2367690cc0e 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_another_fake.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_another_fake.go @@ -27,19 +27,19 @@ type AnotherFakeApiService service /* AnotherFakeApiService To test special tags -To test special tags +To test special tags and operation ID starting with number * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). * @param client client model @return Client */ -func (a *AnotherFakeApiService) TestSpecialTags(ctx context.Context, client Client) (Client, *http.Response, error) { +func (a *AnotherFakeApiService) Call123TestSpecialTags(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -86,7 +86,7 @@ func (a *AnotherFakeApiService) TestSpecialTags(ctx context.Context, client Clie if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -94,18 +94,18 @@ func (a *AnotherFakeApiService) TestSpecialTags(ctx context.Context, client Clie if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore-withXml/api_fake.go b/samples/client/petstore/go/go-petstore-withXml/api_fake.go index 5802c0ab477..c6eba3fe6ba 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_fake.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_fake.go @@ -12,12 +12,12 @@ package petstore import ( "context" + "github.com/antihax/optional" "io/ioutil" "net/http" "net/url" - "strings" - "github.com/antihax/optional" "os" + "strings" ) // Linger please @@ -37,17 +37,17 @@ Test serialization of outer boolean types */ type FakeOuterBooleanSerializeOpts struct { - Body optional.Bool + Body optional.Bool } func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVarOptionals *FakeOuterBooleanSerializeOpts) (bool, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue bool + localVarReturnValue bool ) // create path and map variables @@ -97,7 +97,7 @@ func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVar if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -105,18 +105,18 @@ func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVar if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v bool - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -134,17 +134,17 @@ Test serialization of object with outer number type */ type FakeOuterCompositeSerializeOpts struct { - OuterComposite optional.Interface + OuterComposite optional.Interface } func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localVarOptionals *FakeOuterCompositeSerializeOpts) (OuterComposite, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue OuterComposite + localVarReturnValue OuterComposite ) // create path and map variables @@ -198,7 +198,7 @@ func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localV if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -206,18 +206,18 @@ func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localV if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v OuterComposite - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -235,17 +235,17 @@ Test serialization of outer number types */ type FakeOuterNumberSerializeOpts struct { - Body optional.Float32 + Body optional.Float32 } func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarOptionals *FakeOuterNumberSerializeOpts) (float32, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue float32 + localVarReturnValue float32 ) // create path and map variables @@ -295,7 +295,7 @@ func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -303,18 +303,18 @@ func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v float32 - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -332,17 +332,17 @@ Test serialization of outer string types */ type FakeOuterStringSerializeOpts struct { - Body optional.String + Body optional.String } func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarOptionals *FakeOuterStringSerializeOpts) (string, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue string + localVarReturnValue string ) // create path and map variables @@ -392,7 +392,7 @@ func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -400,18 +400,18 @@ func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v string - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -427,7 +427,7 @@ For this test, the body for this request much reference a schema named `Fil */ func (a *FakeApiService) TestBodyWithFileSchema(ctx context.Context, fileSchemaTestClass FileSchemaTestClass) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -478,7 +478,7 @@ func (a *FakeApiService) TestBodyWithFileSchema(ctx context.Context, fileSchemaT if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -495,7 +495,7 @@ FakeApiService */ func (a *FakeApiService) TestBodyWithQueryParams(ctx context.Context, query string, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -547,7 +547,7 @@ func (a *FakeApiService) TestBodyWithQueryParams(ctx context.Context, query stri if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -565,12 +565,12 @@ To test \"client\" model */ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -617,7 +617,7 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -625,18 +625,18 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -645,8 +645,8 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl } /* -FakeApiService Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 -Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +FakeApiService Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). * @param number None * @param double None @@ -666,21 +666,21 @@ Fake endpoint for testing various parameters 假端點 偽のエンドポイン */ type TestEndpointParametersOpts struct { - Integer optional.Int32 - Int32_ optional.Int32 - Int64_ optional.Int64 - Float optional.Float32 - String_ optional.String - Binary optional.Interface - Date optional.String - DateTime optional.Time - Password optional.String - Callback optional.String + Integer optional.Int32 + Int32_ optional.Int32 + Int64_ optional.Int64 + Float optional.Float32 + String_ optional.String + Binary optional.Interface + Date optional.String + DateTime optional.Time + Password optional.String + Callback optional.String } func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number float32, double float64, patternWithoutDelimiter string, byte_ string, localVarOptionals *TestEndpointParametersOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -748,7 +748,7 @@ func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number floa localVarFileOk := false localVarFile, localVarFileOk = localVarOptionals.Binary.Value().(*os.File) if !localVarFileOk { - return nil, reportError("binary should be *os.File") + return nil, reportError("binary should be *os.File") } } if localVarFile != nil { @@ -787,7 +787,7 @@ func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number floa if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -812,19 +812,19 @@ To test enum parameters */ type TestEnumParametersOpts struct { - EnumHeaderStringArray optional.Interface - EnumHeaderString optional.String - EnumQueryStringArray optional.Interface - EnumQueryString optional.String - EnumQueryInteger optional.Int32 - EnumQueryDouble optional.Float64 - EnumFormStringArray optional.Interface - EnumFormString optional.String + EnumHeaderStringArray optional.Interface + EnumHeaderString optional.String + EnumQueryStringArray optional.Interface + EnumQueryString optional.String + EnumQueryInteger optional.Int32 + EnumQueryDouble optional.Float64 + EnumFormStringArray optional.Interface + EnumFormString optional.String } func (a *FakeApiService) TestEnumParameters(ctx context.Context, localVarOptionals *TestEnumParametersOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -897,7 +897,7 @@ func (a *FakeApiService) TestEnumParameters(ctx context.Context, localVarOptiona if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -913,7 +913,7 @@ FakeApiService test inline additionalProperties */ func (a *FakeApiService) TestInlineAdditionalProperties(ctx context.Context, requestBody map[string]string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -964,7 +964,7 @@ func (a *FakeApiService) TestInlineAdditionalProperties(ctx context.Context, req if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -981,7 +981,7 @@ FakeApiService test json serialization of form data */ func (a *FakeApiService) TestJsonFormData(ctx context.Context, param string, param2 string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -1032,7 +1032,7 @@ func (a *FakeApiService) TestJsonFormData(ctx context.Context, param string, par if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr diff --git a/samples/client/petstore/go/go-petstore-withXml/api_fake_classname_tags123.go b/samples/client/petstore/go/go-petstore-withXml/api_fake_classname_tags123.go index b2748822bb8..bf433a4a729 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_fake_classname_tags123.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_fake_classname_tags123.go @@ -34,12 +34,12 @@ To test class name in snake case */ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -99,7 +99,7 @@ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, clie if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -107,18 +107,18 @@ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, clie if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore-withXml/api_pet.go b/samples/client/petstore/go/go-petstore-withXml/api_pet.go index 2a7fc7f0172..1299f93292b 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_pet.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_pet.go @@ -12,13 +12,13 @@ package petstore import ( "context" + "fmt" + "github.com/antihax/optional" "io/ioutil" "net/http" "net/url" - "strings" - "fmt" - "github.com/antihax/optional" "os" + "strings" ) // Linger please @@ -35,7 +35,7 @@ PetApiService Add a new pet to the store */ func (a *PetApiService) AddPet(ctx context.Context, pet Pet) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -86,7 +86,7 @@ func (a *PetApiService) AddPet(ctx context.Context, pet Pet) (*http.Response, er if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -100,16 +100,16 @@ PetApiService Deletes a pet * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). * @param petId Pet id to delete * @param optional nil or *DeletePetOpts - Optional Parameters: - * @param "ApiKey" (optional.String) - + * @param "ApiKey" (optional.String) - */ type DeletePetOpts struct { - ApiKey optional.String + ApiKey optional.String } func (a *PetApiService) DeletePet(ctx context.Context, petId int64, localVarOptionals *DeletePetOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -162,7 +162,7 @@ func (a *PetApiService) DeletePet(ctx context.Context, petId int64, localVarOpti if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -180,12 +180,12 @@ Multiple status values can be provided with comma separated strings */ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ([]Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue []Pet + localVarReturnValue []Pet ) // create path and map variables @@ -231,7 +231,7 @@ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ( if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -239,18 +239,18 @@ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ( if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v []Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -267,12 +267,12 @@ Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 */ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue []Pet + localVarReturnValue []Pet ) // create path and map variables @@ -318,7 +318,7 @@ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pe if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -326,18 +326,18 @@ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pe if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v []Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -354,12 +354,12 @@ Returns a single pet */ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Pet + localVarReturnValue Pet ) // create path and map variables @@ -418,7 +418,7 @@ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -426,18 +426,18 @@ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -452,7 +452,7 @@ PetApiService Update an existing pet */ func (a *PetApiService) UpdatePet(ctx context.Context, pet Pet) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -503,7 +503,7 @@ func (a *PetApiService) UpdatePet(ctx context.Context, pet Pet) (*http.Response, if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -522,13 +522,13 @@ PetApiService Updates a pet in the store with form data */ type UpdatePetWithFormOpts struct { - Name optional.String - Status optional.String + Name optional.String + Status optional.String } func (a *PetApiService) UpdatePetWithForm(ctx context.Context, petId int64, localVarOptionals *UpdatePetWithFormOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -584,7 +584,7 @@ func (a *PetApiService) UpdatePetWithForm(ctx context.Context, petId int64, loca if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -604,18 +604,18 @@ PetApiService uploads an image */ type UploadFileOpts struct { - AdditionalMetadata optional.String - File optional.Interface + AdditionalMetadata optional.String + File optional.Interface } func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOptionals *UploadFileOpts) (ApiResponse, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue ApiResponse + localVarReturnValue ApiResponse ) // create path and map variables @@ -652,7 +652,7 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt localVarFileOk := false localVarFile, localVarFileOk = localVarOptionals.File.Value().(*os.File) if !localVarFileOk { - return localVarReturnValue, nil, reportError("file should be *os.File") + return localVarReturnValue, nil, reportError("file should be *os.File") } } if localVarFile != nil { @@ -679,7 +679,7 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -687,18 +687,18 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v ApiResponse - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -717,17 +717,17 @@ PetApiService uploads an image (required) */ type UploadFileWithRequiredFileOpts struct { - AdditionalMetadata optional.String + AdditionalMetadata optional.String } func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId int64, requiredFile *os.File, localVarOptionals *UploadFileWithRequiredFileOpts) (ApiResponse, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue ApiResponse + localVarReturnValue ApiResponse ) // create path and map variables @@ -784,7 +784,7 @@ func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId in if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -792,18 +792,18 @@ func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId in if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v ApiResponse - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore-withXml/api_store.go b/samples/client/petstore/go/go-petstore-withXml/api_store.go index 37bfbd9d1e6..ac46e305161 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_store.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_store.go @@ -12,11 +12,11 @@ package petstore import ( "context" + "fmt" "io/ioutil" "net/http" "net/url" "strings" - "fmt" ) // Linger please @@ -34,7 +34,7 @@ For valid response try integer IDs with value < 1000. Anything above 1000 or */ func (a *StoreApiService) DeleteOrder(ctx context.Context, orderId string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -84,7 +84,7 @@ func (a *StoreApiService) DeleteOrder(ctx context.Context, orderId string) (*htt if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -101,12 +101,12 @@ Returns a map of status codes to quantities */ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue map[string]int32 + localVarReturnValue map[string]int32 ) // create path and map variables @@ -164,7 +164,7 @@ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, * if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -172,18 +172,18 @@ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, * if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v map[string]int32 - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -200,12 +200,12 @@ For valid response try integer IDs with value <= 5 or > 10. Other val */ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Order, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Order + localVarReturnValue Order ) // create path and map variables @@ -257,7 +257,7 @@ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Orde if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -265,18 +265,18 @@ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Orde if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Order - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -292,12 +292,12 @@ StoreApiService Place an order for a pet */ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Order + localVarReturnValue Order ) // create path and map variables @@ -344,7 +344,7 @@ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, * if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -352,18 +352,18 @@ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, * if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Order - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore-withXml/api_user.go b/samples/client/petstore/go/go-petstore-withXml/api_user.go index 5fb7bae8892..cee7c24f24a 100644 --- a/samples/client/petstore/go/go-petstore-withXml/api_user.go +++ b/samples/client/petstore/go/go-petstore-withXml/api_user.go @@ -12,11 +12,11 @@ package petstore import ( "context" + "fmt" "io/ioutil" "net/http" "net/url" "strings" - "fmt" ) // Linger please @@ -34,7 +34,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) CreateUser(ctx context.Context, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -85,7 +85,7 @@ func (a *UserApiService) CreateUser(ctx context.Context, user User) (*http.Respo if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -101,7 +101,7 @@ UserApiService Creates list of users with given input array */ func (a *UserApiService) CreateUsersWithArrayInput(ctx context.Context, user []User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -152,7 +152,7 @@ func (a *UserApiService) CreateUsersWithArrayInput(ctx context.Context, user []U if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -168,7 +168,7 @@ UserApiService Creates list of users with given input array */ func (a *UserApiService) CreateUsersWithListInput(ctx context.Context, user []User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -219,7 +219,7 @@ func (a *UserApiService) CreateUsersWithListInput(ctx context.Context, user []Us if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -236,7 +236,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) DeleteUser(ctx context.Context, username string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -286,7 +286,7 @@ func (a *UserApiService) DeleteUser(ctx context.Context, username string) (*http if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -303,12 +303,12 @@ UserApiService Get user by user name */ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (User, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue User + localVarReturnValue User ) // create path and map variables @@ -354,7 +354,7 @@ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (Us if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -362,18 +362,18 @@ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (Us if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v User - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -390,12 +390,12 @@ UserApiService Logs user into the system */ func (a *UserApiService) LoginUser(ctx context.Context, username string, password string) (string, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue string + localVarReturnValue string ) // create path and map variables @@ -442,7 +442,7 @@ func (a *UserApiService) LoginUser(ctx context.Context, username string, passwor if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -450,18 +450,18 @@ func (a *UserApiService) LoginUser(ctx context.Context, username string, passwor if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v string - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -475,7 +475,7 @@ UserApiService Logs out current logged in user session */ func (a *UserApiService) LogoutUser(ctx context.Context) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -524,7 +524,7 @@ func (a *UserApiService) LogoutUser(ctx context.Context) (*http.Response, error) if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -542,7 +542,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) UpdateUser(ctx context.Context, username string, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -594,7 +594,7 @@ func (a *UserApiService) UpdateUser(ctx context.Context, username string, user U if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr diff --git a/samples/client/petstore/go/go-petstore-withXml/client.go b/samples/client/petstore/go/go-petstore-withXml/client.go index 7f6ae237a71..16c86d291fa 100644 --- a/samples/client/petstore/go/go-petstore-withXml/client.go +++ b/samples/client/petstore/go/go-petstore-withXml/client.go @@ -319,17 +319,17 @@ func (c *APIClient) prepareRequest( } func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) { - if strings.Contains(contentType, "application/xml") { - if err = xml.Unmarshal(b, v); err != nil { - return err - } - return nil - } else if strings.Contains(contentType, "application/json") { - if err = json.Unmarshal(b, v); err != nil { - return err - } - return nil + if strings.Contains(contentType, "application/xml") { + if err = xml.Unmarshal(b, v); err != nil { + return err } + return nil + } else if strings.Contains(contentType, "application/json") { + if err = json.Unmarshal(b, v); err != nil { + return err + } + return nil + } return errors.New("undefined response type") } @@ -481,4 +481,4 @@ func (e GenericOpenAPIError) Body() []byte { // Model returns the unpacked model of the error func (e GenericOpenAPIError) Model() interface{} { return e.model -} \ No newline at end of file +} diff --git a/samples/client/petstore/go/go-petstore-withXml/docs/AnotherFakeApi.md b/samples/client/petstore/go/go-petstore-withXml/docs/AnotherFakeApi.md index ce9779af264..43c63231137 100644 --- a/samples/client/petstore/go/go-petstore-withXml/docs/AnotherFakeApi.md +++ b/samples/client/petstore/go/go-petstore-withXml/docs/AnotherFakeApi.md @@ -4,14 +4,14 @@ All URIs are relative to *http://petstore.swagger.io:80/v2* Method | HTTP request | Description ------------- | ------------- | ------------- -[**TestSpecialTags**](AnotherFakeApi.md#TestSpecialTags) | **Patch** /another-fake/dummy | To test special tags +[**Call123TestSpecialTags**](AnotherFakeApi.md#Call123TestSpecialTags) | **Patch** /another-fake/dummy | To test special tags -# **TestSpecialTags** -> Client TestSpecialTags(ctx, client) +# **Call123TestSpecialTags** +> Client Call123TestSpecialTags(ctx, client) To test special tags -To test special tags +To test special tags and operation ID starting with number ### Required Parameters diff --git a/samples/client/petstore/go/go-petstore-withXml/model_200_response.go b/samples/client/petstore/go/go-petstore-withXml/model_200_response.go index c595db80775..5bbdc75815e 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_200_response.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_200_response.go @@ -12,6 +12,6 @@ package petstore // Model for testing model name starting with number type Model200Response struct { - Name int32 `json:"name,omitempty" xml:"name"` + Name int32 `json:"name,omitempty" xml:"name"` Class string `json:"class,omitempty" xml:"class"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_additional_properties_class.go b/samples/client/petstore/go/go-petstore-withXml/model_additional_properties_class.go index afa3de3d955..81330598575 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_additional_properties_class.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_additional_properties_class.go @@ -11,6 +11,6 @@ package petstore type AdditionalPropertiesClass struct { - MapProperty map[string]string `json:"map_property,omitempty" xml:"map_property"` + MapProperty map[string]string `json:"map_property,omitempty" xml:"map_property"` MapOfMapProperty map[string]map[string]string `json:"map_of_map_property,omitempty" xml:"map_of_map_property"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_animal.go b/samples/client/petstore/go/go-petstore-withXml/model_animal.go index 69c91c1b357..1bc1eb6974d 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_animal.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_animal.go @@ -12,5 +12,5 @@ package petstore type Animal struct { ClassName string `json:"className" xml:"className"` - Color string `json:"color,omitempty" xml:"color"` + Color string `json:"color,omitempty" xml:"color"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_api_response.go b/samples/client/petstore/go/go-petstore-withXml/model_api_response.go index 9f617359fd8..df2771ad2cb 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_api_response.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_api_response.go @@ -11,7 +11,7 @@ package petstore type ApiResponse struct { - Code int32 `json:"code,omitempty" xml:"code"` - Type string `json:"type,omitempty" xml:"type"` + Code int32 `json:"code,omitempty" xml:"code"` + Type string `json:"type,omitempty" xml:"type"` Message string `json:"message,omitempty" xml:"message"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_array_test_.go b/samples/client/petstore/go/go-petstore-withXml/model_array_test_.go index 3a0f7178d2b..256e8a1e67e 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_array_test_.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_array_test_.go @@ -11,7 +11,7 @@ package petstore type ArrayTest struct { - ArrayOfString []string `json:"array_of_string,omitempty" xml:"array_of_string"` - ArrayArrayOfInteger [][]int64 `json:"array_array_of_integer,omitempty" xml:"array_array_of_integer"` - ArrayArrayOfModel [][]ReadOnlyFirst `json:"array_array_of_model,omitempty" xml:"array_array_of_model"` + ArrayOfString []string `json:"array_of_string,omitempty" xml:"array_of_string"` + ArrayArrayOfInteger [][]int64 `json:"array_array_of_integer,omitempty" xml:"array_array_of_integer"` + ArrayArrayOfModel [][]ReadOnlyFirst `json:"array_array_of_model,omitempty" xml:"array_array_of_model"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_capitalization.go b/samples/client/petstore/go/go-petstore-withXml/model_capitalization.go index 66c5fc6c148..d20471c50db 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_capitalization.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_capitalization.go @@ -11,11 +11,11 @@ package petstore type Capitalization struct { - SmallCamel string `json:"smallCamel,omitempty" xml:"smallCamel"` - CapitalCamel string `json:"CapitalCamel,omitempty" xml:"CapitalCamel"` - SmallSnake string `json:"small_Snake,omitempty" xml:"small_Snake"` - CapitalSnake string `json:"Capital_Snake,omitempty" xml:"Capital_Snake"` + SmallCamel string `json:"smallCamel,omitempty" xml:"smallCamel"` + CapitalCamel string `json:"CapitalCamel,omitempty" xml:"CapitalCamel"` + SmallSnake string `json:"small_Snake,omitempty" xml:"small_Snake"` + CapitalSnake string `json:"Capital_Snake,omitempty" xml:"Capital_Snake"` SCAETHFlowPoints string `json:"SCA_ETH_Flow_Points,omitempty" xml:"SCA_ETH_Flow_Points"` - // Name of the pet + // Name of the pet ATT_NAME string `json:"ATT_NAME,omitempty" xml:"ATT_NAME"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_cat.go b/samples/client/petstore/go/go-petstore-withXml/model_cat.go index f59648881a6..8c74e6abfb2 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_cat.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_cat.go @@ -12,6 +12,6 @@ package petstore type Cat struct { ClassName string `json:"className" xml:"className"` - Color string `json:"color,omitempty" xml:"color"` - Declawed bool `json:"declawed,omitempty" xml:"declawed"` + Color string `json:"color,omitempty" xml:"color"` + Declawed bool `json:"declawed,omitempty" xml:"declawed"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_category.go b/samples/client/petstore/go/go-petstore-withXml/model_category.go index 2da34c43a24..65a6dc484f9 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_category.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_category.go @@ -11,6 +11,6 @@ package petstore type Category struct { - Id int64 `json:"id,omitempty" xml:"id"` + Id int64 `json:"id,omitempty" xml:"id"` Name string `json:"name,omitempty" xml:"name"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_dog.go b/samples/client/petstore/go/go-petstore-withXml/model_dog.go index 8191c278bb6..3c763bf1020 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_dog.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_dog.go @@ -12,6 +12,6 @@ package petstore type Dog struct { ClassName string `json:"className" xml:"className"` - Color string `json:"color,omitempty" xml:"color"` - Breed string `json:"breed,omitempty" xml:"breed"` + Color string `json:"color,omitempty" xml:"color"` + Breed string `json:"breed,omitempty" xml:"breed"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_enum_arrays.go b/samples/client/petstore/go/go-petstore-withXml/model_enum_arrays.go index f4c7e5495cc..a5d44a6460b 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_enum_arrays.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_enum_arrays.go @@ -11,6 +11,6 @@ package petstore type EnumArrays struct { - JustSymbol string `json:"just_symbol,omitempty" xml:"just_symbol"` - ArrayEnum []string `json:"array_enum,omitempty" xml:"array_enum"` + JustSymbol string `json:"just_symbol,omitempty" xml:"just_symbol"` + ArrayEnum []string `json:"array_enum,omitempty" xml:"array_enum"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_enum_class.go b/samples/client/petstore/go/go-petstore-withXml/model_enum_class.go index 9d3dd60a946..3888784a7fb 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_enum_class.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_enum_class.go @@ -9,6 +9,7 @@ // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. package petstore + type EnumClass string // List of EnumClass @@ -16,4 +17,4 @@ const ( ABC EnumClass = "_abc" EFG EnumClass = "-efg" XYZ EnumClass = "(xyz)" -) \ No newline at end of file +) diff --git a/samples/client/petstore/go/go-petstore-withXml/model_enum_test_.go b/samples/client/petstore/go/go-petstore-withXml/model_enum_test_.go index 02c6c920c31..2767b949dc0 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_enum_test_.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_enum_test_.go @@ -11,9 +11,9 @@ package petstore type EnumTest struct { - EnumString string `json:"enum_string,omitempty" xml:"enum_string"` - EnumStringRequired string `json:"enum_string_required" xml:"enum_string_required"` - EnumInteger int32 `json:"enum_integer,omitempty" xml:"enum_integer"` - EnumNumber float64 `json:"enum_number,omitempty" xml:"enum_number"` - OuterEnum OuterEnum `json:"outerEnum,omitempty" xml:"outerEnum"` + EnumString string `json:"enum_string,omitempty" xml:"enum_string"` + EnumStringRequired string `json:"enum_string_required" xml:"enum_string_required"` + EnumInteger int32 `json:"enum_integer,omitempty" xml:"enum_integer"` + EnumNumber float64 `json:"enum_number,omitempty" xml:"enum_number"` + OuterEnum OuterEnum `json:"outerEnum,omitempty" xml:"outerEnum"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_file_schema_test_class.go b/samples/client/petstore/go/go-petstore-withXml/model_file_schema_test_class.go index 6debdd3639b..88e64fca3f7 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_file_schema_test_class.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_file_schema_test_class.go @@ -11,6 +11,6 @@ package petstore type FileSchemaTestClass struct { - File File `json:"file,omitempty" xml:"file"` + File File `json:"file,omitempty" xml:"file"` Files []File `json:"files,omitempty" xml:"files"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_format_test_.go b/samples/client/petstore/go/go-petstore-withXml/model_format_test_.go index dbd780a794e..5c7f570bb98 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_format_test_.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_format_test_.go @@ -9,23 +9,24 @@ // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. package petstore + import ( "os" "time" ) type FormatTest struct { - Integer int32 `json:"integer,omitempty" xml:"integer"` - Int32 int32 `json:"int32,omitempty" xml:"int32"` - Int64 int64 `json:"int64,omitempty" xml:"int64"` - Number float32 `json:"number" xml:"number"` - Float float32 `json:"float,omitempty" xml:"float"` - Double float64 `json:"double,omitempty" xml:"double"` - String string `json:"string,omitempty" xml:"string"` - Byte string `json:"byte" xml:"byte"` - Binary *os.File `json:"binary,omitempty" xml:"binary"` - Date string `json:"date" xml:"date"` + Integer int32 `json:"integer,omitempty" xml:"integer"` + Int32 int32 `json:"int32,omitempty" xml:"int32"` + Int64 int64 `json:"int64,omitempty" xml:"int64"` + Number float32 `json:"number" xml:"number"` + Float float32 `json:"float,omitempty" xml:"float"` + Double float64 `json:"double,omitempty" xml:"double"` + String string `json:"string,omitempty" xml:"string"` + Byte string `json:"byte" xml:"byte"` + Binary *os.File `json:"binary,omitempty" xml:"binary"` + Date string `json:"date" xml:"date"` DateTime time.Time `json:"dateTime,omitempty" xml:"dateTime"` - Uuid string `json:"uuid,omitempty" xml:"uuid"` - Password string `json:"password" xml:"password"` + Uuid string `json:"uuid,omitempty" xml:"uuid"` + Password string `json:"password" xml:"password"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_map_test_.go b/samples/client/petstore/go/go-petstore-withXml/model_map_test_.go index a15240d0d76..2985ade4731 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_map_test_.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_map_test_.go @@ -11,8 +11,8 @@ package petstore type MapTest struct { - MapMapOfString map[string]map[string]string `json:"map_map_of_string,omitempty" xml:"map_map_of_string"` - MapOfEnumString map[string]string `json:"map_of_enum_string,omitempty" xml:"map_of_enum_string"` - DirectMap map[string]bool `json:"direct_map,omitempty" xml:"direct_map"` - IndirectMap StringBooleanMap `json:"indirect_map,omitempty" xml:"indirect_map"` + MapMapOfString map[string]map[string]string `json:"map_map_of_string,omitempty" xml:"map_map_of_string"` + MapOfEnumString map[string]string `json:"map_of_enum_string,omitempty" xml:"map_of_enum_string"` + DirectMap map[string]bool `json:"direct_map,omitempty" xml:"direct_map"` + IndirectMap StringBooleanMap `json:"indirect_map,omitempty" xml:"indirect_map"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_mixed_properties_and_additional_properties_class.go b/samples/client/petstore/go/go-petstore-withXml/model_mixed_properties_and_additional_properties_class.go index 099ebd1c28a..8575adb7f4a 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_mixed_properties_and_additional_properties_class.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_mixed_properties_and_additional_properties_class.go @@ -9,12 +9,13 @@ // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. package petstore + import ( "time" ) type MixedPropertiesAndAdditionalPropertiesClass struct { - Uuid string `json:"uuid,omitempty" xml:"uuid"` - DateTime time.Time `json:"dateTime,omitempty" xml:"dateTime"` - Map map[string]Animal `json:"map,omitempty" xml:"map"` + Uuid string `json:"uuid,omitempty" xml:"uuid"` + DateTime time.Time `json:"dateTime,omitempty" xml:"dateTime"` + Map map[string]Animal `json:"map,omitempty" xml:"map"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_name.go b/samples/client/petstore/go/go-petstore-withXml/model_name.go index 684f282beb7..b042cac97aa 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_name.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_name.go @@ -12,8 +12,8 @@ package petstore // Model for testing model name same as property name type Name struct { - Name int32 `json:"name" xml:"name"` - SnakeCase int32 `json:"snake_case,omitempty" xml:"snake_case"` - Property string `json:"property,omitempty" xml:"property"` - Var123Number int32 `json:"123Number,omitempty" xml:"123Number"` + Name int32 `json:"name" xml:"name"` + SnakeCase int32 `json:"snake_case,omitempty" xml:"snake_case"` + Property string `json:"property,omitempty" xml:"property"` + Var123Number int32 `json:"123Number,omitempty" xml:"123Number"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_order.go b/samples/client/petstore/go/go-petstore-withXml/model_order.go index c4a731b72ca..762fe102257 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_order.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_order.go @@ -9,16 +9,17 @@ // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. package petstore + import ( "time" ) type Order struct { - Id int64 `json:"id,omitempty" xml:"id"` - PetId int64 `json:"petId,omitempty" xml:"petId"` - Quantity int32 `json:"quantity,omitempty" xml:"quantity"` + Id int64 `json:"id,omitempty" xml:"id"` + PetId int64 `json:"petId,omitempty" xml:"petId"` + Quantity int32 `json:"quantity,omitempty" xml:"quantity"` ShipDate time.Time `json:"shipDate,omitempty" xml:"shipDate"` // Order Status - Status string `json:"status,omitempty" xml:"status"` - Complete bool `json:"complete,omitempty" xml:"complete"` + Status string `json:"status,omitempty" xml:"status"` + Complete bool `json:"complete,omitempty" xml:"complete"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_outer_composite.go b/samples/client/petstore/go/go-petstore-withXml/model_outer_composite.go index 0a6cc434b97..69cc503584c 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_outer_composite.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_outer_composite.go @@ -11,7 +11,7 @@ package petstore type OuterComposite struct { - MyNumber float32 `json:"my_number,omitempty" xml:"my_number"` - MyString string `json:"my_string,omitempty" xml:"my_string"` - MyBoolean bool `json:"my_boolean,omitempty" xml:"my_boolean"` + MyNumber float32 `json:"my_number,omitempty" xml:"my_number"` + MyString string `json:"my_string,omitempty" xml:"my_string"` + MyBoolean bool `json:"my_boolean,omitempty" xml:"my_boolean"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_outer_enum.go b/samples/client/petstore/go/go-petstore-withXml/model_outer_enum.go index c6b28556bf2..05d6dbe7430 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_outer_enum.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_outer_enum.go @@ -9,11 +9,12 @@ // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. package petstore + type OuterEnum string // List of OuterEnum const ( - PLACED OuterEnum = "placed" - APPROVED OuterEnum = "approved" + PLACED OuterEnum = "placed" + APPROVED OuterEnum = "approved" DELIVERED OuterEnum = "delivered" -) \ No newline at end of file +) diff --git a/samples/client/petstore/go/go-petstore-withXml/model_pet.go b/samples/client/petstore/go/go-petstore-withXml/model_pet.go index eb0d4085f77..98af34e7d0b 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_pet.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_pet.go @@ -11,11 +11,11 @@ package petstore type Pet struct { - Id int64 `json:"id,omitempty" xml:"id"` - Category Category `json:"category,omitempty" xml:"category"` - Name string `json:"name" xml:"name"` + Id int64 `json:"id,omitempty" xml:"id"` + Category Category `json:"category,omitempty" xml:"category"` + Name string `json:"name" xml:"name"` PhotoUrls []string `json:"photoUrls" xml:"photoUrls"` - Tags []Tag `json:"tags,omitempty" xml:"tags"` + Tags []Tag `json:"tags,omitempty" xml:"tags"` // pet status in the store Status string `json:"status,omitempty" xml:"status"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_tag.go b/samples/client/petstore/go/go-petstore-withXml/model_tag.go index fb2232a6bf4..d850a48bb3c 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_tag.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_tag.go @@ -11,6 +11,6 @@ package petstore type Tag struct { - Id int64 `json:"id,omitempty" xml:"id"` + Id int64 `json:"id,omitempty" xml:"id"` Name string `json:"name,omitempty" xml:"name"` } diff --git a/samples/client/petstore/go/go-petstore-withXml/model_user.go b/samples/client/petstore/go/go-petstore-withXml/model_user.go index 27f1f67e427..d4fa07b4fc5 100644 --- a/samples/client/petstore/go/go-petstore-withXml/model_user.go +++ b/samples/client/petstore/go/go-petstore-withXml/model_user.go @@ -11,13 +11,13 @@ package petstore type User struct { - Id int64 `json:"id,omitempty" xml:"id"` - Username string `json:"username,omitempty" xml:"username"` + Id int64 `json:"id,omitempty" xml:"id"` + Username string `json:"username,omitempty" xml:"username"` FirstName string `json:"firstName,omitempty" xml:"firstName"` - LastName string `json:"lastName,omitempty" xml:"lastName"` - Email string `json:"email,omitempty" xml:"email"` - Password string `json:"password,omitempty" xml:"password"` - Phone string `json:"phone,omitempty" xml:"phone"` + LastName string `json:"lastName,omitempty" xml:"lastName"` + Email string `json:"email,omitempty" xml:"email"` + Password string `json:"password,omitempty" xml:"password"` + Phone string `json:"phone,omitempty" xml:"phone"` // User Status UserStatus int32 `json:"userStatus,omitempty" xml:"userStatus"` } diff --git a/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION b/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION +++ b/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/go/go-petstore/api_another_fake.go b/samples/client/petstore/go/go-petstore/api_another_fake.go index cf9b1f98673..a7a6f1f75c3 100644 --- a/samples/client/petstore/go/go-petstore/api_another_fake.go +++ b/samples/client/petstore/go/go-petstore/api_another_fake.go @@ -33,12 +33,12 @@ To test special tags and operation ID starting with number */ func (a *AnotherFakeApiService) Call123TestSpecialTags(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -85,7 +85,7 @@ func (a *AnotherFakeApiService) Call123TestSpecialTags(ctx context.Context, clie if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -93,18 +93,18 @@ func (a *AnotherFakeApiService) Call123TestSpecialTags(ctx context.Context, clie if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore/api_fake.go b/samples/client/petstore/go/go-petstore/api_fake.go index 237877e063d..0d70b48b5bd 100644 --- a/samples/client/petstore/go/go-petstore/api_fake.go +++ b/samples/client/petstore/go/go-petstore/api_fake.go @@ -11,12 +11,12 @@ package petstore import ( "context" + "github.com/antihax/optional" "io/ioutil" "net/http" "net/url" - "strings" - "github.com/antihax/optional" "os" + "strings" ) // Linger please @@ -36,17 +36,17 @@ Test serialization of outer boolean types */ type FakeOuterBooleanSerializeOpts struct { - Body optional.Bool + Body optional.Bool } func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVarOptionals *FakeOuterBooleanSerializeOpts) (bool, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue bool + localVarReturnValue bool ) // create path and map variables @@ -96,7 +96,7 @@ func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVar if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -104,18 +104,18 @@ func (a *FakeApiService) FakeOuterBooleanSerialize(ctx context.Context, localVar if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v bool - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -133,17 +133,17 @@ Test serialization of object with outer number type */ type FakeOuterCompositeSerializeOpts struct { - OuterComposite optional.Interface + OuterComposite optional.Interface } func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localVarOptionals *FakeOuterCompositeSerializeOpts) (OuterComposite, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue OuterComposite + localVarReturnValue OuterComposite ) // create path and map variables @@ -197,7 +197,7 @@ func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localV if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -205,18 +205,18 @@ func (a *FakeApiService) FakeOuterCompositeSerialize(ctx context.Context, localV if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v OuterComposite - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -234,17 +234,17 @@ Test serialization of outer number types */ type FakeOuterNumberSerializeOpts struct { - Body optional.Float32 + Body optional.Float32 } func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarOptionals *FakeOuterNumberSerializeOpts) (float32, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue float32 + localVarReturnValue float32 ) // create path and map variables @@ -294,7 +294,7 @@ func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -302,18 +302,18 @@ func (a *FakeApiService) FakeOuterNumberSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v float32 - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -331,17 +331,17 @@ Test serialization of outer string types */ type FakeOuterStringSerializeOpts struct { - Body optional.String + Body optional.String } func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarOptionals *FakeOuterStringSerializeOpts) (string, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue string + localVarReturnValue string ) // create path and map variables @@ -391,7 +391,7 @@ func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -399,18 +399,18 @@ func (a *FakeApiService) FakeOuterStringSerialize(ctx context.Context, localVarO if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v string - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -426,7 +426,7 @@ For this test, the body for this request much reference a schema named `Fil */ func (a *FakeApiService) TestBodyWithFileSchema(ctx context.Context, fileSchemaTestClass FileSchemaTestClass) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -477,7 +477,7 @@ func (a *FakeApiService) TestBodyWithFileSchema(ctx context.Context, fileSchemaT if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -494,7 +494,7 @@ FakeApiService */ func (a *FakeApiService) TestBodyWithQueryParams(ctx context.Context, query string, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -546,7 +546,7 @@ func (a *FakeApiService) TestBodyWithQueryParams(ctx context.Context, query stri if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -564,12 +564,12 @@ To test \"client\" model */ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -616,7 +616,7 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -624,18 +624,18 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -644,8 +644,8 @@ func (a *FakeApiService) TestClientModel(ctx context.Context, client Client) (Cl } /* -FakeApiService Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 -Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +FakeApiService Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). * @param number None * @param double None @@ -665,21 +665,21 @@ Fake endpoint for testing various parameters 假端點 偽のエンドポイン */ type TestEndpointParametersOpts struct { - Integer optional.Int32 - Int32_ optional.Int32 - Int64_ optional.Int64 - Float optional.Float32 - String_ optional.String - Binary optional.Interface - Date optional.String - DateTime optional.Time - Password optional.String - Callback optional.String + Integer optional.Int32 + Int32_ optional.Int32 + Int64_ optional.Int64 + Float optional.Float32 + String_ optional.String + Binary optional.Interface + Date optional.String + DateTime optional.Time + Password optional.String + Callback optional.String } func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number float32, double float64, patternWithoutDelimiter string, byte_ string, localVarOptionals *TestEndpointParametersOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -747,7 +747,7 @@ func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number floa localVarFileOk := false localVarFile, localVarFileOk = localVarOptionals.Binary.Value().(*os.File) if !localVarFileOk { - return nil, reportError("binary should be *os.File") + return nil, reportError("binary should be *os.File") } } if localVarFile != nil { @@ -786,7 +786,7 @@ func (a *FakeApiService) TestEndpointParameters(ctx context.Context, number floa if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -811,19 +811,19 @@ To test enum parameters */ type TestEnumParametersOpts struct { - EnumHeaderStringArray optional.Interface - EnumHeaderString optional.String - EnumQueryStringArray optional.Interface - EnumQueryString optional.String - EnumQueryInteger optional.Int32 - EnumQueryDouble optional.Float64 - EnumFormStringArray optional.Interface - EnumFormString optional.String + EnumHeaderStringArray optional.Interface + EnumHeaderString optional.String + EnumQueryStringArray optional.Interface + EnumQueryString optional.String + EnumQueryInteger optional.Int32 + EnumQueryDouble optional.Float64 + EnumFormStringArray optional.Interface + EnumFormString optional.String } func (a *FakeApiService) TestEnumParameters(ctx context.Context, localVarOptionals *TestEnumParametersOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -896,7 +896,7 @@ func (a *FakeApiService) TestEnumParameters(ctx context.Context, localVarOptiona if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -912,7 +912,7 @@ FakeApiService test inline additionalProperties */ func (a *FakeApiService) TestInlineAdditionalProperties(ctx context.Context, requestBody map[string]string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -963,7 +963,7 @@ func (a *FakeApiService) TestInlineAdditionalProperties(ctx context.Context, req if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -980,7 +980,7 @@ FakeApiService test json serialization of form data */ func (a *FakeApiService) TestJsonFormData(ctx context.Context, param string, param2 string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -1031,7 +1031,7 @@ func (a *FakeApiService) TestJsonFormData(ctx context.Context, param string, par if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr diff --git a/samples/client/petstore/go/go-petstore/api_fake_classname_tags123.go b/samples/client/petstore/go/go-petstore/api_fake_classname_tags123.go index b194fc53f9c..1b55b578de8 100644 --- a/samples/client/petstore/go/go-petstore/api_fake_classname_tags123.go +++ b/samples/client/petstore/go/go-petstore/api_fake_classname_tags123.go @@ -33,12 +33,12 @@ To test class name in snake case */ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, client Client) (Client, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Patch") + localVarHttpMethod = strings.ToUpper("Patch") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Client + localVarReturnValue Client ) // create path and map variables @@ -98,7 +98,7 @@ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, clie if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -106,18 +106,18 @@ func (a *FakeClassnameTags123ApiService) TestClassname(ctx context.Context, clie if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Client - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore/api_pet.go b/samples/client/petstore/go/go-petstore/api_pet.go index 49f60d43de4..b371ddde18a 100644 --- a/samples/client/petstore/go/go-petstore/api_pet.go +++ b/samples/client/petstore/go/go-petstore/api_pet.go @@ -11,13 +11,13 @@ package petstore import ( "context" + "fmt" + "github.com/antihax/optional" "io/ioutil" "net/http" "net/url" - "strings" - "fmt" - "github.com/antihax/optional" "os" + "strings" ) // Linger please @@ -34,7 +34,7 @@ PetApiService Add a new pet to the store */ func (a *PetApiService) AddPet(ctx context.Context, pet Pet) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -85,7 +85,7 @@ func (a *PetApiService) AddPet(ctx context.Context, pet Pet) (*http.Response, er if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -99,16 +99,16 @@ PetApiService Deletes a pet * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). * @param petId Pet id to delete * @param optional nil or *DeletePetOpts - Optional Parameters: - * @param "ApiKey" (optional.String) - + * @param "ApiKey" (optional.String) - */ type DeletePetOpts struct { - ApiKey optional.String + ApiKey optional.String } func (a *PetApiService) DeletePet(ctx context.Context, petId int64, localVarOptionals *DeletePetOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -161,7 +161,7 @@ func (a *PetApiService) DeletePet(ctx context.Context, petId int64, localVarOpti if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -179,12 +179,12 @@ Multiple status values can be provided with comma separated strings */ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ([]Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue []Pet + localVarReturnValue []Pet ) // create path and map variables @@ -230,7 +230,7 @@ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ( if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -238,18 +238,18 @@ func (a *PetApiService) FindPetsByStatus(ctx context.Context, status []string) ( if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v []Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -266,12 +266,12 @@ Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 */ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue []Pet + localVarReturnValue []Pet ) // create path and map variables @@ -317,7 +317,7 @@ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pe if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -325,18 +325,18 @@ func (a *PetApiService) FindPetsByTags(ctx context.Context, tags []string) ([]Pe if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v []Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -353,12 +353,12 @@ Returns a single pet */ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Pet + localVarReturnValue Pet ) // create path and map variables @@ -417,7 +417,7 @@ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -425,18 +425,18 @@ func (a *PetApiService) GetPetById(ctx context.Context, petId int64) (Pet, *http if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Pet - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -451,7 +451,7 @@ PetApiService Update an existing pet */ func (a *PetApiService) UpdatePet(ctx context.Context, pet Pet) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -502,7 +502,7 @@ func (a *PetApiService) UpdatePet(ctx context.Context, pet Pet) (*http.Response, if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -521,13 +521,13 @@ PetApiService Updates a pet in the store with form data */ type UpdatePetWithFormOpts struct { - Name optional.String - Status optional.String + Name optional.String + Status optional.String } func (a *PetApiService) UpdatePetWithForm(ctx context.Context, petId int64, localVarOptionals *UpdatePetWithFormOpts) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -583,7 +583,7 @@ func (a *PetApiService) UpdatePetWithForm(ctx context.Context, petId int64, loca if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -603,18 +603,18 @@ PetApiService uploads an image */ type UploadFileOpts struct { - AdditionalMetadata optional.String - File optional.Interface + AdditionalMetadata optional.String + File optional.Interface } func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOptionals *UploadFileOpts) (ApiResponse, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue ApiResponse + localVarReturnValue ApiResponse ) // create path and map variables @@ -651,7 +651,7 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt localVarFileOk := false localVarFile, localVarFileOk = localVarOptionals.File.Value().(*os.File) if !localVarFileOk { - return localVarReturnValue, nil, reportError("file should be *os.File") + return localVarReturnValue, nil, reportError("file should be *os.File") } } if localVarFile != nil { @@ -678,7 +678,7 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -686,18 +686,18 @@ func (a *PetApiService) UploadFile(ctx context.Context, petId int64, localVarOpt if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v ApiResponse - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -716,17 +716,17 @@ PetApiService uploads an image (required) */ type UploadFileWithRequiredFileOpts struct { - AdditionalMetadata optional.String + AdditionalMetadata optional.String } func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId int64, requiredFile *os.File, localVarOptionals *UploadFileWithRequiredFileOpts) (ApiResponse, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue ApiResponse + localVarReturnValue ApiResponse ) // create path and map variables @@ -783,7 +783,7 @@ func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId in if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -791,18 +791,18 @@ func (a *PetApiService) UploadFileWithRequiredFile(ctx context.Context, petId in if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v ApiResponse - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore/api_store.go b/samples/client/petstore/go/go-petstore/api_store.go index d03e97a27d5..aec376817ac 100644 --- a/samples/client/petstore/go/go-petstore/api_store.go +++ b/samples/client/petstore/go/go-petstore/api_store.go @@ -11,11 +11,11 @@ package petstore import ( "context" + "fmt" "io/ioutil" "net/http" "net/url" "strings" - "fmt" ) // Linger please @@ -33,7 +33,7 @@ For valid response try integer IDs with value < 1000. Anything above 1000 or */ func (a *StoreApiService) DeleteOrder(ctx context.Context, orderId string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -83,7 +83,7 @@ func (a *StoreApiService) DeleteOrder(ctx context.Context, orderId string) (*htt if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -100,12 +100,12 @@ Returns a map of status codes to quantities */ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue map[string]int32 + localVarReturnValue map[string]int32 ) // create path and map variables @@ -163,7 +163,7 @@ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, * if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -171,18 +171,18 @@ func (a *StoreApiService) GetInventory(ctx context.Context) (map[string]int32, * if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v map[string]int32 - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -199,12 +199,12 @@ For valid response try integer IDs with value <= 5 or > 10. Other val */ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Order, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Order + localVarReturnValue Order ) // create path and map variables @@ -256,7 +256,7 @@ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Orde if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -264,18 +264,18 @@ func (a *StoreApiService) GetOrderById(ctx context.Context, orderId int64) (Orde if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Order - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -291,12 +291,12 @@ StoreApiService Place an order for a pet */ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue Order + localVarReturnValue Order ) // create path and map variables @@ -343,7 +343,7 @@ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, * if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -351,18 +351,18 @@ func (a *StoreApiService) PlaceOrder(ctx context.Context, order Order) (Order, * if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v Order - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } diff --git a/samples/client/petstore/go/go-petstore/api_user.go b/samples/client/petstore/go/go-petstore/api_user.go index e8fbe7bef04..cb7115ff81a 100644 --- a/samples/client/petstore/go/go-petstore/api_user.go +++ b/samples/client/petstore/go/go-petstore/api_user.go @@ -11,11 +11,11 @@ package petstore import ( "context" + "fmt" "io/ioutil" "net/http" "net/url" "strings" - "fmt" ) // Linger please @@ -33,7 +33,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) CreateUser(ctx context.Context, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -84,7 +84,7 @@ func (a *UserApiService) CreateUser(ctx context.Context, user User) (*http.Respo if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -100,7 +100,7 @@ UserApiService Creates list of users with given input array */ func (a *UserApiService) CreateUsersWithArrayInput(ctx context.Context, user []User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -151,7 +151,7 @@ func (a *UserApiService) CreateUsersWithArrayInput(ctx context.Context, user []U if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -167,7 +167,7 @@ UserApiService Creates list of users with given input array */ func (a *UserApiService) CreateUsersWithListInput(ctx context.Context, user []User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Post") + localVarHttpMethod = strings.ToUpper("Post") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -218,7 +218,7 @@ func (a *UserApiService) CreateUsersWithListInput(ctx context.Context, user []Us if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -235,7 +235,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) DeleteUser(ctx context.Context, username string) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Delete") + localVarHttpMethod = strings.ToUpper("Delete") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -285,7 +285,7 @@ func (a *UserApiService) DeleteUser(ctx context.Context, username string) (*http if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -302,12 +302,12 @@ UserApiService Get user by user name */ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (User, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue User + localVarReturnValue User ) // create path and map variables @@ -353,7 +353,7 @@ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (Us if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -361,18 +361,18 @@ func (a *UserApiService) GetUserByName(ctx context.Context, username string) (Us if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v User - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -389,12 +389,12 @@ UserApiService Logs user into the system */ func (a *UserApiService) LoginUser(ctx context.Context, username string, password string) (string, *http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string localVarFileBytes []byte - localVarReturnValue string + localVarReturnValue string ) // create path and map variables @@ -441,7 +441,7 @@ func (a *UserApiService) LoginUser(ctx context.Context, username string, passwor if localVarHttpResponse.StatusCode < 300 { // If we succeed, return the data, otherwise pass on to decode error. - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) if err == nil { return localVarReturnValue, localVarHttpResponse, err } @@ -449,18 +449,18 @@ func (a *UserApiService) LoginUser(ctx context.Context, username string, passwor if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } if localVarHttpResponse.StatusCode == 200 { var v string - err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")); - if err != nil { - newErr.error = err.Error() - return localVarReturnValue, localVarHttpResponse, newErr - } - newErr.model = v + err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type")) + if err != nil { + newErr.error = err.Error() return localVarReturnValue, localVarHttpResponse, newErr + } + newErr.model = v + return localVarReturnValue, localVarHttpResponse, newErr } return localVarReturnValue, localVarHttpResponse, newErr } @@ -474,7 +474,7 @@ UserApiService Logs out current logged in user session */ func (a *UserApiService) LogoutUser(ctx context.Context) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Get") + localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -523,7 +523,7 @@ func (a *UserApiService) LogoutUser(ctx context.Context) (*http.Response, error) if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr @@ -541,7 +541,7 @@ This can only be done by the logged in user. */ func (a *UserApiService) UpdateUser(ctx context.Context, username string, user User) (*http.Response, error) { var ( - localVarHttpMethod = strings.ToUpper("Put") + localVarHttpMethod = strings.ToUpper("Put") localVarPostBody interface{} localVarFormFileName string localVarFileName string @@ -593,7 +593,7 @@ func (a *UserApiService) UpdateUser(ctx context.Context, username string, user U if localVarHttpResponse.StatusCode >= 300 { newErr := GenericOpenAPIError{ - body: localVarBody, + body: localVarBody, error: localVarHttpResponse.Status, } return localVarHttpResponse, newErr diff --git a/samples/client/petstore/go/go-petstore/client.go b/samples/client/petstore/go/go-petstore/client.go index a51675e447d..c7e168b3f11 100644 --- a/samples/client/petstore/go/go-petstore/client.go +++ b/samples/client/petstore/go/go-petstore/client.go @@ -318,17 +318,17 @@ func (c *APIClient) prepareRequest( } func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) { - if strings.Contains(contentType, "application/xml") { - if err = xml.Unmarshal(b, v); err != nil { - return err - } - return nil - } else if strings.Contains(contentType, "application/json") { - if err = json.Unmarshal(b, v); err != nil { - return err - } - return nil + if strings.Contains(contentType, "application/xml") { + if err = xml.Unmarshal(b, v); err != nil { + return err } + return nil + } else if strings.Contains(contentType, "application/json") { + if err = json.Unmarshal(b, v); err != nil { + return err + } + return nil + } return errors.New("undefined response type") } @@ -480,4 +480,4 @@ func (e GenericOpenAPIError) Body() []byte { // Model returns the unpacked model of the error func (e GenericOpenAPIError) Model() interface{} { return e.model -} \ No newline at end of file +} diff --git a/samples/client/petstore/go/go-petstore/model_200_response.go b/samples/client/petstore/go/go-petstore/model_200_response.go index f918cabaaae..33a3b87bb11 100644 --- a/samples/client/petstore/go/go-petstore/model_200_response.go +++ b/samples/client/petstore/go/go-petstore/model_200_response.go @@ -11,6 +11,6 @@ package petstore // Model for testing model name starting with number type Model200Response struct { - Name int32 `json:"name,omitempty"` + Name int32 `json:"name,omitempty"` Class string `json:"class,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_additional_properties_class.go b/samples/client/petstore/go/go-petstore/model_additional_properties_class.go index 1d06dde3d04..ed93d44f1a3 100644 --- a/samples/client/petstore/go/go-petstore/model_additional_properties_class.go +++ b/samples/client/petstore/go/go-petstore/model_additional_properties_class.go @@ -10,6 +10,6 @@ package petstore type AdditionalPropertiesClass struct { - MapProperty map[string]string `json:"map_property,omitempty"` + MapProperty map[string]string `json:"map_property,omitempty"` MapOfMapProperty map[string]map[string]string `json:"map_of_map_property,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_animal.go b/samples/client/petstore/go/go-petstore/model_animal.go index 39d0d2d1ec3..e0eee1befe0 100644 --- a/samples/client/petstore/go/go-petstore/model_animal.go +++ b/samples/client/petstore/go/go-petstore/model_animal.go @@ -11,5 +11,5 @@ package petstore type Animal struct { ClassName string `json:"className"` - Color string `json:"color,omitempty"` + Color string `json:"color,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_api_response.go b/samples/client/petstore/go/go-petstore/model_api_response.go index 12732fa32c6..f58619cf62b 100644 --- a/samples/client/petstore/go/go-petstore/model_api_response.go +++ b/samples/client/petstore/go/go-petstore/model_api_response.go @@ -10,7 +10,7 @@ package petstore type ApiResponse struct { - Code int32 `json:"code,omitempty"` - Type string `json:"type,omitempty"` + Code int32 `json:"code,omitempty"` + Type string `json:"type,omitempty"` Message string `json:"message,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_array_test_.go b/samples/client/petstore/go/go-petstore/model_array_test_.go index f8819800934..02381e8f911 100644 --- a/samples/client/petstore/go/go-petstore/model_array_test_.go +++ b/samples/client/petstore/go/go-petstore/model_array_test_.go @@ -10,7 +10,7 @@ package petstore type ArrayTest struct { - ArrayOfString []string `json:"array_of_string,omitempty"` - ArrayArrayOfInteger [][]int64 `json:"array_array_of_integer,omitempty"` - ArrayArrayOfModel [][]ReadOnlyFirst `json:"array_array_of_model,omitempty"` + ArrayOfString []string `json:"array_of_string,omitempty"` + ArrayArrayOfInteger [][]int64 `json:"array_array_of_integer,omitempty"` + ArrayArrayOfModel [][]ReadOnlyFirst `json:"array_array_of_model,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_capitalization.go b/samples/client/petstore/go/go-petstore/model_capitalization.go index 8284ba9c765..25b313e7f30 100644 --- a/samples/client/petstore/go/go-petstore/model_capitalization.go +++ b/samples/client/petstore/go/go-petstore/model_capitalization.go @@ -10,11 +10,11 @@ package petstore type Capitalization struct { - SmallCamel string `json:"smallCamel,omitempty"` - CapitalCamel string `json:"CapitalCamel,omitempty"` - SmallSnake string `json:"small_Snake,omitempty"` - CapitalSnake string `json:"Capital_Snake,omitempty"` + SmallCamel string `json:"smallCamel,omitempty"` + CapitalCamel string `json:"CapitalCamel,omitempty"` + SmallSnake string `json:"small_Snake,omitempty"` + CapitalSnake string `json:"Capital_Snake,omitempty"` SCAETHFlowPoints string `json:"SCA_ETH_Flow_Points,omitempty"` - // Name of the pet + // Name of the pet ATT_NAME string `json:"ATT_NAME,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_cat.go b/samples/client/petstore/go/go-petstore/model_cat.go index 58b3deeb938..aa9d3d47e65 100644 --- a/samples/client/petstore/go/go-petstore/model_cat.go +++ b/samples/client/petstore/go/go-petstore/model_cat.go @@ -11,6 +11,6 @@ package petstore type Cat struct { ClassName string `json:"className"` - Color string `json:"color,omitempty"` - Declawed bool `json:"declawed,omitempty"` + Color string `json:"color,omitempty"` + Declawed bool `json:"declawed,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_category.go b/samples/client/petstore/go/go-petstore/model_category.go index e0e9479465e..5adb0714a4e 100644 --- a/samples/client/petstore/go/go-petstore/model_category.go +++ b/samples/client/petstore/go/go-petstore/model_category.go @@ -10,6 +10,6 @@ package petstore type Category struct { - Id int64 `json:"id,omitempty"` + Id int64 `json:"id,omitempty"` Name string `json:"name,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_dog.go b/samples/client/petstore/go/go-petstore/model_dog.go index 3f791ca1947..22466bd3b07 100644 --- a/samples/client/petstore/go/go-petstore/model_dog.go +++ b/samples/client/petstore/go/go-petstore/model_dog.go @@ -11,6 +11,6 @@ package petstore type Dog struct { ClassName string `json:"className"` - Color string `json:"color,omitempty"` - Breed string `json:"breed,omitempty"` + Color string `json:"color,omitempty"` + Breed string `json:"breed,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_enum_arrays.go b/samples/client/petstore/go/go-petstore/model_enum_arrays.go index ab4dce92ebb..2c138a6014e 100644 --- a/samples/client/petstore/go/go-petstore/model_enum_arrays.go +++ b/samples/client/petstore/go/go-petstore/model_enum_arrays.go @@ -10,6 +10,6 @@ package petstore type EnumArrays struct { - JustSymbol string `json:"just_symbol,omitempty"` - ArrayEnum []string `json:"array_enum,omitempty"` + JustSymbol string `json:"just_symbol,omitempty"` + ArrayEnum []string `json:"array_enum,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_enum_class.go b/samples/client/petstore/go/go-petstore/model_enum_class.go index 534ce432881..0e4612e430f 100644 --- a/samples/client/petstore/go/go-petstore/model_enum_class.go +++ b/samples/client/petstore/go/go-petstore/model_enum_class.go @@ -8,6 +8,7 @@ */ package petstore + type EnumClass string // List of EnumClass @@ -15,4 +16,4 @@ const ( ABC EnumClass = "_abc" EFG EnumClass = "-efg" XYZ EnumClass = "(xyz)" -) \ No newline at end of file +) diff --git a/samples/client/petstore/go/go-petstore/model_enum_test_.go b/samples/client/petstore/go/go-petstore/model_enum_test_.go index f85f31501a0..d5d8061f44b 100644 --- a/samples/client/petstore/go/go-petstore/model_enum_test_.go +++ b/samples/client/petstore/go/go-petstore/model_enum_test_.go @@ -10,9 +10,9 @@ package petstore type EnumTest struct { - EnumString string `json:"enum_string,omitempty"` - EnumStringRequired string `json:"enum_string_required"` - EnumInteger int32 `json:"enum_integer,omitempty"` - EnumNumber float64 `json:"enum_number,omitempty"` - OuterEnum OuterEnum `json:"outerEnum,omitempty"` + EnumString string `json:"enum_string,omitempty"` + EnumStringRequired string `json:"enum_string_required"` + EnumInteger int32 `json:"enum_integer,omitempty"` + EnumNumber float64 `json:"enum_number,omitempty"` + OuterEnum OuterEnum `json:"outerEnum,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_file_schema_test_class.go b/samples/client/petstore/go/go-petstore/model_file_schema_test_class.go index 487f766c649..11fd46b364e 100644 --- a/samples/client/petstore/go/go-petstore/model_file_schema_test_class.go +++ b/samples/client/petstore/go/go-petstore/model_file_schema_test_class.go @@ -10,6 +10,6 @@ package petstore type FileSchemaTestClass struct { - File File `json:"file,omitempty"` + File File `json:"file,omitempty"` Files []File `json:"files,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_format_test_.go b/samples/client/petstore/go/go-petstore/model_format_test_.go index d723bdfee39..fb348fa3fad 100644 --- a/samples/client/petstore/go/go-petstore/model_format_test_.go +++ b/samples/client/petstore/go/go-petstore/model_format_test_.go @@ -8,23 +8,24 @@ */ package petstore + import ( "os" "time" ) type FormatTest struct { - Integer int32 `json:"integer,omitempty"` - Int32 int32 `json:"int32,omitempty"` - Int64 int64 `json:"int64,omitempty"` - Number float32 `json:"number"` - Float float32 `json:"float,omitempty"` - Double float64 `json:"double,omitempty"` - String string `json:"string,omitempty"` - Byte string `json:"byte"` - Binary *os.File `json:"binary,omitempty"` - Date string `json:"date"` + Integer int32 `json:"integer,omitempty"` + Int32 int32 `json:"int32,omitempty"` + Int64 int64 `json:"int64,omitempty"` + Number float32 `json:"number"` + Float float32 `json:"float,omitempty"` + Double float64 `json:"double,omitempty"` + String string `json:"string,omitempty"` + Byte string `json:"byte"` + Binary *os.File `json:"binary,omitempty"` + Date string `json:"date"` DateTime time.Time `json:"dateTime,omitempty"` - Uuid string `json:"uuid,omitempty"` - Password string `json:"password"` + Uuid string `json:"uuid,omitempty"` + Password string `json:"password"` } diff --git a/samples/client/petstore/go/go-petstore/model_map_test_.go b/samples/client/petstore/go/go-petstore/model_map_test_.go index d0c3a6a19ff..b5b43c81bf2 100644 --- a/samples/client/petstore/go/go-petstore/model_map_test_.go +++ b/samples/client/petstore/go/go-petstore/model_map_test_.go @@ -10,8 +10,8 @@ package petstore type MapTest struct { - MapMapOfString map[string]map[string]string `json:"map_map_of_string,omitempty"` - MapOfEnumString map[string]string `json:"map_of_enum_string,omitempty"` - DirectMap map[string]bool `json:"direct_map,omitempty"` - IndirectMap StringBooleanMap `json:"indirect_map,omitempty"` + MapMapOfString map[string]map[string]string `json:"map_map_of_string,omitempty"` + MapOfEnumString map[string]string `json:"map_of_enum_string,omitempty"` + DirectMap map[string]bool `json:"direct_map,omitempty"` + IndirectMap StringBooleanMap `json:"indirect_map,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_mixed_properties_and_additional_properties_class.go b/samples/client/petstore/go/go-petstore/model_mixed_properties_and_additional_properties_class.go index 0ad92e96f8e..38e4143f653 100644 --- a/samples/client/petstore/go/go-petstore/model_mixed_properties_and_additional_properties_class.go +++ b/samples/client/petstore/go/go-petstore/model_mixed_properties_and_additional_properties_class.go @@ -8,12 +8,13 @@ */ package petstore + import ( "time" ) type MixedPropertiesAndAdditionalPropertiesClass struct { - Uuid string `json:"uuid,omitempty"` - DateTime time.Time `json:"dateTime,omitempty"` - Map map[string]Animal `json:"map,omitempty"` + Uuid string `json:"uuid,omitempty"` + DateTime time.Time `json:"dateTime,omitempty"` + Map map[string]Animal `json:"map,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_name.go b/samples/client/petstore/go/go-petstore/model_name.go index dde1b92eb6a..86590a3c181 100644 --- a/samples/client/petstore/go/go-petstore/model_name.go +++ b/samples/client/petstore/go/go-petstore/model_name.go @@ -11,8 +11,8 @@ package petstore // Model for testing model name same as property name type Name struct { - Name int32 `json:"name"` - SnakeCase int32 `json:"snake_case,omitempty"` - Property string `json:"property,omitempty"` - Var123Number int32 `json:"123Number,omitempty"` + Name int32 `json:"name"` + SnakeCase int32 `json:"snake_case,omitempty"` + Property string `json:"property,omitempty"` + Var123Number int32 `json:"123Number,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_order.go b/samples/client/petstore/go/go-petstore/model_order.go index c81d67ae0fa..3e884ceea65 100644 --- a/samples/client/petstore/go/go-petstore/model_order.go +++ b/samples/client/petstore/go/go-petstore/model_order.go @@ -8,16 +8,17 @@ */ package petstore + import ( "time" ) type Order struct { - Id int64 `json:"id,omitempty"` - PetId int64 `json:"petId,omitempty"` - Quantity int32 `json:"quantity,omitempty"` + Id int64 `json:"id,omitempty"` + PetId int64 `json:"petId,omitempty"` + Quantity int32 `json:"quantity,omitempty"` ShipDate time.Time `json:"shipDate,omitempty"` // Order Status - Status string `json:"status,omitempty"` - Complete bool `json:"complete,omitempty"` + Status string `json:"status,omitempty"` + Complete bool `json:"complete,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_outer_composite.go b/samples/client/petstore/go/go-petstore/model_outer_composite.go index 0ebb526267e..8e8e5bc5e20 100644 --- a/samples/client/petstore/go/go-petstore/model_outer_composite.go +++ b/samples/client/petstore/go/go-petstore/model_outer_composite.go @@ -10,7 +10,7 @@ package petstore type OuterComposite struct { - MyNumber float32 `json:"my_number,omitempty"` - MyString string `json:"my_string,omitempty"` - MyBoolean bool `json:"my_boolean,omitempty"` + MyNumber float32 `json:"my_number,omitempty"` + MyString string `json:"my_string,omitempty"` + MyBoolean bool `json:"my_boolean,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_outer_enum.go b/samples/client/petstore/go/go-petstore/model_outer_enum.go index 903d31e8269..ab6136a8f3f 100644 --- a/samples/client/petstore/go/go-petstore/model_outer_enum.go +++ b/samples/client/petstore/go/go-petstore/model_outer_enum.go @@ -8,11 +8,12 @@ */ package petstore + type OuterEnum string // List of OuterEnum const ( - PLACED OuterEnum = "placed" - APPROVED OuterEnum = "approved" + PLACED OuterEnum = "placed" + APPROVED OuterEnum = "approved" DELIVERED OuterEnum = "delivered" -) \ No newline at end of file +) diff --git a/samples/client/petstore/go/go-petstore/model_pet.go b/samples/client/petstore/go/go-petstore/model_pet.go index 4930dbb92e8..c94259ec0b4 100644 --- a/samples/client/petstore/go/go-petstore/model_pet.go +++ b/samples/client/petstore/go/go-petstore/model_pet.go @@ -10,11 +10,11 @@ package petstore type Pet struct { - Id int64 `json:"id,omitempty"` - Category Category `json:"category,omitempty"` - Name string `json:"name"` + Id int64 `json:"id,omitempty"` + Category Category `json:"category,omitempty"` + Name string `json:"name"` PhotoUrls []string `json:"photoUrls"` - Tags []Tag `json:"tags,omitempty"` + Tags []Tag `json:"tags,omitempty"` // pet status in the store Status string `json:"status,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_tag.go b/samples/client/petstore/go/go-petstore/model_tag.go index 37a2b63d445..022ac82645f 100644 --- a/samples/client/petstore/go/go-petstore/model_tag.go +++ b/samples/client/petstore/go/go-petstore/model_tag.go @@ -10,6 +10,6 @@ package petstore type Tag struct { - Id int64 `json:"id,omitempty"` + Id int64 `json:"id,omitempty"` Name string `json:"name,omitempty"` } diff --git a/samples/client/petstore/go/go-petstore/model_user.go b/samples/client/petstore/go/go-petstore/model_user.go index caff75ebc2c..6e203d3491b 100644 --- a/samples/client/petstore/go/go-petstore/model_user.go +++ b/samples/client/petstore/go/go-petstore/model_user.go @@ -10,13 +10,13 @@ package petstore type User struct { - Id int64 `json:"id,omitempty"` - Username string `json:"username,omitempty"` + Id int64 `json:"id,omitempty"` + Username string `json:"username,omitempty"` FirstName string `json:"firstName,omitempty"` - LastName string `json:"lastName,omitempty"` - Email string `json:"email,omitempty"` - Password string `json:"password,omitempty"` - Phone string `json:"phone,omitempty"` + LastName string `json:"lastName,omitempty"` + Email string `json:"email,omitempty"` + Password string `json:"password,omitempty"` + Phone string `json:"phone,omitempty"` // User Status UserStatus int32 `json:"userStatus,omitempty"` } diff --git a/samples/server/petstore/go-api-server/.openapi-generator/VERSION b/samples/server/petstore/go-api-server/.openapi-generator/VERSION index 82602aa4190..c791c986fbb 100644 --- a/samples/server/petstore/go-api-server/.openapi-generator/VERSION +++ b/samples/server/petstore/go-api-server/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.3-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/go-api-server/go/model_api_response.go b/samples/server/petstore/go-api-server/go/model_api_response.go index 2379e169080..d2cbaed56b4 100644 --- a/samples/server/petstore/go-api-server/go/model_api_response.go +++ b/samples/server/petstore/go-api-server/go/model_api_response.go @@ -11,7 +11,6 @@ package petstoreserver // ApiResponse - Describes the result of uploading an image resource type ApiResponse struct { - Code int32 `json:"code,omitempty"` Type string `json:"type,omitempty"` diff --git a/samples/server/petstore/go-api-server/go/model_category.go b/samples/server/petstore/go-api-server/go/model_category.go index 5e6f9d247fa..4f7ca371b42 100644 --- a/samples/server/petstore/go-api-server/go/model_category.go +++ b/samples/server/petstore/go-api-server/go/model_category.go @@ -11,7 +11,6 @@ package petstoreserver // Category - A category for a pet type Category struct { - Id int64 `json:"id,omitempty"` Name string `json:"name,omitempty"` diff --git a/samples/server/petstore/go-api-server/go/model_order.go b/samples/server/petstore/go-api-server/go/model_order.go index a9d8dbb7957..45c20b64543 100644 --- a/samples/server/petstore/go-api-server/go/model_order.go +++ b/samples/server/petstore/go-api-server/go/model_order.go @@ -15,7 +15,6 @@ import ( // Order - An order for a pets from the pet store type Order struct { - Id int64 `json:"id,omitempty"` PetId int64 `json:"petId,omitempty"` diff --git a/samples/server/petstore/go-api-server/go/model_pet.go b/samples/server/petstore/go-api-server/go/model_pet.go index ff09e500be5..a085e97ab58 100644 --- a/samples/server/petstore/go-api-server/go/model_pet.go +++ b/samples/server/petstore/go-api-server/go/model_pet.go @@ -11,7 +11,6 @@ package petstoreserver // Pet - A pet for sale in the pet store type Pet struct { - Id int64 `json:"id,omitempty"` Category *Category `json:"category,omitempty"` diff --git a/samples/server/petstore/go-api-server/go/model_tag.go b/samples/server/petstore/go-api-server/go/model_tag.go index 2fb07fb32c4..1fd6437e34b 100644 --- a/samples/server/petstore/go-api-server/go/model_tag.go +++ b/samples/server/petstore/go-api-server/go/model_tag.go @@ -11,7 +11,6 @@ package petstoreserver // Tag - A tag for a pet type Tag struct { - Id int64 `json:"id,omitempty"` Name string `json:"name,omitempty"` diff --git a/samples/server/petstore/go-api-server/go/model_user.go b/samples/server/petstore/go-api-server/go/model_user.go index 8f40d0ac04c..304d910ec64 100644 --- a/samples/server/petstore/go-api-server/go/model_user.go +++ b/samples/server/petstore/go-api-server/go/model_user.go @@ -11,7 +11,6 @@ package petstoreserver // User - A User who is purchasing from the pet store type User struct { - Id int64 `json:"id,omitempty"` Username string `json:"username,omitempty"` diff --git a/shippable.yml b/shippable.yml index 7b48208fe8c..f323402019f 100644 --- a/shippable.yml +++ b/shippable.yml @@ -12,7 +12,7 @@ build: ci: - mvn --quiet clean install # ensure all modifications created by 'mature' generators are in the git repo - # moved to CircleCI ./bin/utils/ensure-up-to-date + # below move to CircleCI ./bin/utils/ensure-up-to-date # prepare environment for tests - sudo apt-get update -qq # install stack From d4c0de287697b07ab2d333ae2eb399f82c4c250d Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 1 Sep 2018 22:35:24 +0800 Subject: [PATCH 31/74] update ruby petstore client Gemfile (#948) --- samples/client/petstore/ruby/Gemfile.lock | 29 +++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/samples/client/petstore/ruby/Gemfile.lock b/samples/client/petstore/ruby/Gemfile.lock index 1dc6956be6c..246be6b0386 100644 --- a/samples/client/petstore/ruby/Gemfile.lock +++ b/samples/client/petstore/ruby/Gemfile.lock @@ -22,24 +22,24 @@ GEM diff-lcs (1.3) ethon (0.11.0) ffi (>= 1.3.0) - ffi (1.9.23) + ffi (1.9.25) hashdiff (0.3.7) json (2.1.0) - public_suffix (3.0.2) + public_suffix (3.0.3) rake (12.0.0) - rspec (3.7.0) - rspec-core (~> 3.7.0) - rspec-expectations (~> 3.7.0) - rspec-mocks (~> 3.7.0) - rspec-core (3.7.1) - rspec-support (~> 3.7.0) - rspec-expectations (3.7.0) + rspec (3.8.0) + rspec-core (~> 3.8.0) + rspec-expectations (~> 3.8.0) + rspec-mocks (~> 3.8.0) + rspec-core (3.8.0) + rspec-support (~> 3.8.0) + rspec-expectations (3.8.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-mocks (3.7.0) + rspec-support (~> 3.8.0) + rspec-mocks (3.8.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-support (3.7.1) + rspec-support (~> 3.8.0) + rspec-support (3.8.0) safe_yaml (1.0.4) sys-uname (1.0.3) ffi (>= 1.0.0) @@ -64,3 +64,6 @@ DEPENDENCIES rspec (~> 3.6, >= 3.6.0) vcr (~> 3.0, >= 3.0.1) webmock (~> 1.24, >= 1.24.3) + +BUNDLED WITH + 1.16.1 From 8ccb7135d30d054aee7d4b6563bc3f0774f8c2e6 Mon Sep 17 00:00:00 2001 From: Yimin Lin Date: Sun, 2 Sep 2018 15:43:23 +0800 Subject: [PATCH 32/74] [Dart 2] Fix petstore tests (#954) * properly initialized models in tests * Revert "move dart2 test to the end" This reverts commit 7d2edf4713c5c3bfb2d1698c4fd110e5b2a07bd9. --- pom.xml | 2 +- .../dart2/petstore/test/pet_test.dart | 61 ++++++++++++------- .../dart2/petstore/test/store_test.dart | 17 +++++- .../dart2/petstore/test/user_test.dart | 41 +++++++------ 4 files changed, 75 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index c84aa75062c..993041fc77c 100644 --- a/pom.xml +++ b/pom.xml @@ -1005,6 +1005,7 @@ + samples/client/petstore/dart2/petstore samples/client/petstore/haskell-http-client samples/client/petstore/elm samples/client/petstore/groovy @@ -1036,7 +1037,6 @@ samples/client/petstore/ruby samples/server/petstore/rust-server - samples/client/petstore/dart2/petstore diff --git a/samples/client/petstore/dart2/petstore/test/pet_test.dart b/samples/client/petstore/dart2/petstore/test/pet_test.dart index 866e621657e..3671469c7b7 100644 --- a/samples/client/petstore/dart2/petstore/test/pet_test.dart +++ b/samples/client/petstore/dart2/petstore/test/pet_test.dart @@ -9,31 +9,56 @@ import 'random_id.dart'; void main() { var petApi = new PetApi(); + Pet makePet({ + int id = 1234, + String name = 'Fluffy', + String status = '', + }) { + final category = Category() + ..id = 1234 + ..name = 'eyeColor'; + final tags = [ + Tag() + ..id = 1234 + ..name = 'New York', + Tag() + ..id = 124321 + ..name = 'Jose' + ]; + return Pet() + ..id = id + ..category = category + ..tags = tags + ..name = name + ..status = status + ..photoUrls = ['https://petstore.com/sample/photo1.jpg']; + } + group('Pet API ', () { test('adds a new pet and gets it by id', () async { var id = newId(); - - await petApi.addPet(new Pet()..id = id); + await petApi.addPet(makePet(id: id)); var pet = await petApi.getPetById(id); expect(pet.id, equals(id)); }); test('doesn\'t get non-existing pet by id', () { - expect(petApi.getPetById(newId()), throwsA(equals(TypeMatcher()))); + expect(petApi.getPetById(newId()), + throwsA(equals(TypeMatcher()))); }); test('deletes existing pet by id', () async { var id = newId(); - await petApi.addPet(new Pet()..id = id); + await petApi.addPet(makePet(id: id)); await petApi.deletePet(id, apiKey: 'special-key'); - expect(petApi.getPetById(id), throwsA(equals(TypeMatcher()))); + expect( + petApi.getPetById(id), throwsA(equals(TypeMatcher()))); }); test('updates pet with form', () async { var id = newId(); - await petApi.addPet(new Pet() - ..id = id - ..name = 'Snowy'); + + await petApi.addPet(makePet(id: id, name: 'Snowy')); await petApi.updatePetWithForm(id, name: 'Doge', status: ''); var pet = await petApi.getPetById(id); expect(pet.name, equals('Doge')); @@ -43,10 +68,8 @@ void main() { var id = newId(); var name = 'Snowy'; - await petApi.addPet(new Pet()..id = id); - await petApi.updatePet(new Pet() - ..id = id - ..name = name); + await petApi.addPet(makePet(id: id)); + await petApi.updatePet(makePet(id: id, name: name)); var pet = await petApi.getPetById(id); expect(pet.name, equals(name)); }); @@ -58,15 +81,9 @@ void main() { var status = 'available'; return Future.wait([ - petApi.addPet(new Pet() - ..id = id1 - ..status = status), - petApi.addPet(new Pet() - ..id = id2 - ..status = status), - petApi.addPet(new Pet() - ..id = id3 - ..status = 'sold') + petApi.addPet(makePet(id: id1, status: status)), + petApi.addPet(makePet(id: id2, status: status)), + petApi.addPet(makePet(id: id3, status: 'sold')) ]).then((_) async { var pets = await petApi.findPetsByStatus([status]); var petIds = pets.map((pet) => pet.id).toList(); @@ -78,7 +95,7 @@ void main() { test('uploads a pet image', () async { var id = newId(); - await petApi.addPet(new Pet()..id = id); + await petApi.addPet(makePet(id: id)); var file = new MultipartFile.fromBytes('file', [104, 101, 108, 108, 111]); await petApi.uploadFile(id, additionalMetadata: '', file: file); }); diff --git a/samples/client/petstore/dart2/petstore/test/store_test.dart b/samples/client/petstore/dart2/petstore/test/store_test.dart index b6ebc8b9b59..0e610e7a67a 100644 --- a/samples/client/petstore/dart2/petstore/test/store_test.dart +++ b/samples/client/petstore/dart2/petstore/test/store_test.dart @@ -6,11 +6,21 @@ import 'random_id.dart'; void main() { var storeApi = new StoreApi(); + Order makeOrder({int id}) { + return Order() + ..id = id + ..petId = 1234 + ..quantity = 1 + ..shipDate = DateTime.now() + ..status + ..complete = false; + } + group('Store API ', () { test('places an order and gets it by id', () async { var id = newId(); - await storeApi.placeOrder(new Order()..id = id); + await storeApi.placeOrder(makeOrder(id: id)); var order = await storeApi.getOrderById(id); expect(order.id, equals(id)); }); @@ -18,9 +28,10 @@ void main() { test('deletes an order', () async { var id = newId(); - await storeApi.placeOrder(new Order()..id = id); + await storeApi.placeOrder(makeOrder(id: id)); await storeApi.deleteOrder(id.toString()); - expect(storeApi.getOrderById(id), throwsA(equals(TypeMatcher()))); + expect(storeApi.getOrderById(id), + throwsA(equals(TypeMatcher()))); }); test('gets the store inventory', () async { diff --git a/samples/client/petstore/dart2/petstore/test/user_test.dart b/samples/client/petstore/dart2/petstore/test/user_test.dart index 909c4af13e5..a9c37e4808b 100644 --- a/samples/client/petstore/dart2/petstore/test/user_test.dart +++ b/samples/client/petstore/dart2/petstore/test/user_test.dart @@ -6,13 +6,24 @@ import 'random_id.dart'; void main() { var userApi = new UserApi(); + User makeUser( + {int id, String userName = 'username', String password = 'password'}) { + return User() + ..id = id + ..username = userName + ..firstName = 'firstname' + ..lastName = 'lastname' + ..email = 'email' + ..password = password + ..phone = 'phone' + ..userStatus = 0; + } + group('User API ', () { test('creates a user', () async { var id = newId(); var username = 'Mally45'; - await userApi.createUser(new User() - ..id = id - ..username = username); + await userApi.createUser(makeUser(id: id, userName: username)); var user = await userApi.getUserByName(username); expect(user.id, equals(id)); }); @@ -25,12 +36,8 @@ void main() { var secondId = newId(); var users = [ - new User() - ..id = firstId - ..username = joe, - new User() - ..id = secondId - ..username = sally + makeUser(id: firstId, userName: joe), + makeUser(id: secondId, userName: sally), ]; await userApi.createUsersWithListInput(users); @@ -43,9 +50,7 @@ void main() { test('updates a user', () async { var username = 'Arkjam89'; var email = 'test@example.com'; - var user = new User() - ..id = newId() - ..username = username; + var user = makeUser(id: newId(), userName: username); await userApi.createUser(user); user.email = email; @@ -56,20 +61,16 @@ void main() { test('deletes a user', () async { var username = 'Riddlem325'; - await userApi.createUser(new User() - ..id = newId() - ..username = username); + await userApi.createUser(makeUser(id: newId(), userName: username)); await userApi.deleteUser(username); - expect(userApi.getUserByName(username), throwsA(TypeMatcher())); + expect(userApi.getUserByName(username), + throwsA(TypeMatcher())); }); test('logs a user in', () async { var username = 'sgarad625'; var password = 'lokimoki1'; - var user = new User() - ..id = newId() - ..username = username - ..password = password; + var user = makeUser(id: newId(), userName: username, password: password); await userApi.createUser(user); var result = await userApi.loginUser(username, password); From 026c26075dbe688762030b86cdbba07268a5bee7 Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Sun, 2 Sep 2018 09:49:49 +0200 Subject: [PATCH 33/74] Use better return types for the reactive option (#913) --- .../codegen/languages/SpringCodegen.java | 3 + .../resources/JavaSpring/methodBody.mustache | 8 +- .../resources/JavaSpring/returnTypes.mustache | 2 +- .../org/openapitools/api/AnotherFakeApi.java | 10 +-- .../java/org/openapitools/api/FakeApi.java | 90 ++++++++++--------- .../api/FakeClassnameTestApi.java | 10 +-- .../java/org/openapitools/api/PetApi.java | 69 +++++++------- .../java/org/openapitools/api/StoreApi.java | 38 ++++---- .../java/org/openapitools/api/UserApi.java | 50 ++++++----- 9 files changed, 148 insertions(+), 132 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index e88c976d901..8bd1e2deacd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -355,6 +355,9 @@ public class SpringCodegen extends AbstractJavaCodegen if (this.async) { additionalProperties.put(RESPONSE_WRAPPER, "CompletableFuture"); } + if (this.reactive) { + additionalProperties.put(RESPONSE_WRAPPER, "Mono"); + } } else if (this.async) { additionalProperties.put(RESPONSE_WRAPPER, "Callable"); } diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/methodBody.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/methodBody.mustache index 0c2de9868ef..8597a7419ca 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/methodBody.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/methodBody.mustache @@ -29,19 +29,19 @@ return {{#jdk8}}{{#async}}CompletableFuture.completedFuture({{/async}}{{/jdk8}}n {{/examples}} {{/reactive}} {{#reactive}} -{{>returnTypes}} result = {{#isListContainer}}Flux{{/isListContainer}}{{^isListContainer}}Mono{{/isListContainer}}.empty(); +exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); {{#examples}} {{#-first}} for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { {{/-first}} if (mediaType.isCompatibleWith(MediaType.valueOf("{{{contentType}}}"))) { - result = ApiUtil.getExampleResponse(exchange, "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{example}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}") - .then{{#isListContainer}}Many{{/isListContainer}}(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeDoubleQuote}}{{{example}}}{{/lambdaEscapeDoubleQuote}}{{/lambdaRemoveLineBreak}}"); break; } {{#-last}} } {{/-last}} {{/examples}} - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body({{^isListContainer}}{{#allParams}}{{#isBodyParam}}{{paramName}}.then({{/isBodyParam}}{{/allParams}}{{/isListContainer}}{{#isListContainer}}{{#allParams}}{{#isBodyParam}}{{paramName}}.thenMany({{/isBodyParam}}{{/allParams}}{{/isListContainer}}result{{#allParams}}{{#isBodyParam}}){{/isBodyParam}}{{/allParams}}); + return result.then(Mono.empty()); {{/reactive}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/returnTypes.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/returnTypes.mustache index 67d79cc198c..bd6283296da 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/returnTypes.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/returnTypes.mustache @@ -1 +1 @@ -{{#isMapContainer}}{{#reactive}}Mono<{{/reactive}}Map{{/reactive}}>{{/isMapContainer}}{{#isListContainer}}{{#reactive}}Flux{{/reactive}}{{^reactive}}List{{/reactive}}<{{{returnType}}}>{{/isListContainer}}{{^returnContainer}}{{#reactive}}Mono<{{{returnType}}}>{{/reactive}}{{^reactive}}{{{returnType}}}{{/reactive}}{{/returnContainer}} \ No newline at end of file +{{#isMapContainer}}Map{{/isMapContainer}}{{#isListContainer}}{{#reactive}}Flux{{/reactive}}{{^reactive}}List{{/reactive}}<{{{returnType}}}>{{/isListContainer}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}} \ No newline at end of file diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java index 18784dffa68..bc85f007ea5 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java @@ -40,16 +40,16 @@ public interface AnotherFakeApi { produces = { "application/json" }, consumes = { "application/json" }, method = RequestMethod.PATCH) - default ResponseEntity> call123testSpecialTags(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> call123testSpecialTags(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(client.then(result)); + return result.then(Mono.empty()); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java index 7790ea6596c..928e0e031f4 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java @@ -48,16 +48,16 @@ public interface FakeApi { @RequestMapping(value = "/fake/outer/boolean", produces = { "*/*" }, method = RequestMethod.POST) - default ResponseEntity> fakeOuterBooleanSerialize(@ApiParam(value = "Input boolean as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> fakeOuterBooleanSerialize(@ApiParam(value = "Input boolean as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "null"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(body.then(result)); + return result.then(Mono.empty()); } @@ -68,16 +68,16 @@ public interface FakeApi { @RequestMapping(value = "/fake/outer/composite", produces = { "*/*" }, method = RequestMethod.POST) - default ResponseEntity> fakeOuterCompositeSerialize(@ApiParam(value = "Input composite as post body" ) @Valid @RequestBody Mono outerComposite, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> fakeOuterCompositeSerialize(@ApiParam(value = "Input composite as post body" ) @Valid @RequestBody Mono outerComposite, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"my_string\" : \"my_string\", \"my_number\" : 0.80082819046101150206595775671303272247314453125, \"my_boolean\" : true}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"my_string\" : \"my_string\", \"my_number\" : 0.80082819046101150206595775671303272247314453125, \"my_boolean\" : true}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(outerComposite.then(result)); + return result.then(Mono.empty()); } @@ -88,16 +88,16 @@ public interface FakeApi { @RequestMapping(value = "/fake/outer/number", produces = { "*/*" }, method = RequestMethod.POST) - default ResponseEntity> fakeOuterNumberSerialize(@ApiParam(value = "Input number as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> fakeOuterNumberSerialize(@ApiParam(value = "Input number as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "null"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(body.then(result)); + return result.then(Mono.empty()); } @@ -108,16 +108,16 @@ public interface FakeApi { @RequestMapping(value = "/fake/outer/string", produces = { "*/*" }, method = RequestMethod.POST) - default ResponseEntity> fakeOuterStringSerialize(@ApiParam(value = "Input string as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> fakeOuterStringSerialize(@ApiParam(value = "Input string as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "null"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(body.then(result)); + return result.then(Mono.empty()); } @@ -128,9 +128,10 @@ public interface FakeApi { @RequestMapping(value = "/fake/body-with-file-schema", consumes = { "application/json" }, method = RequestMethod.PUT) - default ResponseEntity> testBodyWithFileSchema(@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono fileSchemaTestClass, ServerWebExchange exchange) { + default Mono> testBodyWithFileSchema(@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono fileSchemaTestClass, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(fileSchemaTestClass.then(result)); + return result.then(Mono.empty()); } @@ -141,9 +142,10 @@ public interface FakeApi { @RequestMapping(value = "/fake/body-with-query-params", consumes = { "application/json" }, method = RequestMethod.PUT) - default ResponseEntity> testBodyWithQueryParams(@NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "query", required = true) String query,@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + default Mono> testBodyWithQueryParams(@NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "query", required = true) String query,@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(user.then(result)); + return result.then(Mono.empty()); } @@ -155,16 +157,16 @@ public interface FakeApi { produces = { "application/json" }, consumes = { "application/json" }, method = RequestMethod.PATCH) - default ResponseEntity> testClientModel(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> testClientModel(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(client.then(result)); + return result.then(Mono.empty()); } @@ -178,9 +180,10 @@ public interface FakeApi { @RequestMapping(value = "/fake", consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.POST) - default ResponseEntity> testEndpointParameters(@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="number", required=true) BigDecimal number,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="double", required=true) Double _double,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="pattern_without_delimiter", required=true) String patternWithoutDelimiter,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="byte", required=true) byte[] _byte,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="integer", required=false) Integer integer,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int32", required=false) Integer int32,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int64", required=false) Long int64,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="float", required=false) Float _float,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="string", required=false) String string,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile binary,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="date", required=false) LocalDate date,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="dateTime", required=false) OffsetDateTime dateTime,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="password", required=false) String password,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="callback", required=false) String paramCallback, ServerWebExchange exchange) { + default Mono> testEndpointParameters(@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="number", required=true) BigDecimal number,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="double", required=true) Double _double,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="pattern_without_delimiter", required=true) String patternWithoutDelimiter,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="byte", required=true) byte[] _byte,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="integer", required=false) Integer integer,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int32", required=false) Integer int32,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int64", required=false) Long int64,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="float", required=false) Float _float,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="string", required=false) String string,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile binary,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="date", required=false) LocalDate date,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="dateTime", required=false) OffsetDateTime dateTime,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="password", required=false) String password,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="callback", required=false) String paramCallback, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -192,9 +195,10 @@ public interface FakeApi { @RequestMapping(value = "/fake", consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.GET) - default ResponseEntity> testEnumParameters(@ApiParam(value = "Header parameter enum test (string array)" , allowableValues=">, $") @RequestHeader(value="enum_header_string_array", required=false) List enumHeaderStringArray,@ApiParam(value = "Header parameter enum test (string)" , allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestHeader(value="enum_header_string", required=false) String enumHeaderString,@ApiParam(value = "Query parameter enum test (string array)", allowableValues = ">, $") @Valid @RequestParam(value = "enum_query_string_array", required = false) List enumQueryStringArray,@ApiParam(value = "Query parameter enum test (string)", allowableValues = "_abc, -efg, (xyz)", defaultValue = "-efg") @Valid @RequestParam(value = "enum_query_string", required = false, defaultValue="-efg") String enumQueryString,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1, -2") @Valid @RequestParam(value = "enum_query_integer", required = false) Integer enumQueryInteger,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1.1, -1.2") @Valid @RequestParam(value = "enum_query_double", required = false) Double enumQueryDouble,@ApiParam(value = "Form parameter enum test (string array)", allowableValues=">, $", defaultValue="$") @RequestParam(value="enum_form_string_array", required=false) List enumFormStringArray,@ApiParam(value = "Form parameter enum test (string)", allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestParam(value="enum_form_string", required=false) String enumFormString, ServerWebExchange exchange) { + default Mono> testEnumParameters(@ApiParam(value = "Header parameter enum test (string array)" , allowableValues=">, $") @RequestHeader(value="enum_header_string_array", required=false) List enumHeaderStringArray,@ApiParam(value = "Header parameter enum test (string)" , allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestHeader(value="enum_header_string", required=false) String enumHeaderString,@ApiParam(value = "Query parameter enum test (string array)", allowableValues = ">, $") @Valid @RequestParam(value = "enum_query_string_array", required = false) List enumQueryStringArray,@ApiParam(value = "Query parameter enum test (string)", allowableValues = "_abc, -efg, (xyz)", defaultValue = "-efg") @Valid @RequestParam(value = "enum_query_string", required = false, defaultValue="-efg") String enumQueryString,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1, -2") @Valid @RequestParam(value = "enum_query_integer", required = false) Integer enumQueryInteger,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1.1, -1.2") @Valid @RequestParam(value = "enum_query_double", required = false) Double enumQueryDouble,@ApiParam(value = "Form parameter enum test (string array)", allowableValues=">, $", defaultValue="$") @RequestParam(value="enum_form_string_array", required=false) List enumFormStringArray,@ApiParam(value = "Form parameter enum test (string)", allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestParam(value="enum_form_string", required=false) String enumFormString, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -205,9 +209,10 @@ public interface FakeApi { @RequestMapping(value = "/fake/inline-additionalProperties", consumes = { "application/json" }, method = RequestMethod.POST) - default ResponseEntity> testInlineAdditionalProperties(@ApiParam(value = "request body" ,required=true ) @Valid @RequestBody Mono requestBody, ServerWebExchange exchange) { + default Mono> testInlineAdditionalProperties(@ApiParam(value = "request body" ,required=true ) @Valid @RequestBody Mono requestBody, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(requestBody.then(result)); + return result.then(Mono.empty()); } @@ -218,9 +223,10 @@ public interface FakeApi { @RequestMapping(value = "/fake/jsonFormData", consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.GET) - default ResponseEntity> testJsonFormData(@ApiParam(value = "field1", required=true, defaultValue="null") @RequestParam(value="param", required=true) String param,@ApiParam(value = "field2", required=true, defaultValue="null") @RequestParam(value="param2", required=true) String param2, ServerWebExchange exchange) { + default Mono> testJsonFormData(@ApiParam(value = "field1", required=true, defaultValue="null") @RequestParam(value="param", required=true) String param,@ApiParam(value = "field2", required=true, defaultValue="null") @RequestParam(value="param2", required=true) String param2, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -237,16 +243,16 @@ public interface FakeApi { produces = { "application/json" }, consumes = { "multipart/form-data" }, method = RequestMethod.POST) - default ResponseEntity> uploadFileWithRequiredFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile requiredFile,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> uploadFileWithRequiredFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile requiredFile,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java index 1eb9b9347c5..7588711e585 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java @@ -42,16 +42,16 @@ public interface FakeClassnameTestApi { produces = { "application/json" }, consumes = { "application/json" }, method = RequestMethod.PATCH) - default ResponseEntity> testClassname(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> testClassname(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(client.then(result)); + return result.then(Mono.empty()); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java index 18c1da12a4b..150a6658bf1 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java @@ -46,9 +46,10 @@ public interface PetApi { @RequestMapping(value = "/pet", consumes = { "application/json", "application/xml" }, method = RequestMethod.POST) - default ResponseEntity> addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { + default Mono> addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(pet.then(result)); + return result.then(Mono.empty()); } @@ -63,9 +64,10 @@ public interface PetApi { @ApiResponse(code = 400, message = "Invalid pet value") }) @RequestMapping(value = "/pet/{petId}", method = RequestMethod.DELETE) - default ResponseEntity> deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) String apiKey, ServerWebExchange exchange) { + default Mono> deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) String apiKey, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -82,21 +84,20 @@ public interface PetApi { @RequestMapping(value = "/pet/findByStatus", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) List status, ServerWebExchange exchange) { - Flux result = Flux.empty(); + default Mono>> findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) List status, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}") - .thenMany(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou") - .thenMany(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -113,21 +114,20 @@ public interface PetApi { @RequestMapping(value = "/pet/findByTags", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List tags, ServerWebExchange exchange) { - Flux result = Flux.empty(); + default Mono>> findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List tags, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}") - .thenMany(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou") - .thenMany(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -142,21 +142,20 @@ public interface PetApi { @RequestMapping(value = "/pet/{petId}", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> getPetById(@ApiParam(value = "ID of pet to return",required=true) @PathVariable("petId") Long petId, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> getPetById(@ApiParam(value = "ID of pet to return",required=true) @PathVariable("petId") Long petId, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -174,9 +173,10 @@ public interface PetApi { @RequestMapping(value = "/pet", consumes = { "application/json", "application/xml" }, method = RequestMethod.PUT) - default ResponseEntity> updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { + default Mono> updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(pet.then(result)); + return result.then(Mono.empty()); } @@ -192,9 +192,10 @@ public interface PetApi { @RequestMapping(value = "/pet/{petId}", consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.POST) - default ResponseEntity> updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) String name,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) String status, ServerWebExchange exchange) { + default Mono> updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) String name,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) String status, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -211,16 +212,16 @@ public interface PetApi { produces = { "application/json" }, consumes = { "multipart/form-data" }, method = RequestMethod.POST) - default ResponseEntity> uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile file, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile file, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java index ac33961433c..41c7a604a88 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java @@ -40,9 +40,10 @@ public interface StoreApi { @ApiResponse(code = 404, message = "Order not found") }) @RequestMapping(value = "/store/order/{order_id}", method = RequestMethod.DELETE) - default ResponseEntity> deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathVariable("order_id") String orderId, ServerWebExchange exchange) { + default Mono> deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathVariable("order_id") String orderId, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -55,9 +56,10 @@ public interface StoreApi { @RequestMapping(value = "/store/inventory", produces = { "application/json" }, method = RequestMethod.GET) - default ResponseEntity>> getInventory(ServerWebExchange exchange) { - Mono> result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + default Mono>> getInventory(ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); } @@ -70,21 +72,20 @@ public interface StoreApi { @RequestMapping(value = "/store/order/{order_id}", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathVariable("order_id") Long orderId, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathVariable("order_id") Long orderId, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -96,21 +97,20 @@ public interface StoreApi { @RequestMapping(value = "/store/order", produces = { "application/xml", "application/json" }, method = RequestMethod.POST) - default ResponseEntity> placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody Mono order, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody Mono order, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(order.then(result)); + return result.then(Mono.empty()); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java index afc212df67d..5e46fdae4f9 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java @@ -39,9 +39,10 @@ public interface UserApi { @ApiResponse(code = 200, message = "successful operation") }) @RequestMapping(value = "/user", method = RequestMethod.POST) - default ResponseEntity> createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + default Mono> createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(user.then(result)); + return result.then(Mono.empty()); } @@ -51,9 +52,10 @@ public interface UserApi { @ApiResponse(code = 200, message = "successful operation") }) @RequestMapping(value = "/user/createWithArray", method = RequestMethod.POST) - default ResponseEntity> createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { + default Mono> createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(user.then(result)); + return result.then(Mono.empty()); } @@ -63,9 +65,10 @@ public interface UserApi { @ApiResponse(code = 200, message = "successful operation") }) @RequestMapping(value = "/user/createWithList", method = RequestMethod.POST) - default ResponseEntity> createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { + default Mono> createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(user.then(result)); + return result.then(Mono.empty()); } @@ -76,9 +79,10 @@ public interface UserApi { @ApiResponse(code = 404, message = "User not found") }) @RequestMapping(value = "/user/{username}", method = RequestMethod.DELETE) - default ResponseEntity> deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { + default Mono> deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -91,21 +95,20 @@ public interface UserApi { @RequestMapping(value = "/user/{username}", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { - Mono result = Mono.empty(); + default Mono> getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"password\" : \"password\", \"userStatus\" : 6, \"phone\" : \"phone\", \"id\" : 0, \"email\" : \"email\", \"username\" : \"username\"}") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"password\" : \"password\", \"userStatus\" : 6, \"phone\" : \"phone\", \"id\" : 0, \"email\" : \"email\", \"username\" : \"username\"}"); break; } if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 aeiou aeiou aeiou aeiou aeiou aeiou 123") - .then(Mono.empty()); + result = ApiUtil.getExampleResponse(exchange, " 123456789 aeiou aeiou aeiou aeiou aeiou aeiou 123"); break; } } - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -117,9 +120,10 @@ public interface UserApi { @RequestMapping(value = "/user/login", produces = { "application/xml", "application/json" }, method = RequestMethod.GET) - default ResponseEntity> loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) String username,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) String password, ServerWebExchange exchange) { - Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + default Mono> loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) String username,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) String password, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); } @@ -129,9 +133,10 @@ public interface UserApi { @ApiResponse(code = 200, message = "successful operation") }) @RequestMapping(value = "/user/logout", method = RequestMethod.GET) - default ResponseEntity> logoutUser(ServerWebExchange exchange) { + default Mono> logoutUser(ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(result); + return result.then(Mono.empty()); } @@ -142,9 +147,10 @@ public interface UserApi { @ApiResponse(code = 404, message = "User not found") }) @RequestMapping(value = "/user/{username}", method = RequestMethod.PUT) - default ResponseEntity> updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathVariable("username") String username,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + default Mono> updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathVariable("username") String username,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); Mono result = Mono.empty(); - return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(user.then(result)); + return result.then(Mono.empty()); } From a2acfe3be003ead45f2ce165a8ab7094cc30dcdf Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 2 Sep 2018 15:51:36 +0800 Subject: [PATCH 34/74] add default value to swift3,4 podspec (#921) --- .../main/resources/swift3/Podspec.mustache | 42 +++++++++++++------ .../main/resources/swift4/Podspec.mustache | 42 +++++++++++++------ .../swift3/default/.openapi-generator/VERSION | 2 +- .../swift3/default/PetstoreClient.podspec | 2 +- .../objcCompatible/.openapi-generator/VERSION | 2 +- .../objcCompatible/PetstoreClient.podspec | 2 +- .../promisekit/.openapi-generator/VERSION | 2 +- .../swift3/promisekit/PetstoreClient.podspec | 2 +- .../swift3/rxswift/.openapi-generator/VERSION | 2 +- .../swift3/rxswift/PetstoreClient.podspec | 2 +- .../unwraprequired/.openapi-generator/VERSION | 2 +- .../unwraprequired/PetstoreClient.podspec | 2 +- .../swift4/default/.openapi-generator/VERSION | 2 +- .../swift4/default/PetstoreClient.podspec | 2 +- .../objcCompatible/.openapi-generator/VERSION | 2 +- .../objcCompatible/PetstoreClient.podspec | 2 +- .../OpenAPIs/AlamofireImplementations.swift | 35 ++++++++++++++-- .../promisekit/.openapi-generator/VERSION | 2 +- .../swift4/promisekit/PetstoreClient.podspec | 2 +- .../OpenAPIs/AlamofireImplementations.swift | 35 ++++++++++++++-- .../swift4/rxswift/.openapi-generator/VERSION | 2 +- .../swift4/rxswift/PetstoreClient.podspec | 2 +- .../OpenAPIs/AlamofireImplementations.swift | 35 ++++++++++++++-- .../unwrapRequired/.openapi-generator/VERSION | 2 +- .../unwrapRequired/PetstoreClient.podspec | 2 +- .../OpenAPIs/AlamofireImplementations.swift | 35 ++++++++++++++-- 26 files changed, 206 insertions(+), 58 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/swift3/Podspec.mustache b/modules/openapi-generator/src/main/resources/swift3/Podspec.mustache index e92e9f47ae0..958c6459daf 100644 --- a/modules/openapi-generator/src/main/resources/swift3/Podspec.mustache +++ b/modules/openapi-generator/src/main/resources/swift3/Podspec.mustache @@ -5,18 +5,34 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '{{#podVersion}}{{podVersion}}{{/podVersion}}{{^podVersion}}0.0.1{{/podVersion}}' - s.source = {{#podSource}}{{& podSource}}{{/podSource}}{{^podSource}}{ :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' }{{/podSource}}{{#podAuthors}} - s.authors = '{{podAuthors}}'{{/podAuthors}}{{#podSocialMediaURL}} - s.social_media_url = '{{podSocialMediaURL}}'{{/podSocialMediaURL}}{{#podDocsetURL}} - s.docset_url = '{{podDocsetURL}}'{{/podDocsetURL}} - s.license = {{#podLicense}}{{& podLicense}}{{/podLicense}}{{^podLicense}}'Proprietary'{{/podLicense}}{{#podHomepage}} - s.homepage = '{{podHomepage}}'{{/podHomepage}}{{#podSummary}} - s.summary = '{{podSummary}}'{{/podSummary}}{{#podDescription}} - s.description = '{{podDescription}}'{{/podDescription}}{{#podScreenshots}} - s.screenshots = {{& podScreenshots}}{{/podScreenshots}}{{#podDocumentationURL}} - s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} - s.source_files = '{{projectName}}/Classes/**/*.swift'{{#usePromiseKit}} - s.dependency 'PromiseKit/CorePromise', '~> 4.4.0'{{/usePromiseKit}}{{#useRxSwift}} - s.dependency 'RxSwift', '3.6.1'{{/useRxSwift}} + s.source = {{#podSource}}{{& podSource}}{{/podSource}}{{^podSource}}{ :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' }{{/podSource}} + {{#podAuthors}} + s.authors = '{{podAuthors}}' + {{/podAuthors}} + {{#podSocialMediaURL}} + s.social_media_url = '{{podSocialMediaURL}}' + {{/podSocialMediaURL}} + {{#podDocsetURL}} + s.docset_url = '{{podDocsetURL}}' + {{/podDocsetURL}} + s.license = {{#podLicense}}{{& podLicense}}{{/podLicense}}{{^podLicense}}'Proprietary'{{/podLicense}} + s.homepage = '{{podHomepage}}{{^podHomepage}}https://github.com/OpenAPITools/openapi-generator{{/podHomepage}}' + s.summary = '{{podSummary}}{{^podSummary}}{{projectName}} Swift SDK{{/podSummary}}' + {{#podDescription}} + s.description = '{{podDescription}}' + {{/podDescription}} + {{#podScreenshots}} + s.screenshots = {{& podScreenshots}} + {{/podScreenshots}} + {{#podDocumentationURL}} + s.documentation_url = '{{podDocumentationURL}}' + {{/podDocumentationURL}} + s.source_files = '{{projectName}}/Classes/**/*.swift' + {{#usePromiseKit}} + s.dependency 'PromiseKit/CorePromise', '~> 4.4.0' + {{/usePromiseKit}} + {{#useRxSwift}} + s.dependency 'RxSwift', '3.6.1' + {{/useRxSwift}} s.dependency 'Alamofire', '~> 4.5.0' end diff --git a/modules/openapi-generator/src/main/resources/swift4/Podspec.mustache b/modules/openapi-generator/src/main/resources/swift4/Podspec.mustache index cbb15384222..24ffd62bc15 100644 --- a/modules/openapi-generator/src/main/resources/swift4/Podspec.mustache +++ b/modules/openapi-generator/src/main/resources/swift4/Podspec.mustache @@ -5,18 +5,34 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '{{#podVersion}}{{podVersion}}{{/podVersion}}{{^podVersion}}0.0.1{{/podVersion}}' - s.source = {{#podSource}}{{& podSource}}{{/podSource}}{{^podSource}}{ :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' }{{/podSource}}{{#podAuthors}} - s.authors = '{{podAuthors}}'{{/podAuthors}}{{#podSocialMediaURL}} - s.social_media_url = '{{podSocialMediaURL}}'{{/podSocialMediaURL}}{{#podDocsetURL}} - s.docset_url = '{{podDocsetURL}}'{{/podDocsetURL}} - s.license = {{#podLicense}}{{& podLicense}}{{/podLicense}}{{^podLicense}}'Proprietary'{{/podLicense}}{{#podHomepage}} - s.homepage = '{{podHomepage}}'{{/podHomepage}}{{#podSummary}} - s.summary = '{{podSummary}}'{{/podSummary}}{{#podDescription}} - s.description = '{{podDescription}}'{{/podDescription}}{{#podScreenshots}} - s.screenshots = {{& podScreenshots}}{{/podScreenshots}}{{#podDocumentationURL}} - s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} - s.source_files = '{{projectName}}/Classes/**/*.swift'{{#usePromiseKit}} - s.dependency 'PromiseKit/CorePromise', '~> 4.4.0'{{/usePromiseKit}}{{#useRxSwift}} - s.dependency 'RxSwift', '~> 4.0'{{/useRxSwift}} + s.source = {{#podSource}}{{& podSource}}{{/podSource}}{{^podSource}}{ :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' }{{/podSource}} + {{#podAuthors}} + s.authors = '{{podAuthors}}' + {{/podAuthors}} + {{#podSocialMediaURL}} + s.social_media_url = '{{podSocialMediaURL}}' + {{/podSocialMediaURL}} + {{#podDocsetURL}} + s.docset_url = '{{podDocsetURL}}' + {{/podDocsetURL}} + s.license = {{#podLicense}}{{& podLicense}}{{/podLicense}}{{^podLicense}}'Proprietary'{{/podLicense}} + s.homepage = '{{podHomepage}}{{^podHomepage}}https://github.com/OpenAPITools/openapi-generator{{/podHomepage}}' + s.summary = '{{podSummary}}{{^podSummary}}{{projectName}} Swift SDK{{/podSummary}}' + {{#podDescription}} + s.description = '{{podDescription}}' + {{/podDescription}} + {{#podScreenshots}} + s.screenshots = {{& podScreenshots}} + {{/podScreenshots}} + {{#podDocumentationURL}} + s.documentation_url = '{{podDocumentationURL}}' + {{/podDocumentationURL}} + s.source_files = '{{projectName}}/Classes/**/*.swift' + {{#usePromiseKit}} + s.dependency 'PromiseKit/CorePromise', '~> 4.4.0' + {{/usePromiseKit}} + {{#useRxSwift}} + s.dependency 'RxSwift', '~> 4.0' + {{/useRxSwift}} s.dependency 'Alamofire', '~> 4.5.0' end diff --git a/samples/client/petstore/swift3/default/.openapi-generator/VERSION b/samples/client/petstore/swift3/default/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift3/default/.openapi-generator/VERSION +++ b/samples/client/petstore/swift3/default/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift3/default/PetstoreClient.podspec b/samples/client/petstore/swift3/default/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient.podspec +++ b/samples/client/petstore/swift3/default/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift3/objcCompatible/.openapi-generator/VERSION b/samples/client/petstore/swift3/objcCompatible/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift3/objcCompatible/.openapi-generator/VERSION +++ b/samples/client/petstore/swift3/objcCompatible/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift3/objcCompatible/PetstoreClient.podspec b/samples/client/petstore/swift3/objcCompatible/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift3/objcCompatible/PetstoreClient.podspec +++ b/samples/client/petstore/swift3/objcCompatible/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift3/promisekit/.openapi-generator/VERSION b/samples/client/petstore/swift3/promisekit/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift3/promisekit/.openapi-generator/VERSION +++ b/samples/client/petstore/swift3/promisekit/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift3/promisekit/PetstoreClient.podspec b/samples/client/petstore/swift3/promisekit/PetstoreClient.podspec index 34ca76681f8..9b69b145db2 100644 --- a/samples/client/petstore/swift3/promisekit/PetstoreClient.podspec +++ b/samples/client/petstore/swift3/promisekit/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift3/rxswift/.openapi-generator/VERSION b/samples/client/petstore/swift3/rxswift/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift3/rxswift/.openapi-generator/VERSION +++ b/samples/client/petstore/swift3/rxswift/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift3/rxswift/PetstoreClient.podspec b/samples/client/petstore/swift3/rxswift/PetstoreClient.podspec index 83e2df162eb..e556f44d3d4 100644 --- a/samples/client/petstore/swift3/rxswift/PetstoreClient.podspec +++ b/samples/client/petstore/swift3/rxswift/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift3/unwraprequired/.openapi-generator/VERSION b/samples/client/petstore/swift3/unwraprequired/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift3/unwraprequired/.openapi-generator/VERSION +++ b/samples/client/petstore/swift3/unwraprequired/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift3/unwraprequired/PetstoreClient.podspec b/samples/client/petstore/swift3/unwraprequired/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift3/unwraprequired/PetstoreClient.podspec +++ b/samples/client/petstore/swift3/unwraprequired/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/default/.openapi-generator/VERSION b/samples/client/petstore/swift4/default/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift4/default/.openapi-generator/VERSION +++ b/samples/client/petstore/swift4/default/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift4/default/PetstoreClient.podspec b/samples/client/petstore/swift4/default/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift4/default/PetstoreClient.podspec +++ b/samples/client/petstore/swift4/default/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/objcCompatible/.openapi-generator/VERSION b/samples/client/petstore/swift4/objcCompatible/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift4/objcCompatible/.openapi-generator/VERSION +++ b/samples/client/petstore/swift4/objcCompatible/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift4/objcCompatible/PetstoreClient.podspec b/samples/client/petstore/swift4/objcCompatible/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift4/objcCompatible/PetstoreClient.podspec +++ b/samples/client/petstore/swift4/objcCompatible/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/objcCompatible/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift b/samples/client/petstore/swift4/objcCompatible/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift index 280b4e53389..2ade78f5a61 100644 --- a/samples/client/petstore/swift4/objcCompatible/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift +++ b/samples/client/petstore/swift4/objcCompatible/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift @@ -17,8 +17,37 @@ class AlamofireRequestBuilderFactory: RequestBuilderFactory { } } +private struct SynchronizedDictionary { + + private var dictionary = [K: V]() + private let queue = DispatchQueue( + label: "SynchronizedDictionary", + qos: DispatchQoS.userInitiated, + attributes: [DispatchQueue.Attributes.concurrent], + autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, + target: nil + ) + + public subscript(key: K) -> V? { + get { + var value: V? + + queue.sync { + value = self.dictionary[key] + } + + return value + } + set { + queue.sync(flags: DispatchWorkItemFlags.barrier) { + self.dictionary[key] = newValue + } + } + } + } + // Store manager to retain its reference -private var managerStore: [String: Alamofire.SessionManager] = [:] +private var managerStore = SynchronizedDictionary() open class AlamofireRequestBuilder: RequestBuilder { required public init(method: String, URLString: String, parameters: [String : Any]?, isBody: Bool, headers: [String : String] = [:]) { @@ -112,7 +141,7 @@ open class AlamofireRequestBuilder: RequestBuilder { } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() @@ -314,7 +343,7 @@ open class AlamofireDecodableRequestBuilder: AlamofireRequestBuilde } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() diff --git a/samples/client/petstore/swift4/promisekit/.openapi-generator/VERSION b/samples/client/petstore/swift4/promisekit/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift4/promisekit/.openapi-generator/VERSION +++ b/samples/client/petstore/swift4/promisekit/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift4/promisekit/PetstoreClient.podspec b/samples/client/petstore/swift4/promisekit/PetstoreClient.podspec index 34ca76681f8..9b69b145db2 100644 --- a/samples/client/petstore/swift4/promisekit/PetstoreClient.podspec +++ b/samples/client/petstore/swift4/promisekit/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/promisekit/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift b/samples/client/petstore/swift4/promisekit/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift index 280b4e53389..2ade78f5a61 100644 --- a/samples/client/petstore/swift4/promisekit/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift +++ b/samples/client/petstore/swift4/promisekit/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift @@ -17,8 +17,37 @@ class AlamofireRequestBuilderFactory: RequestBuilderFactory { } } +private struct SynchronizedDictionary { + + private var dictionary = [K: V]() + private let queue = DispatchQueue( + label: "SynchronizedDictionary", + qos: DispatchQoS.userInitiated, + attributes: [DispatchQueue.Attributes.concurrent], + autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, + target: nil + ) + + public subscript(key: K) -> V? { + get { + var value: V? + + queue.sync { + value = self.dictionary[key] + } + + return value + } + set { + queue.sync(flags: DispatchWorkItemFlags.barrier) { + self.dictionary[key] = newValue + } + } + } + } + // Store manager to retain its reference -private var managerStore: [String: Alamofire.SessionManager] = [:] +private var managerStore = SynchronizedDictionary() open class AlamofireRequestBuilder: RequestBuilder { required public init(method: String, URLString: String, parameters: [String : Any]?, isBody: Bool, headers: [String : String] = [:]) { @@ -112,7 +141,7 @@ open class AlamofireRequestBuilder: RequestBuilder { } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() @@ -314,7 +343,7 @@ open class AlamofireDecodableRequestBuilder: AlamofireRequestBuilde } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() diff --git a/samples/client/petstore/swift4/rxswift/.openapi-generator/VERSION b/samples/client/petstore/swift4/rxswift/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift4/rxswift/.openapi-generator/VERSION +++ b/samples/client/petstore/swift4/rxswift/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift4/rxswift/PetstoreClient.podspec b/samples/client/petstore/swift4/rxswift/PetstoreClient.podspec index 5fd8bc297e7..db166a3290e 100644 --- a/samples/client/petstore/swift4/rxswift/PetstoreClient.podspec +++ b/samples/client/petstore/swift4/rxswift/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/rxswift/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift b/samples/client/petstore/swift4/rxswift/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift index 280b4e53389..2ade78f5a61 100644 --- a/samples/client/petstore/swift4/rxswift/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift +++ b/samples/client/petstore/swift4/rxswift/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift @@ -17,8 +17,37 @@ class AlamofireRequestBuilderFactory: RequestBuilderFactory { } } +private struct SynchronizedDictionary { + + private var dictionary = [K: V]() + private let queue = DispatchQueue( + label: "SynchronizedDictionary", + qos: DispatchQoS.userInitiated, + attributes: [DispatchQueue.Attributes.concurrent], + autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, + target: nil + ) + + public subscript(key: K) -> V? { + get { + var value: V? + + queue.sync { + value = self.dictionary[key] + } + + return value + } + set { + queue.sync(flags: DispatchWorkItemFlags.barrier) { + self.dictionary[key] = newValue + } + } + } + } + // Store manager to retain its reference -private var managerStore: [String: Alamofire.SessionManager] = [:] +private var managerStore = SynchronizedDictionary() open class AlamofireRequestBuilder: RequestBuilder { required public init(method: String, URLString: String, parameters: [String : Any]?, isBody: Bool, headers: [String : String] = [:]) { @@ -112,7 +141,7 @@ open class AlamofireRequestBuilder: RequestBuilder { } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() @@ -314,7 +343,7 @@ open class AlamofireDecodableRequestBuilder: AlamofireRequestBuilde } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() diff --git a/samples/client/petstore/swift4/unwrapRequired/.openapi-generator/VERSION b/samples/client/petstore/swift4/unwrapRequired/.openapi-generator/VERSION index 4395ff59232..c791c986fbb 100644 --- a/samples/client/petstore/swift4/unwrapRequired/.openapi-generator/VERSION +++ b/samples/client/petstore/swift4/unwrapRequired/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/swift4/unwrapRequired/PetstoreClient.podspec b/samples/client/petstore/swift4/unwrapRequired/PetstoreClient.podspec index c8453cdd8e0..1ff9b50b5e0 100644 --- a/samples/client/petstore/swift4/unwrapRequired/PetstoreClient.podspec +++ b/samples/client/petstore/swift4/unwrapRequired/PetstoreClient.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.osx.deployment_target = '10.11' s.tvos.deployment_target = '9.0' s.version = '0.0.1' - s.source = { :git => 'git@github.com:openapitools/openapi-generator.git', :tag => 'v1.0.0' } + s.source = { :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v1.0.0' } s.authors = '' s.license = 'Proprietary' s.homepage = 'https://github.com/openapitools/openapi-generator' diff --git a/samples/client/petstore/swift4/unwrapRequired/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift b/samples/client/petstore/swift4/unwrapRequired/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift index 280b4e53389..2ade78f5a61 100644 --- a/samples/client/petstore/swift4/unwrapRequired/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift +++ b/samples/client/petstore/swift4/unwrapRequired/PetstoreClient/Classes/OpenAPIs/AlamofireImplementations.swift @@ -17,8 +17,37 @@ class AlamofireRequestBuilderFactory: RequestBuilderFactory { } } +private struct SynchronizedDictionary { + + private var dictionary = [K: V]() + private let queue = DispatchQueue( + label: "SynchronizedDictionary", + qos: DispatchQoS.userInitiated, + attributes: [DispatchQueue.Attributes.concurrent], + autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, + target: nil + ) + + public subscript(key: K) -> V? { + get { + var value: V? + + queue.sync { + value = self.dictionary[key] + } + + return value + } + set { + queue.sync(flags: DispatchWorkItemFlags.barrier) { + self.dictionary[key] = newValue + } + } + } + } + // Store manager to retain its reference -private var managerStore: [String: Alamofire.SessionManager] = [:] +private var managerStore = SynchronizedDictionary() open class AlamofireRequestBuilder: RequestBuilder { required public init(method: String, URLString: String, parameters: [String : Any]?, isBody: Bool, headers: [String : String] = [:]) { @@ -112,7 +141,7 @@ open class AlamofireRequestBuilder: RequestBuilder { } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() @@ -314,7 +343,7 @@ open class AlamofireDecodableRequestBuilder: AlamofireRequestBuilde } let cleanupRequest = { - _ = managerStore.removeValue(forKey: managerId) + managerStore[managerId] = nil } let validatedRequest = request.validate() From d9400caf69ed731f15141e1c2672f6d790b6a6c2 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 2 Sep 2018 17:59:42 +0800 Subject: [PATCH 35/74] Set Dart2 as default, better format Dart code with dartfmt (#949) * change dart default to v2 * add dart2 author * add dartfmt to postProcess file in dart generator * add dartfmt to format dart code --- README.md | 5 +- bin/dart-petstore.sh | 8 +- bin/dart2-petstore.sh | 6 +- .../codegen/languages/DartClientCodegen.java | 63 +++- .../openapi/.openapi-generator/VERSION | 2 +- .../flutter_petstore/openapi/lib/api.dart | 1 - .../openapi/lib/api/pet_api.dart | 325 ++++++++---------- .../openapi/lib/api/store_api.dart | 141 +++----- .../openapi/lib/api/user_api.dart | 297 +++++++--------- .../openapi/lib/api_client.dart | 49 +-- .../openapi/lib/api_exception.dart | 3 +- .../openapi/lib/api_helper.dart | 9 +- .../openapi/lib/auth/api_key_auth.dart | 4 +- .../openapi/lib/auth/authentication.dart | 6 +- .../openapi/lib/auth/http_basic_auth.dart | 11 +- .../openapi/lib/auth/oauth.dart | 6 +- .../openapi/lib/model/api_response.dart | 22 +- .../openapi/lib/model/category.dart | 19 +- .../openapi/lib/model/order.dart | 23 +- .../openapi/lib/model/pet.dart | 20 +- .../openapi/lib/model/tag.dart | 16 +- .../openapi/lib/model/user.dart | 21 +- .../.openapi-generator/VERSION | 2 +- .../dart/openapi-browser-client/lib/api.dart | 1 - .../lib/api/pet_api.dart | 325 ++++++++---------- .../lib/api/store_api.dart | 141 +++----- .../lib/api/user_api.dart | 297 +++++++--------- .../lib/api_client.dart | 49 +-- .../lib/api_exception.dart | 3 +- .../lib/api_helper.dart | 9 +- .../lib/auth/api_key_auth.dart | 4 +- .../lib/auth/authentication.dart | 6 +- .../lib/auth/http_basic_auth.dart | 11 +- .../lib/auth/oauth.dart | 6 +- .../lib/model/api_response.dart | 22 +- .../lib/model/category.dart | 19 +- .../lib/model/order.dart | 23 +- .../openapi-browser-client/lib/model/pet.dart | 20 +- .../openapi-browser-client/lib/model/tag.dart | 16 +- .../lib/model/user.dart | 21 +- .../dart/openapi/.openapi-generator/VERSION | 2 +- .../client/petstore/dart/openapi/lib/api.dart | 1 - .../dart/openapi/lib/api/pet_api.dart | 325 ++++++++---------- .../dart/openapi/lib/api/store_api.dart | 141 +++----- .../dart/openapi/lib/api/user_api.dart | 297 +++++++--------- .../petstore/dart/openapi/lib/api_client.dart | 49 +-- .../dart/openapi/lib/api_exception.dart | 3 +- .../petstore/dart/openapi/lib/api_helper.dart | 9 +- .../dart/openapi/lib/auth/api_key_auth.dart | 4 +- .../dart/openapi/lib/auth/authentication.dart | 6 +- .../openapi/lib/auth/http_basic_auth.dart | 11 +- .../petstore/dart/openapi/lib/auth/oauth.dart | 6 +- .../dart/openapi/lib/model/api_response.dart | 22 +- .../dart/openapi/lib/model/category.dart | 19 +- .../dart/openapi/lib/model/order.dart | 23 +- .../petstore/dart/openapi/lib/model/pet.dart | 20 +- .../petstore/dart/openapi/lib/model/tag.dart | 16 +- .../petstore/dart/openapi/lib/model/user.dart | 21 +- .../openapi/.openapi-generator/VERSION | 2 +- .../flutter_petstore/openapi/lib/api.dart | 1 - .../openapi/lib/api/pet_api.dart | 325 ++++++++---------- .../openapi/lib/api/store_api.dart | 141 +++----- .../openapi/lib/api/user_api.dart | 297 +++++++--------- .../openapi/lib/api_client.dart | 49 +-- .../openapi/lib/api_exception.dart | 3 +- .../openapi/lib/api_helper.dart | 9 +- .../openapi/lib/auth/api_key_auth.dart | 4 +- .../openapi/lib/auth/authentication.dart | 6 +- .../openapi/lib/auth/http_basic_auth.dart | 9 +- .../openapi/lib/auth/oauth.dart | 3 +- .../openapi/lib/model/api_response.dart | 22 +- .../openapi/lib/model/category.dart | 19 +- .../openapi/lib/model/order.dart | 23 +- .../openapi/lib/model/pet.dart | 21 +- .../openapi/lib/model/tag.dart | 16 +- .../openapi/lib/model/user.dart | 21 +- .../.openapi-generator/VERSION | 2 +- .../dart2/openapi-browser-client/lib/api.dart | 1 - .../lib/api/pet_api.dart | 325 ++++++++---------- .../lib/api/store_api.dart | 141 +++----- .../lib/api/user_api.dart | 297 +++++++--------- .../lib/api_client.dart | 49 +-- .../lib/api_exception.dart | 3 +- .../lib/api_helper.dart | 9 +- .../lib/auth/api_key_auth.dart | 4 +- .../lib/auth/authentication.dart | 6 +- .../lib/auth/http_basic_auth.dart | 9 +- .../lib/auth/oauth.dart | 3 +- .../lib/model/api_response.dart | 22 +- .../lib/model/category.dart | 19 +- .../lib/model/order.dart | 23 +- .../openapi-browser-client/lib/model/pet.dart | 21 +- .../openapi-browser-client/lib/model/tag.dart | 16 +- .../lib/model/user.dart | 21 +- .../dart2/openapi/.openapi-generator/VERSION | 2 +- .../petstore/dart2/openapi/lib/api.dart | 1 - .../dart2/openapi/lib/api/pet_api.dart | 325 ++++++++---------- .../dart2/openapi/lib/api/store_api.dart | 141 +++----- .../dart2/openapi/lib/api/user_api.dart | 297 +++++++--------- .../dart2/openapi/lib/api_client.dart | 49 +-- .../dart2/openapi/lib/api_exception.dart | 3 +- .../dart2/openapi/lib/api_helper.dart | 9 +- .../dart2/openapi/lib/auth/api_key_auth.dart | 4 +- .../openapi/lib/auth/authentication.dart | 6 +- .../openapi/lib/auth/http_basic_auth.dart | 9 +- .../dart2/openapi/lib/auth/oauth.dart | 3 +- .../dart2/openapi/lib/model/api_response.dart | 22 +- .../dart2/openapi/lib/model/category.dart | 19 +- .../dart2/openapi/lib/model/order.dart | 23 +- .../petstore/dart2/openapi/lib/model/pet.dart | 21 +- .../petstore/dart2/openapi/lib/model/tag.dart | 16 +- .../dart2/openapi/lib/model/user.dart | 21 +- .../client/petstore/dart2/petstore/pom.xml | 13 + 113 files changed, 2633 insertions(+), 3300 deletions(-) diff --git a/README.md b/README.md index 57aadbcb366..75970d8bf52 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ OpenAPI Generator allows generation of API client libraries (SDK generation), se | | Languages/Frameworks | |-|-| -**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 3.5 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 6.x), Aurelia, Fetch, Inversify, jQuery, Node) +**API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 3.5 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart (1.x, 2.x)**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured, Spring 5 Web Client), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (rust, rust-server), **Scala** (akka, http4s, scalaz, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (AngularJS, Angular (2.x - 6.x), Aurelia, Fetch, Inversify, jQuery, Node) **Server stubs** | **Ada**, **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples)), **Kotlin** (Spring Boot), **PHP** (Laravel, Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** (rust-server), **Scala** ([Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), Scalatra) **API documentation generators** | **HTML**, **Confluence Wiki** **Configuration files** | [**Apache2**](https://httpd.apache.org/) @@ -516,7 +516,8 @@ Here is a list of template creators: * C# (.NET 4.5 refactored): @jimschubert * Clojure: @xhh * Dart: @yissachar - * Dart (refactored in 2.4.0): @joernahrens + * Dart (refactor): @joernahrens + * Dart 2: @swipesight * Elixir: @niku * Elm: @trenneman * Eiffel: @jvelilla diff --git a/bin/dart-petstore.sh b/bin/dart-petstore.sh index 778c8535126..7c95f8c4aa3 100755 --- a/bin/dart-petstore.sh +++ b/bin/dart-petstore.sh @@ -29,18 +29,18 @@ fi export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" # Generate non-browserClient -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi -DhideGenerationTimestamp=true -DbrowserClient=false $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=false $@" # then options to generate the library for vm would be: -#ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi_vm -DbrowserClient=false -DpubName=openapi_vm $@" +#ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi_vm -DbrowserClient=false -DpubName=openapi_vm --additional-properties supportDart2=false $@" java $JAVA_OPTS -jar $executable $ags # Generate browserClient -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi-browser-client -DhideGenerationTimestamp=true -DbrowserClient=true $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/openapi-browser-client -DhideGenerationTimestamp=true -DbrowserClient=true --additional-properties supportDart2=false $@" java $JAVA_OPTS -jar $executable $ags # Generate non-browserClient and put it to the flutter sample app -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/flutter_petstore/openapi -DhideGenerationTimestamp=true -DbrowserClient=false $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart/flutter_petstore/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=false $@" java $JAVA_OPTS -jar $executable $ags # There is a proposal to allow importing different libraries depending on the environment: diff --git a/bin/dart2-petstore.sh b/bin/dart2-petstore.sh index 7160d1c38b0..1b224bd2611 100755 --- a/bin/dart2-petstore.sh +++ b/bin/dart2-petstore.sh @@ -29,18 +29,18 @@ fi export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" # Generate non-browserClient -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=true $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi -DhideGenerationTimestamp=true -DbrowserClient=false $@" # then options to generate the library for vm would be: #ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi_vm -DbrowserClient=false -DpubName=openapi_vm $@" java $JAVA_OPTS -jar $executable $ags # Generate browserClient -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi-browser-client -DhideGenerationTimestamp=true -DbrowserClient=true --additional-properties supportDart2=true $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/openapi-browser-client -DhideGenerationTimestamp=true -DbrowserClient=true $@" java $JAVA_OPTS -jar $executable $ags # Generate non-browserClient and put it to the flutter sample app -ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/flutter_petstore/openapi -DhideGenerationTimestamp=true -DbrowserClient=false --additional-properties supportDart2=true $@" +ags="generate -t modules/openapi-generator/src/main/resources/dart -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g dart -o samples/client/petstore/dart2/flutter_petstore/openapi -DhideGenerationTimestamp=true -DbrowserClient=false $@" java $JAVA_OPTS -jar $executable $ags # There is a proposal to allow importing different libraries depending on the environment: diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java index 55cf82bde52..8d80c21f5d4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartClientCodegen.java @@ -29,17 +29,20 @@ import org.openapitools.codegen.utils.ModelUtils; import io.swagger.v3.oas.models.media.*; import io.swagger.v3.parser.util.SchemaTypeUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; - +import java.util.Set; public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DartClientCodegen.class); @@ -127,7 +130,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(PUB_DESCRIPTION, "Description in generated pubspec")); cliOptions.add(new CliOption(USE_ENUM_EXTENSION, "Allow the 'x-enum-values' extension for enums")); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "source folder for generated code")); - cliOptions.add(CliOption.newBoolean(SUPPORT_DART2, "support dart2").defaultValue(Boolean.FALSE.toString())); + cliOptions.add(CliOption.newBoolean(SUPPORT_DART2, "support dart2").defaultValue(Boolean.TRUE.toString())); } @Override @@ -142,13 +145,17 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String getHelp() { - return "Generates a Dart client library."; + return "Generates a Dart (1.x or 2.x) client library."; } @Override public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("DART_FMT_PATH"))) { + LOGGER.info("Environment variable DART_FMT_PATH not defined so the Dart code may not be properly formatted. To define it, try 'export DART_FMT_PATH=/usr/local/bin/dartfmt' (Linux/Mac)"); + } + if (additionalProperties.containsKey(BROWSER_CLIENT)) { this.setBrowserClient(convertPropertyToBooleanAndWriteBack(BROWSER_CLIENT)); } else { @@ -193,11 +200,16 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { additionalProperties.put("modelDocPath", modelDocPath); final Object isSupportDart2 = additionalProperties.get(SUPPORT_DART2); - if (Boolean.TRUE.equals(isSupportDart2) || (isSupportDart2 instanceof String && Boolean.parseBoolean((String)isSupportDart2))) { - embeddedTemplateDir = templateDir = "dart2"; - } else { + if (Boolean.FALSE.equals(isSupportDart2) || (isSupportDart2 instanceof String && !Boolean.parseBoolean((String)isSupportDart2))) { + // dart 1.x + LOGGER.info("Dart version: 1.x"); supportingFiles.add(new SupportingFile("analysis_options.mustache", "", ".analysis_options")); + } else { + // dart 2.x + LOGGER.info("Dart version: 2.x"); + embeddedTemplateDir = templateDir = "dart2"; } + final String libFolder = sourceFolder + File.separator + "lib"; supportingFiles.add(new SupportingFile("pubspec.mustache", "", "pubspec.yaml")); supportingFiles.add(new SupportingFile("api_client.mustache", libFolder, "api_client.dart")); @@ -496,4 +508,43 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { return input.replace("*/", "*_/").replace("/*", "/_*"); } + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + String dartFmtPath = System.getenv("DART_FMT_PATH"); + if (StringUtils.isEmpty(dartFmtPath)) { + return; // skip if DART_FMT_PATH env variable is not defined + } + + // only procees the following type (or we can simply rely on the file extension to check if it's a Dart file) + Set supportedFileType = new HashSet( + Arrays.asList( + "supporting-mustache", + "model-test", + "model", + "api-test", + "api")); + if (!supportedFileType.contains(fileType)) { + return; + } + + // only process files with dart extension + if ("dart".equals(FilenameUtils.getExtension(file.toString()))) { + // currently only support "dartfmt -w yourcode.dart" + String command = dartFmtPath + " -w " + file.toString(); + try { + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}): {}", command, p.exitValue()); + } + } catch (Exception e) { + LOGGER.error("Error running the command ({}): {}", command, e.getMessage()); + } + LOGGER.info("Successfully executed: " + command); + } + } } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart/flutter_petstore/openapi/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/.openapi-generator/VERSION +++ b/samples/client/petstore/dart/flutter_petstore/openapi/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api.dart index 9a64a5342b4..756e554c43f 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api.dart @@ -23,5 +23,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/pet_api.dart index 4134e018386..81b5ad0c880 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/store_api.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/store_api.dart index f2a48f2d4da..a3f62747d50 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/user_api.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/user_api.dart index cf8ef6bf800..62e8759ede8 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody = null; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_client.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_client.dart index db4116dd96d..c99c6d8c492 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = new Client(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw new ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw new ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw new ApiException(500, 'Could not find a suitable class for deserialization'); + throw new ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = new MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw new ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw new ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_exception.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_exception.dart index f188fd125a4..e485b6c3226 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_exception.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_helper.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_helper.dart index 79af4521d5b..e6f87d96bfb 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_helper.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => new QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(new QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(new QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/api_key_auth.dart index f9617f7ae4d..69b407fd90e 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/authentication.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/http_basic_auth.dart index 4e77ddcf6e6..e26ec8a005a 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + BASE64.encode(UTF8.encode(str)); } - -} \ No newline at end of file +} diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/oauth.dart index 13bfd799743..829677d6c9c 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/oauth.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/auth/oauth.dart @@ -3,11 +3,11 @@ part of openapi.api; class OAuth implements Authentication { String accessToken; - OAuth({this.accessToken}) { - } + OAuth({this.accessToken}) {} @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/api_response.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/api_response.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/category.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/category.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/order.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/order.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/pet.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/pet.dart index 4d2f77a1a5a..b80a0491345 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/pet.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,8 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = (json['photoUrls'] as List).map((item) => item as String).toList(); + photoUrls = + (json['photoUrls'] as List).map((item) => item as String).toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +43,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/tag.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/tag.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/user.dart b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/user.dart +++ b/samples/client/petstore/dart/flutter_petstore/openapi/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/.openapi-generator/VERSION b/samples/client/petstore/dart/openapi-browser-client/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/dart/openapi-browser-client/.openapi-generator/VERSION +++ b/samples/client/petstore/dart/openapi-browser-client/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api.dart index 84476e0626a..e62b959a456 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api.dart @@ -24,5 +24,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api/pet_api.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api/pet_api.dart index 4134e018386..81b5ad0c880 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api/pet_api.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api/store_api.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api/store_api.dart index f2a48f2d4da..a3f62747d50 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api/store_api.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api/user_api.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api/user_api.dart index cf8ef6bf800..62e8759ede8 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api/user_api.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody = null; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api_client.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api_client.dart index 7cca5bef5f2..bdc0ebf698d 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api_client.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = new BrowserClient(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw new ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw new ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw new ApiException(500, 'Could not find a suitable class for deserialization'); + throw new ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = new MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw new ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw new ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api_exception.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api_exception.dart index f188fd125a4..e485b6c3226 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api_exception.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/api_helper.dart b/samples/client/petstore/dart/openapi-browser-client/lib/api_helper.dart index 79af4521d5b..e6f87d96bfb 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/api_helper.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => new QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(new QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(new QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/auth/api_key_auth.dart b/samples/client/petstore/dart/openapi-browser-client/lib/auth/api_key_auth.dart index f9617f7ae4d..69b407fd90e 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/auth/authentication.dart b/samples/client/petstore/dart/openapi-browser-client/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/auth/authentication.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart/openapi-browser-client/lib/auth/http_basic_auth.dart index 4e77ddcf6e6..e26ec8a005a 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + BASE64.encode(UTF8.encode(str)); } - -} \ No newline at end of file +} diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/auth/oauth.dart b/samples/client/petstore/dart/openapi-browser-client/lib/auth/oauth.dart index 13bfd799743..829677d6c9c 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/auth/oauth.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/auth/oauth.dart @@ -3,11 +3,11 @@ part of openapi.api; class OAuth implements Authentication { String accessToken; - OAuth({this.accessToken}) { - } + OAuth({this.accessToken}) {} @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/api_response.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/api_response.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/category.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/category.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/order.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/order.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/pet.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/pet.dart index 4d2f77a1a5a..b80a0491345 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/pet.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,8 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = (json['photoUrls'] as List).map((item) => item as String).toList(); + photoUrls = + (json['photoUrls'] as List).map((item) => item as String).toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +43,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/tag.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/tag.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi-browser-client/lib/model/user.dart b/samples/client/petstore/dart/openapi-browser-client/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart/openapi-browser-client/lib/model/user.dart +++ b/samples/client/petstore/dart/openapi-browser-client/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart/openapi/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/dart/openapi/.openapi-generator/VERSION +++ b/samples/client/petstore/dart/openapi/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart/openapi/lib/api.dart b/samples/client/petstore/dart/openapi/lib/api.dart index 9a64a5342b4..756e554c43f 100644 --- a/samples/client/petstore/dart/openapi/lib/api.dart +++ b/samples/client/petstore/dart/openapi/lib/api.dart @@ -23,5 +23,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/dart/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart/openapi/lib/api/pet_api.dart index 4134e018386..81b5ad0c880 100644 --- a/samples/client/petstore/dart/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart/openapi/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody = null; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody = null; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart/openapi/lib/api/store_api.dart b/samples/client/petstore/dart/openapi/lib/api/store_api.dart index f2a48f2d4da..a3f62747d50 100644 --- a/samples/client/petstore/dart/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart/openapi/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody = null; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart/openapi/lib/api/user_api.dart b/samples/client/petstore/dart/openapi/lib/api/user_api.dart index cf8ef6bf800..62e8759ede8 100644 --- a/samples/client/petstore/dart/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart/openapi/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody = null; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody = null; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart/openapi/lib/api_client.dart b/samples/client/petstore/dart/openapi/lib/api_client.dart index db4116dd96d..c99c6d8c492 100644 --- a/samples/client/petstore/dart/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart/openapi/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = new Client(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw new ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw new ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw new ApiException(500, 'Could not find a suitable class for deserialization'); + throw new ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = new MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw new ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw new ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart/openapi/lib/api_exception.dart b/samples/client/petstore/dart/openapi/lib/api_exception.dart index f188fd125a4..e485b6c3226 100644 --- a/samples/client/petstore/dart/openapi/lib/api_exception.dart +++ b/samples/client/petstore/dart/openapi/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart/openapi/lib/api_helper.dart b/samples/client/petstore/dart/openapi/lib/api_helper.dart index 79af4521d5b..e6f87d96bfb 100644 --- a/samples/client/petstore/dart/openapi/lib/api_helper.dart +++ b/samples/client/petstore/dart/openapi/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => new QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(new QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(new QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart/openapi/lib/auth/api_key_auth.dart index f9617f7ae4d..69b407fd90e 100644 --- a/samples/client/petstore/dart/openapi/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart/openapi/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart/openapi/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart/openapi/lib/auth/authentication.dart +++ b/samples/client/petstore/dart/openapi/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart/openapi/lib/auth/http_basic_auth.dart index 4e77ddcf6e6..e26ec8a005a 100644 --- a/samples/client/petstore/dart/openapi/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart/openapi/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + BASE64.encode(UTF8.encode(str)); } - -} \ No newline at end of file +} diff --git a/samples/client/petstore/dart/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart/openapi/lib/auth/oauth.dart index 13bfd799743..829677d6c9c 100644 --- a/samples/client/petstore/dart/openapi/lib/auth/oauth.dart +++ b/samples/client/petstore/dart/openapi/lib/auth/oauth.dart @@ -3,11 +3,11 @@ part of openapi.api; class OAuth implements Authentication { String accessToken; - OAuth({this.accessToken}) { - } + OAuth({this.accessToken}) {} @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart/openapi/lib/model/api_response.dart b/samples/client/petstore/dart/openapi/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart/openapi/lib/model/api_response.dart +++ b/samples/client/petstore/dart/openapi/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/lib/model/category.dart b/samples/client/petstore/dart/openapi/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart/openapi/lib/model/category.dart +++ b/samples/client/petstore/dart/openapi/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/lib/model/order.dart b/samples/client/petstore/dart/openapi/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart/openapi/lib/model/order.dart +++ b/samples/client/petstore/dart/openapi/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/lib/model/pet.dart b/samples/client/petstore/dart/openapi/lib/model/pet.dart index 4d2f77a1a5a..b80a0491345 100644 --- a/samples/client/petstore/dart/openapi/lib/model/pet.dart +++ b/samples/client/petstore/dart/openapi/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,8 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = (json['photoUrls'] as List).map((item) => item as String).toList(); + photoUrls = + (json['photoUrls'] as List).map((item) => item as String).toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +43,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/lib/model/tag.dart b/samples/client/petstore/dart/openapi/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart/openapi/lib/model/tag.dart +++ b/samples/client/petstore/dart/openapi/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart/openapi/lib/model/user.dart b/samples/client/petstore/dart/openapi/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart/openapi/lib/model/user.dart +++ b/samples/client/petstore/dart/openapi/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION index 105bb87d77b..6d94c9c2e12 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.2-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart index 69c3ecd2e15..08fe92eb031 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api.dart @@ -23,5 +23,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart index 8e6c815ec2b..0c625c2b04a 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart index 38fe10d4450..5f88bf5ac99 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart index 9d3eb116e61..94b245a5609 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart index f1e49792f90..016e939e55d 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = Client(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw ApiException(500, 'Could not find a suitable class for deserialization'); + throw ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart index 668abe2c96b..a702da723eb 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart index a516a68d264..9f7ccc8df90 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart index 8caf6ab5eba..b5a7a8248c0 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart index 6342d886689..e141c062ae0 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); } - } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart index aa08e5cdb4d..73e2ae07ea3 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/auth/oauth.dart @@ -6,7 +6,8 @@ class OAuth implements Authentication { OAuth({this.accessToken}); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart index da9de49b678..ab265f9d6e1 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,9 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + photoUrls = ((json['photoUrls'] ?? []) as List) + .map((item) => item as String) + .toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +44,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION index 105bb87d77b..6d94c9c2e12 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION +++ b/samples/client/petstore/dart2/openapi-browser-client/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.2-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart index 4e43a1c2083..a8a3dd1fa25 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api.dart @@ -24,5 +24,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart index 8e6c815ec2b..0c625c2b04a 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart index 38fe10d4450..5f88bf5ac99 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart index 9d3eb116e61..94b245a5609 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart index 2ffa4e695a5..72a7c0f345b 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = BrowserClient(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw ApiException(500, 'Could not find a suitable class for deserialization'); + throw ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart index 668abe2c96b..a702da723eb 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart index a516a68d264..9f7ccc8df90 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart index 8caf6ab5eba..b5a7a8248c0 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart index 6342d886689..e141c062ae0 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); } - } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart index aa08e5cdb4d..73e2ae07ea3 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/auth/oauth.dart @@ -6,7 +6,8 @@ class OAuth implements Authentication { OAuth({this.accessToken}); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart index da9de49b678..ab265f9d6e1 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,9 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + photoUrls = ((json['photoUrls'] ?? []) as List) + .map((item) => item as String) + .toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +44,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION b/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION index 105bb87d77b..6d94c9c2e12 100644 --- a/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION +++ b/samples/client/petstore/dart2/openapi/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.2-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/dart2/openapi/lib/api.dart b/samples/client/petstore/dart2/openapi/lib/api.dart index 69c3ecd2e15..08fe92eb031 100644 --- a/samples/client/petstore/dart2/openapi/lib/api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api.dart @@ -23,5 +23,4 @@ part 'model/pet.dart'; part 'model/tag.dart'; part 'model/user.dart'; - ApiClient defaultApiClient = ApiClient(); diff --git a/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart index 8e6c815ec2b..0c625c2b04a 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class PetApi { final ApiClient apiClient; @@ -9,66 +7,60 @@ class PetApi { /// Add a new pet to the store /// - /// + /// Future addPet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Deletes a pet /// - /// - Future deletePet(int petId, { String apiKey }) async { + /// + Future deletePet(int petId, {String apiKey}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -78,34 +70,26 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Finds Pets by status /// /// Multiple status values can be provided with comma separated strings @@ -113,50 +97,46 @@ class PetApi { Object postBody; // verify required params are set - if(status == null) { - throw new ApiException(400, "Missing required param: status"); + if (status == null) { + throw new ApiException(400, "Missing required param: status"); } // create path and map variables - String path = "/pet/findByStatus".replaceAll("{format}","json"); + String path = "/pet/findByStatus".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "status", status)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "status", status)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Finds Pets by tags /// /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. @@ -164,50 +144,46 @@ class PetApi { Object postBody; // verify required params are set - if(tags == null) { - throw new ApiException(400, "Missing required param: tags"); + if (tags == null) { + throw new ApiException(400, "Missing required param: tags"); } // create path and map variables - String path = "/pet/findByTags".replaceAll("{format}","json"); + String path = "/pet/findByTags".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); + queryParams + .addAll(_convertParametersForCollectionFormat("csv", "tags", tags)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return (apiClient.deserialize(response.body, 'List') as List).map((item) => item as Pet).toList(); + } else if (response.body != null) { + return (apiClient.deserialize(response.body, 'List') as List) + .map((item) => item as Pet) + .toList(); } else { return null; } } + /// Find pet by ID /// /// Returns a single pet @@ -215,12 +191,14 @@ class PetApi { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -229,97 +207,84 @@ class PetApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Pet') as Pet; } else { return null; } } + /// Update an existing pet /// - /// + /// Future updatePet(Pet pet) async { Object postBody = pet; // verify required params are set - if(pet == null) { - throw new ApiException(400, "Missing required param: pet"); + if (pet == null) { + throw new ApiException(400, "Missing required param: pet"); } // create path and map variables - String path = "/pet".replaceAll("{format}","json"); + String path = "/pet".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - List contentTypes = ["application/json","application/xml"]; + List contentTypes = ["application/json", "application/xml"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updates a pet in the store with form data /// - /// - Future updatePetWithForm(int petId, { String name, String status }) async { + /// + Future updatePetWithForm(int petId, {String name, String status}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -328,10 +293,11 @@ class PetApi { List contentTypes = ["application/x-www-form-urlencoded"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (name != null) { @@ -342,45 +308,38 @@ class PetApi { hasFields = true; mp.fields['status'] = parameterToString(status); } - if(hasFields) - postBody = mp; - } - else { - if (name != null) - formParams['name'] = parameterToString(name); - if (status != null) - formParams['status'] = parameterToString(status); - } - - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); - - if(response.statusCode >= 400) { - throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + if (hasFields) postBody = mp; } else { + if (name != null) formParams['name'] = parameterToString(name); + if (status != null) formParams['status'] = parameterToString(status); + } + + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); + + if (response.statusCode >= 400) { + throw new ApiException(response.statusCode, response.body); + } else if (response.body != null) {} else { return; } } + /// uploads an image /// - /// - Future uploadFile(int petId, { String additionalMetadata, MultipartFile file }) async { + /// + Future uploadFile(int petId, + {String additionalMetadata, MultipartFile file}) async { Object postBody; // verify required params are set - if(petId == null) { - throw new ApiException(400, "Missing required param: petId"); + if (petId == null) { + throw new ApiException(400, "Missing required param: petId"); } // create path and map variables - String path = "/pet/{petId}/uploadImage".replaceAll("{format}","json").replaceAll("{" + "petId" + "}", petId.toString()); + String path = "/pet/{petId}/uploadImage" + .replaceAll("{format}", "json") + .replaceAll("{" + "petId" + "}", petId.toString()); // query params List queryParams = []; @@ -389,10 +348,11 @@ class PetApi { List contentTypes = ["multipart/form-data"]; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["petstore_auth"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); if (additionalMetadata != null) { @@ -404,26 +364,19 @@ class PetApi { mp.fields['file'] = file.field; mp.files.add(file); } - if(hasFields) - postBody = mp; - } - else { + if (hasFields) postBody = mp; + } else { if (additionalMetadata != null) - formParams['additionalMetadata'] = parameterToString(additionalMetadata); + formParams['additionalMetadata'] = + parameterToString(additionalMetadata); } - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'ApiResponse') as ApiResponse; } else { return null; diff --git a/samples/client/petstore/dart2/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart index 38fe10d4450..5f88bf5ac99 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class StoreApi { final ApiClient apiClient; @@ -14,12 +12,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -28,34 +28,26 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Returns pet inventories by status /// /// Returns a map of status codes to quantities @@ -65,7 +57,7 @@ class StoreApi { // verify required params are set // create path and map variables - String path = "/store/inventory".replaceAll("{format}","json"); + String path = "/store/inventory".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -74,36 +66,30 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = ["api_key"]; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - return new Map.from(apiClient.deserialize(response.body, 'Map')); - ; + } else if (response.body != null) { + return new Map.from( + apiClient.deserialize(response.body, 'Map')); + ; } else { return null; } } + /// Find purchase order by ID /// /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions @@ -111,12 +97,14 @@ class StoreApi { Object postBody; // verify required params are set - if(orderId == null) { - throw new ApiException(400, "Missing required param: orderId"); + if (orderId == null) { + throw new ApiException(400, "Missing required param: orderId"); } // create path and map variables - String path = "/store/order/{orderId}".replaceAll("{format}","json").replaceAll("{" + "orderId" + "}", orderId.toString()); + String path = "/store/order/{orderId}" + .replaceAll("{format}", "json") + .replaceAll("{" + "orderId" + "}", orderId.toString()); // query params List queryParams = []; @@ -125,48 +113,41 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; } } + /// Place an order for a pet /// - /// + /// Future placeOrder(Order order) async { Object postBody = order; // verify required params are set - if(order == null) { - throw new ApiException(400, "Missing required param: order"); + if (order == null) { + throw new ApiException(400, "Missing required param: order"); } // create path and map variables - String path = "/store/order".replaceAll("{format}","json"); + String path = "/store/order".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -175,30 +156,22 @@ class StoreApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'Order') as Order; } else { return null; diff --git a/samples/client/petstore/dart2/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart index 9d3eb116e61..94b245a5609 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart @@ -1,7 +1,5 @@ part of openapi.api; - - class UserApi { final ApiClient apiClient; @@ -14,12 +12,12 @@ class UserApi { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user".replaceAll("{format}","json"); + String path = "/user".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -28,47 +26,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithArrayInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithArray".replaceAll("{format}","json"); + String path = "/user/createWithArray".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -77,47 +67,39 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Creates list of users with given input array /// - /// + /// Future createUsersWithListInput(List user) async { Object postBody = user; // verify required params are set - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/createWithList".replaceAll("{format}","json"); + String path = "/user/createWithList".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -126,34 +108,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'POST', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'POST', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Delete user /// /// This can only be done by the logged in user. @@ -161,12 +135,14 @@ class UserApi { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -175,47 +151,41 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'DELETE', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'DELETE', queryParams, + postBody, headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Get user by user name /// - /// + /// Future getUserByName(String username) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -224,100 +194,88 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'User') as User; } else { return null; } } + /// Logs user into the system /// - /// + /// Future loginUser(String username, String password) async { Object postBody; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(password == null) { - throw new ApiException(400, "Missing required param: password"); + if (password == null) { + throw new ApiException(400, "Missing required param: password"); } // create path and map variables - String path = "/user/login".replaceAll("{format}","json"); + String path = "/user/login".replaceAll("{format}", "json"); // query params List queryParams = []; Map headerParams = {}; Map formParams = {}; - queryParams.addAll(_convertParametersForCollectionFormat("", "username", username)); - queryParams.addAll(_convertParametersForCollectionFormat("", "password", password)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "username", username)); + queryParams.addAll( + _convertParametersForCollectionFormat("", "password", password)); List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { + } else if (response.body != null) { return apiClient.deserialize(response.body, 'String') as String; } else { return null; } } + /// Logs out current logged in user session /// - /// + /// Future logoutUser() async { Object postBody; // verify required params are set // create path and map variables - String path = "/user/logout".replaceAll("{format}","json"); + String path = "/user/logout".replaceAll("{format}", "json"); // query params List queryParams = []; @@ -326,34 +284,26 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'GET', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } + /// Updated user /// /// This can only be done by the logged in user. @@ -361,15 +311,17 @@ class UserApi { Object postBody = user; // verify required params are set - if(username == null) { - throw new ApiException(400, "Missing required param: username"); + if (username == null) { + throw new ApiException(400, "Missing required param: username"); } - if(user == null) { - throw new ApiException(400, "Missing required param: user"); + if (user == null) { + throw new ApiException(400, "Missing required param: user"); } // create path and map variables - String path = "/user/{username}".replaceAll("{format}","json").replaceAll("{" + "username" + "}", username.toString()); + String path = "/user/{username}" + .replaceAll("{format}", "json") + .replaceAll("{" + "username" + "}", username.toString()); // query params List queryParams = []; @@ -378,31 +330,22 @@ class UserApi { List contentTypes = []; - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + String contentType = + contentTypes.length > 0 ? contentTypes[0] : "application/json"; List authNames = []; - if(contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { bool hasFields = false; MultipartRequest mp = new MultipartRequest(null, null); - if(hasFields) - postBody = mp; - } - else { - } + if (hasFields) postBody = mp; + } else {} - var response = await apiClient.invokeAPI(path, - 'PUT', - queryParams, - postBody, - headerParams, - formParams, - contentType, - authNames); + var response = await apiClient.invokeAPI(path, 'PUT', queryParams, postBody, + headerParams, formParams, contentType, authNames); - if(response.statusCode >= 400) { + if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if(response.body != null) { - } else { + } else if (response.body != null) {} else { return; } } diff --git a/samples/client/petstore/dart2/openapi/lib/api_client.dart b/samples/client/petstore/dart2/openapi/lib/api_client.dart index f1e49792f90..016e939e55d 100644 --- a/samples/client/petstore/dart2/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart2/openapi/lib/api_client.dart @@ -8,7 +8,6 @@ class QueryParam { } class ApiClient { - String basePath; var client = Client(); @@ -25,7 +24,7 @@ class ApiClient { } void addDefaultHeader(String key, String value) { - _defaultHeaderMap[key] = value; + _defaultHeaderMap[key] = value; } dynamic _deserialize(dynamic value, String targetType) { @@ -67,9 +66,11 @@ class ApiClient { } } } catch (e, stack) { - throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); + throw ApiException.withInner( + 500, 'Exception during deserialization.', e, stack); } - throw ApiException(500, 'Could not find a suitable class for deserialization'); + throw ApiException( + 500, 'Could not find a suitable class for deserialization'); } dynamic deserialize(String json, String targetType) { @@ -94,28 +95,28 @@ class ApiClient { // We don't use a Map for queryParams. // If collectionFormat is 'multi' a key might appear multiple times. - Future invokeAPI(String path, - String method, - Iterable queryParams, - Object body, - Map headerParams, - Map formParams, - String contentType, - List authNames) async { - + Future invokeAPI( + String path, + String method, + Iterable queryParams, + Object body, + Map headerParams, + Map formParams, + String contentType, + List authNames) async { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); - String queryString = ps.isNotEmpty ? - '?' + ps.join('&') : - ''; + var ps = queryParams + .where((p) => p.value != null) + .map((p) => '${p.name}=${p.value}'); + String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; String url = basePath + path + queryString; headerParams.addAll(_defaultHeaderMap); headerParams['Content-Type'] = contentType; - if(body is MultipartRequest) { + if (body is MultipartRequest) { var request = MultipartRequest(method, Uri.parse(url)); request.fields.addAll(body.fields); request.files.addAll(body.files); @@ -124,8 +125,10 @@ class ApiClient { var response = await client.send(request); return Response.fromStream(response); } else { - var msgBody = contentType == "application/x-www-form-urlencoded" ? formParams : serialize(body); - switch(method) { + var msgBody = contentType == "application/x-www-form-urlencoded" + ? formParams + : serialize(body); + switch (method) { case "POST": return client.post(url, headers: headerParams, body: msgBody); case "PUT": @@ -142,10 +145,12 @@ class ApiClient { /// Update query and header parameters based on authentication settings. /// @param authNames The authentications to apply - void _updateParamsForAuth(List authNames, List queryParams, Map headerParams) { + void _updateParamsForAuth(List authNames, + List queryParams, Map headerParams) { authNames.forEach((authName) { Authentication auth = _authentications[authName]; - if (auth == null) throw ArgumentError("Authentication undefined: " + authName); + if (auth == null) + throw ArgumentError("Authentication undefined: " + authName); auth.applyToParams(queryParams, headerParams); }); } diff --git a/samples/client/petstore/dart2/openapi/lib/api_exception.dart b/samples/client/petstore/dart2/openapi/lib/api_exception.dart index 668abe2c96b..a702da723eb 100644 --- a/samples/client/petstore/dart2/openapi/lib/api_exception.dart +++ b/samples/client/petstore/dart2/openapi/lib/api_exception.dart @@ -8,7 +8,8 @@ class ApiException implements Exception { ApiException(this.code, this.message); - ApiException.withInner(this.code, this.message, this.innerException, this.stackTrace); + ApiException.withInner( + this.code, this.message, this.innerException, this.stackTrace); String toString() { if (message == null) return "ApiException"; diff --git a/samples/client/petstore/dart2/openapi/lib/api_helper.dart b/samples/client/petstore/dart2/openapi/lib/api_helper.dart index a516a68d264..9f7ccc8df90 100644 --- a/samples/client/petstore/dart2/openapi/lib/api_helper.dart +++ b/samples/client/petstore/dart2/openapi/lib/api_helper.dart @@ -4,7 +4,7 @@ const _delimiters = const {'csv': ',', 'ssv': ' ', 'tsv': '\t', 'pipes': '|'}; // port from Java version Iterable _convertParametersForCollectionFormat( - String collectionFormat, String name, dynamic value) { + String collectionFormat, String name, dynamic value) { var params = []; // preconditions @@ -19,8 +19,8 @@ Iterable _convertParametersForCollectionFormat( // get the collection format collectionFormat = (collectionFormat == null || collectionFormat.isEmpty) - ? "csv" - : collectionFormat; // default: csv + ? "csv" + : collectionFormat; // default: csv if (collectionFormat == "multi") { return values.map((v) => QueryParam(name, parameterToString(v))); @@ -28,7 +28,8 @@ Iterable _convertParametersForCollectionFormat( String delimiter = _delimiters[collectionFormat] ?? ","; - params.add(QueryParam(name, values.map((v) => parameterToString(v)).join(delimiter))); + params.add(QueryParam( + name, values.map((v) => parameterToString(v)).join(delimiter))); return params; } diff --git a/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart b/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart index 8caf6ab5eba..b5a7a8248c0 100644 --- a/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart +++ b/samples/client/petstore/dart2/openapi/lib/auth/api_key_auth.dart @@ -1,7 +1,6 @@ part of openapi.api; class ApiKeyAuth implements Authentication { - final String location; final String paramName; String apiKey; @@ -10,7 +9,8 @@ class ApiKeyAuth implements Authentication { ApiKeyAuth(this.location, this.paramName); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { String value; if (apiKeyPrefix != null) { value = '$apiKeyPrefix $apiKey'; diff --git a/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart b/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart index abd5e2fe68a..2c4d5f301fa 100644 --- a/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart +++ b/samples/client/petstore/dart2/openapi/lib/auth/authentication.dart @@ -1,7 +1,7 @@ part of openapi.api; abstract class Authentication { - - /// Apply authentication settings to header and query params. - void applyToParams(List queryParams, Map headerParams); + /// Apply authentication settings to header and query params. + void applyToParams( + List queryParams, Map headerParams); } diff --git a/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart b/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart index 6342d886689..e141c062ae0 100644 --- a/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart +++ b/samples/client/petstore/dart2/openapi/lib/auth/http_basic_auth.dart @@ -1,14 +1,15 @@ part of openapi.api; class HttpBasicAuth implements Authentication { - String username; String password; @override - void applyToParams(List queryParams, Map headerParams) { - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); + void applyToParams( + List queryParams, Map headerParams) { + String str = (username == null ? "" : username) + + ":" + + (password == null ? "" : password); headerParams["Authorization"] = "Basic " + base64.encode(utf8.encode(str)); } - } diff --git a/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart b/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart index aa08e5cdb4d..73e2ae07ea3 100644 --- a/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart +++ b/samples/client/petstore/dart2/openapi/lib/auth/oauth.dart @@ -6,7 +6,8 @@ class OAuth implements Authentication { OAuth({this.accessToken}); @override - void applyToParams(List queryParams, Map headerParams) { + void applyToParams( + List queryParams, Map headerParams) { if (accessToken != null) { headerParams["Authorization"] = "Bearer " + accessToken; } diff --git a/samples/client/petstore/dart2/openapi/lib/model/api_response.dart b/samples/client/petstore/dart2/openapi/lib/model/api_response.dart index a39d9500b29..5599d392539 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/api_response.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/api_response.dart @@ -1,11 +1,10 @@ part of openapi.api; class ApiResponse { - int code = null; - + String type = null; - + String message = null; ApiResponse(); @@ -22,23 +21,22 @@ class ApiResponse { } Map toJson() { - return { - 'code': code, - 'type': type, - 'message': message - }; + return {'code': code, 'type': type, 'message': message}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new ApiResponse.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new ApiResponse.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new ApiResponse.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new ApiResponse.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/lib/model/category.dart b/samples/client/petstore/dart2/openapi/lib/model/category.dart index b9b2481dd29..bcc59c0e893 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/category.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/category.dart @@ -1,9 +1,8 @@ part of openapi.api; class Category { - int id = null; - + String name = null; Category(); @@ -19,22 +18,22 @@ class Category { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Category.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Category.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Category.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Category.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/lib/model/order.dart b/samples/client/petstore/dart2/openapi/lib/model/order.dart index 4e264a183ef..8fa9908b07e 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/order.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/order.dart @@ -1,18 +1,17 @@ part of openapi.api; class Order { - int id = null; - + int petId = null; - + int quantity = null; - + DateTime shipDate = null; /* Order Status */ String status = null; //enum statusEnum { placed, approved, delivered, };{ - + bool complete = false; Order(); @@ -26,7 +25,8 @@ class Order { id = json['id']; petId = json['petId']; quantity = json['quantity']; - shipDate = json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); + shipDate = + json['shipDate'] == null ? null : DateTime.parse(json['shipDate']); status = json['status']; complete = json['complete']; } @@ -43,15 +43,18 @@ class Order { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Order.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Order.fromJson(value)).toList(); } - static Map mapFromJson(Map> json) { + static Map mapFromJson( + Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Order.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Order.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/lib/model/pet.dart b/samples/client/petstore/dart2/openapi/lib/model/pet.dart index da9de49b678..ab265f9d6e1 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/pet.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/pet.dart @@ -1,15 +1,14 @@ part of openapi.api; class Pet { - int id = null; - + Category category = null; - + String name = null; - + List photoUrls = []; - + List tags = []; /* pet status in the store */ String status = null; @@ -26,7 +25,9 @@ class Pet { id = json['id']; category = new Category.fromJson(json['category']); name = json['name']; - photoUrls = ((json['photoUrls'] ?? []) as List).map((item) => item as String).toList(); + photoUrls = ((json['photoUrls'] ?? []) as List) + .map((item) => item as String) + .toList(); tags = Tag.listFromJson(json['tags']); status = json['status']; } @@ -43,15 +44,17 @@ class Pet { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Pet.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Pet.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Pet.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Pet.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/lib/model/tag.dart b/samples/client/petstore/dart2/openapi/lib/model/tag.dart index 315a326adb7..ce683e031c4 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/tag.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/tag.dart @@ -1,9 +1,8 @@ part of openapi.api; class Tag { - int id = null; - + String name = null; Tag(); @@ -19,22 +18,21 @@ class Tag { } Map toJson() { - return { - 'id': id, - 'name': name - }; + return {'id': id, 'name': name}; } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new Tag.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new Tag.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new Tag.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new Tag.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/openapi/lib/model/user.dart b/samples/client/petstore/dart2/openapi/lib/model/user.dart index 0e4cc2104c7..faa02b1ad13 100644 --- a/samples/client/petstore/dart2/openapi/lib/model/user.dart +++ b/samples/client/petstore/dart2/openapi/lib/model/user.dart @@ -1,19 +1,18 @@ part of openapi.api; class User { - int id = null; - + String username = null; - + String firstName = null; - + String lastName = null; - + String email = null; - + String password = null; - + String phone = null; /* User Status */ int userStatus = null; @@ -50,15 +49,17 @@ class User { } static List listFromJson(List json) { - return json == null ? new List() : json.map((value) => new User.fromJson(value)).toList(); + return json == null + ? new List() + : json.map((value) => new User.fromJson(value)).toList(); } static Map mapFromJson(Map> json) { var map = new Map(); if (json != null && json.length > 0) { - json.forEach((String key, Map value) => map[key] = new User.fromJson(value)); + json.forEach((String key, Map value) => + map[key] = new User.fromJson(value)); } return map; } } - diff --git a/samples/client/petstore/dart2/petstore/pom.xml b/samples/client/petstore/dart2/petstore/pom.xml index bec050a7944..f3332da5e1a 100644 --- a/samples/client/petstore/dart2/petstore/pom.xml +++ b/samples/client/petstore/dart2/petstore/pom.xml @@ -26,6 +26,19 @@ exec-maven-plugin 1.2.1 + + export-dartfmt + pre-install-test + + exec + + + export + + DART_FMT_PATH=/usr/local/bin/dartfmt + + + pub-get pre-integration-test From cc537741803ecafdb1545838bff91cc153f082af Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 2 Sep 2018 18:01:34 +0800 Subject: [PATCH 36/74] better process handling in Go postProcessFile (#950) --- .../codegen/languages/AbstractGoCodegen.java | 17 ++++++++++++----- .../go/go-petstore/.openapi-generator/VERSION | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java index d896e9050e2..a51e937cca7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java @@ -613,6 +613,11 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege return; } + String goFmtPath = System.getenv("GO_FMT_PATH"); + if (StringUtils.isEmpty(goFmtPath)) { + return; // skip if GO_FMT_PATH env variable is not defined + } + // only procees the following type (or we can simply rely on the file extension to check if it's a Go file) Set supportedFileType = new HashSet( Arrays.asList( @@ -625,17 +630,19 @@ public abstract class AbstractGoCodegen extends DefaultCodegen implements Codege return; } - String goFmtPath = System.getenv("GO_FMT_PATH"); - // only process files with go extension if ("go".equals(FilenameUtils.getExtension(file.toString()))) { // currently only support "gofmt -w yourcode.go" // another way is "go fmt path/to/your/package" String command = goFmtPath + " -w " + file.toString(); try { - Runtime.getRuntime().exec(command); - } catch (IOException e) { - LOGGER.error("Error running the command: " + command); + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}): {}", command, p.exitValue()); + } + } catch (Exception e) { + LOGGER.error("Error running the command ({}): {}", command, e.getMessage()); } LOGGER.info("Successfully executed: " + command); } diff --git a/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION b/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION +++ b/samples/client/petstore/go/go-petstore/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file From 8a034ce06388c08f09ce2552986224cc55d05ed1 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Sun, 2 Sep 2018 18:21:53 +0500 Subject: [PATCH 37/74] [PHP] Add interface/abstract/trait helpers (#906) * [PHP] Enhance interfaces, abstracts and traits It would be helpful to set prefix/suffix for all interfaces, abstracts and traits in one place. Defaults are set to follow "PSR Naming Conventions". If user will ask we can add prefix/suffix generator options in future. I don't see modelPrefix generator option, so I assume it's not important now. Ref: https://www.php-fig.org/bylaws/psr-naming-conventions/ * [Slim] Refactor to use new helpers * [Slim] Refresh samples --- .../codegen/languages/AbstractPhpCodegen.java | 41 +++++++++++++++++++ .../languages/PhpSlimServerCodegen.java | 2 +- .../AbstractApiController.mustache | 2 +- .../resources/php-slim-server/api.mustache | 6 +-- .../php-slim/lib/Api/AnotherFakeApi.php | 2 +- .../petstore/php-slim/lib/Api/FakeApi.php | 22 +++++----- .../lib/Api/FakeClassnameTags123Api.php | 2 +- .../petstore/php-slim/lib/Api/PetApi.php | 18 ++++---- .../petstore/php-slim/lib/Api/StoreApi.php | 8 ++-- .../petstore/php-slim/lib/Api/UserApi.php | 16 ++++---- 10 files changed, 80 insertions(+), 39 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java index 2b27fdbae19..2490293204d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java @@ -69,6 +69,9 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg protected String variableNamingConvention = "snake_case"; protected String apiDocPath = docsBasePath + File.separator + apiDirName; protected String modelDocPath = docsBasePath + File.separator + modelDirName; + protected String interfaceNamePrefix = "", interfaceNameSuffix = "Interface"; + protected String abstractNamePrefix = "Abstract", abstractNameSuffix = ""; + protected String traitNamePrefix = "", traitNameSuffix = "Trait"; public AbstractPhpCodegen() { super(); @@ -241,6 +244,14 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg // make test path available in mustache template additionalProperties.put("testBasePath", testBasePath); + // make class prefixes and suffixes available in mustache templates + additionalProperties.put("interfaceNamePrefix", interfaceNamePrefix); + additionalProperties.put("interfaceNameSuffix", interfaceNameSuffix); + additionalProperties.put("abstractNamePrefix", abstractNamePrefix); + additionalProperties.put("abstractNameSuffix", abstractNameSuffix); + additionalProperties.put("traitNamePrefix", traitNamePrefix); + additionalProperties.put("traitNameSuffix", traitNameSuffix); + // apache v2 license // supportingFiles.add(new SupportingFile("LICENSE", "", "LICENSE")); @@ -487,6 +498,36 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg return toModelName(name) + "Test"; } + /** + * Output the proper interface name (capitalized). + * + * @param name the name of the interface + * @return capitalized model name + */ + public String toInterfaceName(final String name) { + return org.openapitools.codegen.utils.StringUtils.camelize(interfaceNamePrefix + name + interfaceNameSuffix); + } + + /** + * Output the proper abstract class name (capitalized). + * + * @param name the name of the class + * @return capitalized abstract class name + */ + public String toAbstractName(final String name) { + return org.openapitools.codegen.utils.StringUtils.camelize(abstractNamePrefix + name + abstractNameSuffix); + } + + /** + * Output the proper trait name (capitalized). + * + * @param name the name of the trait + * @return capitalized trait name + */ + public String toTraitName(final String name) { + return org.openapitools.codegen.utils.StringUtils.camelize(traitNamePrefix + name + traitNameSuffix); + } + @Override public String toOperationId(String operationId) { // throw exception if method name is empty diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index ea3549c7af2..abf676d4fec 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -125,7 +125,7 @@ public class PhpSlimServerCodegen extends AbstractPhpCodegen { supportingFiles.add(new SupportingFile("composer.mustache", "", "composer.json")); supportingFiles.add(new SupportingFile("index.mustache", "", "index.php")); supportingFiles.add(new SupportingFile(".htaccess", "", ".htaccess")); - supportingFiles.add(new SupportingFile("AbstractApiController.mustache", toSrcPath(invokerPackage, srcBasePath), "AbstractApiController.php")); + supportingFiles.add(new SupportingFile("AbstractApiController.mustache", toSrcPath(invokerPackage, srcBasePath), toAbstractName("ApiController") + ".php")); supportingFiles.add(new SupportingFile("SlimRouter.mustache", toSrcPath(invokerPackage, srcBasePath), "SlimRouter.php")); supportingFiles.add(new SupportingFile("phpunit.xml.mustache", "", "phpunit.xml.dist")); } diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache index 4ba2ef121cb..ab214f671fa 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/AbstractApiController.mustache @@ -44,7 +44,7 @@ namespace {{invokerPackage}}; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -abstract class AbstractApiController +abstract class {{abstractNamePrefix}}ApiController{{abstractNameSuffix}} { /** diff --git a/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache b/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache index 1bc94ad3cdb..832374d761b 100644 --- a/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache +++ b/modules/openapi-generator/src/main/resources/php-slim-server/api.mustache @@ -34,7 +34,7 @@ */ namespace {{apiPackage}}; -use {{invokerPackage}}\AbstractApiController; +use {{invokerPackage}}\{{abstractNamePrefix}}ApiController{{abstractNameSuffix}}; /** * {{classname}} Class Doc Comment @@ -46,11 +46,11 @@ use {{invokerPackage}}\AbstractApiController; * @author OpenAPI Generator team * @link https://github.com/openapitools/openapi-generator */ -class {{classname}} extends AbstractApiController +class {{classname}} extends {{abstractNamePrefix}}ApiController{{abstractNameSuffix}} { {{#operations}} {{#operation}} - + /** * {{httpMethod}} {{operationId}} {{#summary}} diff --git a/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php b/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php index 80b1a67e427..31a641e5528 100644 --- a/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php +++ b/samples/server/petstore/php-slim/lib/Api/AnotherFakeApi.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class AnotherFakeApi extends AbstractApiController { - + /** * PATCH call123TestSpecialTags * Summary: To test special tags diff --git a/samples/server/petstore/php-slim/lib/Api/FakeApi.php b/samples/server/petstore/php-slim/lib/Api/FakeApi.php index 3d69b510d03..c93048cdfe5 100644 --- a/samples/server/petstore/php-slim/lib/Api/FakeApi.php +++ b/samples/server/petstore/php-slim/lib/Api/FakeApi.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class FakeApi extends AbstractApiController { - + /** * POST fakeOuterBooleanSerialize * Notes: Test serialization of outer boolean types @@ -55,7 +55,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing fakeOuterBooleanSerialize as a POST method ?'); return $response; } - + /** * POST fakeOuterCompositeSerialize * Notes: Test serialization of object with outer number type @@ -71,7 +71,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing fakeOuterCompositeSerialize as a POST method ?'); return $response; } - + /** * POST fakeOuterNumberSerialize * Notes: Test serialization of outer number types @@ -87,7 +87,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing fakeOuterNumberSerialize as a POST method ?'); return $response; } - + /** * POST fakeOuterStringSerialize * Notes: Test serialization of outer string types @@ -103,7 +103,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing fakeOuterStringSerialize as a POST method ?'); return $response; } - + /** * PUT testBodyWithFileSchema * Notes: For this test, the body for this request much reference a schema named `File`. @@ -118,7 +118,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testBodyWithFileSchema as a PUT method ?'); return $response; } - + /** * PUT testBodyWithQueryParams * @@ -134,7 +134,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testBodyWithQueryParams as a PUT method ?'); return $response; } - + /** * PATCH testClientModel * Summary: To test \"client\" model @@ -151,7 +151,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testClientModel as a PATCH method ?'); return $response; } - + /** * POST testEndpointParameters * Summary: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 @@ -180,7 +180,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testEndpointParameters as a POST method ?'); return $response; } - + /** * GET testEnumParameters * Summary: To test enum parameters @@ -205,7 +205,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testEnumParameters as a GET method ?'); return $response; } - + /** * POST testInlineAdditionalProperties * Summary: test inline additionalProperties @@ -220,7 +220,7 @@ class FakeApi extends AbstractApiController $response->write('How about implementing testInlineAdditionalProperties as a POST method ?'); return $response; } - + /** * GET testJsonFormData * Summary: test json serialization of form data diff --git a/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php b/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php index a245034eaa1..c4699994049 100644 --- a/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php +++ b/samples/server/petstore/php-slim/lib/Api/FakeClassnameTags123Api.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class FakeClassnameTags123Api extends AbstractApiController { - + /** * PATCH testClassname * Summary: To test class name in snake case diff --git a/samples/server/petstore/php-slim/lib/Api/PetApi.php b/samples/server/petstore/php-slim/lib/Api/PetApi.php index b8ddd815a89..08fd51b46e9 100644 --- a/samples/server/petstore/php-slim/lib/Api/PetApi.php +++ b/samples/server/petstore/php-slim/lib/Api/PetApi.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class PetApi extends AbstractApiController { - + /** * POST addPet * Summary: Add a new pet to the store @@ -54,7 +54,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing addPet as a POST method ?'); return $response; } - + /** * DELETE deletePet * Summary: Deletes a pet @@ -71,7 +71,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing deletePet as a DELETE method ?'); return $response; } - + /** * GET findPetsByStatus * Summary: Finds Pets by status @@ -89,7 +89,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing findPetsByStatus as a GET method ?'); return $response; } - + /** * GET findPetsByTags * Summary: Finds Pets by tags @@ -107,7 +107,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing findPetsByTags as a GET method ?'); return $response; } - + /** * GET getPetById * Summary: Find pet by ID @@ -124,7 +124,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing getPetById as a GET method ?'); return $response; } - + /** * PUT updatePet * Summary: Update an existing pet @@ -139,7 +139,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing updatePet as a PUT method ?'); return $response; } - + /** * POST updatePetWithForm * Summary: Updates a pet in the store with form data @@ -156,7 +156,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; } - + /** * POST uploadFile * Summary: uploads an image @@ -174,7 +174,7 @@ class PetApi extends AbstractApiController $response->write('How about implementing uploadFile as a POST method ?'); return $response; } - + /** * POST uploadFileWithRequiredFile * Summary: uploads an image (required) diff --git a/samples/server/petstore/php-slim/lib/Api/StoreApi.php b/samples/server/petstore/php-slim/lib/Api/StoreApi.php index 8fcb48a4114..f668236a34f 100644 --- a/samples/server/petstore/php-slim/lib/Api/StoreApi.php +++ b/samples/server/petstore/php-slim/lib/Api/StoreApi.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class StoreApi extends AbstractApiController { - + /** * DELETE deleteOrder * Summary: Delete purchase order by ID @@ -55,7 +55,7 @@ class StoreApi extends AbstractApiController $response->write('How about implementing deleteOrder as a DELETE method ?'); return $response; } - + /** * GET getInventory * Summary: Returns pet inventories by status @@ -71,7 +71,7 @@ class StoreApi extends AbstractApiController $response->write('How about implementing getInventory as a GET method ?'); return $response; } - + /** * GET getOrderById * Summary: Find purchase order by ID @@ -88,7 +88,7 @@ class StoreApi extends AbstractApiController $response->write('How about implementing getOrderById as a GET method ?'); return $response; } - + /** * POST placeOrder * Summary: Place an order for a pet diff --git a/samples/server/petstore/php-slim/lib/Api/UserApi.php b/samples/server/petstore/php-slim/lib/Api/UserApi.php index 39d48b919f4..ef9863cfc33 100644 --- a/samples/server/petstore/php-slim/lib/Api/UserApi.php +++ b/samples/server/petstore/php-slim/lib/Api/UserApi.php @@ -39,7 +39,7 @@ use OpenAPIServer\AbstractApiController; */ class UserApi extends AbstractApiController { - + /** * POST createUser * Summary: Create user @@ -55,7 +55,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing createUser as a POST method ?'); return $response; } - + /** * POST createUsersWithArrayInput * Summary: Creates list of users with given input array @@ -70,7 +70,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); return $response; } - + /** * POST createUsersWithListInput * Summary: Creates list of users with given input array @@ -85,7 +85,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing createUsersWithListInput as a POST method ?'); return $response; } - + /** * DELETE deleteUser * Summary: Delete user @@ -101,7 +101,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing deleteUser as a DELETE method ?'); return $response; } - + /** * GET getUserByName * Summary: Get user by user name @@ -117,7 +117,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing getUserByName as a GET method ?'); return $response; } - + /** * GET loginUser * Summary: Logs user into the system @@ -135,7 +135,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing loginUser as a GET method ?'); return $response; } - + /** * GET logoutUser * Summary: Logs out current logged in user session @@ -149,7 +149,7 @@ class UserApi extends AbstractApiController $response->write('How about implementing logoutUser as a GET method ?'); return $response; } - + /** * PUT updateUser * Summary: Updated user From cabc1af823a919dc034cf4ba4c1fb6fbb45b6ada Mon Sep 17 00:00:00 2001 From: William Cheng Date: Mon, 3 Sep 2018 17:43:25 +0800 Subject: [PATCH 38/74] Add swipesight to techcomm & his company to readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75970d8bf52..f9e48fd6fcd 100644 --- a/README.md +++ b/README.md @@ -470,6 +470,7 @@ Here are some companies/projects (alphabetical order) using OpenAPI Generator in - [Bithost GmbH](https://www.bithost.ch) - [Boxever](https://www.boxever.com/) - [GMO Pepabo](https://pepabo.com/en/) +- [JustStar](https://www.juststarinfo.com) - [Raiffeisen Schweiz Genossenschaft](https://www.raiffeisen.ch) - [RepreZen API Studio](https://www.reprezen.com/swagger-openapi-code-generation-api-first-microservices-enterprise-development) - [REST United](https://restunited.com) @@ -633,7 +634,7 @@ If you want to join the committee, please kindly apply by sending an email to te | C++ | @ravinikam (2017/07) @stkrwork (2017/07) @fvarose (2017/11) @etherealjoy (2018/02) @martindelille (2018/03) | | C# | @mandrean (2017/08) @jimschubert (2017/09) | | Clojure | | -| Dart | @ircecho (2017/07) | +| Dart | @ircecho (2017/07) @swipesight (2018/09) | | Eiffel | @jvelilla (2017/09) | | Elixir | | | Elm | | From 9b38618f68d39547285590140524c4986173fa74 Mon Sep 17 00:00:00 2001 From: Benjamin Gill Date: Mon, 3 Sep 2018 13:17:27 +0100 Subject: [PATCH 39/74] [rust-server] Restore support for nullable (#936) * Restore support for nullable in rust-server Accounts for changes in https://github.com/OpenAPITools/openapi-generator/pull/930. Adds a nullable field to the sample to reduce the risk of this regressing again in future. * Add test for required nullable field --- .../resources/rust-server/models.mustache | 12 +++++----- .../2_0/rust-server/rust-server-test.yaml | 11 ++++++++++ .../output/rust-server-test/api/openapi.yaml | 11 ++++++++++ .../output/rust-server-test/src/models.rs | 22 +++++++++++++++++++ 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/rust-server/models.mustache b/modules/openapi-generator/src/main/resources/rust-server/models.mustache index 5d83eb9bf46..aa106c2b700 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/models.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/models.mustache @@ -145,19 +145,19 @@ pub struct {{{classname}}} { {{/description}}{{#isEnum}} // Note: inline enums are not fully supported by openapi-generator {{/isEnum}} #[serde(rename = "{{{baseName}}}")]{{#vendorExtensions}}{{#itemXmlName}} #[serde(serialize_with = "wrap_in_{{{itemXmlName}}}")]{{/itemXmlName}}{{/vendorExtensions}}{{#required}} - pub {{{name}}}: {{#vendorExtensions}}{{#x-nullable}}swagger::Nullable<{{/x-nullable}}{{/vendorExtensions}}{{{dataType}}}{{#vendorExtensions}}{{#x-nullable}}>{{/x-nullable}}{{/vendorExtensions}}, -{{/required}}{{^required}}{{#vendorExtensions}}{{#x-nullable}} #[serde(deserialize_with = "swagger::nullable_format::deserialize_optional_nullable")] - #[serde(default = "swagger::nullable_format::default_optional_nullable")] -{{/x-nullable}}{{/vendorExtensions}} + pub {{{name}}}: {{#isNullable}}swagger::Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}, +{{/required}}{{^required}}{{#isNullable}} + #[serde(deserialize_with = "swagger::nullable_format::deserialize_optional_nullable")] + #[serde(default = "swagger::nullable_format::default_optional_nullable")]{{/isNullable}} #[serde(skip_serializing_if="Option::is_none")] - pub {{{name}}}: Option<{{#vendorExtensions}}{{#x-nullable}}swagger::Nullable<{{/x-nullable}}{{/vendorExtensions}}{{#isListContainer}}Vec<{{#items}}{{{dataType}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{{dataType}}}{{/isListContainer}}{{#vendorExtensions}}{{#x-nullable}}>{{/x-nullable}}{{/vendorExtensions}}>, + pub {{{name}}}: Option<{{#isNullable}}swagger::Nullable<{{/isNullable}}{{#isListContainer}}Vec<{{#items}}{{{dataType}}}{{/items}}>{{/isListContainer}}{{^isListContainer}}{{{dataType}}}{{/isListContainer}}{{#isNullable}}>{{/isNullable}}>, {{/required}} {{/vars}} } impl {{{classname}}} { - pub fn new({{#vars}}{{^defaultValue}}{{{name}}}: {{#vendorExtensions}}{{#x-nullable}}swagger::Nullable<{{/x-nullable}}{{/vendorExtensions}}{{{dataType}}}{{#vendorExtensions}}{{#x-nullable}}>{{/x-nullable}}{{/vendorExtensions}}, {{/defaultValue}}{{/vars}}) -> {{{classname}}} { + pub fn new({{#vars}}{{^defaultValue}}{{{name}}}: {{#isNullable}}swagger::Nullable<{{/isNullable}}{{{dataType}}}{{#isNullable}}>{{/isNullable}}, {{/defaultValue}}{{/vars}}) -> {{{classname}}} { {{{classname}}} { {{#vars}} {{{name}}}: {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}{{{name}}}{{/defaultValue}}, {{/vars}} diff --git a/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml b/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml index b1874cc158e..1aff69d888b 100644 --- a/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml +++ b/modules/openapi-generator/src/test/resources/2_0/rust-server/rust-server-test.yaml @@ -19,3 +19,14 @@ definitions: additionalProperties: type: string example: "foo" + aNullableContainer: + type: object + properties: + NullableThing: + type: string + x-nullable: true + RequiredNullableThing: + type: string + x-nullable: true + required: + - RequiredNullableThing diff --git a/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml b/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml index 65b747a3f8b..3801e933580 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml +++ b/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml @@ -19,4 +19,15 @@ components: description: An additionalPropertiesObject example: foo type: object + aNullableContainer: + properties: + NullableThing: + nullable: true + type: string + RequiredNullableThing: + nullable: true + type: string + required: + - RequiredNullableThing + type: object diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs index 796339d1303..f4c3e1b36a3 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/models.rs @@ -10,6 +10,28 @@ use models; use swagger; +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ANullableContainer { + #[serde(rename = "NullableThing")] + #[serde(deserialize_with = "swagger::nullable_format::deserialize_optional_nullable")] + #[serde(default = "swagger::nullable_format::default_optional_nullable")] + #[serde(skip_serializing_if="Option::is_none")] + pub nullable_thing: Option>, + + #[serde(rename = "RequiredNullableThing")] + pub required_nullable_thing: swagger::Nullable, + +} + +impl ANullableContainer { + pub fn new(required_nullable_thing: swagger::Nullable, ) -> ANullableContainer { + ANullableContainer { + nullable_thing: None, + required_nullable_thing: required_nullable_thing, + } + } +} + /// An additionalPropertiesObject #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AdditionalPropertiesObject { From b24b6df448878cd8eccae234644e5123785295b5 Mon Sep 17 00:00:00 2001 From: Erik Timmers Date: Tue, 4 Sep 2018 08:24:43 +0200 Subject: [PATCH 40/74] [elm] Add support for Elm 0.19 (#937) * [elm] Add support for Elm 0.19 * add elm 0.18 samples, update cli option * fix elm 0.18 compile test * [elm] 0.19 fixes & improvements --- bin/elm-0.18-petstore.sh | 32 +++++ .../codegen/languages/ElmClientCodegen.java | 107 +++++++++++--- .../src/main/resources/elm/Byte.mustache | 1 - ...DateOnly.mustache => DateOnly018.mustache} | 0 .../main/resources/elm/DateOnly019.mustache | 34 +++++ ...DateTime.mustache => DateTime018.mustache} | 0 .../main/resources/elm/DateTime019.mustache | 32 +++++ .../elm/{Main.mustache => Main018.mustache} | 43 ++++-- .../src/main/resources/elm/Main019.mustache | 61 ++++++++ .../main/resources/elm/aliasDecoder.mustache | 4 +- .../src/main/resources/elm/api.mustache | 4 +- .../src/main/resources/elm/elm.mustache | 28 ++++ .../main/resources/elm/fieldDecoder.mustache | 2 +- .../main/resources/elm/fieldEncoder.mustache | 2 +- .../src/main/resources/elm/model.mustache | 4 +- .../resources/elm/modelTypeArray.mustache | 6 +- .../elm/modelTypeDiscriminator.mustache | 2 +- .../resources/elm/modelTypePrimitive.mustache | 4 +- .../src/main/resources/elm/union.mustache | 2 +- .../main/resources/elm/unionDecoder.mustache | 4 +- .../main/resources/elm/unionEncoder.mustache | 4 +- pom.xml | 3 +- samples/client/petstore/elm-0.18/.gitignore | 1 + .../elm-0.18/.openapi-generator-ignore | 23 +++ .../elm-0.18/.openapi-generator/VERSION | 1 + samples/client/petstore/elm-0.18/README.md | 10 ++ .../petstore/elm-0.18/elm-0.18-compile-test | 14 ++ .../{elm => elm-0.18}/elm-package.json | 0 samples/client/petstore/elm-0.18/pom.xml | 43 ++++++ samples/client/petstore/elm-0.18/src/Byte.elm | 18 +++ .../elm-0.18/src/Data/ApiResponse.elm | 46 ++++++ .../petstore/elm-0.18/src/Data/Category.elm | 43 ++++++ .../petstore/elm-0.18/src/Data/Order_.elm | 97 +++++++++++++ .../client/petstore/elm-0.18/src/Data/Pet.elm | 98 +++++++++++++ .../client/petstore/elm-0.18/src/Data/Tag.elm | 43 ++++++ .../petstore/elm-0.18/src/Data/User.elm | 61 ++++++++ .../client/petstore/elm-0.18/src/DateOnly.elm | 32 +++++ .../client/petstore/elm-0.18/src/DateTime.elm | 32 +++++ samples/client/petstore/elm-0.18/src/Main.elm | 60 ++++++++ .../petstore/elm-0.18/src/Request/Pet.elm | 134 ++++++++++++++++++ .../petstore/elm-0.18/src/Request/Store.elm | 81 +++++++++++ .../petstore/elm-0.18/src/Request/User.elm | 133 +++++++++++++++++ samples/client/petstore/elm/elm-compile-test | 2 +- samples/client/petstore/elm/elm.json | 28 ++++ samples/client/petstore/elm/src/Byte.elm | 1 - .../petstore/elm/src/Data/ApiResponse.elm | 4 +- .../client/petstore/elm/src/Data/Category.elm | 4 +- .../client/petstore/elm/src/Data/Order_.elm | 4 +- samples/client/petstore/elm/src/Data/Pet.elm | 8 +- samples/client/petstore/elm/src/Data/Tag.elm | 4 +- samples/client/petstore/elm/src/Data/User.elm | 4 +- samples/client/petstore/elm/src/DateOnly.elm | 20 +-- samples/client/petstore/elm/src/DateTime.elm | 18 +-- samples/client/petstore/elm/src/Main.elm | 50 ++++--- .../client/petstore/elm/src/Request/Pet.elm | 8 +- .../client/petstore/elm/src/Request/Store.elm | 2 +- shippable.yml | 2 + 57 files changed, 1398 insertions(+), 110 deletions(-) create mode 100755 bin/elm-0.18-petstore.sh rename modules/openapi-generator/src/main/resources/elm/{DateOnly.mustache => DateOnly018.mustache} (100%) create mode 100644 modules/openapi-generator/src/main/resources/elm/DateOnly019.mustache rename modules/openapi-generator/src/main/resources/elm/{DateTime.mustache => DateTime018.mustache} (100%) create mode 100644 modules/openapi-generator/src/main/resources/elm/DateTime019.mustache rename modules/openapi-generator/src/main/resources/elm/{Main.mustache => Main018.mustache} (57%) create mode 100644 modules/openapi-generator/src/main/resources/elm/Main019.mustache create mode 100644 modules/openapi-generator/src/main/resources/elm/elm.mustache create mode 100644 samples/client/petstore/elm-0.18/.gitignore create mode 100644 samples/client/petstore/elm-0.18/.openapi-generator-ignore create mode 100644 samples/client/petstore/elm-0.18/.openapi-generator/VERSION create mode 100644 samples/client/petstore/elm-0.18/README.md create mode 100755 samples/client/petstore/elm-0.18/elm-0.18-compile-test rename samples/client/petstore/{elm => elm-0.18}/elm-package.json (100%) create mode 100644 samples/client/petstore/elm-0.18/pom.xml create mode 100644 samples/client/petstore/elm-0.18/src/Byte.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/Category.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/Order_.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/Pet.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/Tag.elm create mode 100644 samples/client/petstore/elm-0.18/src/Data/User.elm create mode 100644 samples/client/petstore/elm-0.18/src/DateOnly.elm create mode 100644 samples/client/petstore/elm-0.18/src/DateTime.elm create mode 100644 samples/client/petstore/elm-0.18/src/Main.elm create mode 100644 samples/client/petstore/elm-0.18/src/Request/Pet.elm create mode 100644 samples/client/petstore/elm-0.18/src/Request/Store.elm create mode 100644 samples/client/petstore/elm-0.18/src/Request/User.elm create mode 100644 samples/client/petstore/elm/elm.json diff --git a/bin/elm-0.18-petstore.sh b/bin/elm-0.18-petstore.sh new file mode 100755 index 00000000000..d82f3628ad6 --- /dev/null +++ b/bin/elm-0.18-petstore.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g elm -t modules/openapi-generator/src/main/resources/elm -o samples/client/petstore/elm-0.18 --additional-properties elmVersion=0.18 $@" + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 3867be62e46..42b21c5d903 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -22,6 +22,7 @@ import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.NumberSchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.responses.ApiResponse; +import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenOperation; @@ -49,16 +50,19 @@ import java.util.TreeSet; public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { - private static final String X_ENCODER = "x-encoder"; - private static final String X_DECODER = "x-decoder"; + private static final String ELM_VERSION = "elmVersion"; + private static final String ENCODER = "elmEncoder"; + private static final String DECODER = "elmDecoder"; private static final String X_DISCRIMINATOR_TYPE = "x-discriminator-value"; - private static final String X_UNION_TYPE = "x-union-type"; + private static final String UNION_TYPE = "elmUnionType"; private Set customPrimitives = new HashSet(); protected String packageName = "openapi"; protected String packageVersion = "1.0.0"; + private ElmVersion elmVersion = ElmVersion.ELM_019; + public CodegenType getTag() { return CodegenType.CLIENT; } @@ -144,13 +148,52 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.clear(); + final CliOption elmVersion = new CliOption(ELM_VERSION, "Elm version: 0.18, 0.19").defaultValue("0.19"); + final Map supportedVersions = new HashMap<>(); + supportedVersions.put("0.18", "Elm 0.18"); + supportedVersions.put("0.19", "Elm 0.19"); + elmVersion.setEnum(supportedVersions); + cliOptions.add(elmVersion); + } + + @Override + public void processOpts() { + super.processOpts(); + + if (additionalProperties.containsKey(ELM_VERSION)) { + final String version = (String) additionalProperties.get(ELM_VERSION); + if ("0.18".equals(version)) { + elmVersion = ElmVersion.ELM_018; + } + } + + switch (elmVersion) { + case ELM_018: + additionalProperties.put("isElm018", true); + break; + case ELM_019: + additionalProperties.put("isElm019", true); + break; + default: + throw new RuntimeException("Undefined Elm version"); + } + supportingFiles.add(new SupportingFile("Byte.mustache", "src", "Byte.elm")); - supportingFiles.add(new SupportingFile("DateOnly.mustache", "src", "DateOnly.elm")); - supportingFiles.add(new SupportingFile("DateTime.mustache", "src", "DateTime.elm")); - supportingFiles.add(new SupportingFile("Main.mustache", "src", "Main.elm")); - supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); - supportingFiles.add(new SupportingFile("elm-package.mustache", "", "elm-package.json")); supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + + if (ElmVersion.ELM_018.equals(elmVersion)) { + supportingFiles.add(new SupportingFile("DateOnly018.mustache", "src", "DateOnly.elm")); + supportingFiles.add(new SupportingFile("DateTime018.mustache", "src", "DateTime.elm")); + supportingFiles.add(new SupportingFile("elm-package.mustache", "", "elm-package.json")); + supportingFiles.add(new SupportingFile("Main018.mustache", "src", "Main.elm")); + } + if (ElmVersion.ELM_019.equals(elmVersion)) { + supportingFiles.add(new SupportingFile("DateOnly019.mustache", "src", "DateOnly.elm")); + supportingFiles.add(new SupportingFile("DateTime019.mustache", "src", "DateTime.elm")); + supportingFiles.add(new SupportingFile("elm.mustache", "", "elm.json")); + supportingFiles.add(new SupportingFile("Main019.mustache", "src", "Main.elm")); + } } @Override @@ -279,7 +322,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { CodegenModel cm = (CodegenModel) mo.get("model"); if (cm.isEnum) { this.addEncoderAndDecoder(cm.vendorExtensions, cm.classname, false, false); - cm.vendorExtensions.put(X_UNION_TYPE, cm.classname); + cm.vendorExtensions.put(UNION_TYPE, cm.classname); } else if (cm.isAlias) { this.addEncoderAndDecoder(cm.vendorExtensions, cm.dataType, false, true); } @@ -365,11 +408,11 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { elmImport.moduleName = modulePrefix + property.complexType; elmImport.exposures = new TreeSet<>(); elmImport.exposures.add(property.complexType); - if (property.vendorExtensions.containsKey(X_DECODER)) { - elmImport.exposures.add((String) property.vendorExtensions.get(X_DECODER)); + if (property.vendorExtensions.containsKey(DECODER)) { + elmImport.exposures.add((String) property.vendorExtensions.get(DECODER)); } - if (property.vendorExtensions.containsKey(X_ENCODER)) { - elmImport.exposures.add((String) property.vendorExtensions.get(X_ENCODER)); + if (property.vendorExtensions.containsKey(ENCODER)) { + elmImport.exposures.add((String) property.vendorExtensions.get(ENCODER)); } elmImport.hasExposures = true; return elmImport; @@ -391,13 +434,13 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { for (CodegenOperation op : ops) { String path = op.path; for (CodegenParameter param : op.pathParams) { - final String var = param.isString ? param.paramName : "toString " + param.paramName; + final String var = paramToString(param); path = path.replace("{" + param.paramName + "}", "\" ++ " + var + " ++ \""); } op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", ""); if (op.bodyParam != null && !op.bodyParam.isPrimitiveType && !op.bodyParam.isMapContainer) { - final String encoder = (String) op.bodyParam.vendorExtensions.get(X_ENCODER); + final String encoder = (String) op.bodyParam.vendorExtensions.get(ENCODER); if (encoder != null) { if (!dependencies.containsKey(op.bodyParam.dataType)) { dependencies.put(op.bodyParam.dataType, new TreeSet()); @@ -409,7 +452,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { if (resp.primitiveType || resp.isMapContainer) { continue; } - final String decoder = (String) resp.vendorExtensions.get(X_DECODER); + final String decoder = (String) resp.vendorExtensions.get(DECODER); if (decoder != null) { if (!dependencies.containsKey(resp.dataType)) { dependencies.put(resp.dataType, new TreeSet()); @@ -473,6 +516,23 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { return "(Just " + value + ")"; } + private String paramToString(final CodegenParameter param) { + final String paramName = param.paramName; + if (param.isString) { + return paramName; + } + if (ElmVersion.ELM_018.equals(elmVersion)) { + return "toString " + paramName; + } + if (param.isInteger || param.isLong) { + return "String.fromInt " + paramName; + } + if (param.isFloat || param.isDouble) { + return "String.fromFloat " + paramName; + } + throw new RuntimeException("Parameter '" + paramName + "' cannot be converted to a string"); + } + @Override public String getSchemaType(Schema p) { String openAPIType = super.getSchemaType(p); @@ -507,7 +567,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { final String dataType = property.isEnum ? property.baseName : property.dataType; addEncoderAndDecoder(property.vendorExtensions, dataType, property.isMapContainer, property.isPrimitiveType && !property.isEnum); if (property.isEnum) { - property.vendorExtensions.put(X_UNION_TYPE, property.datatypeWithEnum); + property.vendorExtensions.put(UNION_TYPE, property.datatypeWithEnum); } return property; @@ -545,11 +605,11 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { encoderName = baseName + "Encoder"; decoderName = baseName + "Decoder"; } - if (!vendorExtensions.containsKey(X_ENCODER)) { - vendorExtensions.put(X_ENCODER, encoderName); + if (!vendorExtensions.containsKey(ENCODER)) { + vendorExtensions.put(ENCODER, encoderName); } - if (!vendorExtensions.containsKey(X_DECODER)) { - vendorExtensions.put(X_DECODER, decoderName); + if (!vendorExtensions.containsKey(DECODER)) { + vendorExtensions.put(DECODER, decoderName); } } @@ -559,4 +619,9 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { public Set exposures; public Boolean hasExposures; } + + private enum ElmVersion { + ELM_018, + ELM_019 + } } diff --git a/modules/openapi-generator/src/main/resources/elm/Byte.mustache b/modules/openapi-generator/src/main/resources/elm/Byte.mustache index 6974f1ed59b..da078742947 100644 --- a/modules/openapi-generator/src/main/resources/elm/Byte.mustache +++ b/modules/openapi-generator/src/main/resources/elm/Byte.mustache @@ -16,4 +16,3 @@ byteDecoder = byteEncoder : Byte -> Encode.Value byteEncoder model = Encode.string model - diff --git a/modules/openapi-generator/src/main/resources/elm/DateOnly.mustache b/modules/openapi-generator/src/main/resources/elm/DateOnly018.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/elm/DateOnly.mustache rename to modules/openapi-generator/src/main/resources/elm/DateOnly018.mustache diff --git a/modules/openapi-generator/src/main/resources/elm/DateOnly019.mustache b/modules/openapi-generator/src/main/resources/elm/DateOnly019.mustache new file mode 100644 index 00000000000..c18b180ba11 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/elm/DateOnly019.mustache @@ -0,0 +1,34 @@ +module DateOnly exposing (DateOnly, dateOnlyDecoder, dateOnlyEncoder) + +import Iso8601 +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode +import Result +import Time + + +type alias DateOnly = + Time.Posix + + +dateOnlyDecoder : Decoder DateOnly +dateOnlyDecoder = + Decode.string + |> Decode.andThen decodeIsoString + + +dateOnlyEncoder : DateOnly -> Encode.Value +dateOnlyEncoder model = + Iso8601.fromTime model + |> String.left 10 + |> Encode.string + + +decodeIsoString : String -> Decoder DateOnly +decodeIsoString str = + case Iso8601.toTime (str ++ "T00:00:00.000Z") of + Result.Ok posix -> + Decode.succeed posix + + Result.Err _ -> + Decode.fail <| "Invalid date: " ++ str diff --git a/modules/openapi-generator/src/main/resources/elm/DateTime.mustache b/modules/openapi-generator/src/main/resources/elm/DateTime018.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/elm/DateTime.mustache rename to modules/openapi-generator/src/main/resources/elm/DateTime018.mustache diff --git a/modules/openapi-generator/src/main/resources/elm/DateTime019.mustache b/modules/openapi-generator/src/main/resources/elm/DateTime019.mustache new file mode 100644 index 00000000000..28882c8cfa6 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/elm/DateTime019.mustache @@ -0,0 +1,32 @@ +module DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) + +import Iso8601 +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode +import Result +import Time + + +type alias DateTime = + Time.Posix + + +dateTimeDecoder : Decoder DateTime +dateTimeDecoder = + Decode.string + |> Decode.andThen decodeIsoString + + +dateTimeEncoder : DateTime -> Encode.Value +dateTimeEncoder model = + Encode.string <| Iso8601.fromTime model + + +decodeIsoString : String -> Decoder DateTime +decodeIsoString str = + case Iso8601.toTime str of + Result.Ok posix -> + Decode.succeed posix + + Result.Err _ -> + Decode.fail <| "Invalid date: " ++ str diff --git a/modules/openapi-generator/src/main/resources/elm/Main.mustache b/modules/openapi-generator/src/main/resources/elm/Main018.mustache similarity index 57% rename from modules/openapi-generator/src/main/resources/elm/Main.mustache rename to modules/openapi-generator/src/main/resources/elm/Main018.mustache index b0a2ce0b52c..23274d541c1 100644 --- a/modules/openapi-generator/src/main/resources/elm/Main.mustache +++ b/modules/openapi-generator/src/main/resources/elm/Main018.mustache @@ -1,9 +1,6 @@ -module Main exposing (..) +module Main exposing (main) -import Json.Decode as Decode -import Html exposing (Html, button, div, text) -import Html.Events exposing (onClick) -import Http +import Html exposing (Html) main : Program Never Model Msg @@ -15,29 +12,49 @@ main = , subscriptions = subscriptions } + + +-- MODEL + + type alias Model = - { status : Maybe Int + { value : Int } -init : (Model, Cmd Msg) + +init : ( Model, Cmd Msg ) init = - ( Model Nothing, Cmd.none ) + ( Model 0, Cmd.none ) + + + +-- UPDATE + type Msg = NoOp -update : Msg -> Model -> (Model, Cmd Msg) + +update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of NoOp -> ( model, Cmd.none ) -view : Model -> Html Msg -view model = - Html.text "main" + +-- SUBSCRIPTIONS subscriptions : Model -> Sub Msg -subscriptions model = +subscriptions _ = Sub.none + + + +-- VIEW + + +view : Model -> Html Msg +view _ = + Html.text "main" diff --git a/modules/openapi-generator/src/main/resources/elm/Main019.mustache b/modules/openapi-generator/src/main/resources/elm/Main019.mustache new file mode 100644 index 00000000000..7c9ddd056d3 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/elm/Main019.mustache @@ -0,0 +1,61 @@ +module Main exposing (main) + +import Browser +import Html exposing (Html) + + +main : Program () Model Msg +main = + Browser.element + { init = init + , view = view + , update = update + , subscriptions = subscriptions + } + + + +-- MODEL + + +type alias Model = + { value : Int + } + + +init : () -> ( Model, Cmd Msg ) +init _ = + ( Model 0, Cmd.none ) + + + +-- UPDATE + + +type Msg + = NoOp + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions _ = + Sub.none + + + +-- VIEW + + +view : Model -> Html Msg +view _ = + Html.text "main" diff --git a/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache index 48154f0d4f1..8a20470d27d 100644 --- a/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/aliasDecoder.mustache @@ -1,7 +1,7 @@ {{classVarName}}Decoder : Decoder {{classname}} {{classVarName}}Decoder = - decode {{classname}} + {{#isElm018}}decode{{/isElm018}}{{#isElm019}}Decode.succeed{{/isElm019}} {{classname}} {{#allVars}} {{^discriminatorValue}} |> {{>fieldDecoder}} {{/discriminatorValue}} -{{/allVars}} \ No newline at end of file +{{/allVars}} diff --git a/modules/openapi-generator/src/main/resources/elm/api.mustache b/modules/openapi-generator/src/main/resources/elm/api.mustache index df085dfa437..ebe53eeac93 100644 --- a/modules/openapi-generator/src/main/resources/elm/api.mustache +++ b/modules/openapi-generator/src/main/resources/elm/api.mustache @@ -23,8 +23,8 @@ basePath = { method = "{{httpMethod}}" , url = basePath ++ {{{path}}} , headers = [] - , body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.x-encoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}} - , expect = {{^responses}}Http.expectStringResponse (\_ -> Ok ()){{/responses}}{{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{x-decoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}} + , body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.elmEncoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}} + , expect = {{^responses}}Http.expectStringResponse (\_ -> Ok ()){{/responses}}{{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{elmDecoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}} , timeout = Just 30000 , withCredentials = False } diff --git a/modules/openapi-generator/src/main/resources/elm/elm.mustache b/modules/openapi-generator/src/main/resources/elm/elm.mustache new file mode 100644 index 00000000000..6028a740feb --- /dev/null +++ b/modules/openapi-generator/src/main/resources/elm/elm.mustache @@ -0,0 +1,28 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.0", + "dependencies": { + "direct": { + "NoRedInk/elm-json-decode-pipeline": "1.0.0", + "elm/browser": "1.0.0", + "elm/core": "1.0.0", + "elm/html": "1.0.0", + "elm/http": "1.0.0", + "elm/json": "1.0.0", + "elm/time": "1.0.0", + "rtfeldman/elm-iso8601-date-strings": "1.0.0" + }, + "indirect": { + "elm/parser": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.0" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache index 3a63d1895bc..6f7db61ddbd 100644 --- a/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/fieldDecoder.mustache @@ -1 +1 @@ -{{#required}}required{{/required}}{{^required}}optional{{/required}} "{{baseName}}" {{^required}}(Decode.nullable {{/required}}{{#isContainer}}(Decode.list {{/isContainer}}{{vendorExtensions.x-decoder}}{{#isContainer}}){{/isContainer}}{{^required}}){{/required}}{{^required}} {{{defaultValue}}}{{/required}} \ No newline at end of file +{{#required}}required{{/required}}{{^required}}optional{{/required}} "{{baseName}}" {{^required}}(Decode.nullable {{/required}}{{#isContainer}}(Decode.list {{/isContainer}}{{vendorExtensions.elmDecoder}}{{#isContainer}}){{/isContainer}}{{^required}}){{/required}}{{^required}} {{{defaultValue}}}{{/required}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache index 64131c7c227..ccd982a96c6 100644 --- a/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/fieldEncoder.mustache @@ -1 +1 @@ -( "{{baseName}}", {{#discriminatorValue}}Encode.string "{{discriminatorValue}}"{{/discriminatorValue}}{{^discriminatorValue}}{{^required}}withDefault Encode.null (map {{/required}}{{#isContainer}}(Encode.list << List.map {{/isContainer}}{{vendorExtensions.x-encoder}}{{#isContainer}}){{/isContainer}} model.{{name}}{{^required}}){{/required}}{{/discriminatorValue}} ) \ No newline at end of file +( "{{baseName}}", {{#discriminatorValue}}Encode.string "{{discriminatorValue}}"{{/discriminatorValue}}{{^discriminatorValue}}{{^required}}withDefault Encode.null (map {{/required}}{{#isContainer}}(Encode.list {{#isElm018}}<< List.map {{/isElm018}}{{/isContainer}}{{vendorExtensions.elmEncoder}}{{#isContainer}}){{/isContainer}} model.{{name}}{{^required}}){{/required}}{{/discriminatorValue}} ) \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/model.mustache b/modules/openapi-generator/src/main/resources/elm/model.mustache index 5a0f0722605..2fdecbf47a1 100644 --- a/modules/openapi-generator/src/main/resources/elm/model.mustache +++ b/modules/openapi-generator/src/main/resources/elm/model.mustache @@ -1,9 +1,9 @@ {{>licenseInfo}} -module Data.{{classname}} exposing ({{#models}}{{#model}}{{classname}}{{#hasChildren}}(..){{/hasChildren}}{{#isEnum}}(..){{/isEnum}}{{^isEnum}}{{#vars}}{{#isEnum}}, {{vendorExtensions.x-union-type}}(..){{/isEnum}}{{/vars}}{{/isEnum}}, {{classVarName}}Decoder, {{classVarName}}Encoder{{/model}}{{/models}}) +module Data.{{classname}} exposing ({{#models}}{{#model}}{{classname}}{{#hasChildren}}(..){{/hasChildren}}{{#isEnum}}(..){{/isEnum}}{{^isEnum}}{{#vars}}{{#isEnum}}, {{vendorExtensions.elmUnionType}}(..){{/isEnum}}{{/vars}}{{/isEnum}}, {{classVarName}}Decoder, {{classVarName}}Encoder{{/model}}{{/models}}) {{>imports}}import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing ({{#isElm018}}decode, {{/isElm018}}optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) {{#models}} diff --git a/modules/openapi-generator/src/main/resources/elm/modelTypeArray.mustache b/modules/openapi-generator/src/main/resources/elm/modelTypeArray.mustache index 7d3c6d437a4..30f67fc37fb 100644 --- a/modules/openapi-generator/src/main/resources/elm/modelTypeArray.mustache +++ b/modules/openapi-generator/src/main/resources/elm/modelTypeArray.mustache @@ -4,9 +4,9 @@ type alias {{classname}} = {{classVarName}}Decoder : Decoder {{classname}} {{classVarName}}Decoder = - Decode.list {{vendorExtensions.x-decoder}} + Decode.list {{vendorExtensions.elmDecoder}} {{classVarName}}Encoder : {{classname}} -> Encode.Value -{{classVarName}}Encoder model = - Encode.list (List.map {{vendorExtensions.x-encoder}} model) +{{classVarName}}Encoder items = + Encode.list {{#isElm018}}(List.map {{/isElm018}}{{vendorExtensions.elmEncoder}} items{{#isElm018}}){{/isElm018}} diff --git a/modules/openapi-generator/src/main/resources/elm/modelTypeDiscriminator.mustache b/modules/openapi-generator/src/main/resources/elm/modelTypeDiscriminator.mustache index d00b9de18d4..728c7a729ff 100644 --- a/modules/openapi-generator/src/main/resources/elm/modelTypeDiscriminator.mustache +++ b/modules/openapi-generator/src/main/resources/elm/modelTypeDiscriminator.mustache @@ -21,7 +21,7 @@ type {{classname}} _ -> Decode.fail <| "Trying to decode {{classname}}, but {{{discriminatorName}}} " - ++ toString {{{discriminatorName}}} ++ " is not supported." + ++ {{{discriminatorName}}} ++ " is not supported." {{classVarName}}Encoder : {{classname}} -> Encode.Value diff --git a/modules/openapi-generator/src/main/resources/elm/modelTypePrimitive.mustache b/modules/openapi-generator/src/main/resources/elm/modelTypePrimitive.mustache index a1d872f1451..7c671f24a90 100644 --- a/modules/openapi-generator/src/main/resources/elm/modelTypePrimitive.mustache +++ b/modules/openapi-generator/src/main/resources/elm/modelTypePrimitive.mustache @@ -4,9 +4,9 @@ type alias {{classname}} {{classVarName}}Decoder : Decoder {{classname}} {{classVarName}}Decoder = - {{vendorExtensions.x-decoder}} + {{vendorExtensions.elmDecoder}} {{classVarName}}Encoder : {{classname}} -> Encode.Value {{classVarName}}Encoder = - {{vendorExtensions.x-encoder}} + {{vendorExtensions.elmEncoder}} diff --git a/modules/openapi-generator/src/main/resources/elm/union.mustache b/modules/openapi-generator/src/main/resources/elm/union.mustache index b692277835e..25dc6d89cde 100644 --- a/modules/openapi-generator/src/main/resources/elm/union.mustache +++ b/modules/openapi-generator/src/main/resources/elm/union.mustache @@ -1,4 +1,4 @@ -type {{#vendorExtensions}}{{x-union-type}}{{/vendorExtensions}} +type {{#vendorExtensions}}{{elmUnionType}}{{/vendorExtensions}} {{#allowableValues}} {{#enumVars}} {{#-first}}={{/-first}}{{^-first}}|{{/-first}} {{name}} diff --git a/modules/openapi-generator/src/main/resources/elm/unionDecoder.mustache b/modules/openapi-generator/src/main/resources/elm/unionDecoder.mustache index 5cf56193d28..4b1efba70ec 100644 --- a/modules/openapi-generator/src/main/resources/elm/unionDecoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/unionDecoder.mustache @@ -1,5 +1,5 @@ -{{vendorExtensions.x-decoder}} : Decoder {{vendorExtensions.x-union-type}} -{{vendorExtensions.x-decoder}} = +{{vendorExtensions.elmDecoder}} : Decoder {{vendorExtensions.elmUnionType}} +{{vendorExtensions.elmDecoder}} = Decode.string |> Decode.andThen (\str -> case str of diff --git a/modules/openapi-generator/src/main/resources/elm/unionEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/unionEncoder.mustache index 4432a6b753f..2c286154f07 100644 --- a/modules/openapi-generator/src/main/resources/elm/unionEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/unionEncoder.mustache @@ -1,5 +1,5 @@ -{{vendorExtensions.x-encoder}} : {{vendorExtensions.x-union-type}} -> Encode.Value -{{vendorExtensions.x-encoder}} model = +{{vendorExtensions.elmEncoder}} : {{vendorExtensions.elmUnionType}} -> Encode.Value +{{vendorExtensions.elmEncoder}} model = case model of {{#allowableValues}} {{#enumVars}} diff --git a/pom.xml b/pom.xml index 993041fc77c..5c1ae35b957 100644 --- a/pom.xml +++ b/pom.xml @@ -1007,7 +1007,7 @@ samples/client/petstore/dart2/petstore samples/client/petstore/haskell-http-client - samples/client/petstore/elm + samples/client/petstore/elm-0.18 samples/client/petstore/groovy samples/client/petstore/rust @@ -1049,6 +1049,7 @@ + samples/client/petstore/elm samples/client/petstore/elixir samples/client/petstore/erlang-client diff --git a/samples/client/petstore/elm-0.18/.gitignore b/samples/client/petstore/elm-0.18/.gitignore new file mode 100644 index 00000000000..8b0d053e4e3 --- /dev/null +++ b/samples/client/petstore/elm-0.18/.gitignore @@ -0,0 +1 @@ +/elm-stuff \ No newline at end of file diff --git a/samples/client/petstore/elm-0.18/.openapi-generator-ignore b/samples/client/petstore/elm-0.18/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/elm-0.18/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/elm-0.18/.openapi-generator/VERSION b/samples/client/petstore/elm-0.18/.openapi-generator/VERSION new file mode 100644 index 00000000000..c791c986fbb --- /dev/null +++ b/samples/client/petstore/elm-0.18/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/elm-0.18/README.md b/samples/client/petstore/elm-0.18/README.md new file mode 100644 index 00000000000..3f36740911a --- /dev/null +++ b/samples/client/petstore/elm-0.18/README.md @@ -0,0 +1,10 @@ +# Elm API client + +This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + +## Overview +This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [openapi-spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate an API client. + +- API version: 1.0.0 +- Package version: +- Build package: org.openapitools.codegen.languages.ElmClientCodegen diff --git a/samples/client/petstore/elm-0.18/elm-0.18-compile-test b/samples/client/petstore/elm-0.18/elm-0.18-compile-test new file mode 100755 index 00000000000..c6ba0a25f68 --- /dev/null +++ b/samples/client/petstore/elm-0.18/elm-0.18-compile-test @@ -0,0 +1,14 @@ +#!/bin/bash -e +# elm 0.18 make all elm files under src + +for ELM in `find src -name "*.elm"` +do + echo "Compiling $ELM" + elm make $ELM --output /dev/null --yes + rc=$? + if [[ $rc != 0 ]] + then + echo "ERROR!! FAILED TO COMPILE $ELM" + exit $rc; + fi +done diff --git a/samples/client/petstore/elm/elm-package.json b/samples/client/petstore/elm-0.18/elm-package.json similarity index 100% rename from samples/client/petstore/elm/elm-package.json rename to samples/client/petstore/elm-0.18/elm-package.json diff --git a/samples/client/petstore/elm-0.18/pom.xml b/samples/client/petstore/elm-0.18/pom.xml new file mode 100644 index 00000000000..7ddfe9d49e7 --- /dev/null +++ b/samples/client/petstore/elm-0.18/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + org.openapitools + Elm018ClientTests + pom + 1.0-SNAPSHOT + Elm 0.18 Petstore Client + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory} + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + bundle-test + integration-test + + exec + + + ./elm-0.18-compile-test + + + + + + + diff --git a/samples/client/petstore/elm-0.18/src/Byte.elm b/samples/client/petstore/elm-0.18/src/Byte.elm new file mode 100644 index 00000000000..da078742947 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Byte.elm @@ -0,0 +1,18 @@ +module Byte exposing (Byte, byteDecoder, byteEncoder) + +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode + + +type alias Byte = + String + + +byteDecoder : Decoder Byte +byteDecoder = + Decode.string + + +byteEncoder : Byte -> Encode.Value +byteEncoder model = + Encode.string model diff --git a/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm b/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm new file mode 100644 index 00000000000..c7400283086 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm @@ -0,0 +1,46 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.ApiResponse exposing (ApiResponse, apiResponseDecoder, apiResponseEncoder) + +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| Describes the result of uploading an image resource +-} +type alias ApiResponse = + { code : Maybe Int + , type_ : Maybe String + , message : Maybe String + } + + +apiResponseDecoder : Decoder ApiResponse +apiResponseDecoder = + decode ApiResponse + |> optional "code" (Decode.nullable Decode.int) Nothing + |> optional "type" (Decode.nullable Decode.string) Nothing + |> optional "message" (Decode.nullable Decode.string) Nothing + + + +apiResponseEncoder : ApiResponse -> Encode.Value +apiResponseEncoder model = + Encode.object + [ ( "code", withDefault Encode.null (map Encode.int model.code) ) + , ( "type", withDefault Encode.null (map Encode.string model.type_) ) + , ( "message", withDefault Encode.null (map Encode.string model.message) ) + ] + diff --git a/samples/client/petstore/elm-0.18/src/Data/Category.elm b/samples/client/petstore/elm-0.18/src/Data/Category.elm new file mode 100644 index 00000000000..b2baddd929f --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/Category.elm @@ -0,0 +1,43 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.Category exposing (Category, categoryDecoder, categoryEncoder) + +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| A category for a pet +-} +type alias Category = + { id : Maybe Int + , name : Maybe String + } + + +categoryDecoder : Decoder Category +categoryDecoder = + decode Category + |> optional "id" (Decode.nullable Decode.int) Nothing + |> optional "name" (Decode.nullable Decode.string) Nothing + + + +categoryEncoder : Category -> Encode.Value +categoryEncoder model = + Encode.object + [ ( "id", withDefault Encode.null (map Encode.int model.id) ) + , ( "name", withDefault Encode.null (map Encode.string model.name) ) + ] + diff --git a/samples/client/petstore/elm-0.18/src/Data/Order_.elm b/samples/client/petstore/elm-0.18/src/Data/Order_.elm new file mode 100644 index 00000000000..58559b874be --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/Order_.elm @@ -0,0 +1,97 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.Order_ exposing (Order_, Status(..), orderDecoder, orderEncoder) + +import DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| An order for a pets from the pet store +-} +type alias Order_ = + { id : Maybe Int + , petId : Maybe Int + , quantity : Maybe Int + , shipDate : Maybe DateTime + , status : Maybe Status + , complete : Maybe Bool + } + + +type Status + = Placed + | Approved + | Delivered + + + +orderDecoder : Decoder Order_ +orderDecoder = + decode Order_ + |> optional "id" (Decode.nullable Decode.int) Nothing + |> optional "petId" (Decode.nullable Decode.int) Nothing + |> optional "quantity" (Decode.nullable Decode.int) Nothing + |> optional "shipDate" (Decode.nullable dateTimeDecoder) Nothing + |> optional "status" (Decode.nullable statusDecoder) Nothing + |> optional "complete" (Decode.nullable Decode.bool) (Just False) + + + +orderEncoder : Order_ -> Encode.Value +orderEncoder model = + Encode.object + [ ( "id", withDefault Encode.null (map Encode.int model.id) ) + , ( "petId", withDefault Encode.null (map Encode.int model.petId) ) + , ( "quantity", withDefault Encode.null (map Encode.int model.quantity) ) + , ( "shipDate", withDefault Encode.null (map dateTimeEncoder model.shipDate) ) + , ( "status", withDefault Encode.null (map statusEncoder model.status) ) + , ( "complete", withDefault Encode.null (map Encode.bool model.complete) ) + ] + + +statusDecoder : Decoder Status +statusDecoder = + Decode.string + |> Decode.andThen (\str -> + case str of + "placed" -> + Decode.succeed Placed + + "approved" -> + Decode.succeed Approved + + "delivered" -> + Decode.succeed Delivered + + other -> + Decode.fail <| "Unknown type: " ++ other + ) + + +statusEncoder : Status -> Encode.Value +statusEncoder model = + case model of + Placed -> + Encode.string "placed" + + Approved -> + Encode.string "approved" + + Delivered -> + Encode.string "delivered" + + + diff --git a/samples/client/petstore/elm-0.18/src/Data/Pet.elm b/samples/client/petstore/elm-0.18/src/Data/Pet.elm new file mode 100644 index 00000000000..cdb4296712e --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/Pet.elm @@ -0,0 +1,98 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.Pet exposing (Pet, Status(..), petDecoder, petEncoder) + +import Data.Category exposing (Category, categoryDecoder, categoryEncoder) +import Data.Tag exposing (Tag, tagDecoder, tagEncoder) +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| A pet for sale in the pet store +-} +type alias Pet = + { id : Maybe Int + , category : Maybe Category + , name : String + , photoUrls : List String + , tags : Maybe (List Tag) + , status : Maybe Status + } + + +type Status + = Available + | Pending + | Sold + + + +petDecoder : Decoder Pet +petDecoder = + decode Pet + |> optional "id" (Decode.nullable Decode.int) Nothing + |> optional "category" (Decode.nullable categoryDecoder) Nothing + |> required "name" Decode.string + |> required "photoUrls" (Decode.list Decode.string) + |> optional "tags" (Decode.nullable (Decode.list tagDecoder)) Nothing + |> optional "status" (Decode.nullable statusDecoder) Nothing + + + +petEncoder : Pet -> Encode.Value +petEncoder model = + Encode.object + [ ( "id", withDefault Encode.null (map Encode.int model.id) ) + , ( "category", withDefault Encode.null (map categoryEncoder model.category) ) + , ( "name", Encode.string model.name ) + , ( "photoUrls", (Encode.list << List.map Encode.string) model.photoUrls ) + , ( "tags", withDefault Encode.null (map (Encode.list << List.map tagEncoder) model.tags) ) + , ( "status", withDefault Encode.null (map statusEncoder model.status) ) + ] + + +statusDecoder : Decoder Status +statusDecoder = + Decode.string + |> Decode.andThen (\str -> + case str of + "available" -> + Decode.succeed Available + + "pending" -> + Decode.succeed Pending + + "sold" -> + Decode.succeed Sold + + other -> + Decode.fail <| "Unknown type: " ++ other + ) + + +statusEncoder : Status -> Encode.Value +statusEncoder model = + case model of + Available -> + Encode.string "available" + + Pending -> + Encode.string "pending" + + Sold -> + Encode.string "sold" + + + diff --git a/samples/client/petstore/elm-0.18/src/Data/Tag.elm b/samples/client/petstore/elm-0.18/src/Data/Tag.elm new file mode 100644 index 00000000000..79d0fa2da27 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/Tag.elm @@ -0,0 +1,43 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.Tag exposing (Tag, tagDecoder, tagEncoder) + +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| A tag for a pet +-} +type alias Tag = + { id : Maybe Int + , name : Maybe String + } + + +tagDecoder : Decoder Tag +tagDecoder = + decode Tag + |> optional "id" (Decode.nullable Decode.int) Nothing + |> optional "name" (Decode.nullable Decode.string) Nothing + + + +tagEncoder : Tag -> Encode.Value +tagEncoder model = + Encode.object + [ ( "id", withDefault Encode.null (map Encode.int model.id) ) + , ( "name", withDefault Encode.null (map Encode.string model.name) ) + ] + diff --git a/samples/client/petstore/elm-0.18/src/Data/User.elm b/samples/client/petstore/elm-0.18/src/Data/User.elm new file mode 100644 index 00000000000..657f6fb6600 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Data/User.elm @@ -0,0 +1,61 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Data.User exposing (User, userDecoder, userEncoder) + +import Json.Decode as Decode exposing (Decoder) +import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Encode as Encode +import Maybe exposing (map, withDefault) + + +{-| A User who is purchasing from the pet store +-} +type alias User = + { id : Maybe Int + , username : Maybe String + , firstName : Maybe String + , lastName : Maybe String + , email : Maybe String + , password : Maybe String + , phone : Maybe String + , userStatus : Maybe Int + } + + +userDecoder : Decoder User +userDecoder = + decode User + |> optional "id" (Decode.nullable Decode.int) Nothing + |> optional "username" (Decode.nullable Decode.string) Nothing + |> optional "firstName" (Decode.nullable Decode.string) Nothing + |> optional "lastName" (Decode.nullable Decode.string) Nothing + |> optional "email" (Decode.nullable Decode.string) Nothing + |> optional "password" (Decode.nullable Decode.string) Nothing + |> optional "phone" (Decode.nullable Decode.string) Nothing + |> optional "userStatus" (Decode.nullable Decode.int) Nothing + + + +userEncoder : User -> Encode.Value +userEncoder model = + Encode.object + [ ( "id", withDefault Encode.null (map Encode.int model.id) ) + , ( "username", withDefault Encode.null (map Encode.string model.username) ) + , ( "firstName", withDefault Encode.null (map Encode.string model.firstName) ) + , ( "lastName", withDefault Encode.null (map Encode.string model.lastName) ) + , ( "email", withDefault Encode.null (map Encode.string model.email) ) + , ( "password", withDefault Encode.null (map Encode.string model.password) ) + , ( "phone", withDefault Encode.null (map Encode.string model.phone) ) + , ( "userStatus", withDefault Encode.null (map Encode.int model.userStatus) ) + ] + diff --git a/samples/client/petstore/elm-0.18/src/DateOnly.elm b/samples/client/petstore/elm-0.18/src/DateOnly.elm new file mode 100644 index 00000000000..59551c7aa71 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/DateOnly.elm @@ -0,0 +1,32 @@ +module DateOnly exposing (DateOnly, dateOnlyDecoder, dateOnlyEncoder) + +import Date +import Date.Extra exposing (fromIsoString, toFormattedString) +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode +import Result + + +type alias DateOnly = + Date.Date + + +dateOnlyDecoder : Decoder DateOnly +dateOnlyDecoder = + Decode.string + |> Decode.andThen decodeIsoString + + +dateOnlyEncoder : DateOnly -> Encode.Value +dateOnlyEncoder model = + Encode.string <| toFormattedString "yyyy-MM-dd" model + + +decodeIsoString : String -> Decoder DateOnly +decodeIsoString str = + case fromIsoString str of + Result.Ok date -> + Decode.succeed date + + Result.Err msg -> + Decode.fail msg diff --git a/samples/client/petstore/elm-0.18/src/DateTime.elm b/samples/client/petstore/elm-0.18/src/DateTime.elm new file mode 100644 index 00000000000..d3638500a89 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/DateTime.elm @@ -0,0 +1,32 @@ +module DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) + +import Date +import Date.Extra exposing (fromIsoString, toIsoString) +import Json.Decode as Decode exposing (Decoder) +import Json.Encode as Encode +import Result + + +type alias DateTime = + Date.Date + + +dateTimeDecoder : Decoder DateTime +dateTimeDecoder = + Decode.string + |> Decode.andThen decodeIsoString + + +dateTimeEncoder : DateTime -> Encode.Value +dateTimeEncoder model = + Encode.string <| toIsoString model + + +decodeIsoString : String -> Decoder DateTime +decodeIsoString str = + case fromIsoString str of + Result.Ok date -> + Decode.succeed date + + Result.Err msg -> + Decode.fail msg diff --git a/samples/client/petstore/elm-0.18/src/Main.elm b/samples/client/petstore/elm-0.18/src/Main.elm new file mode 100644 index 00000000000..23274d541c1 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Main.elm @@ -0,0 +1,60 @@ +module Main exposing (main) + +import Html exposing (Html) + + +main : Program Never Model Msg +main = + Html.program + { init = init + , view = view + , update = update + , subscriptions = subscriptions + } + + + +-- MODEL + + +type alias Model = + { value : Int + } + + +init : ( Model, Cmd Msg ) +init = + ( Model 0, Cmd.none ) + + + +-- UPDATE + + +type Msg + = NoOp + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions _ = + Sub.none + + + +-- VIEW + + +view : Model -> Html Msg +view _ = + Html.text "main" diff --git a/samples/client/petstore/elm-0.18/src/Request/Pet.elm b/samples/client/petstore/elm-0.18/src/Request/Pet.elm new file mode 100644 index 00000000000..0a4b5c1769e --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Request/Pet.elm @@ -0,0 +1,134 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags, getPetById, updatePet, updatePetWithForm, uploadFile) + +import Data.Pet exposing (Pet, petDecoder, petEncoder) +import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder) +import Dict +import Http +import Json.Decode as Decode + + +basePath : String +basePath = + "http://petstore.swagger.io/v2" + + +addPet : Pet -> Http.Request () +addPet model = + { method = "POST" + , url = basePath ++ "/pet" + , headers = [] + , body = Http.jsonBody <| petEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +deletePet : Int -> Http.Request () +deletePet petId = + { method = "DELETE" + , url = basePath ++ "/pet/" ++ toString petId + , headers = [] + , body = Http.emptyBody + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| Multiple status values can be provided with comma separated strings +-} +findPetsByStatus : Http.Request (List Pet) +findPetsByStatus = + { method = "GET" + , url = basePath ++ "/pet/findByStatus" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson (Decode.list petDecoder) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. +-} +findPetsByTags : Http.Request (List Pet) +findPetsByTags = + { method = "GET" + , url = basePath ++ "/pet/findByTags" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson (Decode.list petDecoder) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| Returns a single pet +-} +getPetById : Int -> Http.Request Pet +getPetById petId = + { method = "GET" + , url = basePath ++ "/pet/" ++ toString petId + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson petDecoder + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +updatePet : Pet -> Http.Request () +updatePet model = + { method = "PUT" + , url = basePath ++ "/pet" + , headers = [] + , body = Http.jsonBody <| petEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +updatePetWithForm : Int -> Http.Request () +updatePetWithForm petId = + { method = "POST" + , url = basePath ++ "/pet/" ++ toString petId + , headers = [] + , body = Http.emptyBody + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +uploadFile : Int -> Http.Request ApiResponse +uploadFile petId = + { method = "POST" + , url = basePath ++ "/pet/" ++ toString petId ++ "/uploadImage" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson apiResponseDecoder + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request diff --git a/samples/client/petstore/elm-0.18/src/Request/Store.elm b/samples/client/petstore/elm-0.18/src/Request/Store.elm new file mode 100644 index 00000000000..2e98105a2f4 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Request/Store.elm @@ -0,0 +1,81 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Request.Store exposing (deleteOrder, getInventory, getOrderById, placeOrder) + +import Data.Order_ exposing (Order_, orderDecoder, orderEncoder) +import Dict +import Http +import Json.Decode as Decode + + +basePath : String +basePath = + "http://petstore.swagger.io/v2" + + +{-| For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors +-} +deleteOrder : String -> Http.Request () +deleteOrder orderId = + { method = "DELETE" + , url = basePath ++ "/store/order/" ++ orderId + , headers = [] + , body = Http.emptyBody + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| Returns a map of status codes to quantities +-} +getInventory : Http.Request (Dict.Dict String Int) +getInventory = + { method = "GET" + , url = basePath ++ "/store/inventory" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson (Decode.dict Decode.int) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions +-} +getOrderById : Int -> Http.Request Order_ +getOrderById orderId = + { method = "GET" + , url = basePath ++ "/store/order/" ++ toString orderId + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson orderDecoder + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +placeOrder : Order_ -> Http.Request Order_ +placeOrder model = + { method = "POST" + , url = basePath ++ "/store/order" + , headers = [] + , body = Http.jsonBody <| orderEncoder model + , expect = Http.expectJson orderDecoder + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request diff --git a/samples/client/petstore/elm-0.18/src/Request/User.elm b/samples/client/petstore/elm-0.18/src/Request/User.elm new file mode 100644 index 00000000000..e6bbbb32ed5 --- /dev/null +++ b/samples/client/petstore/elm-0.18/src/Request/User.elm @@ -0,0 +1,133 @@ +{- + OpenAPI Petstore + This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + + OpenAPI spec version: 1.0.0 + + NOTE: This file is auto generated by the openapi-generator. + https://github.com/openapitools/openapi-generator.git + Do not edit this file manually. +-} + + +module Request.User exposing (createUser, createUsersWithArrayInput, createUsersWithListInput, deleteUser, getUserByName, loginUser, logoutUser, updateUser) + +import Data.User exposing (User, userDecoder, userEncoder) +import Dict +import Http +import Json.Decode as Decode + + +basePath : String +basePath = + "http://petstore.swagger.io/v2" + + +{-| This can only be done by the logged in user. +-} +createUser : User -> Http.Request () +createUser model = + { method = "POST" + , url = basePath ++ "/user" + , headers = [] + , body = Http.jsonBody <| userEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +createUsersWithArrayInput : User -> Http.Request () +createUsersWithArrayInput model = + { method = "POST" + , url = basePath ++ "/user/createWithArray" + , headers = [] + , body = Http.jsonBody <| userEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +createUsersWithListInput : User -> Http.Request () +createUsersWithListInput model = + { method = "POST" + , url = basePath ++ "/user/createWithList" + , headers = [] + , body = Http.jsonBody <| userEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| This can only be done by the logged in user. +-} +deleteUser : String -> Http.Request () +deleteUser username = + { method = "DELETE" + , url = basePath ++ "/user/" ++ username + , headers = [] + , body = Http.emptyBody + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +getUserByName : String -> Http.Request User +getUserByName username = + { method = "GET" + , url = basePath ++ "/user/" ++ username + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson userDecoder + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +loginUser : Http.Request String +loginUser = + { method = "GET" + , url = basePath ++ "/user/login" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectJson Decode.string + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +logoutUser : Http.Request () +logoutUser = + { method = "GET" + , url = basePath ++ "/user/logout" + , headers = [] + , body = Http.emptyBody + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request + + +{-| This can only be done by the logged in user. +-} +updateUser : String -> User -> Http.Request () +updateUser username model = + { method = "PUT" + , url = basePath ++ "/user/" ++ username + , headers = [] + , body = Http.jsonBody <| userEncoder model + , expect = Http.expectStringResponse (\_ -> Ok ()) + , timeout = Just 30000 + , withCredentials = False + } + |> Http.request diff --git a/samples/client/petstore/elm/elm-compile-test b/samples/client/petstore/elm/elm-compile-test index c2403c5fd4e..55507cfcad6 100755 --- a/samples/client/petstore/elm/elm-compile-test +++ b/samples/client/petstore/elm/elm-compile-test @@ -4,7 +4,7 @@ for ELM in `find src -name "*.elm"` do echo "Compiling $ELM" - elm make $ELM --output /dev/null --yes + elm make $ELM --output /dev/null rc=$? if [[ $rc != 0 ]] then diff --git a/samples/client/petstore/elm/elm.json b/samples/client/petstore/elm/elm.json new file mode 100644 index 00000000000..6028a740feb --- /dev/null +++ b/samples/client/petstore/elm/elm.json @@ -0,0 +1,28 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.0", + "dependencies": { + "direct": { + "NoRedInk/elm-json-decode-pipeline": "1.0.0", + "elm/browser": "1.0.0", + "elm/core": "1.0.0", + "elm/html": "1.0.0", + "elm/http": "1.0.0", + "elm/json": "1.0.0", + "elm/time": "1.0.0", + "rtfeldman/elm-iso8601-date-strings": "1.0.0" + }, + "indirect": { + "elm/parser": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.0" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/samples/client/petstore/elm/src/Byte.elm b/samples/client/petstore/elm/src/Byte.elm index 6974f1ed59b..da078742947 100644 --- a/samples/client/petstore/elm/src/Byte.elm +++ b/samples/client/petstore/elm/src/Byte.elm @@ -16,4 +16,3 @@ byteDecoder = byteEncoder : Byte -> Encode.Value byteEncoder model = Encode.string model - diff --git a/samples/client/petstore/elm/src/Data/ApiResponse.elm b/samples/client/petstore/elm/src/Data/ApiResponse.elm index c7400283086..a8af70b330c 100644 --- a/samples/client/petstore/elm/src/Data/ApiResponse.elm +++ b/samples/client/petstore/elm/src/Data/ApiResponse.elm @@ -13,7 +13,7 @@ module Data.ApiResponse exposing (ApiResponse, apiResponseDecoder, apiResponseEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -29,7 +29,7 @@ type alias ApiResponse = apiResponseDecoder : Decoder ApiResponse apiResponseDecoder = - decode ApiResponse + Decode.succeed ApiResponse |> optional "code" (Decode.nullable Decode.int) Nothing |> optional "type" (Decode.nullable Decode.string) Nothing |> optional "message" (Decode.nullable Decode.string) Nothing diff --git a/samples/client/petstore/elm/src/Data/Category.elm b/samples/client/petstore/elm/src/Data/Category.elm index b2baddd929f..b00828d0418 100644 --- a/samples/client/petstore/elm/src/Data/Category.elm +++ b/samples/client/petstore/elm/src/Data/Category.elm @@ -13,7 +13,7 @@ module Data.Category exposing (Category, categoryDecoder, categoryEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -28,7 +28,7 @@ type alias Category = categoryDecoder : Decoder Category categoryDecoder = - decode Category + Decode.succeed Category |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "name" (Decode.nullable Decode.string) Nothing diff --git a/samples/client/petstore/elm/src/Data/Order_.elm b/samples/client/petstore/elm/src/Data/Order_.elm index 58559b874be..f1e713ac7c9 100644 --- a/samples/client/petstore/elm/src/Data/Order_.elm +++ b/samples/client/petstore/elm/src/Data/Order_.elm @@ -14,7 +14,7 @@ module Data.Order_ exposing (Order_, Status(..), orderDecoder, orderEncoder) import DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -40,7 +40,7 @@ type Status orderDecoder : Decoder Order_ orderDecoder = - decode Order_ + Decode.succeed Order_ |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "petId" (Decode.nullable Decode.int) Nothing |> optional "quantity" (Decode.nullable Decode.int) Nothing diff --git a/samples/client/petstore/elm/src/Data/Pet.elm b/samples/client/petstore/elm/src/Data/Pet.elm index cdb4296712e..f37f03e085d 100644 --- a/samples/client/petstore/elm/src/Data/Pet.elm +++ b/samples/client/petstore/elm/src/Data/Pet.elm @@ -15,7 +15,7 @@ module Data.Pet exposing (Pet, Status(..), petDecoder, petEncoder) import Data.Category exposing (Category, categoryDecoder, categoryEncoder) import Data.Tag exposing (Tag, tagDecoder, tagEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -41,7 +41,7 @@ type Status petDecoder : Decoder Pet petDecoder = - decode Pet + Decode.succeed Pet |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "category" (Decode.nullable categoryDecoder) Nothing |> required "name" Decode.string @@ -57,8 +57,8 @@ petEncoder model = [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "category", withDefault Encode.null (map categoryEncoder model.category) ) , ( "name", Encode.string model.name ) - , ( "photoUrls", (Encode.list << List.map Encode.string) model.photoUrls ) - , ( "tags", withDefault Encode.null (map (Encode.list << List.map tagEncoder) model.tags) ) + , ( "photoUrls", (Encode.list Encode.string) model.photoUrls ) + , ( "tags", withDefault Encode.null (map (Encode.list tagEncoder) model.tags) ) , ( "status", withDefault Encode.null (map statusEncoder model.status) ) ] diff --git a/samples/client/petstore/elm/src/Data/Tag.elm b/samples/client/petstore/elm/src/Data/Tag.elm index 79d0fa2da27..7ab34e9168a 100644 --- a/samples/client/petstore/elm/src/Data/Tag.elm +++ b/samples/client/petstore/elm/src/Data/Tag.elm @@ -13,7 +13,7 @@ module Data.Tag exposing (Tag, tagDecoder, tagEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -28,7 +28,7 @@ type alias Tag = tagDecoder : Decoder Tag tagDecoder = - decode Tag + Decode.succeed Tag |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "name" (Decode.nullable Decode.string) Nothing diff --git a/samples/client/petstore/elm/src/Data/User.elm b/samples/client/petstore/elm/src/Data/User.elm index 657f6fb6600..9395b0d02f8 100644 --- a/samples/client/petstore/elm/src/Data/User.elm +++ b/samples/client/petstore/elm/src/Data/User.elm @@ -13,7 +13,7 @@ module Data.User exposing (User, userDecoder, userEncoder) import Json.Decode as Decode exposing (Decoder) -import Json.Decode.Pipeline exposing (decode, optional, required) +import Json.Decode.Pipeline exposing (optional, required) import Json.Encode as Encode import Maybe exposing (map, withDefault) @@ -34,7 +34,7 @@ type alias User = userDecoder : Decoder User userDecoder = - decode User + Decode.succeed User |> optional "id" (Decode.nullable Decode.int) Nothing |> optional "username" (Decode.nullable Decode.string) Nothing |> optional "firstName" (Decode.nullable Decode.string) Nothing diff --git a/samples/client/petstore/elm/src/DateOnly.elm b/samples/client/petstore/elm/src/DateOnly.elm index 59551c7aa71..c18b180ba11 100644 --- a/samples/client/petstore/elm/src/DateOnly.elm +++ b/samples/client/petstore/elm/src/DateOnly.elm @@ -1,14 +1,14 @@ module DateOnly exposing (DateOnly, dateOnlyDecoder, dateOnlyEncoder) -import Date -import Date.Extra exposing (fromIsoString, toFormattedString) +import Iso8601 import Json.Decode as Decode exposing (Decoder) import Json.Encode as Encode import Result +import Time type alias DateOnly = - Date.Date + Time.Posix dateOnlyDecoder : Decoder DateOnly @@ -19,14 +19,16 @@ dateOnlyDecoder = dateOnlyEncoder : DateOnly -> Encode.Value dateOnlyEncoder model = - Encode.string <| toFormattedString "yyyy-MM-dd" model + Iso8601.fromTime model + |> String.left 10 + |> Encode.string decodeIsoString : String -> Decoder DateOnly decodeIsoString str = - case fromIsoString str of - Result.Ok date -> - Decode.succeed date + case Iso8601.toTime (str ++ "T00:00:00.000Z") of + Result.Ok posix -> + Decode.succeed posix - Result.Err msg -> - Decode.fail msg + Result.Err _ -> + Decode.fail <| "Invalid date: " ++ str diff --git a/samples/client/petstore/elm/src/DateTime.elm b/samples/client/petstore/elm/src/DateTime.elm index d3638500a89..28882c8cfa6 100644 --- a/samples/client/petstore/elm/src/DateTime.elm +++ b/samples/client/petstore/elm/src/DateTime.elm @@ -1,14 +1,14 @@ module DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) -import Date -import Date.Extra exposing (fromIsoString, toIsoString) +import Iso8601 import Json.Decode as Decode exposing (Decoder) import Json.Encode as Encode import Result +import Time type alias DateTime = - Date.Date + Time.Posix dateTimeDecoder : Decoder DateTime @@ -19,14 +19,14 @@ dateTimeDecoder = dateTimeEncoder : DateTime -> Encode.Value dateTimeEncoder model = - Encode.string <| toIsoString model + Encode.string <| Iso8601.fromTime model decodeIsoString : String -> Decoder DateTime decodeIsoString str = - case fromIsoString str of - Result.Ok date -> - Decode.succeed date + case Iso8601.toTime str of + Result.Ok posix -> + Decode.succeed posix - Result.Err msg -> - Decode.fail msg + Result.Err _ -> + Decode.fail <| "Invalid date: " ++ str diff --git a/samples/client/petstore/elm/src/Main.elm b/samples/client/petstore/elm/src/Main.elm index b0a2ce0b52c..7c9ddd056d3 100644 --- a/samples/client/petstore/elm/src/Main.elm +++ b/samples/client/petstore/elm/src/Main.elm @@ -1,43 +1,61 @@ -module Main exposing (..) +module Main exposing (main) -import Json.Decode as Decode -import Html exposing (Html, button, div, text) -import Html.Events exposing (onClick) -import Http +import Browser +import Html exposing (Html) -main : Program Never Model Msg +main : Program () Model Msg main = - Html.program + Browser.element { init = init , view = view , update = update , subscriptions = subscriptions } + + +-- MODEL + + type alias Model = - { status : Maybe Int + { value : Int } -init : (Model, Cmd Msg) -init = - ( Model Nothing, Cmd.none ) + +init : () -> ( Model, Cmd Msg ) +init _ = + ( Model 0, Cmd.none ) + + + +-- UPDATE + type Msg = NoOp -update : Msg -> Model -> (Model, Cmd Msg) + +update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of NoOp -> ( model, Cmd.none ) -view : Model -> Html Msg -view model = - Html.text "main" + +-- SUBSCRIPTIONS subscriptions : Model -> Sub Msg -subscriptions model = +subscriptions _ = Sub.none + + + +-- VIEW + + +view : Model -> Html Msg +view _ = + Html.text "main" diff --git a/samples/client/petstore/elm/src/Request/Pet.elm b/samples/client/petstore/elm/src/Request/Pet.elm index 0a4b5c1769e..2a96489a830 100644 --- a/samples/client/petstore/elm/src/Request/Pet.elm +++ b/samples/client/petstore/elm/src/Request/Pet.elm @@ -40,7 +40,7 @@ addPet model = deletePet : Int -> Http.Request () deletePet petId = { method = "DELETE" - , url = basePath ++ "/pet/" ++ toString petId + , url = basePath ++ "/pet/" ++ String.fromInt petId , headers = [] , body = Http.emptyBody , expect = Http.expectStringResponse (\_ -> Ok ()) @@ -85,7 +85,7 @@ findPetsByTags = getPetById : Int -> Http.Request Pet getPetById petId = { method = "GET" - , url = basePath ++ "/pet/" ++ toString petId + , url = basePath ++ "/pet/" ++ String.fromInt petId , headers = [] , body = Http.emptyBody , expect = Http.expectJson petDecoder @@ -111,7 +111,7 @@ updatePet model = updatePetWithForm : Int -> Http.Request () updatePetWithForm petId = { method = "POST" - , url = basePath ++ "/pet/" ++ toString petId + , url = basePath ++ "/pet/" ++ String.fromInt petId , headers = [] , body = Http.emptyBody , expect = Http.expectStringResponse (\_ -> Ok ()) @@ -124,7 +124,7 @@ updatePetWithForm petId = uploadFile : Int -> Http.Request ApiResponse uploadFile petId = { method = "POST" - , url = basePath ++ "/pet/" ++ toString petId ++ "/uploadImage" + , url = basePath ++ "/pet/" ++ String.fromInt petId ++ "/uploadImage" , headers = [] , body = Http.emptyBody , expect = Http.expectJson apiResponseDecoder diff --git a/samples/client/petstore/elm/src/Request/Store.elm b/samples/client/petstore/elm/src/Request/Store.elm index 2e98105a2f4..54899538425 100644 --- a/samples/client/petstore/elm/src/Request/Store.elm +++ b/samples/client/petstore/elm/src/Request/Store.elm @@ -58,7 +58,7 @@ getInventory = getOrderById : Int -> Http.Request Order_ getOrderById orderId = { method = "GET" - , url = basePath ++ "/store/order/" ++ toString orderId + , url = basePath ++ "/store/order/" ++ String.fromInt orderId , headers = [] , body = Http.emptyBody , expect = Http.expectJson orderDecoder diff --git a/shippable.yml b/shippable.yml index f323402019f..06c87b55137 100644 --- a/shippable.yml +++ b/shippable.yml @@ -24,6 +24,8 @@ build: - wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb - sudo apt-get update - sudo apt-get install elixir + # install elm + - curl -SL https://github.com/elm/compiler/releases/download/0.19.0/binaries-for-linux.tar.gz | tar xzv -C /usr/local/bin # install rebar3 - wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3 && cp rebar3 /usr/bin # install php From f7b807f980c5a60c230c9cf934c62f0b65be0329 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 4 Sep 2018 09:58:14 +0200 Subject: [PATCH 41/74] [Java][Webclient ]Avoid double encoding on query params (#924) * call build() with encoded = true * Regenerate client --- .../main/resources/Java/libraries/webclient/ApiClient.mustache | 2 +- .../src/main/java/org/openapitools/client/ApiClient.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache index 41b81a004c5..7f91fe44134 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache @@ -545,7 +545,7 @@ public class ApiClient { builder.queryParams(queryParams); } - final WebClient.RequestBodySpec requestBuilder = webClient.method(method).uri(builder.build().toUri()); + final WebClient.RequestBodySpec requestBuilder = webClient.method(method).uri(builder.build(true).toUri()); if(accept != null) { requestBuilder.accept(accept.toArray(new MediaType[accept.size()])); } diff --git a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java index 460bd563c0f..7d5f7dd66bb 100644 --- a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java @@ -546,7 +546,7 @@ public class ApiClient { builder.queryParams(queryParams); } - final WebClient.RequestBodySpec requestBuilder = webClient.method(method).uri(builder.build().toUri()); + final WebClient.RequestBodySpec requestBuilder = webClient.method(method).uri(builder.build(true).toUri()); if(accept != null) { requestBuilder.accept(accept.toArray(new MediaType[accept.size()])); } From 9d89387d837a5803781d91f8562fc4b16b251afd Mon Sep 17 00:00:00 2001 From: delenius Date: Tue, 4 Sep 2018 01:31:33 -0700 Subject: [PATCH 42/74] Fix cookie support in Node.js client (#895) --- .../src/main/resources/Javascript/ApiClient.mustache | 6 +++--- .../src/main/resources/Javascript/es6/ApiClient.mustache | 6 +++--- .../petstore/javascript-es6/.openapi-generator/VERSION | 2 +- samples/client/petstore/javascript-es6/src/ApiClient.js | 4 ++-- .../javascript-promise-es6/.openapi-generator/VERSION | 2 +- .../client/petstore/javascript-promise-es6/src/ApiClient.js | 4 ++-- .../petstore/javascript-promise/.openapi-generator/VERSION | 2 +- samples/client/petstore/javascript-promise/src/ApiClient.js | 6 +++--- .../petstore/javascript-promise/src/api/AnotherFakeApi.js | 2 +- .../client/petstore/javascript-promise/src/api/FakeApi.js | 2 +- .../javascript-promise/src/api/FakeClassnameTags123Api.js | 2 +- .../client/petstore/javascript-promise/src/api/PetApi.js | 2 +- .../client/petstore/javascript-promise/src/api/StoreApi.js | 2 +- .../client/petstore/javascript-promise/src/api/UserApi.js | 2 +- samples/client/petstore/javascript-promise/src/index.js | 2 +- .../src/model/AdditionalPropertiesClass.js | 2 +- .../client/petstore/javascript-promise/src/model/Animal.js | 2 +- .../petstore/javascript-promise/src/model/AnimalFarm.js | 2 +- .../petstore/javascript-promise/src/model/ApiResponse.js | 2 +- .../src/model/ArrayOfArrayOfNumberOnly.js | 2 +- .../javascript-promise/src/model/ArrayOfNumberOnly.js | 2 +- .../petstore/javascript-promise/src/model/ArrayTest.js | 2 +- .../petstore/javascript-promise/src/model/Capitalization.js | 2 +- samples/client/petstore/javascript-promise/src/model/Cat.js | 2 +- .../petstore/javascript-promise/src/model/Category.js | 2 +- .../petstore/javascript-promise/src/model/ClassModel.js | 2 +- .../client/petstore/javascript-promise/src/model/Client.js | 2 +- samples/client/petstore/javascript-promise/src/model/Dog.js | 2 +- .../petstore/javascript-promise/src/model/EnumArrays.js | 2 +- .../petstore/javascript-promise/src/model/EnumClass.js | 2 +- .../petstore/javascript-promise/src/model/EnumTest.js | 2 +- .../client/petstore/javascript-promise/src/model/File.js | 2 +- .../javascript-promise/src/model/FileSchemaTestClass.js | 2 +- .../petstore/javascript-promise/src/model/FormatTest.js | 2 +- .../javascript-promise/src/model/HasOnlyReadOnly.js | 2 +- .../client/petstore/javascript-promise/src/model/List.js | 2 +- .../client/petstore/javascript-promise/src/model/MapTest.js | 2 +- .../model/MixedPropertiesAndAdditionalPropertiesClass.js | 2 +- .../javascript-promise/src/model/Model200Response.js | 2 +- .../petstore/javascript-promise/src/model/ModelReturn.js | 2 +- .../client/petstore/javascript-promise/src/model/Name.js | 2 +- .../petstore/javascript-promise/src/model/NumberOnly.js | 2 +- .../client/petstore/javascript-promise/src/model/Order.js | 2 +- .../petstore/javascript-promise/src/model/OuterComposite.js | 2 +- .../petstore/javascript-promise/src/model/OuterEnum.js | 2 +- samples/client/petstore/javascript-promise/src/model/Pet.js | 2 +- .../petstore/javascript-promise/src/model/ReadOnlyFirst.js | 2 +- .../javascript-promise/src/model/SpecialModelName.js | 2 +- .../javascript-promise/src/model/StringBooleanMap.js | 2 +- samples/client/petstore/javascript-promise/src/model/Tag.js | 2 +- .../client/petstore/javascript-promise/src/model/User.js | 2 +- .../client/petstore/javascript/.openapi-generator/VERSION | 2 +- samples/client/petstore/javascript/src/ApiClient.js | 6 +++--- .../client/petstore/javascript/src/api/AnotherFakeApi.js | 2 +- samples/client/petstore/javascript/src/api/FakeApi.js | 2 +- .../petstore/javascript/src/api/FakeClassnameTags123Api.js | 2 +- samples/client/petstore/javascript/src/api/PetApi.js | 2 +- samples/client/petstore/javascript/src/api/StoreApi.js | 2 +- samples/client/petstore/javascript/src/api/UserApi.js | 2 +- samples/client/petstore/javascript/src/index.js | 2 +- .../javascript/src/model/AdditionalPropertiesClass.js | 2 +- samples/client/petstore/javascript/src/model/Animal.js | 2 +- samples/client/petstore/javascript/src/model/AnimalFarm.js | 2 +- samples/client/petstore/javascript/src/model/ApiResponse.js | 2 +- .../javascript/src/model/ArrayOfArrayOfNumberOnly.js | 2 +- .../petstore/javascript/src/model/ArrayOfNumberOnly.js | 2 +- samples/client/petstore/javascript/src/model/ArrayTest.js | 2 +- .../client/petstore/javascript/src/model/Capitalization.js | 2 +- samples/client/petstore/javascript/src/model/Cat.js | 2 +- samples/client/petstore/javascript/src/model/Category.js | 2 +- samples/client/petstore/javascript/src/model/ClassModel.js | 2 +- samples/client/petstore/javascript/src/model/Client.js | 2 +- samples/client/petstore/javascript/src/model/Dog.js | 2 +- samples/client/petstore/javascript/src/model/EnumArrays.js | 2 +- samples/client/petstore/javascript/src/model/EnumClass.js | 2 +- samples/client/petstore/javascript/src/model/EnumTest.js | 2 +- samples/client/petstore/javascript/src/model/File.js | 2 +- .../petstore/javascript/src/model/FileSchemaTestClass.js | 2 +- samples/client/petstore/javascript/src/model/FormatTest.js | 2 +- .../client/petstore/javascript/src/model/HasOnlyReadOnly.js | 2 +- samples/client/petstore/javascript/src/model/List.js | 2 +- samples/client/petstore/javascript/src/model/MapTest.js | 2 +- .../model/MixedPropertiesAndAdditionalPropertiesClass.js | 2 +- .../petstore/javascript/src/model/Model200Response.js | 2 +- samples/client/petstore/javascript/src/model/ModelReturn.js | 2 +- samples/client/petstore/javascript/src/model/Name.js | 2 +- samples/client/petstore/javascript/src/model/NumberOnly.js | 2 +- samples/client/petstore/javascript/src/model/Order.js | 2 +- .../client/petstore/javascript/src/model/OuterComposite.js | 2 +- samples/client/petstore/javascript/src/model/OuterEnum.js | 2 +- samples/client/petstore/javascript/src/model/Pet.js | 2 +- .../client/petstore/javascript/src/model/ReadOnlyFirst.js | 2 +- .../petstore/javascript/src/model/SpecialModelName.js | 2 +- .../petstore/javascript/src/model/StringBooleanMap.js | 2 +- samples/client/petstore/javascript/src/model/Tag.js | 2 +- samples/client/petstore/javascript/src/model/User.js | 2 +- 96 files changed, 106 insertions(+), 106 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Javascript/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Javascript/ApiClient.mustache index 4c5a5d60e7f..997e9446f0f 100644 --- a/modules/openapi-generator/src/main/resources/Javascript/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Javascript/ApiClient.mustache @@ -463,7 +463,7 @@ // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -478,7 +478,7 @@ try { var data = _this.deserialize(response, returnType); if (_this.enableCookies && typeof window === 'undefined'){ - _this.agent.saveCookies(response); + _this.agent._saveCookies(response); } resolve({data: data, response: response}); } catch (err) { @@ -494,7 +494,7 @@ try { data = _this.deserialize(response, returnType); if (_this.enableCookies && typeof window === 'undefined'){ - _this.agent.saveCookies(response); + _this.agent._saveCookies(response); } } catch (err) { error = err; diff --git a/modules/openapi-generator/src/main/resources/Javascript/es6/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Javascript/es6/ApiClient.mustache index 7ba837e183d..f824d552fce 100644 --- a/modules/openapi-generator/src/main/resources/Javascript/es6/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Javascript/es6/ApiClient.mustache @@ -415,7 +415,7 @@ class ApiClient { // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -430,7 +430,7 @@ class ApiClient { try { var data = this.deserialize(response, returnType); if (this.enableCookies && typeof window === 'undefined'){ - this.agent.saveCookies(response); + this.agent._saveCookies(response); } resolve({data, response}); @@ -448,7 +448,7 @@ class ApiClient { try { data = this.deserialize(response, returnType); if (this.enableCookies && typeof window === 'undefined'){ - this.agent.saveCookies(response); + this.agent._saveCookies(response); } } catch (err) { error = err; diff --git a/samples/client/petstore/javascript-es6/.openapi-generator/VERSION b/samples/client/petstore/javascript-es6/.openapi-generator/VERSION index 14900cee60e..c791c986fbb 100644 --- a/samples/client/petstore/javascript-es6/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-es6/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-es6/src/ApiClient.js b/samples/client/petstore/javascript-es6/src/ApiClient.js index 85db2a42984..5f0486a1841 100644 --- a/samples/client/petstore/javascript-es6/src/ApiClient.js +++ b/samples/client/petstore/javascript-es6/src/ApiClient.js @@ -417,7 +417,7 @@ class ApiClient { // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -433,7 +433,7 @@ class ApiClient { try { data = this.deserialize(response, returnType); if (this.enableCookies && typeof window === 'undefined'){ - this.agent.saveCookies(response); + this.agent._saveCookies(response); } } catch (err) { error = err; diff --git a/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION b/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION index 14900cee60e..c791c986fbb 100644 --- a/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-promise-es6/src/ApiClient.js b/samples/client/petstore/javascript-promise-es6/src/ApiClient.js index 330df9845a0..4ce5c1e48d3 100644 --- a/samples/client/petstore/javascript-promise-es6/src/ApiClient.js +++ b/samples/client/petstore/javascript-promise-es6/src/ApiClient.js @@ -410,7 +410,7 @@ class ApiClient { // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -425,7 +425,7 @@ class ApiClient { try { var data = this.deserialize(response, returnType); if (this.enableCookies && typeof window === 'undefined'){ - this.agent.saveCookies(response); + this.agent._saveCookies(response); } resolve({data, response}); diff --git a/samples/client/petstore/javascript-promise/.openapi-generator/VERSION b/samples/client/petstore/javascript-promise/.openapi-generator/VERSION index 14900cee60e..c791c986fbb 100644 --- a/samples/client/petstore/javascript-promise/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-promise/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-promise/src/ApiClient.js b/samples/client/petstore/javascript-promise/src/ApiClient.js index b2151bf9f42..15e044368dc 100644 --- a/samples/client/petstore/javascript-promise/src/ApiClient.js +++ b/samples/client/petstore/javascript-promise/src/ApiClient.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * @@ -460,7 +460,7 @@ // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -475,7 +475,7 @@ try { var data = _this.deserialize(response, returnType); if (_this.enableCookies && typeof window === 'undefined'){ - _this.agent.saveCookies(response); + _this.agent._saveCookies(response); } resolve({data: data, response: response}); } catch (err) { diff --git a/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js b/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js index 84c0b45c7cd..d395a28c308 100644 --- a/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js +++ b/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/FakeApi.js b/samples/client/petstore/javascript-promise/src/api/FakeApi.js index 284f964a43c..fae50ab04ef 100644 --- a/samples/client/petstore/javascript-promise/src/api/FakeApi.js +++ b/samples/client/petstore/javascript-promise/src/api/FakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js b/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js index 409db18bdb9..3b55da896c7 100644 --- a/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js +++ b/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/PetApi.js b/samples/client/petstore/javascript-promise/src/api/PetApi.js index 15db5e00a60..f11646b2b2f 100644 --- a/samples/client/petstore/javascript-promise/src/api/PetApi.js +++ b/samples/client/petstore/javascript-promise/src/api/PetApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/StoreApi.js b/samples/client/petstore/javascript-promise/src/api/StoreApi.js index 517f01e2c83..6aefe154739 100644 --- a/samples/client/petstore/javascript-promise/src/api/StoreApi.js +++ b/samples/client/petstore/javascript-promise/src/api/StoreApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/UserApi.js b/samples/client/petstore/javascript-promise/src/api/UserApi.js index 2dfa2d9429d..d663102caff 100644 --- a/samples/client/petstore/javascript-promise/src/api/UserApi.js +++ b/samples/client/petstore/javascript-promise/src/api/UserApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/index.js b/samples/client/petstore/javascript-promise/src/index.js index 3f904b570ca..0a661df2958 100644 --- a/samples/client/petstore/javascript-promise/src/index.js +++ b/samples/client/petstore/javascript-promise/src/index.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js b/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js index 3e41a2906a5..a0fecb58c62 100644 --- a/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Animal.js b/samples/client/petstore/javascript-promise/src/model/Animal.js index 5ec0fe427cb..fe8092aca28 100644 --- a/samples/client/petstore/javascript-promise/src/model/Animal.js +++ b/samples/client/petstore/javascript-promise/src/model/Animal.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js b/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js index f8099197245..dee8dc23b6b 100644 --- a/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js +++ b/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ApiResponse.js b/samples/client/petstore/javascript-promise/src/model/ApiResponse.js index d3236a99234..019604926b1 100644 --- a/samples/client/petstore/javascript-promise/src/model/ApiResponse.js +++ b/samples/client/petstore/javascript-promise/src/model/ApiResponse.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js b/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js index e7ac7b24a33..db6766a51b3 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js b/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js index 7c98321c3d4..3e805670939 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayTest.js b/samples/client/petstore/javascript-promise/src/model/ArrayTest.js index 0f47e3e78ef..57ebe94e9f1 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayTest.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Capitalization.js b/samples/client/petstore/javascript-promise/src/model/Capitalization.js index 9f5e832699d..848ac1d0743 100644 --- a/samples/client/petstore/javascript-promise/src/model/Capitalization.js +++ b/samples/client/petstore/javascript-promise/src/model/Capitalization.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Cat.js b/samples/client/petstore/javascript-promise/src/model/Cat.js index 4c1d8f0c845..ee1b7683a14 100644 --- a/samples/client/petstore/javascript-promise/src/model/Cat.js +++ b/samples/client/petstore/javascript-promise/src/model/Cat.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Category.js b/samples/client/petstore/javascript-promise/src/model/Category.js index 560f1a94013..61577d4bd95 100644 --- a/samples/client/petstore/javascript-promise/src/model/Category.js +++ b/samples/client/petstore/javascript-promise/src/model/Category.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ClassModel.js b/samples/client/petstore/javascript-promise/src/model/ClassModel.js index cadf752c644..ce9f24d2afd 100644 --- a/samples/client/petstore/javascript-promise/src/model/ClassModel.js +++ b/samples/client/petstore/javascript-promise/src/model/ClassModel.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Client.js b/samples/client/petstore/javascript-promise/src/model/Client.js index 7bf09ed3ac6..dbe1f639d35 100644 --- a/samples/client/petstore/javascript-promise/src/model/Client.js +++ b/samples/client/petstore/javascript-promise/src/model/Client.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Dog.js b/samples/client/petstore/javascript-promise/src/model/Dog.js index 93f8f38ae13..7e2e6b91c61 100644 --- a/samples/client/petstore/javascript-promise/src/model/Dog.js +++ b/samples/client/petstore/javascript-promise/src/model/Dog.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumArrays.js b/samples/client/petstore/javascript-promise/src/model/EnumArrays.js index d7b36eb6307..8af55604e77 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumArrays.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumArrays.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumClass.js b/samples/client/petstore/javascript-promise/src/model/EnumClass.js index d2f7c69374b..400a587b11e 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumClass.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumTest.js b/samples/client/petstore/javascript-promise/src/model/EnumTest.js index e6f1a7ea9e4..95c35adc4d8 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumTest.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/File.js b/samples/client/petstore/javascript-promise/src/model/File.js index aa7449e2907..f0c412ed7e5 100644 --- a/samples/client/petstore/javascript-promise/src/model/File.js +++ b/samples/client/petstore/javascript-promise/src/model/File.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js b/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js index f2f1b8e966a..53f4b4659b6 100644 --- a/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js +++ b/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/FormatTest.js b/samples/client/petstore/javascript-promise/src/model/FormatTest.js index ea6d1966613..296857d44ca 100644 --- a/samples/client/petstore/javascript-promise/src/model/FormatTest.js +++ b/samples/client/petstore/javascript-promise/src/model/FormatTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js b/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js index b6470082caf..9aa9cfca512 100644 --- a/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/List.js b/samples/client/petstore/javascript-promise/src/model/List.js index 3b9f343524e..84b63989e85 100644 --- a/samples/client/petstore/javascript-promise/src/model/List.js +++ b/samples/client/petstore/javascript-promise/src/model/List.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/MapTest.js b/samples/client/petstore/javascript-promise/src/model/MapTest.js index 8563624adff..ee5f5dd07cd 100644 --- a/samples/client/petstore/javascript-promise/src/model/MapTest.js +++ b/samples/client/petstore/javascript-promise/src/model/MapTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js b/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js index ff56b0e4981..eaecc593817 100644 --- a/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Model200Response.js b/samples/client/petstore/javascript-promise/src/model/Model200Response.js index 665e9d64f65..7d22d9f50c1 100644 --- a/samples/client/petstore/javascript-promise/src/model/Model200Response.js +++ b/samples/client/petstore/javascript-promise/src/model/Model200Response.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ModelReturn.js b/samples/client/petstore/javascript-promise/src/model/ModelReturn.js index 836fab1b221..4e43daf99f8 100644 --- a/samples/client/petstore/javascript-promise/src/model/ModelReturn.js +++ b/samples/client/petstore/javascript-promise/src/model/ModelReturn.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Name.js b/samples/client/petstore/javascript-promise/src/model/Name.js index 24d63b4836f..076c04d87c1 100644 --- a/samples/client/petstore/javascript-promise/src/model/Name.js +++ b/samples/client/petstore/javascript-promise/src/model/Name.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/NumberOnly.js b/samples/client/petstore/javascript-promise/src/model/NumberOnly.js index b50c8dadc26..aaf10683e71 100644 --- a/samples/client/petstore/javascript-promise/src/model/NumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/NumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Order.js b/samples/client/petstore/javascript-promise/src/model/Order.js index 5abd1899c04..d4642cd267b 100644 --- a/samples/client/petstore/javascript-promise/src/model/Order.js +++ b/samples/client/petstore/javascript-promise/src/model/Order.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/OuterComposite.js b/samples/client/petstore/javascript-promise/src/model/OuterComposite.js index 7410237332e..5d83a1632d1 100644 --- a/samples/client/petstore/javascript-promise/src/model/OuterComposite.js +++ b/samples/client/petstore/javascript-promise/src/model/OuterComposite.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/OuterEnum.js b/samples/client/petstore/javascript-promise/src/model/OuterEnum.js index 0d7f9a4fd59..bf484fcdb5c 100644 --- a/samples/client/petstore/javascript-promise/src/model/OuterEnum.js +++ b/samples/client/petstore/javascript-promise/src/model/OuterEnum.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Pet.js b/samples/client/petstore/javascript-promise/src/model/Pet.js index 69d47d25aef..a3232c511cb 100644 --- a/samples/client/petstore/javascript-promise/src/model/Pet.js +++ b/samples/client/petstore/javascript-promise/src/model/Pet.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js b/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js index 4e2f573958e..74a2fe86277 100644 --- a/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js +++ b/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js b/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js index 5bea0b84fcf..d6791c03805 100644 --- a/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js +++ b/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js b/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js index d07c0fc99ea..87274d44502 100644 --- a/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js +++ b/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Tag.js b/samples/client/petstore/javascript-promise/src/model/Tag.js index 09299a4d0d6..228533a3157 100644 --- a/samples/client/petstore/javascript-promise/src/model/Tag.js +++ b/samples/client/petstore/javascript-promise/src/model/Tag.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/User.js b/samples/client/petstore/javascript-promise/src/model/User.js index 62a2a70c680..e305e9756b0 100644 --- a/samples/client/petstore/javascript-promise/src/model/User.js +++ b/samples/client/petstore/javascript-promise/src/model/User.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/.openapi-generator/VERSION b/samples/client/petstore/javascript/.openapi-generator/VERSION index 14900cee60e..c791c986fbb 100644 --- a/samples/client/petstore/javascript/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/ApiClient.js b/samples/client/petstore/javascript/src/ApiClient.js index 666b55968cd..a2d54c9b3ed 100644 --- a/samples/client/petstore/javascript/src/ApiClient.js +++ b/samples/client/petstore/javascript/src/ApiClient.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * @@ -469,7 +469,7 @@ // Attach previously saved cookies, if enabled if (this.enableCookies){ if (typeof window === 'undefined') { - this.agent.attachCookies(request); + this.agent._attachCookies(request); } else { request.withCredentials(); @@ -484,7 +484,7 @@ try { data = _this.deserialize(response, returnType); if (_this.enableCookies && typeof window === 'undefined'){ - _this.agent.saveCookies(response); + _this.agent._saveCookies(response); } } catch (err) { error = err; diff --git a/samples/client/petstore/javascript/src/api/AnotherFakeApi.js b/samples/client/petstore/javascript/src/api/AnotherFakeApi.js index 5075bf8ee34..ab4eada963d 100644 --- a/samples/client/petstore/javascript/src/api/AnotherFakeApi.js +++ b/samples/client/petstore/javascript/src/api/AnotherFakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/FakeApi.js b/samples/client/petstore/javascript/src/api/FakeApi.js index 56d61947600..1ac41b6bf33 100644 --- a/samples/client/petstore/javascript/src/api/FakeApi.js +++ b/samples/client/petstore/javascript/src/api/FakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js b/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js index 9384dce1b7d..d62d7d706de 100644 --- a/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js +++ b/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index 34bd8e70ddc..fc494798667 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index 33216d30b39..d7bb5ff5912 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 4ca5eb45ee7..092528a7580 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js index 3f904b570ca..0a661df2958 100644 --- a/samples/client/petstore/javascript/src/index.js +++ b/samples/client/petstore/javascript/src/index.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js b/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js index 3e41a2906a5..a0fecb58c62 100644 --- a/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Animal.js b/samples/client/petstore/javascript/src/model/Animal.js index 5ec0fe427cb..fe8092aca28 100644 --- a/samples/client/petstore/javascript/src/model/Animal.js +++ b/samples/client/petstore/javascript/src/model/Animal.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/AnimalFarm.js b/samples/client/petstore/javascript/src/model/AnimalFarm.js index f8099197245..dee8dc23b6b 100644 --- a/samples/client/petstore/javascript/src/model/AnimalFarm.js +++ b/samples/client/petstore/javascript/src/model/AnimalFarm.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ApiResponse.js b/samples/client/petstore/javascript/src/model/ApiResponse.js index d3236a99234..019604926b1 100644 --- a/samples/client/petstore/javascript/src/model/ApiResponse.js +++ b/samples/client/petstore/javascript/src/model/ApiResponse.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js b/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js index e7ac7b24a33..db6766a51b3 100644 --- a/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js b/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js index 7c98321c3d4..3e805670939 100644 --- a/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayTest.js b/samples/client/petstore/javascript/src/model/ArrayTest.js index 0f47e3e78ef..57ebe94e9f1 100644 --- a/samples/client/petstore/javascript/src/model/ArrayTest.js +++ b/samples/client/petstore/javascript/src/model/ArrayTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Capitalization.js b/samples/client/petstore/javascript/src/model/Capitalization.js index 9f5e832699d..848ac1d0743 100644 --- a/samples/client/petstore/javascript/src/model/Capitalization.js +++ b/samples/client/petstore/javascript/src/model/Capitalization.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Cat.js b/samples/client/petstore/javascript/src/model/Cat.js index 4c1d8f0c845..ee1b7683a14 100644 --- a/samples/client/petstore/javascript/src/model/Cat.js +++ b/samples/client/petstore/javascript/src/model/Cat.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js index 560f1a94013..61577d4bd95 100644 --- a/samples/client/petstore/javascript/src/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ClassModel.js b/samples/client/petstore/javascript/src/model/ClassModel.js index cadf752c644..ce9f24d2afd 100644 --- a/samples/client/petstore/javascript/src/model/ClassModel.js +++ b/samples/client/petstore/javascript/src/model/ClassModel.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Client.js b/samples/client/petstore/javascript/src/model/Client.js index 7bf09ed3ac6..dbe1f639d35 100644 --- a/samples/client/petstore/javascript/src/model/Client.js +++ b/samples/client/petstore/javascript/src/model/Client.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Dog.js b/samples/client/petstore/javascript/src/model/Dog.js index 93f8f38ae13..7e2e6b91c61 100644 --- a/samples/client/petstore/javascript/src/model/Dog.js +++ b/samples/client/petstore/javascript/src/model/Dog.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumArrays.js b/samples/client/petstore/javascript/src/model/EnumArrays.js index d7b36eb6307..8af55604e77 100644 --- a/samples/client/petstore/javascript/src/model/EnumArrays.js +++ b/samples/client/petstore/javascript/src/model/EnumArrays.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumClass.js b/samples/client/petstore/javascript/src/model/EnumClass.js index d2f7c69374b..400a587b11e 100644 --- a/samples/client/petstore/javascript/src/model/EnumClass.js +++ b/samples/client/petstore/javascript/src/model/EnumClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumTest.js b/samples/client/petstore/javascript/src/model/EnumTest.js index e6f1a7ea9e4..95c35adc4d8 100644 --- a/samples/client/petstore/javascript/src/model/EnumTest.js +++ b/samples/client/petstore/javascript/src/model/EnumTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/File.js b/samples/client/petstore/javascript/src/model/File.js index aa7449e2907..f0c412ed7e5 100644 --- a/samples/client/petstore/javascript/src/model/File.js +++ b/samples/client/petstore/javascript/src/model/File.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js b/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js index f2f1b8e966a..53f4b4659b6 100644 --- a/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js +++ b/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/FormatTest.js b/samples/client/petstore/javascript/src/model/FormatTest.js index ea6d1966613..296857d44ca 100644 --- a/samples/client/petstore/javascript/src/model/FormatTest.js +++ b/samples/client/petstore/javascript/src/model/FormatTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js b/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js index b6470082caf..9aa9cfca512 100644 --- a/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js +++ b/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/List.js b/samples/client/petstore/javascript/src/model/List.js index 3b9f343524e..84b63989e85 100644 --- a/samples/client/petstore/javascript/src/model/List.js +++ b/samples/client/petstore/javascript/src/model/List.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/MapTest.js b/samples/client/petstore/javascript/src/model/MapTest.js index 8563624adff..ee5f5dd07cd 100644 --- a/samples/client/petstore/javascript/src/model/MapTest.js +++ b/samples/client/petstore/javascript/src/model/MapTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js b/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js index ff56b0e4981..eaecc593817 100644 --- a/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Model200Response.js b/samples/client/petstore/javascript/src/model/Model200Response.js index 665e9d64f65..7d22d9f50c1 100644 --- a/samples/client/petstore/javascript/src/model/Model200Response.js +++ b/samples/client/petstore/javascript/src/model/Model200Response.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ModelReturn.js b/samples/client/petstore/javascript/src/model/ModelReturn.js index 836fab1b221..4e43daf99f8 100644 --- a/samples/client/petstore/javascript/src/model/ModelReturn.js +++ b/samples/client/petstore/javascript/src/model/ModelReturn.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Name.js b/samples/client/petstore/javascript/src/model/Name.js index 24d63b4836f..076c04d87c1 100644 --- a/samples/client/petstore/javascript/src/model/Name.js +++ b/samples/client/petstore/javascript/src/model/Name.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/NumberOnly.js b/samples/client/petstore/javascript/src/model/NumberOnly.js index b50c8dadc26..aaf10683e71 100644 --- a/samples/client/petstore/javascript/src/model/NumberOnly.js +++ b/samples/client/petstore/javascript/src/model/NumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js index 5abd1899c04..d4642cd267b 100644 --- a/samples/client/petstore/javascript/src/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/OuterComposite.js b/samples/client/petstore/javascript/src/model/OuterComposite.js index 7410237332e..5d83a1632d1 100644 --- a/samples/client/petstore/javascript/src/model/OuterComposite.js +++ b/samples/client/petstore/javascript/src/model/OuterComposite.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/OuterEnum.js b/samples/client/petstore/javascript/src/model/OuterEnum.js index 0d7f9a4fd59..bf484fcdb5c 100644 --- a/samples/client/petstore/javascript/src/model/OuterEnum.js +++ b/samples/client/petstore/javascript/src/model/OuterEnum.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js index 69d47d25aef..a3232c511cb 100644 --- a/samples/client/petstore/javascript/src/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js b/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js index 4e2f573958e..74a2fe86277 100644 --- a/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js +++ b/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/SpecialModelName.js b/samples/client/petstore/javascript/src/model/SpecialModelName.js index 5bea0b84fcf..d6791c03805 100644 --- a/samples/client/petstore/javascript/src/model/SpecialModelName.js +++ b/samples/client/petstore/javascript/src/model/SpecialModelName.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/StringBooleanMap.js b/samples/client/petstore/javascript/src/model/StringBooleanMap.js index d07c0fc99ea..87274d44502 100644 --- a/samples/client/petstore/javascript/src/model/StringBooleanMap.js +++ b/samples/client/petstore/javascript/src/model/StringBooleanMap.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js index 09299a4d0d6..228533a3157 100644 --- a/samples/client/petstore/javascript/src/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/User.js b/samples/client/petstore/javascript/src/model/User.js index 62a2a70c680..e305e9756b0 100644 --- a/samples/client/petstore/javascript/src/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.1-SNAPSHOT + * OpenAPI Generator version: 3.2.3-SNAPSHOT * * Do not edit the class manually. * From 66022a1f2267c3515e42b47b4b565872df1ae35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Tue, 4 Sep 2018 15:46:46 +0200 Subject: [PATCH 43/74] Update swagger-parser to v2.0.3-OpenAPITools.org-1 (#951) * Update swagger-parser to v2.0.3-OpenAPITools.org-1 * Run bin/rust-server-petstore.sh --- CI/pom.xml.bash | 2 +- CI/pom.xml.circleci | 2 +- CI/pom.xml.circleci.java7 | 2 +- CI/pom.xml.ios | 2 +- pom.xml | 2 +- .../rust-server/output/rust-server-test/api/openapi.yaml | 2 ++ .../rust-server/output/rust-server-test/src/client/mod.rs | 2 +- .../petstore/rust-server/output/rust-server-test/src/lib.rs | 2 +- .../rust-server/output/rust-server-test/src/server/mod.rs | 2 +- 9 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CI/pom.xml.bash b/CI/pom.xml.bash index db47a951971..a17e0ae51a9 100644 --- a/CI/pom.xml.bash +++ b/CI/pom.xml.bash @@ -920,7 +920,7 @@ - 2.0.2-OpenAPITools.org-1 + 2.0.3-OpenAPITools.org-1 2.0.1 2.11.1 3.3.0 diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index 919bd961436..e49833ab326 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -1030,7 +1030,7 @@ - 2.0.2-OpenAPITools.org-1 + 2.0.3-OpenAPITools.org-1 2.0.1 2.11.1 3.3.0 diff --git a/CI/pom.xml.circleci.java7 b/CI/pom.xml.circleci.java7 index 2fe52837a87..3713c48fa68 100644 --- a/CI/pom.xml.circleci.java7 +++ b/CI/pom.xml.circleci.java7 @@ -1000,7 +1000,7 @@ - 2.0.2-OpenAPITools.org-1 + 2.0.3-OpenAPITools.org-1 2.0.1 2.11.1 3.3.0 diff --git a/CI/pom.xml.ios b/CI/pom.xml.ios index f77dfc9f1c9..ffbf423381e 100644 --- a/CI/pom.xml.ios +++ b/CI/pom.xml.ios @@ -928,7 +928,7 @@ - 2.0.2-OpenAPITools.org-1 + 2.0.3-OpenAPITools.org-1 2.0.1 2.11.1 3.3.0 diff --git a/pom.xml b/pom.xml index 5c1ae35b957..31438e91cf5 100644 --- a/pom.xml +++ b/pom.xml @@ -1135,7 +1135,7 @@ 1.8 1.8 - 2.0.2-OpenAPITools.org-1 + 2.0.3-OpenAPITools.org-1 2.0.1 2.11.1 3.3.0 diff --git a/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml b/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml index 3801e933580..3ad35a166ff 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml +++ b/samples/server/petstore/rust-server/output/rust-server-test/api/openapi.yaml @@ -3,6 +3,8 @@ info: description: This spec is for testing rust-server-specific things title: rust-server-test version: 1.0.0 +servers: +- url: / paths: /dummy: get: diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs index 78aa49e0085..3f868e0407c 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/client/mod.rs @@ -249,7 +249,7 @@ impl Api for Client where let uri = format!( - "{}/dummy", + "{}//dummy", self.base_path ); diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/lib.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/lib.rs index aceb8e42ccc..50b0fc6207f 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/lib.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/lib.rs @@ -35,7 +35,7 @@ mod mimetypes; pub use swagger::{ApiError, ContextWrapper}; -pub const BASE_PATH: &'static str = ""; +pub const BASE_PATH: &'static str = "/"; pub const API_VERSION: &'static str = "1.0.0"; diff --git a/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs b/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs index 919e430b084..f15596204ed 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs +++ b/samples/server/petstore/rust-server/output/rust-server-test/src/server/mod.rs @@ -51,7 +51,7 @@ mod paths { lazy_static! { pub static ref GLOBAL_REGEX_SET: regex::RegexSet = regex::RegexSet::new(&[ - r"^/dummy$" + r"^//dummy$" ]).unwrap(); } pub static ID_DUMMY: usize = 0; From 7a18a1a7b6809d4db9a63fcc90a5330f96e092af Mon Sep 17 00:00:00 2001 From: Remi Patriarche Date: Wed, 5 Sep 2018 01:57:11 +0200 Subject: [PATCH 44/74] [typescript-angular] Add `fileNaming` configuration property (#767) * resolve #727 * remove commented code --- .../codegen/DefaultGenerator.java | 1 + .../TypeScriptAngularClientCodegen.java | 41 +++++++++++++++++-- ...ypeScriptAngularClientOptionsProvider.java | 2 + 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index f4a05610abc..718a4c86b25 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -1026,6 +1026,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } if (mapping != null) { im.put("import", mapping); + im.put("classname", nextImport); if (!imports.contains(im)) { // avoid duplicates imports.add(im); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java index 4ae97530cc4..17ad3c37e78 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAngularClientCodegen.java @@ -50,6 +50,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode public static final String SERVICE_FILE_SUFFIX = "serviceFileSuffix"; public static final String MODEL_SUFFIX = "modelSuffix"; public static final String MODEL_FILE_SUFFIX = "modelFileSuffix"; + public static final String FILE_NAMING = "fileNaming"; protected String npmName = null; protected String npmVersion = "1.0.0"; @@ -58,6 +59,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode protected String serviceFileSuffix = ".service"; protected String modelSuffix = ""; protected String modelFileSuffix = ""; + protected String fileNaming = "camelCase"; private boolean taggedUnions = false; @@ -95,6 +97,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode this.cliOptions.add(new CliOption(SERVICE_FILE_SUFFIX, "The suffix of the file of the generated service (service.ts). Default is '.service'.")); this.cliOptions.add(new CliOption(MODEL_SUFFIX, "The suffix of the generated model. Default is ''.")); this.cliOptions.add(new CliOption(MODEL_FILE_SUFFIX, "The suffix of the file of the generated model (model.ts). Default is ''.")); + this.cliOptions.add(new CliOption(FILE_NAMING, "Naming convention for the output files: 'camelCase', 'kebab-case'. Default is 'camelCase'.")); } @Override @@ -189,6 +192,9 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode modelFileSuffix = additionalProperties.get(MODEL_FILE_SUFFIX).toString(); validateFileSuffixArgument("Model", modelFileSuffix); } + if (additionalProperties.containsKey(FILE_NAMING)) { + this.setFileNaming(additionalProperties.get(FILE_NAMING).toString()); + } } private void addNpmPackageGeneration(SemVer ngVersion) { @@ -375,7 +381,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode List> imports = (List>) operations.get("imports"); for (Map im : imports) { im.put("filename", im.get("import")); - im.put("classname", getModelnameFromModelFilename(im.get("filename").toString())); + im.put("classname", im.get("classname")); } return operations; @@ -456,7 +462,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode if (name.length() == 0) { return "default.service"; } - return org.openapitools.codegen.utils.StringUtils.camelize(removeModelSuffixIfNecessary(name), true) + serviceFileSuffix; + return this.convertUsingFileNamingConvention(name) + serviceFileSuffix; } @Override @@ -466,8 +472,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode @Override public String toModelFilename(String name) { - String modelName = toModelName(name); - return org.openapitools.codegen.utils.StringUtils.camelize(removeModelSuffixIfNecessary(modelName), true) + modelFileSuffix; + return this.convertUsingFileNamingConvention(name) + modelFileSuffix; } @Override @@ -558,4 +563,32 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode ); } } + + /** + * Set the file naming type. + * @param fileNaming the file naming to use + */ + private void setFileNaming(String fileNaming) { + if ("camelCase".equals(fileNaming) || "kebab-case".equals(fileNaming)) { + this.fileNaming = fileNaming; + } else { + throw new IllegalArgumentException("Invalid file naming '" + + fileNaming + "'. Must be 'camelCase' or 'kebab-case'"); + } + } + + /** + * Converts the original name according to the current fileNaming strategy. + * @param originalName the original name to transform + * @return the transformed name + */ + private String convertUsingFileNamingConvention(String originalName) { + String name = this.removeModelSuffixIfNecessary(originalName); + if ("kebab-case".equals(fileNaming)) { + name = dashize(underscore(name)); + } else { + name = camelize(name, true); + } + return name; + } } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptAngularClientOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptAngularClientOptionsProvider.java index d4a1e718589..c809a156ea5 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptAngularClientOptionsProvider.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/TypeScriptAngularClientOptionsProvider.java @@ -35,6 +35,7 @@ public class TypeScriptAngularClientOptionsProvider implements OptionsProvider { public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false"; public static final String NG_VERSION = "2"; public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true"; + public static final String FILE_NAMING_VALUE = "camelCase"; public static String SERVICE_SUFFIX = "Service"; public static String SERVICE_FILE_SUFFIX = ".service"; public static String MODEL_SUFFIX = ""; @@ -66,6 +67,7 @@ public class TypeScriptAngularClientOptionsProvider implements OptionsProvider { .put(TypeScriptAngularClientCodegen.MODEL_FILE_SUFFIX, MODEL_FILE_SUFFIX) .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(CodegenConstants.PREPEND_FORM_OR_BODY_PARAMETERS, PREPEND_FORM_OR_BODY_PARAMETERS_VALUE) + .put(TypeScriptAngularClientCodegen.FILE_NAMING, FILE_NAMING_VALUE) .build(); } From 5d52bd51bfb9b1343818e96059b1069f4d48acaa Mon Sep 17 00:00:00 2001 From: Nathan Broadbent Date: Wed, 5 Sep 2018 06:59:16 +0700 Subject: [PATCH 45/74] Generate a Gemfile.lock for the Ruby client, to keep versions consistent when running automated tests (#966) --- .../codegen/languages/RubyClientCodegen.java | 1 + .../ruby-client/Gemfile.lock.mustache | 69 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java index 995d21788c6..dc84d632ff5 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RubyClientCodegen.java @@ -216,6 +216,7 @@ public class RubyClientCodegen extends AbstractRubyCodegen { supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); supportingFiles.add(new SupportingFile("Rakefile.mustache", "", "Rakefile")); supportingFiles.add(new SupportingFile("Gemfile.mustache", "", "Gemfile")); + supportingFiles.add(new SupportingFile("Gemfile.lock.mustache", "", "Gemfile.lock")); supportingFiles.add(new SupportingFile("rubocop.mustache", "", ".rubocop.yml")); // test files should not be overwritten diff --git a/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache new file mode 100644 index 00000000000..1c472281127 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache @@ -0,0 +1,69 @@ +PATH + remote: . + specs: + {{gemName}}{{^gemName}}{{{appName}}}{{/gemName}} ({{gemVersion}}) + json (~> 2.1, >= 2.1.0) + typhoeus (~> 1.0, >= 1.0.1) + +GEM + remote: https://rubygems.org/ + specs: + ZenTest (4.11.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + autotest (4.4.6) + ZenTest (>= 4.4.1) + autotest-fsevent (0.2.13) + sys-uname + autotest-growl (0.2.16) + autotest-rails-pure (4.1.2) + crack (0.4.3) + safe_yaml (~> 1.0.0) + diff-lcs (1.3) + ethon (0.11.0) + ffi (>= 1.3.0) + ffi (1.9.25) + hashdiff (0.3.7) + json (2.1.0) + public_suffix (3.0.3) + rake (12.0.0) + rspec (3.8.0) + rspec-core (~> 3.8.0) + rspec-expectations (~> 3.8.0) + rspec-mocks (~> 3.8.0) + rspec-core (3.8.0) + rspec-support (~> 3.8.0) + rspec-expectations (3.8.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.8.0) + rspec-mocks (3.8.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.8.0) + rspec-support (3.8.0) + safe_yaml (1.0.4) + sys-uname (1.0.3) + ffi (>= 1.0.0) + typhoeus (1.3.0) + ethon (>= 0.9.0) + vcr (3.0.3) + webmock (1.24.6) + addressable (>= 2.3.6) + crack (>= 0.3.2) + hashdiff + +PLATFORMS + ruby + +DEPENDENCIES + autotest (~> 4.4, >= 4.4.6) + autotest-fsevent (~> 0.2, >= 0.2.12) + autotest-growl (~> 0.2, >= 0.2.16) + autotest-rails-pure (~> 4.1, >= 4.1.2) + {{gemName}}{{^gemName}}{{{appName}}}{{/gemName}}! + rake (~> 12.0.0) + rspec (~> 3.6, >= 3.6.0) + vcr (~> 3.0, >= 3.0.1) + webmock (~> 1.24, >= 1.24.3) + +BUNDLED WITH + 1.16.1 From 26591f5d7ff1e9d4d2a785e77311d96d39ec5034 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 5 Sep 2018 08:04:27 +0800 Subject: [PATCH 46/74] Use elm-format to format Elm API client (#959) * add elm-format support * update elm petstore samples * add trenneman to elm tech comm * replace dart class with elm class * revise elm format arguments * update petstore samples --- README.md | 2 +- bin/elm-petstore-all.sh | 5 ++ .../codegen/languages/ElmClientCodegen.java | 51 +++++++++++++++++-- .../elm-0.18/.openapi-generator/VERSION | 2 +- .../elm-0.18/src/Data/ApiResponse.elm | 2 - .../petstore/elm-0.18/src/Data/Category.elm | 2 - .../petstore/elm-0.18/src/Data/Order_.elm | 28 +++++----- .../client/petstore/elm-0.18/src/Data/Pet.elm | 28 +++++----- .../client/petstore/elm-0.18/src/Data/Tag.elm | 2 - .../petstore/elm-0.18/src/Data/User.elm | 2 - .../petstore/elm-0.18/src/Request/Pet.elm | 2 +- .../petstore/elm/.openapi-generator/VERSION | 2 +- .../petstore/elm/src/Data/ApiResponse.elm | 2 - .../client/petstore/elm/src/Data/Category.elm | 2 - .../client/petstore/elm/src/Data/Order_.elm | 28 +++++----- samples/client/petstore/elm/src/Data/Pet.elm | 30 +++++------ samples/client/petstore/elm/src/Data/Tag.elm | 2 - samples/client/petstore/elm/src/Data/User.elm | 2 - .../client/petstore/elm/src/Request/Pet.elm | 2 +- 19 files changed, 105 insertions(+), 91 deletions(-) create mode 100755 bin/elm-petstore-all.sh diff --git a/README.md b/README.md index f9e48fd6fcd..2bf2f1cc0b3 100644 --- a/README.md +++ b/README.md @@ -637,7 +637,7 @@ If you want to join the committee, please kindly apply by sending an email to te | Dart | @ircecho (2017/07) @swipesight (2018/09) | | Eiffel | @jvelilla (2017/09) | | Elixir | | -| Elm | | +| Elm | @trenneman (2018/09) | | Erlang | @tsloughter (2017/11) | | Go | @antihax (2017/11) @bvwells (2017/12) @grokify (2018/07) | | Groovy | | diff --git a/bin/elm-petstore-all.sh b/bin/elm-petstore-all.sh new file mode 100755 index 00000000000..0d64cf613cf --- /dev/null +++ b/bin/elm-petstore-all.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +./bin/elm-0.18-petstore.sh +./bin/elm-petstore.sh + diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 42b21c5d903..a4d631ab9e2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -34,6 +34,12 @@ import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.utils.ModelUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.FilenameUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.File; import java.text.Collator; import java.util.ArrayList; @@ -48,21 +54,20 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; - public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(ElmClientCodegen.class); + private Set customPrimitives = new HashSet(); + private ElmVersion elmVersion = ElmVersion.ELM_019; + private static final String ELM_VERSION = "elmVersion"; private static final String ENCODER = "elmEncoder"; private static final String DECODER = "elmDecoder"; private static final String X_DISCRIMINATOR_TYPE = "x-discriminator-value"; private static final String UNION_TYPE = "elmUnionType"; - private Set customPrimitives = new HashSet(); - protected String packageName = "openapi"; protected String packageVersion = "1.0.0"; - private ElmVersion elmVersion = ElmVersion.ELM_019; - public CodegenType getTag() { return CodegenType.CLIENT; } @@ -160,6 +165,10 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("ELM_FORMAT_PATH"))) { + LOGGER.info("Environment variable ELM_FORMAT_PATH not defined so the Elm code may not be properly formatted. To define it, try 'export ELM_FORMAT_PATH=/usr/local/bin/elm-format' (Linux/Mac)"); + } + if (additionalProperties.containsKey(ELM_VERSION)) { final String version = (String) additionalProperties.get(ELM_VERSION); if ("0.18".equals(version)) { @@ -624,4 +633,36 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig { ELM_018, ELM_019 } + + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + String elmFmtPath = System.getenv("ELM_FORMAT_PATH"); + if (StringUtils.isEmpty(elmFmtPath)) { + return; // skip if ELM_FORMAT_PATH env variable is not defined + } + + // only process files with elm extension + if ("elm".equals(FilenameUtils.getExtension(file.toString()))) { + // currently only support "elm-format -w yourcode.elm" + String command = elmFmtPath + " --yes " + file.toString(); + if (ElmVersion.ELM_018.equals(elmVersion)) { + command += " --elm-version=0.18"; + } + + try { + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}): {}", command, p.exitValue()); + } + } catch (Exception e) { + LOGGER.error("Error running the command ({}): {}", command, e.getMessage()); + } + LOGGER.info("Successfully executed: " + command); + } + } } diff --git a/samples/client/petstore/elm-0.18/.openapi-generator/VERSION b/samples/client/petstore/elm-0.18/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/elm-0.18/.openapi-generator/VERSION +++ b/samples/client/petstore/elm-0.18/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm b/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm index c7400283086..b392f467ca5 100644 --- a/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm +++ b/samples/client/petstore/elm-0.18/src/Data/ApiResponse.elm @@ -35,7 +35,6 @@ apiResponseDecoder = |> optional "message" (Decode.nullable Decode.string) Nothing - apiResponseEncoder : ApiResponse -> Encode.Value apiResponseEncoder model = Encode.object @@ -43,4 +42,3 @@ apiResponseEncoder model = , ( "type", withDefault Encode.null (map Encode.string model.type_) ) , ( "message", withDefault Encode.null (map Encode.string model.message) ) ] - diff --git a/samples/client/petstore/elm-0.18/src/Data/Category.elm b/samples/client/petstore/elm-0.18/src/Data/Category.elm index b2baddd929f..c47b3e1fa62 100644 --- a/samples/client/petstore/elm-0.18/src/Data/Category.elm +++ b/samples/client/petstore/elm-0.18/src/Data/Category.elm @@ -33,11 +33,9 @@ categoryDecoder = |> optional "name" (Decode.nullable Decode.string) Nothing - categoryEncoder : Category -> Encode.Value categoryEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm-0.18/src/Data/Order_.elm b/samples/client/petstore/elm-0.18/src/Data/Order_.elm index 58559b874be..8703f63c8ed 100644 --- a/samples/client/petstore/elm-0.18/src/Data/Order_.elm +++ b/samples/client/petstore/elm-0.18/src/Data/Order_.elm @@ -37,7 +37,6 @@ type Status | Delivered - orderDecoder : Decoder Order_ orderDecoder = decode Order_ @@ -49,7 +48,6 @@ orderDecoder = |> optional "complete" (Decode.nullable Decode.bool) (Just False) - orderEncoder : Order_ -> Encode.Value orderEncoder model = Encode.object @@ -65,20 +63,21 @@ orderEncoder model = statusDecoder : Decoder Status statusDecoder = Decode.string - |> Decode.andThen (\str -> - case str of - "placed" -> - Decode.succeed Placed + |> Decode.andThen + (\str -> + case str of + "placed" -> + Decode.succeed Placed - "approved" -> - Decode.succeed Approved + "approved" -> + Decode.succeed Approved - "delivered" -> - Decode.succeed Delivered + "delivered" -> + Decode.succeed Delivered - other -> - Decode.fail <| "Unknown type: " ++ other - ) + other -> + Decode.fail <| "Unknown type: " ++ other + ) statusEncoder : Status -> Encode.Value @@ -92,6 +91,3 @@ statusEncoder model = Delivered -> Encode.string "delivered" - - - diff --git a/samples/client/petstore/elm-0.18/src/Data/Pet.elm b/samples/client/petstore/elm-0.18/src/Data/Pet.elm index cdb4296712e..76fb0e4d0a2 100644 --- a/samples/client/petstore/elm-0.18/src/Data/Pet.elm +++ b/samples/client/petstore/elm-0.18/src/Data/Pet.elm @@ -38,7 +38,6 @@ type Status | Sold - petDecoder : Decoder Pet petDecoder = decode Pet @@ -50,7 +49,6 @@ petDecoder = |> optional "status" (Decode.nullable statusDecoder) Nothing - petEncoder : Pet -> Encode.Value petEncoder model = Encode.object @@ -66,20 +64,21 @@ petEncoder model = statusDecoder : Decoder Status statusDecoder = Decode.string - |> Decode.andThen (\str -> - case str of - "available" -> - Decode.succeed Available + |> Decode.andThen + (\str -> + case str of + "available" -> + Decode.succeed Available - "pending" -> - Decode.succeed Pending + "pending" -> + Decode.succeed Pending - "sold" -> - Decode.succeed Sold + "sold" -> + Decode.succeed Sold - other -> - Decode.fail <| "Unknown type: " ++ other - ) + other -> + Decode.fail <| "Unknown type: " ++ other + ) statusEncoder : Status -> Encode.Value @@ -93,6 +92,3 @@ statusEncoder model = Sold -> Encode.string "sold" - - - diff --git a/samples/client/petstore/elm-0.18/src/Data/Tag.elm b/samples/client/petstore/elm-0.18/src/Data/Tag.elm index 79d0fa2da27..338eaa7ad27 100644 --- a/samples/client/petstore/elm-0.18/src/Data/Tag.elm +++ b/samples/client/petstore/elm-0.18/src/Data/Tag.elm @@ -33,11 +33,9 @@ tagDecoder = |> optional "name" (Decode.nullable Decode.string) Nothing - tagEncoder : Tag -> Encode.Value tagEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm-0.18/src/Data/User.elm b/samples/client/petstore/elm-0.18/src/Data/User.elm index 657f6fb6600..2b873692d2d 100644 --- a/samples/client/petstore/elm-0.18/src/Data/User.elm +++ b/samples/client/petstore/elm-0.18/src/Data/User.elm @@ -45,7 +45,6 @@ userDecoder = |> optional "userStatus" (Decode.nullable Decode.int) Nothing - userEncoder : User -> Encode.Value userEncoder model = Encode.object @@ -58,4 +57,3 @@ userEncoder model = , ( "phone", withDefault Encode.null (map Encode.string model.phone) ) , ( "userStatus", withDefault Encode.null (map Encode.int model.userStatus) ) ] - diff --git a/samples/client/petstore/elm-0.18/src/Request/Pet.elm b/samples/client/petstore/elm-0.18/src/Request/Pet.elm index 0a4b5c1769e..948ab5d3c01 100644 --- a/samples/client/petstore/elm-0.18/src/Request/Pet.elm +++ b/samples/client/petstore/elm-0.18/src/Request/Pet.elm @@ -12,8 +12,8 @@ module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags, getPetById, updatePet, updatePetWithForm, uploadFile) -import Data.Pet exposing (Pet, petDecoder, petEncoder) import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder) +import Data.Pet exposing (Pet, petDecoder, petEncoder) import Dict import Http import Json.Decode as Decode diff --git a/samples/client/petstore/elm/.openapi-generator/VERSION b/samples/client/petstore/elm/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/elm/.openapi-generator/VERSION +++ b/samples/client/petstore/elm/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/elm/src/Data/ApiResponse.elm b/samples/client/petstore/elm/src/Data/ApiResponse.elm index a8af70b330c..9bb9480a8ae 100644 --- a/samples/client/petstore/elm/src/Data/ApiResponse.elm +++ b/samples/client/petstore/elm/src/Data/ApiResponse.elm @@ -35,7 +35,6 @@ apiResponseDecoder = |> optional "message" (Decode.nullable Decode.string) Nothing - apiResponseEncoder : ApiResponse -> Encode.Value apiResponseEncoder model = Encode.object @@ -43,4 +42,3 @@ apiResponseEncoder model = , ( "type", withDefault Encode.null (map Encode.string model.type_) ) , ( "message", withDefault Encode.null (map Encode.string model.message) ) ] - diff --git a/samples/client/petstore/elm/src/Data/Category.elm b/samples/client/petstore/elm/src/Data/Category.elm index b00828d0418..01b80800072 100644 --- a/samples/client/petstore/elm/src/Data/Category.elm +++ b/samples/client/petstore/elm/src/Data/Category.elm @@ -33,11 +33,9 @@ categoryDecoder = |> optional "name" (Decode.nullable Decode.string) Nothing - categoryEncoder : Category -> Encode.Value categoryEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm/src/Data/Order_.elm b/samples/client/petstore/elm/src/Data/Order_.elm index f1e713ac7c9..3985c150336 100644 --- a/samples/client/petstore/elm/src/Data/Order_.elm +++ b/samples/client/petstore/elm/src/Data/Order_.elm @@ -37,7 +37,6 @@ type Status | Delivered - orderDecoder : Decoder Order_ orderDecoder = Decode.succeed Order_ @@ -49,7 +48,6 @@ orderDecoder = |> optional "complete" (Decode.nullable Decode.bool) (Just False) - orderEncoder : Order_ -> Encode.Value orderEncoder model = Encode.object @@ -65,20 +63,21 @@ orderEncoder model = statusDecoder : Decoder Status statusDecoder = Decode.string - |> Decode.andThen (\str -> - case str of - "placed" -> - Decode.succeed Placed + |> Decode.andThen + (\str -> + case str of + "placed" -> + Decode.succeed Placed - "approved" -> - Decode.succeed Approved + "approved" -> + Decode.succeed Approved - "delivered" -> - Decode.succeed Delivered + "delivered" -> + Decode.succeed Delivered - other -> - Decode.fail <| "Unknown type: " ++ other - ) + other -> + Decode.fail <| "Unknown type: " ++ other + ) statusEncoder : Status -> Encode.Value @@ -92,6 +91,3 @@ statusEncoder model = Delivered -> Encode.string "delivered" - - - diff --git a/samples/client/petstore/elm/src/Data/Pet.elm b/samples/client/petstore/elm/src/Data/Pet.elm index f37f03e085d..f0968e4c1db 100644 --- a/samples/client/petstore/elm/src/Data/Pet.elm +++ b/samples/client/petstore/elm/src/Data/Pet.elm @@ -38,7 +38,6 @@ type Status | Sold - petDecoder : Decoder Pet petDecoder = Decode.succeed Pet @@ -50,14 +49,13 @@ petDecoder = |> optional "status" (Decode.nullable statusDecoder) Nothing - petEncoder : Pet -> Encode.Value petEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "category", withDefault Encode.null (map categoryEncoder model.category) ) , ( "name", Encode.string model.name ) - , ( "photoUrls", (Encode.list Encode.string) model.photoUrls ) + , ( "photoUrls", Encode.list Encode.string model.photoUrls ) , ( "tags", withDefault Encode.null (map (Encode.list tagEncoder) model.tags) ) , ( "status", withDefault Encode.null (map statusEncoder model.status) ) ] @@ -66,20 +64,21 @@ petEncoder model = statusDecoder : Decoder Status statusDecoder = Decode.string - |> Decode.andThen (\str -> - case str of - "available" -> - Decode.succeed Available + |> Decode.andThen + (\str -> + case str of + "available" -> + Decode.succeed Available - "pending" -> - Decode.succeed Pending + "pending" -> + Decode.succeed Pending - "sold" -> - Decode.succeed Sold + "sold" -> + Decode.succeed Sold - other -> - Decode.fail <| "Unknown type: " ++ other - ) + other -> + Decode.fail <| "Unknown type: " ++ other + ) statusEncoder : Status -> Encode.Value @@ -93,6 +92,3 @@ statusEncoder model = Sold -> Encode.string "sold" - - - diff --git a/samples/client/petstore/elm/src/Data/Tag.elm b/samples/client/petstore/elm/src/Data/Tag.elm index 7ab34e9168a..21c76a52eee 100644 --- a/samples/client/petstore/elm/src/Data/Tag.elm +++ b/samples/client/petstore/elm/src/Data/Tag.elm @@ -33,11 +33,9 @@ tagDecoder = |> optional "name" (Decode.nullable Decode.string) Nothing - tagEncoder : Tag -> Encode.Value tagEncoder model = Encode.object [ ( "id", withDefault Encode.null (map Encode.int model.id) ) , ( "name", withDefault Encode.null (map Encode.string model.name) ) ] - diff --git a/samples/client/petstore/elm/src/Data/User.elm b/samples/client/petstore/elm/src/Data/User.elm index 9395b0d02f8..3f08ec51625 100644 --- a/samples/client/petstore/elm/src/Data/User.elm +++ b/samples/client/petstore/elm/src/Data/User.elm @@ -45,7 +45,6 @@ userDecoder = |> optional "userStatus" (Decode.nullable Decode.int) Nothing - userEncoder : User -> Encode.Value userEncoder model = Encode.object @@ -58,4 +57,3 @@ userEncoder model = , ( "phone", withDefault Encode.null (map Encode.string model.phone) ) , ( "userStatus", withDefault Encode.null (map Encode.int model.userStatus) ) ] - diff --git a/samples/client/petstore/elm/src/Request/Pet.elm b/samples/client/petstore/elm/src/Request/Pet.elm index 2a96489a830..0a3b1e89891 100644 --- a/samples/client/petstore/elm/src/Request/Pet.elm +++ b/samples/client/petstore/elm/src/Request/Pet.elm @@ -12,8 +12,8 @@ module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags, getPetById, updatePet, updatePetWithForm, uploadFile) -import Data.Pet exposing (Pet, petDecoder, petEncoder) import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder) +import Data.Pet exposing (Pet, petDecoder, petEncoder) import Dict import Http import Json.Decode as Decode From 3abeb826851aeeb53db5f56accab50ad939c9d7e Mon Sep 17 00:00:00 2001 From: Elan Thangamani Date: Wed, 5 Sep 2018 03:38:06 -0500 Subject: [PATCH 47/74] Service Virtualization Feature enhancement (#196) * Open Virtualan API Implementation * Menu change * Delete .swagger-codegen-ignore * Delete jsonbeautifier.html * Supporting files for Virtual service setup * CRLF removed * Unwanted new lines are removed * Build issues resolved * Build issue resolved * Removed Logger statement * Logger removed * Updated * Codegen virtual services samples for petstore.yaml * - Code Revamp and Clean up - Maven plugin related changes - Samples added * Tab space removed.. * Annotation based Service virtualization * Open API code generator changes * Virtualan samples added with Sprint boot app. * Build issue resolved * Removed unwanted files * Updated with version 3.0.3 SNAPSHOT * Reverted the options for virtual service in global and not needed now. * virtualan-plugin integration with open api tool. * Updated the all review comments and removed all tab spaces. * Updated the ReadMe generator section. * New line removed to fix the build issue. * Spring boot virtualan included in the spring build script * Included in the spring-all-petstore script --- bin/spring-all-pestore.sh | 1 + bin/springboot-virtualan-petstore-server.json | 7 + bin/springboot-virtualan-petstore-server.sh | 35 ++ .../codegen/CodegenConstants.java | 3 + .../codegen/languages/SpringCodegen.java | 10 + .../main/resources/JavaSpring/api.mustache | 10 + .../JavaSpring/apiController.mustache | 2 + .../libraries/spring-boot/README.mustache | 11 + .../spring-boot/application.mustache | 8 +- .../libraries/spring-boot/pom.mustache | 22 +- pom.xml | 12 + .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 2 +- .../.openapi-generator-ignore | 23 + .../.openapi-generator/VERSION | 1 + .../petstore/springboot-virtualan/README.md | 26 ++ .../petstore/springboot-virtualan/pom.xml | 79 ++++ .../org/openapitools/OpenAPI2SpringBoot.java | 50 +++ .../org/openapitools/RFC3339DateFormat.java | 22 + .../configuration/HomeController.java | 19 + .../OpenAPIDocumentationConfig.java | 70 +++ .../virtualan/api/AnotherFakeApi.java | 62 +++ .../api/AnotherFakeApiController.java | 24 ++ .../openapitools/virtualan/api/ApiUtil.java | 17 + .../openapitools/virtualan/api/FakeApi.java | 264 ++++++++++++ .../virtualan/api/FakeApiController.java | 24 ++ .../virtualan/api/FakeClassnameTestApi.java | 64 +++ .../api/FakeClassnameTestApiController.java | 24 ++ .../openapitools/virtualan/api/PetApi.java | 233 ++++++++++ .../virtualan/api/PetApiController.java | 24 ++ .../openapitools/virtualan/api/StoreApi.java | 122 ++++++ .../virtualan/api/StoreApiController.java | 24 ++ .../openapitools/virtualan/api/UserApi.java | 156 +++++++ .../virtualan/api/UserApiController.java | 24 ++ .../model/AdditionalPropertiesClass.java | 125 ++++++ .../openapitools/virtualan/model/Animal.java | 112 +++++ .../virtualan/model/AnimalFarm.java | 52 +++ .../model/ArrayOfArrayOfNumberOnly.java | 91 ++++ .../virtualan/model/ArrayOfNumberOnly.java | 91 ++++ .../virtualan/model/ArrayTest.java | 160 +++++++ .../virtualan/model/Capitalization.java | 203 +++++++++ .../org/openapitools/virtualan/model/Cat.java | 80 ++++ .../virtualan/model/Category.java | 103 +++++ .../virtualan/model/ClassModel.java | 79 ++++ .../openapitools/virtualan/model/Client.java | 78 ++++ .../org/openapitools/virtualan/model/Dog.java | 80 ++++ .../virtualan/model/EnumArrays.java | 177 ++++++++ .../virtualan/model/EnumClass.java | 43 ++ .../virtualan/model/EnumTest.java | 310 ++++++++++++++ .../virtualan/model/FileSchemaTestClass.java | 116 +++++ .../virtualan/model/FormatTest.java | 402 ++++++++++++++++++ .../virtualan/model/HasOnlyReadOnly.java | 103 +++++ .../openapitools/virtualan/model/MapTest.java | 218 ++++++++++ ...ropertiesAndAdditionalPropertiesClass.java | 146 +++++++ .../virtualan/model/Model200Response.java | 104 +++++ .../virtualan/model/ModelApiResponse.java | 128 ++++++ .../virtualan/model/ModelReturn.java | 79 ++++ .../openapitools/virtualan/model/Name.java | 155 +++++++ .../virtualan/model/NumberOnly.java | 80 ++++ .../openapitools/virtualan/model/Order.java | 239 +++++++++++ .../virtualan/model/OuterComposite.java | 130 ++++++ .../virtualan/model/OuterEnum.java | 43 ++ .../org/openapitools/virtualan/model/Pet.java | 260 +++++++++++ .../virtualan/model/ReadOnlyFirst.java | 103 +++++ .../virtualan/model/SpecialModelName.java | 78 ++++ .../virtualan/model/StringBooleanMap.java | 51 +++ .../org/openapitools/virtualan/model/Tag.java | 103 +++++ .../openapitools/virtualan/model/User.java | 253 +++++++++++ .../src/main/resources/application.properties | 8 + .../src/main/resources/application.properties | 2 +- 74 files changed, 6061 insertions(+), 9 deletions(-) create mode 100644 bin/springboot-virtualan-petstore-server.json create mode 100644 bin/springboot-virtualan-petstore-server.sh create mode 100644 samples/server/petstore/springboot-virtualan/.openapi-generator-ignore create mode 100644 samples/server/petstore/springboot-virtualan/.openapi-generator/VERSION create mode 100644 samples/server/petstore/springboot-virtualan/README.md create mode 100644 samples/server/petstore/springboot-virtualan/pom.xml create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/OpenAPI2SpringBoot.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/RFC3339DateFormat.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/HomeController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/OpenAPIDocumentationConfig.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/ApiUtil.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApi.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApiController.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AdditionalPropertiesClass.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Animal.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AnimalFarm.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfArrayOfNumberOnly.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfNumberOnly.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayTest.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Capitalization.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Cat.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Category.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ClassModel.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Client.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Dog.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumArrays.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumClass.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumTest.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FileSchemaTestClass.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FormatTest.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/HasOnlyReadOnly.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MapTest.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MixedPropertiesAndAdditionalPropertiesClass.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Model200Response.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelApiResponse.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelReturn.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Name.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/NumberOnly.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Order.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterComposite.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterEnum.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Pet.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ReadOnlyFirst.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/SpecialModelName.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/StringBooleanMap.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Tag.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/User.java create mode 100644 samples/server/petstore/springboot-virtualan/src/main/resources/application.properties diff --git a/bin/spring-all-pestore.sh b/bin/spring-all-pestore.sh index ca760a5f7a5..e3060626f7b 100755 --- a/bin/spring-all-pestore.sh +++ b/bin/spring-all-pestore.sh @@ -17,3 +17,4 @@ ./bin/springboot-petstore-server-beanvalidation.sh ./bin/springboot-petstore-server-implicitHeaders.sh ./bin/springboot-petstore-server-useOptional.sh +./bin/springboot-virtualan-petstore-server.sh \ No newline at end of file diff --git a/bin/springboot-virtualan-petstore-server.json b/bin/springboot-virtualan-petstore-server.json new file mode 100644 index 00000000000..d02799fde62 --- /dev/null +++ b/bin/springboot-virtualan-petstore-server.json @@ -0,0 +1,7 @@ +{ + "artifactId": "springboot-virtualan", + "library": "spring-boot", + "virtualService": true, + "modelPackage" : "org.openapitools.virtualan.model", + "apiPackage" : "org.openapitools.virtualan.api" +} diff --git a/bin/springboot-virtualan-petstore-server.sh b/bin/springboot-virtualan-petstore-server.sh new file mode 100644 index 00000000000..fa7c100379f --- /dev/null +++ b/bin/springboot-virtualan-petstore-server.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate --artifact-id springboot-virtualan -t modules/openapi-generator/src/main/resources/JavaSpring -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g spring -o samples/server/petstore/springboot-virtualan -c bin/springboot-virtualan-petstore-server.json -DhideGenerationTimestamp=true $@" + +echo "Removing files and folders under samples/server/petstore/springboot-virtualan/src/main" +rm -rf samples/server/petstore/springboot-virtualan/src/main +find samples/server/petstore/springboot-virtualan -maxdepth 1 -type f ! -name "README.md" -exec rm {} + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index d96fda52687..30695d3a3f6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -232,6 +232,9 @@ public class CodegenConstants { public static final String GENERATE_MODELS = "generateModels"; public static final String GENERATE_MODEL_DOCS = "generateModelDocs"; + public static final String VIRTUAL_SERVICE = "virtualService"; + public static final String VIRTUAL_SERVICE_DESC = "Generate Spring boot rest service as virtual service with Virtualan"; + public static final String GENERATE_MODEL_TESTS = "generateModelTests"; public static final String GENERATE_MODEL_TESTS_DESC = "Specifies that model tests are to be generated."; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 8bd1e2deacd..4b41f4bf64d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -61,6 +61,8 @@ public class SpringCodegen extends AbstractJavaCodegen public static final String INTERFACE_ONLY = "interfaceOnly"; public static final String DELEGATE_PATTERN = "delegatePattern"; public static final String SINGLE_CONTENT_TYPES = "singleContentTypes"; + public static final String VIRTUAL_SERVICE = "virtualService"; + public static final String JAVA_8 = "java8"; public static final String ASYNC = "async"; public static final String REACTIVE = "reactive"; @@ -90,6 +92,7 @@ public class SpringCodegen extends AbstractJavaCodegen protected boolean openapiDocketConfig = false; protected boolean apiFirst = false; protected boolean useOptional = false; + protected boolean virtualService = false; public SpringCodegen() { super(); @@ -114,6 +117,7 @@ public class SpringCodegen extends AbstractJavaCodegen cliOptions.add(CliOption.newBoolean(ASYNC, "use async Callable controllers", async)); cliOptions.add(CliOption.newBoolean(REACTIVE, "wrap responses in Mono/Flux Reactor types (spring-boot only)", reactive)); cliOptions.add(new CliOption(RESPONSE_WRAPPER, "wrap the responses in given type (Future,Callable,CompletableFuture,ListenableFuture,DeferredResult,HystrixCommand,RxObservable,RxSingle or fully qualified type)")); + cliOptions.add(CliOption.newBoolean(VIRTUAL_SERVICE, "Generates the virtual service. For more details refer - https://github.com/elan-venture/virtualan/wiki")); cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames", useTags)); cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations", useBeanValidation)); cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers.", implicitHeaders)); @@ -198,6 +202,10 @@ public class SpringCodegen extends AbstractJavaCodegen } else { additionalProperties.put(BASE_PACKAGE, basePackage); } + + if (additionalProperties.containsKey(VIRTUAL_SERVICE)) { + this.setVirtualService(Boolean.valueOf(additionalProperties.get(VIRTUAL_SERVICE).toString())); + } if (additionalProperties.containsKey(INTERFACE_ONLY)) { this.setInterfaceOnly(Boolean.valueOf(additionalProperties.get(INTERFACE_ONLY).toString())); @@ -667,6 +675,8 @@ public class SpringCodegen extends AbstractJavaCodegen public void setJava8(boolean java8) { this.java8 = java8; } + public void setVirtualService(boolean virtualService) { this.virtualService = virtualService; } + public void setAsync(boolean async) { this.async = async; } public void setReactive(boolean reactive) { this.reactive = reactive; } diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache index 66121f30584..6736878e6f0 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache @@ -9,6 +9,10 @@ package {{package}}; {{/imports}} import io.swagger.annotations.*; {{#jdk8-no-delegate}} +{{#virtualService}} +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +{{/virtualService}} import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; {{/jdk8-no-delegate}} @@ -58,6 +62,9 @@ import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture {{/useBeanValidation}} @Api(value = "{{{baseName}}}", description = "the {{{baseName}}} API") {{#operations}} +{{#virtualService}} +@VirtualService +{{/virtualService}} public interface {{classname}} { {{#jdk8}} {{^isDelegate}} @@ -77,6 +84,9 @@ public interface {{classname}} { {{/jdk8}} {{#operation}} + {{#virtualService}} + @ApiVirtual + {{/virtualService}} @ApiOperation(value = "{{{summary}}}", nickname = "{{{operationId}}}", notes = "{{{notes}}}"{{#returnBaseType}}, response = {{{returnBaseType}}}.class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = { {{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = { {{#scopes}}@AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}}, diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/apiController.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/apiController.mustache index 4c9e6271d59..5052f367a27 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/apiController.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/apiController.mustache @@ -69,6 +69,8 @@ public class {{classname}}Controller implements {{classname}} { {{^isDelegate}} {{^reactive}} + {{^jdk8}} + {{/jdk8}} private final NativeWebRequest request; @org.springframework.beans.factory.annotation.Autowired diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/README.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/README.mustache index f824f03035f..fdc844423d6 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/README.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/README.mustache @@ -47,3 +47,14 @@ public interface PetClient extends PetApi { } ``` {{/interfaceOnly}} +{{#virtualService}} + + +## Virtualan : + +You can view Virtualan UI by pointing to +http://localhost:80//virtualan-ui.html. + +How to use guide available in the Virtualan wiki +https://github.com/elan-venture/virtualan/wiki +{{/virtualService}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/application.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/application.mustache index 1193554dd22..b7fea3f6262 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/application.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/application.mustache @@ -3,4 +3,10 @@ springfox.documentation.swagger.v2.path=/api-docs {{/useSpringfox}} server.port={{serverPort}} spring.jackson.date-format={{basePackage}}.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +{{#virtualService}} +virtual.datasource.driver-class-name=org.hsqldb.jdbcDriver +virtual.datasource.jdbcurl=jdbc:hsqldb:mem:dataSource +virtual.datasource.username=sa +virtual.datasource.password= +{{/virtualService}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/pom.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/pom.mustache index 2d35c75cd1b..f97f0ea9258 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/pom.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-boot/pom.mustache @@ -134,6 +134,26 @@ javax.validation validation-api -{{/useBeanValidation}} +{{/useBeanValidation}} +{{#virtualService}} + + + io.virtualan + virtualan-plugin + 1.0.0 + + + + org.hsqldb + hsqldb + 2.3.2 + + + org.springframework.boot + spring-boot-starter-data-jpa + 1.5.9.RELEASE + + +{{/virtualService}} diff --git a/pom.xml b/pom.xml index 31438e91cf5..d54c14d4bd3 100644 --- a/pom.xml +++ b/pom.xml @@ -947,6 +947,18 @@ samples/server/petstore/springboot + + springboot-virtualan + + + env + java + + + + samples/server/petstore/springboot-virtualan + + spring-cloud diff --git a/samples/server/petstore/springboot-beanvalidation/src/main/resources/application.properties b/samples/server/petstore/springboot-beanvalidation/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot-beanvalidation/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-beanvalidation/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/resources/application.properties b/samples/server/petstore/springboot-delegate-j8/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-delegate-j8/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-delegate/src/main/resources/application.properties b/samples/server/petstore/springboot-delegate/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot-delegate/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-delegate/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-implicitHeaders/src/main/resources/application.properties b/samples/server/petstore/springboot-implicitHeaders/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot-implicitHeaders/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-implicitHeaders/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-reactive/src/main/resources/application.properties b/samples/server/petstore/springboot-reactive/src/main/resources/application.properties index 6512a5b02e4..9d06609db66 100644 --- a/samples/server/petstore/springboot-reactive/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-reactive/src/main/resources/application.properties @@ -1,3 +1,3 @@ server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-useoptional/src/main/resources/application.properties b/samples/server/petstore/springboot-useoptional/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot-useoptional/src/main/resources/application.properties +++ b/samples/server/petstore/springboot-useoptional/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false diff --git a/samples/server/petstore/springboot-virtualan/.openapi-generator-ignore b/samples/server/petstore/springboot-virtualan/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/springboot-virtualan/.openapi-generator/VERSION b/samples/server/petstore/springboot-virtualan/.openapi-generator/VERSION new file mode 100644 index 00000000000..6d94c9c2e12 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/springboot-virtualan/README.md b/samples/server/petstore/springboot-virtualan/README.md new file mode 100644 index 00000000000..34d7562140a --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/README.md @@ -0,0 +1,26 @@ +# OpenAPI generated server + +Spring Boot Server + + +## Overview +This server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. +By using the [OpenAPI-Spec](https://openapis.org), you can easily generate a server stub. +This is an example of building a OpenAPI-enabled server in Java using the SpringBoot framework. + +The underlying library integrating OpenAPI to SpringBoot is [springfox](https://github.com/springfox/springfox) + +Start your server as a simple java application + +You can view the api documentation in swagger-ui by pointing to +http://localhost:80/ + +Change default port value in application.properties + +## Virtualan : + +You can view Virtualan UI by pointing to +http://localhost:80//virtualan-ui.html. + +How to use guide available in the Virtualan wiki +https://github.com/elan-venture/virtualan/wiki diff --git a/samples/server/petstore/springboot-virtualan/pom.xml b/samples/server/petstore/springboot-virtualan/pom.xml new file mode 100644 index 00000000000..c13fb400aff --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/pom.xml @@ -0,0 +1,79 @@ + + 4.0.0 + org.openapitools + springboot-virtualan + jar + springboot-virtualan + 1.0.0 + + 1.8 + ${java.version} + ${java.version} + 2.8.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.0.1.RELEASE + + + src/main/java + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + io.springfox + springfox-swagger2 + ${springfox-version} + + + io.springfox + springfox-swagger-ui + ${springfox-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + javax.validation + validation-api + + + + io.virtualan + virtualan-plugin + 1.0.0 + + + + org.hsqldb + hsqldb + 2.3.2 + + + org.springframework.boot + spring-boot-starter-data-jpa + 1.5.9.RELEASE + + + + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/OpenAPI2SpringBoot.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/OpenAPI2SpringBoot.java new file mode 100644 index 00000000000..5f8148a921b --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/OpenAPI2SpringBoot.java @@ -0,0 +1,50 @@ +package org.openapitools; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.ExitCodeGenerator; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@SpringBootApplication +@ComponentScan(basePackages = {"org.openapitools", "org.openapitools.virtualan.api" , "org.openapitools.configuration"}) +public class OpenAPI2SpringBoot implements CommandLineRunner { + + @Override + public void run(String... arg0) throws Exception { + if (arg0.length > 0 && arg0[0].equals("exitcode")) { + throw new ExitException(); + } + } + + public static void main(String[] args) throws Exception { + new SpringApplication(OpenAPI2SpringBoot.class).run(args); + } + + class ExitException extends RuntimeException implements ExitCodeGenerator { + private static final long serialVersionUID = 1L; + + @Override + public int getExitCode() { + return 10; + } + + } + + @Bean + public WebMvcConfigurer webConfigurer() { + return new WebMvcConfigurer() { + /*@Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("*") + .allowedHeaders("Content-Type"); + }*/ + }; + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/RFC3339DateFormat.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/RFC3339DateFormat.java new file mode 100644 index 00000000000..026bb3168c6 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/RFC3339DateFormat.java @@ -0,0 +1,22 @@ +package org.openapitools; + +import com.fasterxml.jackson.databind.util.ISO8601DateFormat; +import com.fasterxml.jackson.databind.util.ISO8601Utils; + +import java.text.FieldPosition; +import java.util.Date; + + +public class RFC3339DateFormat extends ISO8601DateFormat { + + private static final long serialVersionUID = 1L; + + // Same as ISO8601DateFormat but serializing milliseconds. + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + String value = ISO8601Utils.format(date, true); + toAppendTo.append(value); + return toAppendTo; + } + +} \ No newline at end of file diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/HomeController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/HomeController.java new file mode 100644 index 00000000000..25727830541 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/HomeController.java @@ -0,0 +1,19 @@ +package org.openapitools.configuration; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +public class HomeController { + + @RequestMapping("/") + public String index() { + return "redirect:swagger-ui.html"; + } + + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/OpenAPIDocumentationConfig.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/OpenAPIDocumentationConfig.java new file mode 100644 index 00000000000..b018fb7272a --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/configuration/OpenAPIDocumentationConfig.java @@ -0,0 +1,70 @@ +package org.openapitools.configuration; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import org.springframework.web.util.UriComponentsBuilder; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.paths.Paths; +import springfox.documentation.spring.web.paths.RelativePathProvider; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import javax.servlet.ServletContext; + + +@Configuration +@EnableSwagger2 +public class OpenAPIDocumentationConfig { + + ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("OpenAPI Petstore") + .description("This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\") + .license("Apache-2.0") + .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .termsOfServiceUrl("") + .version("1.0.0") + .contact(new Contact("","", "")) + .build(); + } + + @Bean + public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.openapitools.virtualan.api")) + .build() + .pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath)) + .directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class) + .directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class) + .apiInfo(apiInfo()); + } + + class BasePathAwareRelativePathProvider extends RelativePathProvider { + private String basePath; + + public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) { + super(servletContext); + this.basePath = basePath; + } + + @Override + protected String applicationPath() { + return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString()); + } + + @Override + public String getOperationPath(String operationPath) { + UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/"); + return Paths.removeAdjacentForwardSlashes( + uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString()); + } + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApi.java new file mode 100644 index 00000000000..7106b763d21 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApi.java @@ -0,0 +1,62 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import org.openapitools.virtualan.model.Client; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "another-fake", description = "the another-fake API") +@VirtualService +public interface AnotherFakeApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "To test special tags", nickname = "call123testSpecialTags", notes = "To test special tags and operation ID starting with number", response = Client.class, tags={ "$another-fake?", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Client.class) }) + @RequestMapping(value = "/another-fake/dummy", + produces = { "application/json" }, + consumes = { "application/json" }, + method = RequestMethod.PATCH) + default ResponseEntity call123testSpecialTags(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Client client) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"client\" : \"client\"}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApiController.java new file mode 100644 index 00000000000..8ba61766e9e --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/AnotherFakeApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class AnotherFakeApiController implements AnotherFakeApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public AnotherFakeApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/ApiUtil.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/ApiUtil.java new file mode 100644 index 00000000000..a1b15b821fb --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/ApiUtil.java @@ -0,0 +1,17 @@ +package org.openapitools.virtualan.api; + +import org.springframework.web.context.request.NativeWebRequest; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ApiUtil { + public static void setExampleResponse(NativeWebRequest req, String contentType, String example) { + try { + req.getNativeResponse(HttpServletResponse.class).addHeader("Content-Type", contentType); + req.getNativeResponse(HttpServletResponse.class).getOutputStream().print(example); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApi.java new file mode 100644 index 00000000000..0555f06748f --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApi.java @@ -0,0 +1,264 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import java.math.BigDecimal; +import org.openapitools.virtualan.model.Client; +import org.openapitools.virtualan.model.FileSchemaTestClass; +import java.time.LocalDate; +import java.util.Map; +import org.openapitools.virtualan.model.ModelApiResponse; +import java.time.OffsetDateTime; +import org.openapitools.virtualan.model.OuterComposite; +import org.springframework.core.io.Resource; +import org.openapitools.virtualan.model.User; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "fake", description = "the fake API") +@VirtualService +public interface FakeApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "", nickname = "fakeOuterBooleanSerialize", notes = "Test serialization of outer boolean types", response = Boolean.class, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Output boolean", response = Boolean.class) }) + @RequestMapping(value = "/fake/outer/boolean", + produces = { "*/*" }, + method = RequestMethod.POST) + default ResponseEntity fakeOuterBooleanSerialize(@ApiParam(value = "Input boolean as post body" ) @Valid @RequestBody Boolean body) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + ApiUtil.setExampleResponse(request, "*/*", "null"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "", nickname = "fakeOuterCompositeSerialize", notes = "Test serialization of object with outer number type", response = OuterComposite.class, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Output composite", response = OuterComposite.class) }) + @RequestMapping(value = "/fake/outer/composite", + produces = { "*/*" }, + method = RequestMethod.POST) + default ResponseEntity fakeOuterCompositeSerialize(@ApiParam(value = "Input composite as post body" ) @Valid @RequestBody OuterComposite outerComposite) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + ApiUtil.setExampleResponse(request, "*/*", "{ \"my_string\" : \"my_string\", \"my_number\" : 0.80082819046101150206595775671303272247314453125, \"my_boolean\" : true}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "", nickname = "fakeOuterNumberSerialize", notes = "Test serialization of outer number types", response = BigDecimal.class, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Output number", response = BigDecimal.class) }) + @RequestMapping(value = "/fake/outer/number", + produces = { "*/*" }, + method = RequestMethod.POST) + default ResponseEntity fakeOuterNumberSerialize(@ApiParam(value = "Input number as post body" ) @Valid @RequestBody BigDecimal body) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + ApiUtil.setExampleResponse(request, "*/*", "null"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "", nickname = "fakeOuterStringSerialize", notes = "Test serialization of outer string types", response = String.class, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Output string", response = String.class) }) + @RequestMapping(value = "/fake/outer/string", + produces = { "*/*" }, + method = RequestMethod.POST) + default ResponseEntity fakeOuterStringSerialize(@ApiParam(value = "Input string as post body" ) @Valid @RequestBody String body) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + ApiUtil.setExampleResponse(request, "*/*", "null"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "", nickname = "testBodyWithFileSchema", notes = "For this test, the body for this request much reference a schema named `File`.", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Success") }) + @RequestMapping(value = "/fake/body-with-file-schema", + consumes = { "application/json" }, + method = RequestMethod.PUT) + default ResponseEntity testBodyWithFileSchema(@ApiParam(value = "" ,required=true ) @Valid @RequestBody FileSchemaTestClass fileSchemaTestClass) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "", nickname = "testBodyWithQueryParams", notes = "", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Success") }) + @RequestMapping(value = "/fake/body-with-query-params", + consumes = { "application/json" }, + method = RequestMethod.PUT) + default ResponseEntity testBodyWithQueryParams(@NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "query", required = true) String query,@ApiParam(value = "" ,required=true ) @Valid @RequestBody User user) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "To test \"client\" model", nickname = "testClientModel", notes = "To test \"client\" model", response = Client.class, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Client.class) }) + @RequestMapping(value = "/fake", + produces = { "application/json" }, + consumes = { "application/json" }, + method = RequestMethod.PATCH) + default ResponseEntity testClientModel(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Client client) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"client\" : \"client\"}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ", nickname = "testEndpointParameters", notes = "Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ", authorizations = { + @Authorization(value = "http_basic_test") + }, tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid username supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @RequestMapping(value = "/fake", + consumes = { "application/x-www-form-urlencoded" }, + method = RequestMethod.POST) + default ResponseEntity testEndpointParameters(@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="number", required=true) BigDecimal number,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="double", required=true) Double _double,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="pattern_without_delimiter", required=true) String patternWithoutDelimiter,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="byte", required=true) byte[] _byte,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="integer", required=false) Integer integer,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int32", required=false) Integer int32,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int64", required=false) Long int64,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="float", required=false) Float _float,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="string", required=false) String string,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile binary,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="date", required=false) LocalDate date,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="dateTime", required=false) OffsetDateTime dateTime,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="password", required=false) String password,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="callback", required=false) String paramCallback) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "To test enum parameters", nickname = "testEnumParameters", notes = "To test enum parameters", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid request"), + @ApiResponse(code = 404, message = "Not found") }) + @RequestMapping(value = "/fake", + consumes = { "application/x-www-form-urlencoded" }, + method = RequestMethod.GET) + default ResponseEntity testEnumParameters(@ApiParam(value = "Header parameter enum test (string array)" , allowableValues=">, $") @RequestHeader(value="enum_header_string_array", required=false) List enumHeaderStringArray,@ApiParam(value = "Header parameter enum test (string)" , allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestHeader(value="enum_header_string", required=false) String enumHeaderString,@ApiParam(value = "Query parameter enum test (string array)", allowableValues = ">, $") @Valid @RequestParam(value = "enum_query_string_array", required = false) List enumQueryStringArray,@ApiParam(value = "Query parameter enum test (string)", allowableValues = "_abc, -efg, (xyz)", defaultValue = "-efg") @Valid @RequestParam(value = "enum_query_string", required = false, defaultValue="-efg") String enumQueryString,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1, -2") @Valid @RequestParam(value = "enum_query_integer", required = false) Integer enumQueryInteger,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1.1, -1.2") @Valid @RequestParam(value = "enum_query_double", required = false) Double enumQueryDouble,@ApiParam(value = "Form parameter enum test (string array)", allowableValues=">, $", defaultValue="$") @RequestParam(value="enum_form_string_array", required=false) List enumFormStringArray,@ApiParam(value = "Form parameter enum test (string)", allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestParam(value="enum_form_string", required=false) String enumFormString) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "test inline additionalProperties", nickname = "testInlineAdditionalProperties", notes = "", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/fake/inline-additionalProperties", + consumes = { "application/json" }, + method = RequestMethod.POST) + default ResponseEntity testInlineAdditionalProperties(@ApiParam(value = "request body" ,required=true ) @Valid @RequestBody Map requestBody) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "test json serialization of form data", nickname = "testJsonFormData", notes = "", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/fake/jsonFormData", + consumes = { "application/x-www-form-urlencoded" }, + method = RequestMethod.GET) + default ResponseEntity testJsonFormData(@ApiParam(value = "field1", required=true, defaultValue="null") @RequestParam(value="param", required=true) String param,@ApiParam(value = "field2", required=true, defaultValue="null") @RequestParam(value="param2", required=true) String param2) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "uploads an image (required)", nickname = "uploadFileWithRequiredFile", notes = "", response = ModelApiResponse.class, authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse.class) }) + @RequestMapping(value = "/fake/{petId}/uploadImageWithRequiredFile", + produces = { "application/json" }, + consumes = { "multipart/form-data" }, + method = RequestMethod.POST) + default ResponseEntity uploadFileWithRequiredFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile requiredFile,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApiController.java new file mode 100644 index 00000000000..4b2e463440d --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class FakeApiController implements FakeApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public FakeApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApi.java new file mode 100644 index 00000000000..d83dcb48787 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApi.java @@ -0,0 +1,64 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import org.openapitools.virtualan.model.Client; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "fake_classname_test", description = "the fake_classname_test API") +@VirtualService +public interface FakeClassnameTestApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "To test class name in snake case", nickname = "testClassname", notes = "To test class name in snake case", response = Client.class, authorizations = { + @Authorization(value = "api_key_query") + }, tags={ "fake_classname_tags 123#$%^", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Client.class) }) + @RequestMapping(value = "/fake_classname_test", + produces = { "application/json" }, + consumes = { "application/json" }, + method = RequestMethod.PATCH) + default ResponseEntity testClassname(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Client client) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"client\" : \"client\"}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApiController.java new file mode 100644 index 00000000000..9a048c36e72 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/FakeClassnameTestApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class FakeClassnameTestApiController implements FakeClassnameTestApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public FakeClassnameTestApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApi.java new file mode 100644 index 00000000000..21ad9cccb25 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApi.java @@ -0,0 +1,233 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import org.openapitools.virtualan.model.ModelApiResponse; +import org.openapitools.virtualan.model.Pet; +import org.springframework.core.io.Resource; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "pet", description = "the pet API") +@VirtualService +public interface PetApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "Add a new pet to the store", nickname = "addPet", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + @RequestMapping(value = "/pet", + consumes = { "application/json", "application/xml" }, + method = RequestMethod.POST) + default ResponseEntity addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Pet pet) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Deletes a pet", nickname = "deletePet", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid pet value") }) + @RequestMapping(value = "/pet/{petId}", + method = RequestMethod.DELETE) + default ResponseEntity deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) String apiKey) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Finds Pets by status", nickname = "findPetsByStatus", notes = "Multiple status values can be provided with comma separated strings", response = Pet.class, responseContainer = "List", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class, responseContainer = "List"), + @ApiResponse(code = 400, message = "Invalid status value") }) + @RequestMapping(value = "/pet/findByStatus", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity> findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) List status) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 doggie aeiou aeiou"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Finds Pets by tags", nickname = "findPetsByTags", notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet.class, responseContainer = "List", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class, responseContainer = "List"), + @ApiResponse(code = 400, message = "Invalid tag value") }) + @RequestMapping(value = "/pet/findByTags", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity> findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List tags) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 doggie aeiou aeiou"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Find pet by ID", nickname = "getPetById", notes = "Returns a single pet", response = Pet.class, authorizations = { + @Authorization(value = "api_key") + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Pet.class), + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Pet not found") }) + @RequestMapping(value = "/pet/{petId}", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity getPetById(@ApiParam(value = "ID of pet to return",required=true) @PathVariable("petId") Long petId) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 doggie aeiou aeiou"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Update an existing pet", nickname = "updatePet", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Pet not found"), + @ApiResponse(code = 405, message = "Validation exception") }) + @RequestMapping(value = "/pet", + consumes = { "application/json", "application/xml" }, + method = RequestMethod.PUT) + default ResponseEntity updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Pet pet) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + @RequestMapping(value = "/pet/{petId}", + consumes = { "application/x-www-form-urlencoded" }, + method = RequestMethod.POST) + default ResponseEntity updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) String name,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) String status) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "uploads an image", nickname = "uploadFile", notes = "", response = ModelApiResponse.class, authorizations = { + @Authorization(value = "petstore_auth", scopes = { + @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), + @AuthorizationScope(scope = "read:pets", description = "read your pets") + }) + }, tags={ "pet", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse.class) }) + @RequestMapping(value = "/pet/{petId}/uploadImage", + produces = { "application/json" }, + consumes = { "multipart/form-data" }, + method = RequestMethod.POST) + default ResponseEntity uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile file) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApiController.java new file mode 100644 index 00000000000..d9f4d8f1264 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/PetApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class PetApiController implements PetApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public PetApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApi.java new file mode 100644 index 00000000000..f4f013f0f55 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApi.java @@ -0,0 +1,122 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import java.util.Map; +import org.openapitools.virtualan.model.Order; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "store", description = "the store API") +@VirtualService +public interface StoreApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "Delete purchase order by ID", nickname = "deleteOrder", notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", tags={ "store", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Order not found") }) + @RequestMapping(value = "/store/order/{order_id}", + method = RequestMethod.DELETE) + default ResponseEntity deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathVariable("order_id") String orderId) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Returns pet inventories by status", nickname = "getInventory", notes = "Returns a map of status codes to quantities", response = Integer.class, responseContainer = "Map", authorizations = { + @Authorization(value = "api_key") + }, tags={ "store", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Map.class, responseContainer = "Map") }) + @RequestMapping(value = "/store/inventory", + produces = { "application/json" }, + method = RequestMethod.GET) + default ResponseEntity> getInventory() { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", response = Order.class, tags={ "store", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Order.class), + @ApiResponse(code = 400, message = "Invalid ID supplied"), + @ApiResponse(code = 404, message = "Order not found") }) + @RequestMapping(value = "/store/order/{order_id}", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathVariable("order_id") Long orderId) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Place an order for a pet", nickname = "placeOrder", notes = "", response = Order.class, tags={ "store", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = Order.class), + @ApiResponse(code = 400, message = "Invalid Order") }) + @RequestMapping(value = "/store/order", + produces = { "application/xml", "application/json" }, + method = RequestMethod.POST) + default ResponseEntity placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody Order order) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApiController.java new file mode 100644 index 00000000000..abb0e0f5370 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/StoreApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class StoreApiController implements StoreApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public StoreApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApi.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApi.java new file mode 100644 index 00000000000..36d28a4b1f7 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApi.java @@ -0,0 +1,156 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.3.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package org.openapitools.virtualan.api; + +import java.util.List; +import org.openapitools.virtualan.model.User; +import io.swagger.annotations.*; +import io.virtualan.annotation.ApiVirtual; +import io.virtualan.annotation.VirtualService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Validated +@Api(value = "user", description = "the user API") +@VirtualService +public interface UserApi { + + default Optional getRequest() { + return Optional.empty(); + } + + @ApiVirtual + @ApiOperation(value = "Create user", nickname = "createUser", notes = "This can only be done by the logged in user.", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/user", + method = RequestMethod.POST) + default ResponseEntity createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody User user) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", notes = "", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/user/createWithArray", + method = RequestMethod.POST) + default ResponseEntity createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody List user) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Creates list of users with given input array", nickname = "createUsersWithListInput", notes = "", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/user/createWithList", + method = RequestMethod.POST) + default ResponseEntity createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody List user) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Delete user", nickname = "deleteUser", notes = "This can only be done by the logged in user.", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid username supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @RequestMapping(value = "/user/{username}", + method = RequestMethod.DELETE) + default ResponseEntity deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathVariable("username") String username) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Get user by user name", nickname = "getUserByName", notes = "", response = User.class, tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = User.class), + @ApiResponse(code = 400, message = "Invalid username supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @RequestMapping(value = "/user/{username}", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathVariable("username") String username) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + ApiUtil.setExampleResponse(request, "application/json", "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"password\" : \"password\", \"userStatus\" : 6, \"phone\" : \"phone\", \"id\" : 0, \"email\" : \"email\", \"username\" : \"username\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + ApiUtil.setExampleResponse(request, "application/xml", " 123456789 aeiou aeiou aeiou aeiou aeiou aeiou 123"); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Logs user into the system", nickname = "loginUser", notes = "", response = String.class, tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation", response = String.class), + @ApiResponse(code = 400, message = "Invalid username/password supplied") }) + @RequestMapping(value = "/user/login", + produces = { "application/xml", "application/json" }, + method = RequestMethod.GET) + default ResponseEntity loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) String username,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) String password) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Logs out current logged in user session", nickname = "logoutUser", notes = "", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + @RequestMapping(value = "/user/logout", + method = RequestMethod.GET) + default ResponseEntity logoutUser() { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + @ApiVirtual + @ApiOperation(value = "Updated user", nickname = "updateUser", notes = "This can only be done by the logged in user.", tags={ "user", }) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid user supplied"), + @ApiResponse(code = 404, message = "User not found") }) + @RequestMapping(value = "/user/{username}", + method = RequestMethod.PUT) + default ResponseEntity updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathVariable("username") String username,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody User user) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApiController.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApiController.java new file mode 100644 index 00000000000..01ceadc0d00 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/api/UserApiController.java @@ -0,0 +1,24 @@ +package org.openapitools.virtualan.api; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + +@Controller +@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") +public class UserApiController implements UserApi { + + private final NativeWebRequest request; + + @org.springframework.beans.factory.annotation.Autowired + public UserApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AdditionalPropertiesClass.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AdditionalPropertiesClass.java new file mode 100644 index 00000000000..3fbea03c759 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AdditionalPropertiesClass.java @@ -0,0 +1,125 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * AdditionalPropertiesClass + */ + +public class AdditionalPropertiesClass { + @JsonProperty("map_property") + @Valid + private Map mapProperty = null; + + @JsonProperty("map_of_map_property") + @Valid + private Map> mapOfMapProperty = null; + + public AdditionalPropertiesClass mapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + return this; + } + + public AdditionalPropertiesClass putMapPropertyItem(String key, String mapPropertyItem) { + if (this.mapProperty == null) { + this.mapProperty = new HashMap<>(); + } + this.mapProperty.put(key, mapPropertyItem); + return this; + } + + /** + * Get mapProperty + * @return mapProperty + **/ + @ApiModelProperty(value = "") + + + public Map getMapProperty() { + return mapProperty; + } + + public void setMapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + } + + public AdditionalPropertiesClass mapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + return this; + } + + public AdditionalPropertiesClass putMapOfMapPropertyItem(String key, Map mapOfMapPropertyItem) { + if (this.mapOfMapProperty == null) { + this.mapOfMapProperty = new HashMap<>(); + } + this.mapOfMapProperty.put(key, mapOfMapPropertyItem); + return this; + } + + /** + * Get mapOfMapProperty + * @return mapOfMapProperty + **/ + @ApiModelProperty(value = "") + + @Valid + + public Map> getMapOfMapProperty() { + return mapOfMapProperty; + } + + public void setMapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AdditionalPropertiesClass additionalPropertiesClass = (AdditionalPropertiesClass) o; + return Objects.equals(this.mapProperty, additionalPropertiesClass.mapProperty) && + Objects.equals(this.mapOfMapProperty, additionalPropertiesClass.mapOfMapProperty); + } + + @Override + public int hashCode() { + return Objects.hash(mapProperty, mapOfMapProperty); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AdditionalPropertiesClass {\n"); + + sb.append(" mapProperty: ").append(toIndentedString(mapProperty)).append("\n"); + sb.append(" mapOfMapProperty: ").append(toIndentedString(mapOfMapProperty)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Animal.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Animal.java new file mode 100644 index 00000000000..5c1ffdf5386 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Animal.java @@ -0,0 +1,112 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Animal + */ + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Dog.class, name = "Dog"), + @JsonSubTypes.Type(value = Cat.class, name = "Cat"), +}) + +public class Animal { + @JsonProperty("className") + private String className = null; + + @JsonProperty("color") + private String color = "red"; + + public Animal className(String className) { + this.className = className; + return this; + } + + /** + * Get className + * @return className + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Animal color(String color) { + this.color = color; + return this; + } + + /** + * Get color + * @return color + **/ + @ApiModelProperty(value = "") + + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Animal animal = (Animal) o; + return Objects.equals(this.className, animal.className) && + Objects.equals(this.color, animal.color); + } + + @Override + public int hashCode() { + return Objects.hash(className, color); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Animal {\n"); + + sb.append(" className: ").append(toIndentedString(className)).append("\n"); + sb.append(" color: ").append(toIndentedString(color)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AnimalFarm.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AnimalFarm.java new file mode 100644 index 00000000000..225ae3beb87 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/AnimalFarm.java @@ -0,0 +1,52 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.virtualan.model.Animal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * AnimalFarm + */ + +public class AnimalFarm extends ArrayList { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AnimalFarm {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfArrayOfNumberOnly.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfArrayOfNumberOnly.java new file mode 100644 index 00000000000..486702883d2 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfArrayOfNumberOnly.java @@ -0,0 +1,91 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * ArrayOfArrayOfNumberOnly + */ + +public class ArrayOfArrayOfNumberOnly { + @JsonProperty("ArrayArrayNumber") + @Valid + private List> arrayArrayNumber = null; + + public ArrayOfArrayOfNumberOnly arrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + return this; + } + + public ArrayOfArrayOfNumberOnly addArrayArrayNumberItem(List arrayArrayNumberItem) { + if (this.arrayArrayNumber == null) { + this.arrayArrayNumber = new ArrayList<>(); + } + this.arrayArrayNumber.add(arrayArrayNumberItem); + return this; + } + + /** + * Get arrayArrayNumber + * @return arrayArrayNumber + **/ + @ApiModelProperty(value = "") + + @Valid + + public List> getArrayArrayNumber() { + return arrayArrayNumber; + } + + public void setArrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfArrayOfNumberOnly arrayOfArrayOfNumberOnly = (ArrayOfArrayOfNumberOnly) o; + return Objects.equals(this.arrayArrayNumber, arrayOfArrayOfNumberOnly.arrayArrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayArrayNumber); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfArrayOfNumberOnly {\n"); + + sb.append(" arrayArrayNumber: ").append(toIndentedString(arrayArrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfNumberOnly.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfNumberOnly.java new file mode 100644 index 00000000000..28875cb548b --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayOfNumberOnly.java @@ -0,0 +1,91 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * ArrayOfNumberOnly + */ + +public class ArrayOfNumberOnly { + @JsonProperty("ArrayNumber") + @Valid + private List arrayNumber = null; + + public ArrayOfNumberOnly arrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + return this; + } + + public ArrayOfNumberOnly addArrayNumberItem(BigDecimal arrayNumberItem) { + if (this.arrayNumber == null) { + this.arrayNumber = new ArrayList<>(); + } + this.arrayNumber.add(arrayNumberItem); + return this; + } + + /** + * Get arrayNumber + * @return arrayNumber + **/ + @ApiModelProperty(value = "") + + @Valid + + public List getArrayNumber() { + return arrayNumber; + } + + public void setArrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfNumberOnly arrayOfNumberOnly = (ArrayOfNumberOnly) o; + return Objects.equals(this.arrayNumber, arrayOfNumberOnly.arrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayNumber); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfNumberOnly {\n"); + + sb.append(" arrayNumber: ").append(toIndentedString(arrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayTest.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayTest.java new file mode 100644 index 00000000000..64e608900f8 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ArrayTest.java @@ -0,0 +1,160 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.virtualan.model.ReadOnlyFirst; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * ArrayTest + */ + +public class ArrayTest { + @JsonProperty("array_of_string") + @Valid + private List arrayOfString = null; + + @JsonProperty("array_array_of_integer") + @Valid + private List> arrayArrayOfInteger = null; + + @JsonProperty("array_array_of_model") + @Valid + private List> arrayArrayOfModel = null; + + public ArrayTest arrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + return this; + } + + public ArrayTest addArrayOfStringItem(String arrayOfStringItem) { + if (this.arrayOfString == null) { + this.arrayOfString = new ArrayList<>(); + } + this.arrayOfString.add(arrayOfStringItem); + return this; + } + + /** + * Get arrayOfString + * @return arrayOfString + **/ + @ApiModelProperty(value = "") + + + public List getArrayOfString() { + return arrayOfString; + } + + public void setArrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + } + + public ArrayTest arrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + return this; + } + + public ArrayTest addArrayArrayOfIntegerItem(List arrayArrayOfIntegerItem) { + if (this.arrayArrayOfInteger == null) { + this.arrayArrayOfInteger = new ArrayList<>(); + } + this.arrayArrayOfInteger.add(arrayArrayOfIntegerItem); + return this; + } + + /** + * Get arrayArrayOfInteger + * @return arrayArrayOfInteger + **/ + @ApiModelProperty(value = "") + + @Valid + + public List> getArrayArrayOfInteger() { + return arrayArrayOfInteger; + } + + public void setArrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + } + + public ArrayTest arrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + return this; + } + + public ArrayTest addArrayArrayOfModelItem(List arrayArrayOfModelItem) { + if (this.arrayArrayOfModel == null) { + this.arrayArrayOfModel = new ArrayList<>(); + } + this.arrayArrayOfModel.add(arrayArrayOfModelItem); + return this; + } + + /** + * Get arrayArrayOfModel + * @return arrayArrayOfModel + **/ + @ApiModelProperty(value = "") + + @Valid + + public List> getArrayArrayOfModel() { + return arrayArrayOfModel; + } + + public void setArrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayTest arrayTest = (ArrayTest) o; + return Objects.equals(this.arrayOfString, arrayTest.arrayOfString) && + Objects.equals(this.arrayArrayOfInteger, arrayTest.arrayArrayOfInteger) && + Objects.equals(this.arrayArrayOfModel, arrayTest.arrayArrayOfModel); + } + + @Override + public int hashCode() { + return Objects.hash(arrayOfString, arrayArrayOfInteger, arrayArrayOfModel); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayTest {\n"); + + sb.append(" arrayOfString: ").append(toIndentedString(arrayOfString)).append("\n"); + sb.append(" arrayArrayOfInteger: ").append(toIndentedString(arrayArrayOfInteger)).append("\n"); + sb.append(" arrayArrayOfModel: ").append(toIndentedString(arrayArrayOfModel)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Capitalization.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Capitalization.java new file mode 100644 index 00000000000..7071e42a553 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Capitalization.java @@ -0,0 +1,203 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Capitalization + */ + +public class Capitalization { + @JsonProperty("smallCamel") + private String smallCamel = null; + + @JsonProperty("CapitalCamel") + private String capitalCamel = null; + + @JsonProperty("small_Snake") + private String smallSnake = null; + + @JsonProperty("Capital_Snake") + private String capitalSnake = null; + + @JsonProperty("SCA_ETH_Flow_Points") + private String scAETHFlowPoints = null; + + @JsonProperty("ATT_NAME") + private String ATT_NAME = null; + + public Capitalization smallCamel(String smallCamel) { + this.smallCamel = smallCamel; + return this; + } + + /** + * Get smallCamel + * @return smallCamel + **/ + @ApiModelProperty(value = "") + + + public String getSmallCamel() { + return smallCamel; + } + + public void setSmallCamel(String smallCamel) { + this.smallCamel = smallCamel; + } + + public Capitalization capitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + return this; + } + + /** + * Get capitalCamel + * @return capitalCamel + **/ + @ApiModelProperty(value = "") + + + public String getCapitalCamel() { + return capitalCamel; + } + + public void setCapitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + } + + public Capitalization smallSnake(String smallSnake) { + this.smallSnake = smallSnake; + return this; + } + + /** + * Get smallSnake + * @return smallSnake + **/ + @ApiModelProperty(value = "") + + + public String getSmallSnake() { + return smallSnake; + } + + public void setSmallSnake(String smallSnake) { + this.smallSnake = smallSnake; + } + + public Capitalization capitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + return this; + } + + /** + * Get capitalSnake + * @return capitalSnake + **/ + @ApiModelProperty(value = "") + + + public String getCapitalSnake() { + return capitalSnake; + } + + public void setCapitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + } + + public Capitalization scAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + return this; + } + + /** + * Get scAETHFlowPoints + * @return scAETHFlowPoints + **/ + @ApiModelProperty(value = "") + + + public String getScAETHFlowPoints() { + return scAETHFlowPoints; + } + + public void setScAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + } + + public Capitalization ATT_NAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + return this; + } + + /** + * Name of the pet + * @return ATT_NAME + **/ + @ApiModelProperty(value = "Name of the pet ") + + + public String getATTNAME() { + return ATT_NAME; + } + + public void setATTNAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Capitalization capitalization = (Capitalization) o; + return Objects.equals(this.smallCamel, capitalization.smallCamel) && + Objects.equals(this.capitalCamel, capitalization.capitalCamel) && + Objects.equals(this.smallSnake, capitalization.smallSnake) && + Objects.equals(this.capitalSnake, capitalization.capitalSnake) && + Objects.equals(this.scAETHFlowPoints, capitalization.scAETHFlowPoints) && + Objects.equals(this.ATT_NAME, capitalization.ATT_NAME); + } + + @Override + public int hashCode() { + return Objects.hash(smallCamel, capitalCamel, smallSnake, capitalSnake, scAETHFlowPoints, ATT_NAME); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Capitalization {\n"); + + sb.append(" smallCamel: ").append(toIndentedString(smallCamel)).append("\n"); + sb.append(" capitalCamel: ").append(toIndentedString(capitalCamel)).append("\n"); + sb.append(" smallSnake: ").append(toIndentedString(smallSnake)).append("\n"); + sb.append(" capitalSnake: ").append(toIndentedString(capitalSnake)).append("\n"); + sb.append(" scAETHFlowPoints: ").append(toIndentedString(scAETHFlowPoints)).append("\n"); + sb.append(" ATT_NAME: ").append(toIndentedString(ATT_NAME)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Cat.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Cat.java new file mode 100644 index 00000000000..a1f38af43e0 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Cat.java @@ -0,0 +1,80 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.virtualan.model.Animal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Cat + */ + +public class Cat extends Animal { + @JsonProperty("declawed") + private Boolean declawed = null; + + public Cat declawed(Boolean declawed) { + this.declawed = declawed; + return this; + } + + /** + * Get declawed + * @return declawed + **/ + @ApiModelProperty(value = "") + + + public Boolean getDeclawed() { + return declawed; + } + + public void setDeclawed(Boolean declawed) { + this.declawed = declawed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Cat cat = (Cat) o; + return Objects.equals(this.declawed, cat.declawed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(declawed, super.hashCode()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Cat {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" declawed: ").append(toIndentedString(declawed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Category.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Category.java new file mode 100644 index 00000000000..5a43da49eeb --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Category.java @@ -0,0 +1,103 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Category + */ + +public class Category { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Category id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Category name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(this.id, category.id) && + Objects.equals(this.name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ClassModel.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ClassModel.java new file mode 100644 index 00000000000..92b739c6db7 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ClassModel.java @@ -0,0 +1,79 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Model for testing model with \"_class\" property + */ +@ApiModel(description = "Model for testing model with \"_class\" property") + +public class ClassModel { + @JsonProperty("_class") + private String propertyClass = null; + + public ClassModel propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + + + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ClassModel classModel = (ClassModel) o; + return Objects.equals(this.propertyClass, classModel.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(propertyClass); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ClassModel {\n"); + + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Client.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Client.java new file mode 100644 index 00000000000..f689ff66b2d --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Client.java @@ -0,0 +1,78 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Client + */ + +public class Client { + @JsonProperty("client") + private String client = null; + + public Client client(String client) { + this.client = client; + return this; + } + + /** + * Get client + * @return client + **/ + @ApiModelProperty(value = "") + + + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Client client = (Client) o; + return Objects.equals(this.client, client.client); + } + + @Override + public int hashCode() { + return Objects.hash(client); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Client {\n"); + + sb.append(" client: ").append(toIndentedString(client)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Dog.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Dog.java new file mode 100644 index 00000000000..7a5f1b21863 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Dog.java @@ -0,0 +1,80 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.virtualan.model.Animal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Dog + */ + +public class Dog extends Animal { + @JsonProperty("breed") + private String breed = null; + + public Dog breed(String breed) { + this.breed = breed; + return this; + } + + /** + * Get breed + * @return breed + **/ + @ApiModelProperty(value = "") + + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Dog dog = (Dog) o; + return Objects.equals(this.breed, dog.breed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(breed, super.hashCode()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Dog {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" breed: ").append(toIndentedString(breed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumArrays.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumArrays.java new file mode 100644 index 00000000000..7f37a350cf4 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumArrays.java @@ -0,0 +1,177 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * EnumArrays + */ + +public class EnumArrays { + /** + * Gets or Sets justSymbol + */ + public enum JustSymbolEnum { + GREATER_THAN_OR_EQUAL_TO(">="), + + DOLLAR("$"); + + private String value; + + JustSymbolEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static JustSymbolEnum fromValue(String text) { + for (JustSymbolEnum b : JustSymbolEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("just_symbol") + private JustSymbolEnum justSymbol = null; + + /** + * Gets or Sets arrayEnum + */ + public enum ArrayEnumEnum { + FISH("fish"), + + CRAB("crab"); + + private String value; + + ArrayEnumEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ArrayEnumEnum fromValue(String text) { + for (ArrayEnumEnum b : ArrayEnumEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("array_enum") + @Valid + private List arrayEnum = null; + + public EnumArrays justSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + return this; + } + + /** + * Get justSymbol + * @return justSymbol + **/ + @ApiModelProperty(value = "") + + + public JustSymbolEnum getJustSymbol() { + return justSymbol; + } + + public void setJustSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + } + + public EnumArrays arrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + return this; + } + + public EnumArrays addArrayEnumItem(ArrayEnumEnum arrayEnumItem) { + if (this.arrayEnum == null) { + this.arrayEnum = new ArrayList<>(); + } + this.arrayEnum.add(arrayEnumItem); + return this; + } + + /** + * Get arrayEnum + * @return arrayEnum + **/ + @ApiModelProperty(value = "") + + + public List getArrayEnum() { + return arrayEnum; + } + + public void setArrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumArrays enumArrays = (EnumArrays) o; + return Objects.equals(this.justSymbol, enumArrays.justSymbol) && + Objects.equals(this.arrayEnum, enumArrays.arrayEnum); + } + + @Override + public int hashCode() { + return Objects.hash(justSymbol, arrayEnum); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumArrays {\n"); + + sb.append(" justSymbol: ").append(toIndentedString(justSymbol)).append("\n"); + sb.append(" arrayEnum: ").append(toIndentedString(arrayEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumClass.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumClass.java new file mode 100644 index 00000000000..408833a2482 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumClass.java @@ -0,0 +1,43 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonValue; +import javax.validation.Valid; +import javax.validation.constraints.*; + +import com.fasterxml.jackson.annotation.JsonCreator; + +/** + * Gets or Sets EnumClass + */ +public enum EnumClass { + + _ABC("_abc"), + + _EFG("-efg"), + + _XYZ_("(xyz)"); + + private String value; + + EnumClass(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumClass fromValue(String text) { + for (EnumClass b : EnumClass.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumTest.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumTest.java new file mode 100644 index 00000000000..297d624ea58 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/EnumTest.java @@ -0,0 +1,310 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.virtualan.model.OuterEnum; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * EnumTest + */ + +public class EnumTest { + /** + * Gets or Sets enumString + */ + public enum EnumStringEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringEnum fromValue(String text) { + for (EnumStringEnum b : EnumStringEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string") + private EnumStringEnum enumString = null; + + /** + * Gets or Sets enumStringRequired + */ + public enum EnumStringRequiredEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringRequiredEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringRequiredEnum fromValue(String text) { + for (EnumStringRequiredEnum b : EnumStringRequiredEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string_required") + private EnumStringRequiredEnum enumStringRequired = null; + + /** + * Gets or Sets enumInteger + */ + public enum EnumIntegerEnum { + NUMBER_1(1), + + NUMBER_MINUS_1(-1); + + private Integer value; + + EnumIntegerEnum(Integer value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumIntegerEnum fromValue(String text) { + for (EnumIntegerEnum b : EnumIntegerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_integer") + private EnumIntegerEnum enumInteger = null; + + /** + * Gets or Sets enumNumber + */ + public enum EnumNumberEnum { + NUMBER_1_DOT_1(1.1), + + NUMBER_MINUS_1_DOT_2(-1.2); + + private Double value; + + EnumNumberEnum(Double value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumNumberEnum fromValue(String text) { + for (EnumNumberEnum b : EnumNumberEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_number") + private EnumNumberEnum enumNumber = null; + + @JsonProperty("outerEnum") + private OuterEnum outerEnum = null; + + public EnumTest enumString(EnumStringEnum enumString) { + this.enumString = enumString; + return this; + } + + /** + * Get enumString + * @return enumString + **/ + @ApiModelProperty(value = "") + + + public EnumStringEnum getEnumString() { + return enumString; + } + + public void setEnumString(EnumStringEnum enumString) { + this.enumString = enumString; + } + + public EnumTest enumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + return this; + } + + /** + * Get enumStringRequired + * @return enumStringRequired + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + + public EnumStringRequiredEnum getEnumStringRequired() { + return enumStringRequired; + } + + public void setEnumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + } + + public EnumTest enumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + return this; + } + + /** + * Get enumInteger + * @return enumInteger + **/ + @ApiModelProperty(value = "") + + + public EnumIntegerEnum getEnumInteger() { + return enumInteger; + } + + public void setEnumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + } + + public EnumTest enumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + return this; + } + + /** + * Get enumNumber + * @return enumNumber + **/ + @ApiModelProperty(value = "") + + + public EnumNumberEnum getEnumNumber() { + return enumNumber; + } + + public void setEnumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + } + + public EnumTest outerEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + return this; + } + + /** + * Get outerEnum + * @return outerEnum + **/ + @ApiModelProperty(value = "") + + @Valid + + public OuterEnum getOuterEnum() { + return outerEnum; + } + + public void setOuterEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumTest enumTest = (EnumTest) o; + return Objects.equals(this.enumString, enumTest.enumString) && + Objects.equals(this.enumStringRequired, enumTest.enumStringRequired) && + Objects.equals(this.enumInteger, enumTest.enumInteger) && + Objects.equals(this.enumNumber, enumTest.enumNumber) && + Objects.equals(this.outerEnum, enumTest.outerEnum); + } + + @Override + public int hashCode() { + return Objects.hash(enumString, enumStringRequired, enumInteger, enumNumber, outerEnum); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumTest {\n"); + + sb.append(" enumString: ").append(toIndentedString(enumString)).append("\n"); + sb.append(" enumStringRequired: ").append(toIndentedString(enumStringRequired)).append("\n"); + sb.append(" enumInteger: ").append(toIndentedString(enumInteger)).append("\n"); + sb.append(" enumNumber: ").append(toIndentedString(enumNumber)).append("\n"); + sb.append(" outerEnum: ").append(toIndentedString(outerEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FileSchemaTestClass.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FileSchemaTestClass.java new file mode 100644 index 00000000000..1494da4da30 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FileSchemaTestClass.java @@ -0,0 +1,116 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * FileSchemaTestClass + */ + +public class FileSchemaTestClass { + @JsonProperty("file") + private java.io.File file = null; + + @JsonProperty("files") + @Valid + private List files = null; + + public FileSchemaTestClass file(java.io.File file) { + this.file = file; + return this; + } + + /** + * Get file + * @return file + **/ + @ApiModelProperty(value = "") + + @Valid + + public java.io.File getFile() { + return file; + } + + public void setFile(java.io.File file) { + this.file = file; + } + + public FileSchemaTestClass files(List files) { + this.files = files; + return this; + } + + public FileSchemaTestClass addFilesItem(java.io.File filesItem) { + if (this.files == null) { + this.files = new ArrayList<>(); + } + this.files.add(filesItem); + return this; + } + + /** + * Get files + * @return files + **/ + @ApiModelProperty(value = "") + + @Valid + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FileSchemaTestClass fileSchemaTestClass = (FileSchemaTestClass) o; + return Objects.equals(this.file, fileSchemaTestClass.file) && + Objects.equals(this.files, fileSchemaTestClass.files); + } + + @Override + public int hashCode() { + return Objects.hash(file, files); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FileSchemaTestClass {\n"); + + sb.append(" file: ").append(toIndentedString(file)).append("\n"); + sb.append(" files: ").append(toIndentedString(files)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FormatTest.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FormatTest.java new file mode 100644 index 00000000000..de411628665 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/FormatTest.java @@ -0,0 +1,402 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.OffsetDateTime; +import java.util.UUID; +import org.springframework.core.io.Resource; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * FormatTest + */ + +public class FormatTest { + @JsonProperty("integer") + private Integer integer = null; + + @JsonProperty("int32") + private Integer int32 = null; + + @JsonProperty("int64") + private Long int64 = null; + + @JsonProperty("number") + private BigDecimal number = null; + + @JsonProperty("float") + private Float _float = null; + + @JsonProperty("double") + private Double _double = null; + + @JsonProperty("string") + private String string = null; + + @JsonProperty("byte") + private byte[] _byte = null; + + @JsonProperty("binary") + private Resource binary = null; + + @JsonProperty("date") + private LocalDate date = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("password") + private String password = null; + + public FormatTest integer(Integer integer) { + this.integer = integer; + return this; + } + + /** + * Get integer + * minimum: 10 + * maximum: 100 + * @return integer + **/ + @ApiModelProperty(value = "") + +@Min(10) @Max(100) + public Integer getInteger() { + return integer; + } + + public void setInteger(Integer integer) { + this.integer = integer; + } + + public FormatTest int32(Integer int32) { + this.int32 = int32; + return this; + } + + /** + * Get int32 + * minimum: 20 + * maximum: 200 + * @return int32 + **/ + @ApiModelProperty(value = "") + +@Min(20) @Max(200) + public Integer getInt32() { + return int32; + } + + public void setInt32(Integer int32) { + this.int32 = int32; + } + + public FormatTest int64(Long int64) { + this.int64 = int64; + return this; + } + + /** + * Get int64 + * @return int64 + **/ + @ApiModelProperty(value = "") + + + public Long getInt64() { + return int64; + } + + public void setInt64(Long int64) { + this.int64 = int64; + } + + public FormatTest number(BigDecimal number) { + this.number = number; + return this; + } + + /** + * Get number + * minimum: 32.1 + * maximum: 543.2 + * @return number + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + @Valid +@DecimalMin("32.1") @DecimalMax("543.2") + public BigDecimal getNumber() { + return number; + } + + public void setNumber(BigDecimal number) { + this.number = number; + } + + public FormatTest _float(Float _float) { + this._float = _float; + return this; + } + + /** + * Get _float + * minimum: 54.3 + * maximum: 987.6 + * @return _float + **/ + @ApiModelProperty(value = "") + +@DecimalMin("54.3") @DecimalMax("987.6") + public Float getFloat() { + return _float; + } + + public void setFloat(Float _float) { + this._float = _float; + } + + public FormatTest _double(Double _double) { + this._double = _double; + return this; + } + + /** + * Get _double + * minimum: 67.8 + * maximum: 123.4 + * @return _double + **/ + @ApiModelProperty(value = "") + +@DecimalMin("67.8") @DecimalMax("123.4") + public Double getDouble() { + return _double; + } + + public void setDouble(Double _double) { + this._double = _double; + } + + public FormatTest string(String string) { + this.string = string; + return this; + } + + /** + * Get string + * @return string + **/ + @ApiModelProperty(value = "") + +@Pattern(regexp="/[a-z]/i") + public String getString() { + return string; + } + + public void setString(String string) { + this.string = string; + } + + public FormatTest _byte(byte[] _byte) { + this._byte = _byte; + return this; + } + + /** + * Get _byte + * @return _byte + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + +@Pattern(regexp="^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$") + public byte[] getByte() { + return _byte; + } + + public void setByte(byte[] _byte) { + this._byte = _byte; + } + + public FormatTest binary(Resource binary) { + this.binary = binary; + return this; + } + + /** + * Get binary + * @return binary + **/ + @ApiModelProperty(value = "") + + @Valid + + public Resource getBinary() { + return binary; + } + + public void setBinary(Resource binary) { + this.binary = binary; + } + + public FormatTest date(LocalDate date) { + this.date = date; + return this; + } + + /** + * Get date + * @return date + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + @Valid + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public FormatTest dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @ApiModelProperty(value = "") + + @Valid + + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public FormatTest uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @ApiModelProperty(value = "") + + @Valid + + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public FormatTest password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + +@Size(min=10,max=64) + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FormatTest formatTest = (FormatTest) o; + return Objects.equals(this.integer, formatTest.integer) && + Objects.equals(this.int32, formatTest.int32) && + Objects.equals(this.int64, formatTest.int64) && + Objects.equals(this.number, formatTest.number) && + Objects.equals(this._float, formatTest._float) && + Objects.equals(this._double, formatTest._double) && + Objects.equals(this.string, formatTest.string) && + Objects.equals(this._byte, formatTest._byte) && + Objects.equals(this.binary, formatTest.binary) && + Objects.equals(this.date, formatTest.date) && + Objects.equals(this.dateTime, formatTest.dateTime) && + Objects.equals(this.uuid, formatTest.uuid) && + Objects.equals(this.password, formatTest.password); + } + + @Override + public int hashCode() { + return Objects.hash(integer, int32, int64, number, _float, _double, string, _byte, binary, date, dateTime, uuid, password); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FormatTest {\n"); + + sb.append(" integer: ").append(toIndentedString(integer)).append("\n"); + sb.append(" int32: ").append(toIndentedString(int32)).append("\n"); + sb.append(" int64: ").append(toIndentedString(int64)).append("\n"); + sb.append(" number: ").append(toIndentedString(number)).append("\n"); + sb.append(" _float: ").append(toIndentedString(_float)).append("\n"); + sb.append(" _double: ").append(toIndentedString(_double)).append("\n"); + sb.append(" string: ").append(toIndentedString(string)).append("\n"); + sb.append(" _byte: ").append(toIndentedString(_byte)).append("\n"); + sb.append(" binary: ").append(toIndentedString(binary)).append("\n"); + sb.append(" date: ").append(toIndentedString(date)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/HasOnlyReadOnly.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/HasOnlyReadOnly.java new file mode 100644 index 00000000000..45cc65677cb --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/HasOnlyReadOnly.java @@ -0,0 +1,103 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * HasOnlyReadOnly + */ + +public class HasOnlyReadOnly { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("foo") + private String foo = null; + + public HasOnlyReadOnly bar(String bar) { + this.bar = bar; + return this; + } + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(readOnly = true, value = "") + + + public String getBar() { + return bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + + public HasOnlyReadOnly foo(String foo) { + this.foo = foo; + return this; + } + + /** + * Get foo + * @return foo + **/ + @ApiModelProperty(readOnly = true, value = "") + + + public String getFoo() { + return foo; + } + + public void setFoo(String foo) { + this.foo = foo; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + HasOnlyReadOnly hasOnlyReadOnly = (HasOnlyReadOnly) o; + return Objects.equals(this.bar, hasOnlyReadOnly.bar) && + Objects.equals(this.foo, hasOnlyReadOnly.foo); + } + + @Override + public int hashCode() { + return Objects.hash(bar, foo); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class HasOnlyReadOnly {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" foo: ").append(toIndentedString(foo)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MapTest.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MapTest.java new file mode 100644 index 00000000000..14296751f1e --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MapTest.java @@ -0,0 +1,218 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.openapitools.virtualan.model.StringBooleanMap; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * MapTest + */ + +public class MapTest { + @JsonProperty("map_map_of_string") + @Valid + private Map> mapMapOfString = null; + + /** + * Gets or Sets inner + */ + public enum InnerEnum { + UPPER("UPPER"), + + LOWER("lower"); + + private String value; + + InnerEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static InnerEnum fromValue(String text) { + for (InnerEnum b : InnerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("map_of_enum_string") + @Valid + private Map mapOfEnumString = null; + + @JsonProperty("direct_map") + @Valid + private Map directMap = null; + + @JsonProperty("indirect_map") + private StringBooleanMap indirectMap = null; + + public MapTest mapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + return this; + } + + public MapTest putMapMapOfStringItem(String key, Map mapMapOfStringItem) { + if (this.mapMapOfString == null) { + this.mapMapOfString = new HashMap<>(); + } + this.mapMapOfString.put(key, mapMapOfStringItem); + return this; + } + + /** + * Get mapMapOfString + * @return mapMapOfString + **/ + @ApiModelProperty(value = "") + + @Valid + + public Map> getMapMapOfString() { + return mapMapOfString; + } + + public void setMapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + } + + public MapTest mapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + return this; + } + + public MapTest putMapOfEnumStringItem(String key, InnerEnum mapOfEnumStringItem) { + if (this.mapOfEnumString == null) { + this.mapOfEnumString = new HashMap<>(); + } + this.mapOfEnumString.put(key, mapOfEnumStringItem); + return this; + } + + /** + * Get mapOfEnumString + * @return mapOfEnumString + **/ + @ApiModelProperty(value = "") + + + public Map getMapOfEnumString() { + return mapOfEnumString; + } + + public void setMapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + } + + public MapTest directMap(Map directMap) { + this.directMap = directMap; + return this; + } + + public MapTest putDirectMapItem(String key, Boolean directMapItem) { + if (this.directMap == null) { + this.directMap = new HashMap<>(); + } + this.directMap.put(key, directMapItem); + return this; + } + + /** + * Get directMap + * @return directMap + **/ + @ApiModelProperty(value = "") + + + public Map getDirectMap() { + return directMap; + } + + public void setDirectMap(Map directMap) { + this.directMap = directMap; + } + + public MapTest indirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + return this; + } + + /** + * Get indirectMap + * @return indirectMap + **/ + @ApiModelProperty(value = "") + + @Valid + + public StringBooleanMap getIndirectMap() { + return indirectMap; + } + + public void setIndirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MapTest mapTest = (MapTest) o; + return Objects.equals(this.mapMapOfString, mapTest.mapMapOfString) && + Objects.equals(this.mapOfEnumString, mapTest.mapOfEnumString) && + Objects.equals(this.directMap, mapTest.directMap) && + Objects.equals(this.indirectMap, mapTest.indirectMap); + } + + @Override + public int hashCode() { + return Objects.hash(mapMapOfString, mapOfEnumString, directMap, indirectMap); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MapTest {\n"); + + sb.append(" mapMapOfString: ").append(toIndentedString(mapMapOfString)).append("\n"); + sb.append(" mapOfEnumString: ").append(toIndentedString(mapOfEnumString)).append("\n"); + sb.append(" directMap: ").append(toIndentedString(directMap)).append("\n"); + sb.append(" indirectMap: ").append(toIndentedString(indirectMap)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MixedPropertiesAndAdditionalPropertiesClass.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MixedPropertiesAndAdditionalPropertiesClass.java new file mode 100644 index 00000000000..8a55f4585d2 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/MixedPropertiesAndAdditionalPropertiesClass.java @@ -0,0 +1,146 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.OffsetDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.openapitools.virtualan.model.Animal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * MixedPropertiesAndAdditionalPropertiesClass + */ + +public class MixedPropertiesAndAdditionalPropertiesClass { + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("map") + @Valid + private Map map = null; + + public MixedPropertiesAndAdditionalPropertiesClass uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @ApiModelProperty(value = "") + + @Valid + + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public MixedPropertiesAndAdditionalPropertiesClass dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @ApiModelProperty(value = "") + + @Valid + + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public MixedPropertiesAndAdditionalPropertiesClass map(Map map) { + this.map = map; + return this; + } + + public MixedPropertiesAndAdditionalPropertiesClass putMapItem(String key, Animal mapItem) { + if (this.map == null) { + this.map = new HashMap<>(); + } + this.map.put(key, mapItem); + return this; + } + + /** + * Get map + * @return map + **/ + @ApiModelProperty(value = "") + + @Valid + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MixedPropertiesAndAdditionalPropertiesClass mixedPropertiesAndAdditionalPropertiesClass = (MixedPropertiesAndAdditionalPropertiesClass) o; + return Objects.equals(this.uuid, mixedPropertiesAndAdditionalPropertiesClass.uuid) && + Objects.equals(this.dateTime, mixedPropertiesAndAdditionalPropertiesClass.dateTime) && + Objects.equals(this.map, mixedPropertiesAndAdditionalPropertiesClass.map); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, dateTime, map); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MixedPropertiesAndAdditionalPropertiesClass {\n"); + + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" map: ").append(toIndentedString(map)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Model200Response.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Model200Response.java new file mode 100644 index 00000000000..27598e36568 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Model200Response.java @@ -0,0 +1,104 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Model for testing model name starting with number + */ +@ApiModel(description = "Model for testing model name starting with number") + +public class Model200Response { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("class") + private String propertyClass = null; + + public Model200Response name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + + + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + public Model200Response propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + + + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Model200Response _200response = (Model200Response) o; + return Objects.equals(this.name, _200response.name) && + Objects.equals(this.propertyClass, _200response.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(name, propertyClass); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Model200Response {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelApiResponse.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelApiResponse.java new file mode 100644 index 00000000000..2966dd98906 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelApiResponse.java @@ -0,0 +1,128 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * ModelApiResponse + */ + +public class ModelApiResponse { + @JsonProperty("code") + private Integer code = null; + + @JsonProperty("type") + private String type = null; + + @JsonProperty("message") + private String message = null; + + public ModelApiResponse code(Integer code) { + this.code = code; + return this; + } + + /** + * Get code + * @return code + **/ + @ApiModelProperty(value = "") + + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public ModelApiResponse type(String type) { + this.type = type; + return this; + } + + /** + * Get type + * @return type + **/ + @ApiModelProperty(value = "") + + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public ModelApiResponse message(String message) { + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @ApiModelProperty(value = "") + + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelApiResponse _apiResponse = (ModelApiResponse) o; + return Objects.equals(this.code, _apiResponse.code) && + Objects.equals(this.type, _apiResponse.type) && + Objects.equals(this.message, _apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelApiResponse {\n"); + + sb.append(" code: ").append(toIndentedString(code)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelReturn.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelReturn.java new file mode 100644 index 00000000000..ca8e032976d --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ModelReturn.java @@ -0,0 +1,79 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Model for testing reserved words + */ +@ApiModel(description = "Model for testing reserved words") + +public class ModelReturn { + @JsonProperty("return") + private Integer _return = null; + + public ModelReturn _return(Integer _return) { + this._return = _return; + return this; + } + + /** + * Get _return + * @return _return + **/ + @ApiModelProperty(value = "") + + + public Integer getReturn() { + return _return; + } + + public void setReturn(Integer _return) { + this._return = _return; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelReturn _return = (ModelReturn) o; + return Objects.equals(this._return, _return._return); + } + + @Override + public int hashCode() { + return Objects.hash(_return); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelReturn {\n"); + + sb.append(" _return: ").append(toIndentedString(_return)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Name.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Name.java new file mode 100644 index 00000000000..13c0933b1be --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Name.java @@ -0,0 +1,155 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Model for testing model name same as property name + */ +@ApiModel(description = "Model for testing model name same as property name") + +public class Name { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("snake_case") + private Integer snakeCase = null; + + @JsonProperty("property") + private String property = null; + + @JsonProperty("123Number") + private Integer _123number = null; + + public Name name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + public Name snakeCase(Integer snakeCase) { + this.snakeCase = snakeCase; + return this; + } + + /** + * Get snakeCase + * @return snakeCase + **/ + @ApiModelProperty(readOnly = true, value = "") + + + public Integer getSnakeCase() { + return snakeCase; + } + + public void setSnakeCase(Integer snakeCase) { + this.snakeCase = snakeCase; + } + + public Name property(String property) { + this.property = property; + return this; + } + + /** + * Get property + * @return property + **/ + @ApiModelProperty(value = "") + + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + public Name _123number(Integer _123number) { + this._123number = _123number; + return this; + } + + /** + * Get _123number + * @return _123number + **/ + @ApiModelProperty(readOnly = true, value = "") + + + public Integer get123number() { + return _123number; + } + + public void set123number(Integer _123number) { + this._123number = _123number; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Name name = (Name) o; + return Objects.equals(this.name, name.name) && + Objects.equals(this.snakeCase, name.snakeCase) && + Objects.equals(this.property, name.property) && + Objects.equals(this._123number, name._123number); + } + + @Override + public int hashCode() { + return Objects.hash(name, snakeCase, property, _123number); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Name {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" snakeCase: ").append(toIndentedString(snakeCase)).append("\n"); + sb.append(" property: ").append(toIndentedString(property)).append("\n"); + sb.append(" _123number: ").append(toIndentedString(_123number)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/NumberOnly.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/NumberOnly.java new file mode 100644 index 00000000000..56a6e6eb908 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/NumberOnly.java @@ -0,0 +1,80 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * NumberOnly + */ + +public class NumberOnly { + @JsonProperty("JustNumber") + private BigDecimal justNumber = null; + + public NumberOnly justNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + return this; + } + + /** + * Get justNumber + * @return justNumber + **/ + @ApiModelProperty(value = "") + + @Valid + + public BigDecimal getJustNumber() { + return justNumber; + } + + public void setJustNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberOnly numberOnly = (NumberOnly) o; + return Objects.equals(this.justNumber, numberOnly.justNumber); + } + + @Override + public int hashCode() { + return Objects.hash(justNumber); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class NumberOnly {\n"); + + sb.append(" justNumber: ").append(toIndentedString(justNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Order.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Order.java new file mode 100644 index 00000000000..d424a8c4a9c --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Order.java @@ -0,0 +1,239 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Order + */ + +public class Order { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("petId") + private Long petId = null; + + @JsonProperty("quantity") + private Integer quantity = null; + + @JsonProperty("shipDate") + private OffsetDateTime shipDate = null; + + /** + * Order Status + */ + public enum StatusEnum { + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + @JsonProperty("complete") + private Boolean complete = false; + + public Order id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Order petId(Long petId) { + this.petId = petId; + return this; + } + + /** + * Get petId + * @return petId + **/ + @ApiModelProperty(value = "") + + + public Long getPetId() { + return petId; + } + + public void setPetId(Long petId) { + this.petId = petId; + } + + public Order quantity(Integer quantity) { + this.quantity = quantity; + return this; + } + + /** + * Get quantity + * @return quantity + **/ + @ApiModelProperty(value = "") + + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Order shipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + return this; + } + + /** + * Get shipDate + * @return shipDate + **/ + @ApiModelProperty(value = "") + + @Valid + + public OffsetDateTime getShipDate() { + return shipDate; + } + + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + public Order status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * Order Status + * @return status + **/ + @ApiModelProperty(value = "Order Status") + + + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + public Order complete(Boolean complete) { + this.complete = complete; + return this; + } + + /** + * Get complete + * @return complete + **/ + @ApiModelProperty(value = "") + + + public Boolean getComplete() { + return complete; + } + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(this.id, order.id) && + Objects.equals(this.petId, order.petId) && + Objects.equals(this.quantity, order.quantity) && + Objects.equals(this.shipDate, order.shipDate) && + Objects.equals(this.status, order.status) && + Objects.equals(this.complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterComposite.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterComposite.java new file mode 100644 index 00000000000..18fa8134225 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterComposite.java @@ -0,0 +1,130 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * OuterComposite + */ + +public class OuterComposite { + @JsonProperty("my_number") + private BigDecimal myNumber = null; + + @JsonProperty("my_string") + private String myString = null; + + @JsonProperty("my_boolean") + private Boolean myBoolean = null; + + public OuterComposite myNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + return this; + } + + /** + * Get myNumber + * @return myNumber + **/ + @ApiModelProperty(value = "") + + @Valid + + public BigDecimal getMyNumber() { + return myNumber; + } + + public void setMyNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + } + + public OuterComposite myString(String myString) { + this.myString = myString; + return this; + } + + /** + * Get myString + * @return myString + **/ + @ApiModelProperty(value = "") + + + public String getMyString() { + return myString; + } + + public void setMyString(String myString) { + this.myString = myString; + } + + public OuterComposite myBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + return this; + } + + /** + * Get myBoolean + * @return myBoolean + **/ + @ApiModelProperty(value = "") + + + public Boolean getMyBoolean() { + return myBoolean; + } + + public void setMyBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OuterComposite outerComposite = (OuterComposite) o; + return Objects.equals(this.myNumber, outerComposite.myNumber) && + Objects.equals(this.myString, outerComposite.myString) && + Objects.equals(this.myBoolean, outerComposite.myBoolean); + } + + @Override + public int hashCode() { + return Objects.hash(myNumber, myString, myBoolean); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class OuterComposite {\n"); + + sb.append(" myNumber: ").append(toIndentedString(myNumber)).append("\n"); + sb.append(" myString: ").append(toIndentedString(myString)).append("\n"); + sb.append(" myBoolean: ").append(toIndentedString(myBoolean)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterEnum.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterEnum.java new file mode 100644 index 00000000000..cd7f3b134e9 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/OuterEnum.java @@ -0,0 +1,43 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonValue; +import javax.validation.Valid; +import javax.validation.constraints.*; + +import com.fasterxml.jackson.annotation.JsonCreator; + +/** + * Gets or Sets OuterEnum + */ +public enum OuterEnum { + + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + OuterEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static OuterEnum fromValue(String text) { + for (OuterEnum b : OuterEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Pet.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Pet.java new file mode 100644 index 00000000000..beaa5cd32e3 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Pet.java @@ -0,0 +1,260 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.virtualan.model.Category; +import org.openapitools.virtualan.model.Tag; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Pet + */ + +public class Pet { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("category") + private Category category = null; + + @JsonProperty("name") + private String name = null; + + @JsonProperty("photoUrls") + @Valid + private List photoUrls = new ArrayList<>(); + + @JsonProperty("tags") + @Valid + private List tags = null; + + /** + * pet status in the store + */ + public enum StatusEnum { + AVAILABLE("available"), + + PENDING("pending"), + + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + public Pet id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Pet category(Category category) { + this.category = category; + return this; + } + + /** + * Get category + * @return category + **/ + @ApiModelProperty(value = "") + + @Valid + + public Category getCategory() { + return category; + } + + public void setCategory(Category category) { + this.category = category; + } + + public Pet name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(example = "doggie", required = true, value = "") + @NotNull + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Pet photoUrls(List photoUrls) { + this.photoUrls = photoUrls; + return this; + } + + public Pet addPhotoUrlsItem(String photoUrlsItem) { + this.photoUrls.add(photoUrlsItem); + return this; + } + + /** + * Get photoUrls + * @return photoUrls + **/ + @ApiModelProperty(required = true, value = "") + @NotNull + + + public List getPhotoUrls() { + return photoUrls; + } + + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + public Pet tags(List tags) { + this.tags = tags; + return this; + } + + public Pet addTagsItem(Tag tagsItem) { + if (this.tags == null) { + this.tags = new ArrayList<>(); + } + this.tags.add(tagsItem); + return this; + } + + /** + * Get tags + * @return tags + **/ + @ApiModelProperty(value = "") + + @Valid + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public Pet status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * pet status in the store + * @return status + **/ + @ApiModelProperty(value = "pet status in the store") + + + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(this.id, pet.id) && + Objects.equals(this.category, pet.category) && + Objects.equals(this.name, pet.name) && + Objects.equals(this.photoUrls, pet.photoUrls) && + Objects.equals(this.tags, pet.tags) && + Objects.equals(this.status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ReadOnlyFirst.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ReadOnlyFirst.java new file mode 100644 index 00000000000..d0735af1ae3 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/ReadOnlyFirst.java @@ -0,0 +1,103 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * ReadOnlyFirst + */ + +public class ReadOnlyFirst { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("baz") + private String baz = null; + + public ReadOnlyFirst bar(String bar) { + this.bar = bar; + return this; + } + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(readOnly = true, value = "") + + + public String getBar() { + return bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + + public ReadOnlyFirst baz(String baz) { + this.baz = baz; + return this; + } + + /** + * Get baz + * @return baz + **/ + @ApiModelProperty(value = "") + + + public String getBaz() { + return baz; + } + + public void setBaz(String baz) { + this.baz = baz; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReadOnlyFirst readOnlyFirst = (ReadOnlyFirst) o; + return Objects.equals(this.bar, readOnlyFirst.bar) && + Objects.equals(this.baz, readOnlyFirst.baz); + } + + @Override + public int hashCode() { + return Objects.hash(bar, baz); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ReadOnlyFirst {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" baz: ").append(toIndentedString(baz)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/SpecialModelName.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/SpecialModelName.java new file mode 100644 index 00000000000..baaaa7f81e3 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/SpecialModelName.java @@ -0,0 +1,78 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * SpecialModelName + */ + +public class SpecialModelName { + @JsonProperty("$special[property.name]") + private Long $specialPropertyName = null; + + public SpecialModelName $specialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + return this; + } + + /** + * Get $specialPropertyName + * @return $specialPropertyName + **/ + @ApiModelProperty(value = "") + + + public Long get$SpecialPropertyName() { + return $specialPropertyName; + } + + public void set$SpecialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SpecialModelName $specialModelName = (SpecialModelName) o; + return Objects.equals(this.$specialPropertyName, $specialModelName.$specialPropertyName); + } + + @Override + public int hashCode() { + return Objects.hash($specialPropertyName); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class SpecialModelName {\n"); + + sb.append(" $specialPropertyName: ").append(toIndentedString($specialPropertyName)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/StringBooleanMap.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/StringBooleanMap.java new file mode 100644 index 00000000000..095b736ebbc --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/StringBooleanMap.java @@ -0,0 +1,51 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import java.util.HashMap; +import java.util.Map; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * StringBooleanMap + */ + +public class StringBooleanMap extends HashMap { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class StringBooleanMap {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Tag.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Tag.java new file mode 100644 index 00000000000..59c62dba854 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/Tag.java @@ -0,0 +1,103 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * Tag + */ + +public class Tag { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Tag id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Tag name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(this.id, tag.id) && + Objects.equals(this.name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/User.java b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/User.java new file mode 100644 index 00000000000..ab17265faa4 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/java/org/openapitools/virtualan/model/User.java @@ -0,0 +1,253 @@ +package org.openapitools.virtualan.model; + +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import javax.validation.Valid; +import javax.validation.constraints.*; + +/** + * User + */ + +public class User { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("username") + private String username = null; + + @JsonProperty("firstName") + private String firstName = null; + + @JsonProperty("lastName") + private String lastName = null; + + @JsonProperty("email") + private String email = null; + + @JsonProperty("password") + private String password = null; + + @JsonProperty("phone") + private String phone = null; + + @JsonProperty("userStatus") + private Integer userStatus = null; + + public User id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public User username(String username) { + this.username = username; + return this; + } + + /** + * Get username + * @return username + **/ + @ApiModelProperty(value = "") + + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public User firstName(String firstName) { + this.firstName = firstName; + return this; + } + + /** + * Get firstName + * @return firstName + **/ + @ApiModelProperty(value = "") + + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public User lastName(String lastName) { + this.lastName = lastName; + return this; + } + + /** + * Get lastName + * @return lastName + **/ + @ApiModelProperty(value = "") + + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public User email(String email) { + this.email = email; + return this; + } + + /** + * Get email + * @return email + **/ + @ApiModelProperty(value = "") + + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public User password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(value = "") + + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public User phone(String phone) { + this.phone = phone; + return this; + } + + /** + * Get phone + * @return phone + **/ + @ApiModelProperty(value = "") + + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User userStatus(Integer userStatus) { + this.userStatus = userStatus; + return this; + } + + /** + * User Status + * @return userStatus + **/ + @ApiModelProperty(value = "User Status") + + + public Integer getUserStatus() { + return userStatus; + } + + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(this.id, user.id) && + Objects.equals(this.username, user.username) && + Objects.equals(this.firstName, user.firstName) && + Objects.equals(this.lastName, user.lastName) && + Objects.equals(this.email, user.email) && + Objects.equals(this.password, user.password) && + Objects.equals(this.phone, user.phone) && + Objects.equals(this.userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/server/petstore/springboot-virtualan/src/main/resources/application.properties b/samples/server/petstore/springboot-virtualan/src/main/resources/application.properties new file mode 100644 index 00000000000..cf5e33b6869 --- /dev/null +++ b/samples/server/petstore/springboot-virtualan/src/main/resources/application.properties @@ -0,0 +1,8 @@ +springfox.documentation.swagger.v2.path=/api-docs +server.port=80 +spring.jackson.date-format=org.openapitools.RFC3339DateFormat +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +virtual.datasource.driver-class-name=org.hsqldb.jdbcDriver +virtual.datasource.jdbcurl=jdbc:hsqldb:mem:dataSource +virtual.datasource.username=sa +virtual.datasource.password= diff --git a/samples/server/petstore/springboot/src/main/resources/application.properties b/samples/server/petstore/springboot/src/main/resources/application.properties index 13b0dc6ab96..ceca4a9e0d0 100644 --- a/samples/server/petstore/springboot/src/main/resources/application.properties +++ b/samples/server/petstore/springboot/src/main/resources/application.properties @@ -1,4 +1,4 @@ springfox.documentation.swagger.v2.path=/api-docs server.port=80 spring.jackson.date-format=org.openapitools.RFC3339DateFormat -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false From 39c734fc259869f34c05cfc314b8da7b58e5f2f5 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 6 Sep 2018 14:24:14 +0800 Subject: [PATCH 48/74] Better code format for Java (okhttp-gson) client (#971) * better code format for java okhttp client * update java petstore samples --- .../openapitools/codegen/DefaultCodegen.java | 2 +- .../src/main/resources/Java/JSON.mustache | 46 ++-- .../src/main/resources/Java/Pair.mustache | 17 +- .../main/resources/Java/StringUtil.mustache | 12 +- .../libraries/okhttp-gson/ApiClient.mustache | 28 ++- .../GzipRequestInterceptor.mustache | 14 +- .../Java/libraries/okhttp-gson/api.mustache | 35 ++- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/ApiClient.java | 28 ++- .../client/GzipRequestInterceptor.java | 14 +- .../java/org/openapitools/client/JSON.java | 38 ++- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../client/api/AnotherFakeApi.java | 9 +- .../org/openapitools/client/api/FakeApi.java | 237 ++++++++++-------- .../client/api/FakeClassnameTags123Api.java | 9 +- .../org/openapitools/client/api/PetApi.java | 123 ++++----- .../org/openapitools/client/api/StoreApi.java | 36 ++- .../org/openapitools/client/api/UserApi.java | 82 +++--- .../org/openapitools/client/ApiClient.java | 28 ++- .../client/GzipRequestInterceptor.java | 14 +- .../java/org/openapitools/client/JSON.java | 38 ++- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../client/api/AnotherFakeApi.java | 9 +- .../org/openapitools/client/api/FakeApi.java | 237 ++++++++++-------- .../client/api/FakeClassnameTags123Api.java | 9 +- .../org/openapitools/client/api/PetApi.java | 123 ++++----- .../org/openapitools/client/api/StoreApi.java | 36 ++- .../org/openapitools/client/api/UserApi.java | 82 +++--- .../java/org/openapitools/client/JSON.java | 38 ++- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/StringUtil.java | 12 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- .../java/org/openapitools/client/Pair.java | 17 +- .../org/openapitools/client/StringUtil.java | 12 +- 56 files changed, 1055 insertions(+), 709 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index a062e301350..d7115b9c8db 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4700,6 +4700,6 @@ public class DefaultCodegen implements CodegenConfig { * @param fileType file type */ public void postProcessFile(File file, String fileType) { - LOGGER.info("Post processing file {} ({})", file, fileType); + LOGGER.debug("Post processing file {} ({})", file, fileType); } } diff --git a/modules/openapi-generator/src/main/resources/Java/JSON.mustache b/modules/openapi-generator/src/main/resources/Java/JSON.mustache index ae8de32fafc..724b428392b 100644 --- a/modules/openapi-generator/src/main/resources/Java/JSON.mustache +++ b/modules/openapi-generator/src/main/resources/Java/JSON.mustache @@ -61,20 +61,24 @@ public class JSON { public static GsonBuilder createGson() { GsonFireBuilder fireBuilder = new GsonFireBuilder() - {{#models}}{{#model}}{{#discriminator}} .registerTypeSelector({{classname}}.class, new TypeSelector() { - @Override - public Class getClassForElement(JsonElement readElement) { - Map classByDiscriminatorValue = new HashMap(); - {{#mappedModels}} - classByDiscriminatorValue.put("{{mappingName}}".toUpperCase(Locale.ROOT), {{modelName}}.class); - {{/mappedModels}} - classByDiscriminatorValue.put("{{classname}}".toUpperCase(Locale.ROOT), {{classname}}.class); - return getClassByDiscriminator( - classByDiscriminatorValue, - getDiscriminatorValue(readElement, "{{{propertyName}}}")); - } + {{#models}} + {{#model}} + {{#discriminator}} + .registerTypeSelector({{classname}}.class, new TypeSelector() { + @Override + public Class getClassForElement(JsonElement readElement) { + Map classByDiscriminatorValue = new HashMap(); + {{#mappedModels}} + classByDiscriminatorValue.put("{{mappingName}}".toUpperCase(Locale.ROOT), {{modelName}}.class); + {{/mappedModels}} + classByDiscriminatorValue.put("{{classname}}".toUpperCase(Locale.ROOT), {{classname}}.class); + return getClassByDiscriminator(classByDiscriminatorValue, + getDiscriminatorValue(readElement, "{{{propertyName}}}")); + } }) - {{/discriminator}}{{/model}}{{/models}} + {{/discriminator}} + {{/model}} + {{/models}} ; GsonBuilder builder = fireBuilder.createGsonBuilder(); {{#disableHtmlEscaping}} @@ -85,7 +89,7 @@ public class JSON { private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) { JsonElement element = readElement.getAsJsonObject().get(discriminatorField); - if(null == element) { + if (null == element) { throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">"); } return element.getAsString(); @@ -93,7 +97,7 @@ public class JSON { private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) { Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase(Locale.ROOT)); - if(null == clazz) { + if (null == clazz) { throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">"); } return clazz; @@ -172,9 +176,11 @@ public class JSON { } catch (JsonParseException e) { // Fallback processing when failed to parse JSON form response body: // return the response body string directly for the String return type; - if (returnType.equals(String.class)) + if (returnType.equals(String.class)) { return (T) body; - else throw (e); + } else { + throw (e); + } } } @@ -408,8 +414,7 @@ public class JSON { private DateFormat dateFormat; - public SqlDateTypeAdapter() { - } + public SqlDateTypeAdapter() {} public SqlDateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; @@ -462,8 +467,7 @@ public class JSON { private DateFormat dateFormat; - public DateTypeAdapter() { - } + public DateTypeAdapter() {} public DateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; diff --git a/modules/openapi-generator/src/main/resources/Java/Pair.mustache b/modules/openapi-generator/src/main/resources/Java/Pair.mustache index c08f145a482..ff9e06b20d4 100644 --- a/modules/openapi-generator/src/main/resources/Java/Pair.mustache +++ b/modules/openapi-generator/src/main/resources/Java/Pair.mustache @@ -13,13 +13,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -33,8 +37,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/modules/openapi-generator/src/main/resources/Java/StringUtil.mustache b/modules/openapi-generator/src/main/resources/Java/StringUtil.mustache index 7b72a7bab45..ce52c82384d 100644 --- a/modules/openapi-generator/src/main/resources/Java/StringUtil.mustache +++ b/modules/openapi-generator/src/main/resources/Java/StringUtil.mustache @@ -13,8 +13,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -32,7 +36,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache index 5af1e2285f9..178dd691ad8 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache @@ -517,7 +517,7 @@ public class ApiClient { return jsonStr.substring(1, jsonStr.length() - 1); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); - for (Object o : (Collection)param) { + for (Object o : (Collection) param) { if (b.length() > 0) { b.append(","); } @@ -542,7 +542,9 @@ public class ApiClient { List params = new ArrayList(); // preconditions - if (name == null || name.isEmpty() || value == null || value instanceof Collection) return params; + if (name == null || name.isEmpty() || value == null || value instanceof Collection) { + return params; + } params.add(new Pair(name, parameterToString(value))); return params; @@ -587,7 +589,7 @@ public class ApiClient { delimiter = escapeString("|"); } - StringBuilder sb = new StringBuilder() ; + StringBuilder sb = new StringBuilder(); for (Object item : value) { sb.append(delimiter); sb.append(escapeString(parameterToString(item))); @@ -657,7 +659,7 @@ public class ApiClient { */ public String selectHeaderContentType(String[] contentTypes) { if (contentTypes.length == 0 || contentTypes[0].equals("*/*")) { - return "application/json"; + return "application/json"; } for (String contentType : contentTypes) { if (isJsonMime(contentType)) { @@ -981,7 +983,7 @@ public class ApiClient { * @param formParams The form parameters * @param authNames The authentications to apply * @param progressRequestListener Progress request listener - * @return The HTTP request + * @return The HTTP request * @throws ApiException If fail to serialize the request body object */ public Request buildRequest(String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { @@ -1098,13 +1100,15 @@ public class ApiClient { * Update query and header parameters based on authentication settings. * * @param authNames The authentications to apply - * @param queryParams List of query parameters - * @param headerParams Map of header parameters + * @param queryParams List of query parameters + * @param headerParams Map of header parameters */ public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { for (String authName : authNames) { Authentication auth = authentications.get(authName); - if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + if (auth == null) { + throw new RuntimeException("Authentication undefined: " + authName); + } auth.applyToParams(queryParams, headerParams); } } @@ -1116,7 +1120,7 @@ public class ApiClient { * @return RequestBody */ public RequestBody buildRequestBodyFormEncoding(Map formParams) { - FormEncodingBuilder formBuilder = new FormEncodingBuilder(); + FormEncodingBuilder formBuilder = new FormEncodingBuilder(); for (Entry param : formParams.entrySet()) { formBuilder.add(param.getKey(), parameterToString(param.getValue())); } @@ -1179,10 +1183,12 @@ public class ApiClient { public X509Certificate[] getAcceptedIssuers() { return null; } }; SSLContext sslContext = SSLContext.getInstance("TLS"); - trustManagers = new TrustManager[]{ trustAll }; + trustManagers = new TrustManager[] {trustAll}; hostnameVerifier = new HostnameVerifier() { @Override - public boolean verify(String hostname, SSLSession session) { return true; } + public boolean verify(String hostname, SSLSession session) { + return true; + } }; } else if (sslCaCert != null) { char[] password = null; // Any password will work. diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/GzipRequestInterceptor.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/GzipRequestInterceptor.mustache index 23224cf5d5b..61a5b7b0ba2 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/GzipRequestInterceptor.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/GzipRequestInterceptor.mustache @@ -16,7 +16,8 @@ import java.io.IOException; * Taken from https://github.com/square/okhttp/issues/350 */ class GzipRequestInterceptor implements Interceptor { - @Override public Response intercept(Chain chain) throws IOException { + @Override + public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) { return chain.proceed(originalRequest); @@ -52,19 +53,22 @@ class GzipRequestInterceptor implements Interceptor { private RequestBody gzip(final RequestBody body) { return new RequestBody() { - @Override public MediaType contentType() { + @Override + public MediaType contentType() { return body.contentType(); } - @Override public long contentLength() { + @Override + public long contentLength() { return -1; // We don't know the compressed length in advance! } - @Override public void writeTo(BufferedSink sink) throws IOException { + @Override + public void writeTo(BufferedSink sink) throws IOException { BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); } }; } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/api.mustache index 5f599b117d8..9af817bc272 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -89,23 +89,34 @@ public class {{classname}} { .replaceAll("\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}; {{javaUtilPrefix}}List {{localVariablePrefix}}localVarQueryParams = new {{javaUtilPrefix}}ArrayList(); - {{javaUtilPrefix}}List {{localVariablePrefix}}localVarCollectionQueryParams = new {{javaUtilPrefix}}ArrayList();{{#queryParams}} - if ({{paramName}} != null) - {{localVariablePrefix}}{{#collectionFormat}}localVarCollectionQueryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{{collectionFormat}}}", {{/collectionFormat}}{{^collectionFormat}}localVarQueryParams.addAll({{localVariablePrefix}}apiClient.parameterToPair({{/collectionFormat}}"{{baseName}}", {{paramName}}));{{/queryParams}} + {{javaUtilPrefix}}List {{localVariablePrefix}}localVarCollectionQueryParams = new {{javaUtilPrefix}}ArrayList(); + {{#queryParams}} + if ({{paramName}} != null) { + {{localVariablePrefix}}{{#collectionFormat}}localVarCollectionQueryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{{collectionFormat}}}", {{/collectionFormat}}{{^collectionFormat}}localVarQueryParams.addAll({{localVariablePrefix}}apiClient.parameterToPair({{/collectionFormat}}"{{baseName}}", {{paramName}})); + } - {{javaUtilPrefix}}Map {{localVariablePrefix}}localVarHeaderParams = new {{javaUtilPrefix}}HashMap();{{#headerParams}} - if ({{paramName}} != null) - {{localVariablePrefix}}localVarHeaderParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}}));{{/headerParams}} + {{/queryParams}} + {{javaUtilPrefix}}Map {{localVariablePrefix}}localVarHeaderParams = new {{javaUtilPrefix}}HashMap(); + {{#headerParams}} + if ({{paramName}} != null) { + {{localVariablePrefix}}localVarHeaderParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + } - {{javaUtilPrefix}}Map {{localVariablePrefix}}localVarFormParams = new {{javaUtilPrefix}}HashMap();{{#formParams}} - if ({{paramName}} != null) - {{localVariablePrefix}}localVarFormParams.put("{{baseName}}", {{paramName}});{{/formParams}} + {{/headerParams}} + {{javaUtilPrefix}}Map {{localVariablePrefix}}localVarFormParams = new {{javaUtilPrefix}}HashMap(); + {{#formParams}} + if ({{paramName}} != null) { + {{localVariablePrefix}}localVarFormParams.put("{{baseName}}", {{paramName}}); + } + {{/formParams}} final String[] {{localVariablePrefix}}localVarAccepts = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }; final String {{localVariablePrefix}}localVarAccept = {{localVariablePrefix}}apiClient.selectHeaderAccept({{localVariablePrefix}}localVarAccepts); - if ({{localVariablePrefix}}localVarAccept != null) {{localVariablePrefix}}localVarHeaderParams.put("Accept", {{localVariablePrefix}}localVarAccept); + if ({{localVariablePrefix}}localVarAccept != null) { + {{localVariablePrefix}}localVarHeaderParams.put("Accept", {{localVariablePrefix}}localVarAccept); + } final String[] {{localVariablePrefix}}localVarContentTypes = { {{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} @@ -113,7 +124,7 @@ public class {{classname}} { final String {{localVariablePrefix}}localVarContentType = {{localVariablePrefix}}apiClient.selectHeaderContentType({{localVariablePrefix}}localVarContentTypes); {{localVariablePrefix}}localVarHeaderParams.put("Content-Type", {{localVariablePrefix}}localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -265,4 +276,4 @@ public class {{classname}} { } {{/operation}} } -{{/operations}} \ No newline at end of file +{{/operations}} diff --git a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/google-api-client/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/google-api-client/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/google-api-client/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/google-api-client/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/jersey1/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/jersey2-java6/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/jersey2/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/ApiClient.java index 86ce63c9b93..59801547b04 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/ApiClient.java @@ -499,7 +499,7 @@ public class ApiClient { return jsonStr.substring(1, jsonStr.length() - 1); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); - for (Object o : (Collection)param) { + for (Object o : (Collection) param) { if (b.length() > 0) { b.append(","); } @@ -524,7 +524,9 @@ public class ApiClient { List params = new ArrayList(); // preconditions - if (name == null || name.isEmpty() || value == null || value instanceof Collection) return params; + if (name == null || name.isEmpty() || value == null || value instanceof Collection) { + return params; + } params.add(new Pair(name, parameterToString(value))); return params; @@ -569,7 +571,7 @@ public class ApiClient { delimiter = escapeString("|"); } - StringBuilder sb = new StringBuilder() ; + StringBuilder sb = new StringBuilder(); for (Object item : value) { sb.append(delimiter); sb.append(escapeString(parameterToString(item))); @@ -639,7 +641,7 @@ public class ApiClient { */ public String selectHeaderContentType(String[] contentTypes) { if (contentTypes.length == 0 || contentTypes[0].equals("*/*")) { - return "application/json"; + return "application/json"; } for (String contentType : contentTypes) { if (isJsonMime(contentType)) { @@ -963,7 +965,7 @@ public class ApiClient { * @param formParams The form parameters * @param authNames The authentications to apply * @param progressRequestListener Progress request listener - * @return The HTTP request + * @return The HTTP request * @throws ApiException If fail to serialize the request body object */ public Request buildRequest(String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { @@ -1080,13 +1082,15 @@ public class ApiClient { * Update query and header parameters based on authentication settings. * * @param authNames The authentications to apply - * @param queryParams List of query parameters - * @param headerParams Map of header parameters + * @param queryParams List of query parameters + * @param headerParams Map of header parameters */ public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { for (String authName : authNames) { Authentication auth = authentications.get(authName); - if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + if (auth == null) { + throw new RuntimeException("Authentication undefined: " + authName); + } auth.applyToParams(queryParams, headerParams); } } @@ -1098,7 +1102,7 @@ public class ApiClient { * @return RequestBody */ public RequestBody buildRequestBodyFormEncoding(Map formParams) { - FormEncodingBuilder formBuilder = new FormEncodingBuilder(); + FormEncodingBuilder formBuilder = new FormEncodingBuilder(); for (Entry param : formParams.entrySet()) { formBuilder.add(param.getKey(), parameterToString(param.getValue())); } @@ -1161,10 +1165,12 @@ public class ApiClient { public X509Certificate[] getAcceptedIssuers() { return null; } }; SSLContext sslContext = SSLContext.getInstance("TLS"); - trustManagers = new TrustManager[]{ trustAll }; + trustManagers = new TrustManager[] {trustAll}; hostnameVerifier = new HostnameVerifier() { @Override - public boolean verify(String hostname, SSLSession session) { return true; } + public boolean verify(String hostname, SSLSession session) { + return true; + } }; } else if (sslCaCert != null) { char[] password = null; // Any password will work. diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/GzipRequestInterceptor.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/GzipRequestInterceptor.java index 64d88915295..f7ecf09b39e 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/GzipRequestInterceptor.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/GzipRequestInterceptor.java @@ -27,7 +27,8 @@ import java.io.IOException; * Taken from https://github.com/square/okhttp/issues/350 */ class GzipRequestInterceptor implements Interceptor { - @Override public Response intercept(Chain chain) throws IOException { + @Override + public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) { return chain.proceed(originalRequest); @@ -63,19 +64,22 @@ class GzipRequestInterceptor implements Interceptor { private RequestBody gzip(final RequestBody body) { return new RequestBody() { - @Override public MediaType contentType() { + @Override + public MediaType contentType() { return body.contentType(); } - @Override public long contentLength() { + @Override + public long contentLength() { return -1; // We don't know the compressed length in advance! } - @Override public void writeTo(BufferedSink sink) throws IOException { + @Override + public void writeTo(BufferedSink sink) throws IOException { BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); } }; } -} \ No newline at end of file +} diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/JSON.java index 64ff528f11c..8f1c98264dc 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/JSON.java @@ -52,19 +52,17 @@ public class JSON { public static GsonBuilder createGson() { GsonFireBuilder fireBuilder = new GsonFireBuilder() - .registerTypeSelector(Animal.class, new TypeSelector() { - @Override - public Class getClassForElement(JsonElement readElement) { - Map classByDiscriminatorValue = new HashMap(); - classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); - classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); - classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); - return getClassByDiscriminator( - classByDiscriminatorValue, - getDiscriminatorValue(readElement, "className")); - } + .registerTypeSelector(Animal.class, new TypeSelector() { + @Override + public Class getClassForElement(JsonElement readElement) { + Map classByDiscriminatorValue = new HashMap(); + classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); + classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); + classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); + return getClassByDiscriminator(classByDiscriminatorValue, + getDiscriminatorValue(readElement, "className")); + } }) - ; GsonBuilder builder = fireBuilder.createGsonBuilder(); return builder; @@ -72,7 +70,7 @@ public class JSON { private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) { JsonElement element = readElement.getAsJsonObject().get(discriminatorField); - if(null == element) { + if (null == element) { throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">"); } return element.getAsString(); @@ -80,7 +78,7 @@ public class JSON { private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) { Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase(Locale.ROOT)); - if(null == clazz) { + if (null == clazz) { throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">"); } return clazz; @@ -153,9 +151,11 @@ public class JSON { } catch (JsonParseException e) { // Fallback processing when failed to parse JSON form response body: // return the response body string directly for the String return type; - if (returnType.equals(String.class)) + if (returnType.equals(String.class)) { return (T) body; - else throw (e); + } else { + throw (e); + } } } @@ -291,8 +291,7 @@ public class JSON { private DateFormat dateFormat; - public SqlDateTypeAdapter() { - } + public SqlDateTypeAdapter() {} public SqlDateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; @@ -345,8 +344,7 @@ public class JSON { private DateFormat dateFormat; - public DateTypeAdapter() { - } + public DateTypeAdapter() {} public DateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/AnotherFakeApi.java index cb429b37da6..ef2a1c94f92 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/AnotherFakeApi.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -70,16 +70,15 @@ public class AnotherFakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -87,7 +86,7 @@ public class AnotherFakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeApi.java index 9179f116ec3..6ca9910ab2a 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeApi.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeApi.java @@ -77,16 +77,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -94,7 +93,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -194,16 +193,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -211,7 +209,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -311,16 +309,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -328,7 +325,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -428,16 +425,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -445,7 +441,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -545,16 +541,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -562,7 +557,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -664,18 +659,19 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (query != null) - localVarQueryParams.addAll(apiClient.parameterToPair("query", query)); + if (query != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("query", query)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -683,7 +679,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -792,16 +788,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -809,7 +804,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -927,44 +922,71 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (integer != null) - localVarFormParams.put("integer", integer); - if (int32 != null) - localVarFormParams.put("int32", int32); - if (int64 != null) - localVarFormParams.put("int64", int64); - if (number != null) - localVarFormParams.put("number", number); - if (_float != null) - localVarFormParams.put("float", _float); - if (_double != null) - localVarFormParams.put("double", _double); - if (string != null) - localVarFormParams.put("string", string); - if (patternWithoutDelimiter != null) - localVarFormParams.put("pattern_without_delimiter", patternWithoutDelimiter); - if (_byte != null) - localVarFormParams.put("byte", _byte); - if (binary != null) - localVarFormParams.put("binary", binary); - if (date != null) - localVarFormParams.put("date", date); - if (dateTime != null) - localVarFormParams.put("dateTime", dateTime); - if (password != null) - localVarFormParams.put("password", password); - if (paramCallback != null) - localVarFormParams.put("callback", paramCallback); + if (integer != null) { + localVarFormParams.put("integer", integer); + } + + if (int32 != null) { + localVarFormParams.put("int32", int32); + } + + if (int64 != null) { + localVarFormParams.put("int64", int64); + } + + if (number != null) { + localVarFormParams.put("number", number); + } + + if (_float != null) { + localVarFormParams.put("float", _float); + } + + if (_double != null) { + localVarFormParams.put("double", _double); + } + + if (string != null) { + localVarFormParams.put("string", string); + } + + if (patternWithoutDelimiter != null) { + localVarFormParams.put("pattern_without_delimiter", patternWithoutDelimiter); + } + + if (_byte != null) { + localVarFormParams.put("byte", _byte); + } + + if (binary != null) { + localVarFormParams.put("binary", binary); + } + + if (date != null) { + localVarFormParams.put("date", date); + } + + if (dateTime != null) { + localVarFormParams.put("dateTime", dateTime); + } + + if (password != null) { + localVarFormParams.put("password", password); + } + + if (paramCallback != null) { + localVarFormParams.put("callback", paramCallback); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -972,7 +994,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1134,32 +1156,47 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (enumQueryStringArray != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "enum_query_string_array", enumQueryStringArray)); - if (enumQueryString != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_string", enumQueryString)); - if (enumQueryInteger != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_integer", enumQueryInteger)); - if (enumQueryDouble != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_double", enumQueryDouble)); + if (enumQueryStringArray != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "enum_query_string_array", enumQueryStringArray)); + } + + if (enumQueryString != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_string", enumQueryString)); + } + + if (enumQueryInteger != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_integer", enumQueryInteger)); + } + + if (enumQueryDouble != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_double", enumQueryDouble)); + } Map localVarHeaderParams = new HashMap(); - if (enumHeaderStringArray != null) - localVarHeaderParams.put("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); - if (enumHeaderString != null) - localVarHeaderParams.put("enum_header_string", apiClient.parameterToString(enumHeaderString)); + if (enumHeaderStringArray != null) { + localVarHeaderParams.put("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); + } + + if (enumHeaderString != null) { + localVarHeaderParams.put("enum_header_string", apiClient.parameterToString(enumHeaderString)); + } Map localVarFormParams = new HashMap(); - if (enumFormStringArray != null) - localVarFormParams.put("enum_form_string_array", enumFormStringArray); - if (enumFormString != null) - localVarFormParams.put("enum_form_string", enumFormString); + if (enumFormStringArray != null) { + localVarFormParams.put("enum_form_string_array", enumFormStringArray); + } + + if (enumFormString != null) { + localVarFormParams.put("enum_form_string", enumFormString); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -1167,7 +1204,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1284,16 +1321,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -1301,7 +1337,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1403,20 +1439,23 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (param != null) - localVarFormParams.put("param", param); - if (param2 != null) - localVarFormParams.put("param2", param2); + if (param != null) { + localVarFormParams.put("param", param); + } + + if (param2 != null) { + localVarFormParams.put("param2", param2); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -1424,7 +1463,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java index 749598b3099..fee24a345ed 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -70,16 +70,15 @@ public class FakeClassnameTags123Api { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -87,7 +86,7 @@ public class FakeClassnameTags123Api { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/PetApi.java index d1b477e0d44..14e85162f7e 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/PetApi.java @@ -72,16 +72,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json", "application/xml" @@ -89,7 +88,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -192,18 +191,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - if (apiKey != null) - localVarHeaderParams.put("api_key", apiClient.parameterToString(apiKey)); + if (apiKey != null) { + localVarHeaderParams.put("api_key", apiClient.parameterToString(apiKey)); + } Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -211,7 +211,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -315,18 +315,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (status != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "status", status)); + if (status != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "status", status)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -334,7 +335,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -441,18 +442,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (tags != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "tags", tags)); + if (tags != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "tags", tags)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -460,7 +462,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -573,16 +575,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -590,7 +591,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -695,16 +696,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json", "application/xml" @@ -712,7 +712,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -816,20 +816,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (name != null) - localVarFormParams.put("name", name); - if (status != null) - localVarFormParams.put("status", status); + if (name != null) { + localVarFormParams.put("name", name); + } + + if (status != null) { + localVarFormParams.put("status", status); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -837,7 +840,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -947,20 +950,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (additionalMetadata != null) - localVarFormParams.put("additionalMetadata", additionalMetadata); - if (file != null) - localVarFormParams.put("file", file); + if (additionalMetadata != null) { + localVarFormParams.put("additionalMetadata", additionalMetadata); + } + + if (file != null) { + localVarFormParams.put("file", file); + } final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "multipart/form-data" @@ -968,7 +974,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1082,20 +1088,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (additionalMetadata != null) - localVarFormParams.put("additionalMetadata", additionalMetadata); - if (requiredFile != null) - localVarFormParams.put("requiredFile", requiredFile); + if (additionalMetadata != null) { + localVarFormParams.put("additionalMetadata", additionalMetadata); + } + + if (requiredFile != null) { + localVarFormParams.put("requiredFile", requiredFile); + } final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "multipart/form-data" @@ -1103,7 +1112,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/StoreApi.java index c4669755c16..c9924191862 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/StoreApi.java @@ -71,16 +71,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -88,7 +87,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -188,16 +187,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -205,7 +203,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -303,16 +301,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -320,7 +317,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -425,16 +422,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -442,7 +438,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/UserApi.java index bf4c1fb77aa..ffb2e6bd52c 100644 --- a/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson-parcelableModel/src/main/java/org/openapitools/client/api/UserApi.java @@ -70,16 +70,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -87,7 +86,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -188,16 +187,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -205,7 +203,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -306,16 +304,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -323,7 +320,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -425,16 +422,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -442,7 +438,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -544,16 +540,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -561,7 +556,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -667,20 +662,23 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (username != null) - localVarQueryParams.addAll(apiClient.parameterToPair("username", username)); - if (password != null) - localVarQueryParams.addAll(apiClient.parameterToPair("password", password)); + if (username != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("username", username)); + } + + if (password != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("password", password)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -688,7 +686,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -800,16 +798,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -817,7 +814,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -912,16 +909,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -929,7 +925,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java index 86ce63c9b93..59801547b04 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/ApiClient.java @@ -499,7 +499,7 @@ public class ApiClient { return jsonStr.substring(1, jsonStr.length() - 1); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); - for (Object o : (Collection)param) { + for (Object o : (Collection) param) { if (b.length() > 0) { b.append(","); } @@ -524,7 +524,9 @@ public class ApiClient { List params = new ArrayList(); // preconditions - if (name == null || name.isEmpty() || value == null || value instanceof Collection) return params; + if (name == null || name.isEmpty() || value == null || value instanceof Collection) { + return params; + } params.add(new Pair(name, parameterToString(value))); return params; @@ -569,7 +571,7 @@ public class ApiClient { delimiter = escapeString("|"); } - StringBuilder sb = new StringBuilder() ; + StringBuilder sb = new StringBuilder(); for (Object item : value) { sb.append(delimiter); sb.append(escapeString(parameterToString(item))); @@ -639,7 +641,7 @@ public class ApiClient { */ public String selectHeaderContentType(String[] contentTypes) { if (contentTypes.length == 0 || contentTypes[0].equals("*/*")) { - return "application/json"; + return "application/json"; } for (String contentType : contentTypes) { if (isJsonMime(contentType)) { @@ -963,7 +965,7 @@ public class ApiClient { * @param formParams The form parameters * @param authNames The authentications to apply * @param progressRequestListener Progress request listener - * @return The HTTP request + * @return The HTTP request * @throws ApiException If fail to serialize the request body object */ public Request buildRequest(String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { @@ -1080,13 +1082,15 @@ public class ApiClient { * Update query and header parameters based on authentication settings. * * @param authNames The authentications to apply - * @param queryParams List of query parameters - * @param headerParams Map of header parameters + * @param queryParams List of query parameters + * @param headerParams Map of header parameters */ public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { for (String authName : authNames) { Authentication auth = authentications.get(authName); - if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + if (auth == null) { + throw new RuntimeException("Authentication undefined: " + authName); + } auth.applyToParams(queryParams, headerParams); } } @@ -1098,7 +1102,7 @@ public class ApiClient { * @return RequestBody */ public RequestBody buildRequestBodyFormEncoding(Map formParams) { - FormEncodingBuilder formBuilder = new FormEncodingBuilder(); + FormEncodingBuilder formBuilder = new FormEncodingBuilder(); for (Entry param : formParams.entrySet()) { formBuilder.add(param.getKey(), parameterToString(param.getValue())); } @@ -1161,10 +1165,12 @@ public class ApiClient { public X509Certificate[] getAcceptedIssuers() { return null; } }; SSLContext sslContext = SSLContext.getInstance("TLS"); - trustManagers = new TrustManager[]{ trustAll }; + trustManagers = new TrustManager[] {trustAll}; hostnameVerifier = new HostnameVerifier() { @Override - public boolean verify(String hostname, SSLSession session) { return true; } + public boolean verify(String hostname, SSLSession session) { + return true; + } }; } else if (sslCaCert != null) { char[] password = null; // Any password will work. diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/GzipRequestInterceptor.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/GzipRequestInterceptor.java index 64d88915295..f7ecf09b39e 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/GzipRequestInterceptor.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/GzipRequestInterceptor.java @@ -27,7 +27,8 @@ import java.io.IOException; * Taken from https://github.com/square/okhttp/issues/350 */ class GzipRequestInterceptor implements Interceptor { - @Override public Response intercept(Chain chain) throws IOException { + @Override + public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) { return chain.proceed(originalRequest); @@ -63,19 +64,22 @@ class GzipRequestInterceptor implements Interceptor { private RequestBody gzip(final RequestBody body) { return new RequestBody() { - @Override public MediaType contentType() { + @Override + public MediaType contentType() { return body.contentType(); } - @Override public long contentLength() { + @Override + public long contentLength() { return -1; // We don't know the compressed length in advance! } - @Override public void writeTo(BufferedSink sink) throws IOException { + @Override + public void writeTo(BufferedSink sink) throws IOException { BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); } }; } -} \ No newline at end of file +} diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java index 64ff528f11c..8f1c98264dc 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/JSON.java @@ -52,19 +52,17 @@ public class JSON { public static GsonBuilder createGson() { GsonFireBuilder fireBuilder = new GsonFireBuilder() - .registerTypeSelector(Animal.class, new TypeSelector() { - @Override - public Class getClassForElement(JsonElement readElement) { - Map classByDiscriminatorValue = new HashMap(); - classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); - classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); - classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); - return getClassByDiscriminator( - classByDiscriminatorValue, - getDiscriminatorValue(readElement, "className")); - } + .registerTypeSelector(Animal.class, new TypeSelector() { + @Override + public Class getClassForElement(JsonElement readElement) { + Map classByDiscriminatorValue = new HashMap(); + classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); + classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); + classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); + return getClassByDiscriminator(classByDiscriminatorValue, + getDiscriminatorValue(readElement, "className")); + } }) - ; GsonBuilder builder = fireBuilder.createGsonBuilder(); return builder; @@ -72,7 +70,7 @@ public class JSON { private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) { JsonElement element = readElement.getAsJsonObject().get(discriminatorField); - if(null == element) { + if (null == element) { throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">"); } return element.getAsString(); @@ -80,7 +78,7 @@ public class JSON { private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) { Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase(Locale.ROOT)); - if(null == clazz) { + if (null == clazz) { throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">"); } return clazz; @@ -153,9 +151,11 @@ public class JSON { } catch (JsonParseException e) { // Fallback processing when failed to parse JSON form response body: // return the response body string directly for the String return type; - if (returnType.equals(String.class)) + if (returnType.equals(String.class)) { return (T) body; - else throw (e); + } else { + throw (e); + } } } @@ -291,8 +291,7 @@ public class JSON { private DateFormat dateFormat; - public SqlDateTypeAdapter() { - } + public SqlDateTypeAdapter() {} public SqlDateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; @@ -345,8 +344,7 @@ public class JSON { private DateFormat dateFormat; - public DateTypeAdapter() { - } + public DateTypeAdapter() {} public DateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/AnotherFakeApi.java index cb429b37da6..ef2a1c94f92 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/AnotherFakeApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -70,16 +70,15 @@ public class AnotherFakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -87,7 +86,7 @@ public class AnotherFakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java index 9179f116ec3..6ca9910ab2a 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeApi.java @@ -77,16 +77,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -94,7 +93,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -194,16 +193,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -211,7 +209,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -311,16 +309,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -328,7 +325,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -428,16 +425,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "*/*" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -445,7 +441,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -545,16 +541,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -562,7 +557,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -664,18 +659,19 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (query != null) - localVarQueryParams.addAll(apiClient.parameterToPair("query", query)); + if (query != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("query", query)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -683,7 +679,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -792,16 +788,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -809,7 +804,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -927,44 +922,71 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (integer != null) - localVarFormParams.put("integer", integer); - if (int32 != null) - localVarFormParams.put("int32", int32); - if (int64 != null) - localVarFormParams.put("int64", int64); - if (number != null) - localVarFormParams.put("number", number); - if (_float != null) - localVarFormParams.put("float", _float); - if (_double != null) - localVarFormParams.put("double", _double); - if (string != null) - localVarFormParams.put("string", string); - if (patternWithoutDelimiter != null) - localVarFormParams.put("pattern_without_delimiter", patternWithoutDelimiter); - if (_byte != null) - localVarFormParams.put("byte", _byte); - if (binary != null) - localVarFormParams.put("binary", binary); - if (date != null) - localVarFormParams.put("date", date); - if (dateTime != null) - localVarFormParams.put("dateTime", dateTime); - if (password != null) - localVarFormParams.put("password", password); - if (paramCallback != null) - localVarFormParams.put("callback", paramCallback); + if (integer != null) { + localVarFormParams.put("integer", integer); + } + + if (int32 != null) { + localVarFormParams.put("int32", int32); + } + + if (int64 != null) { + localVarFormParams.put("int64", int64); + } + + if (number != null) { + localVarFormParams.put("number", number); + } + + if (_float != null) { + localVarFormParams.put("float", _float); + } + + if (_double != null) { + localVarFormParams.put("double", _double); + } + + if (string != null) { + localVarFormParams.put("string", string); + } + + if (patternWithoutDelimiter != null) { + localVarFormParams.put("pattern_without_delimiter", patternWithoutDelimiter); + } + + if (_byte != null) { + localVarFormParams.put("byte", _byte); + } + + if (binary != null) { + localVarFormParams.put("binary", binary); + } + + if (date != null) { + localVarFormParams.put("date", date); + } + + if (dateTime != null) { + localVarFormParams.put("dateTime", dateTime); + } + + if (password != null) { + localVarFormParams.put("password", password); + } + + if (paramCallback != null) { + localVarFormParams.put("callback", paramCallback); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -972,7 +994,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1134,32 +1156,47 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (enumQueryStringArray != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "enum_query_string_array", enumQueryStringArray)); - if (enumQueryString != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_string", enumQueryString)); - if (enumQueryInteger != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_integer", enumQueryInteger)); - if (enumQueryDouble != null) - localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_double", enumQueryDouble)); + if (enumQueryStringArray != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "enum_query_string_array", enumQueryStringArray)); + } + + if (enumQueryString != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_string", enumQueryString)); + } + + if (enumQueryInteger != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_integer", enumQueryInteger)); + } + + if (enumQueryDouble != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("enum_query_double", enumQueryDouble)); + } Map localVarHeaderParams = new HashMap(); - if (enumHeaderStringArray != null) - localVarHeaderParams.put("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); - if (enumHeaderString != null) - localVarHeaderParams.put("enum_header_string", apiClient.parameterToString(enumHeaderString)); + if (enumHeaderStringArray != null) { + localVarHeaderParams.put("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); + } + + if (enumHeaderString != null) { + localVarHeaderParams.put("enum_header_string", apiClient.parameterToString(enumHeaderString)); + } Map localVarFormParams = new HashMap(); - if (enumFormStringArray != null) - localVarFormParams.put("enum_form_string_array", enumFormStringArray); - if (enumFormString != null) - localVarFormParams.put("enum_form_string", enumFormString); + if (enumFormStringArray != null) { + localVarFormParams.put("enum_form_string_array", enumFormStringArray); + } + + if (enumFormString != null) { + localVarFormParams.put("enum_form_string", enumFormString); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -1167,7 +1204,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1284,16 +1321,15 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -1301,7 +1337,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1403,20 +1439,23 @@ public class FakeApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (param != null) - localVarFormParams.put("param", param); - if (param2 != null) - localVarFormParams.put("param2", param2); + if (param != null) { + localVarFormParams.put("param", param); + } + + if (param2 != null) { + localVarFormParams.put("param2", param2); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -1424,7 +1463,7 @@ public class FakeApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java index 749598b3099..fee24a345ed 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -70,16 +70,15 @@ public class FakeClassnameTags123Api { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json" @@ -87,7 +86,7 @@ public class FakeClassnameTags123Api { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/PetApi.java index d1b477e0d44..14e85162f7e 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/PetApi.java @@ -72,16 +72,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json", "application/xml" @@ -89,7 +88,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -192,18 +191,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - if (apiKey != null) - localVarHeaderParams.put("api_key", apiClient.parameterToString(apiKey)); + if (apiKey != null) { + localVarHeaderParams.put("api_key", apiClient.parameterToString(apiKey)); + } Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -211,7 +211,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -315,18 +315,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (status != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "status", status)); + if (status != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "status", status)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -334,7 +335,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -441,18 +442,19 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (tags != null) - localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "tags", tags)); + if (tags != null) { + localVarCollectionQueryParams.addAll(apiClient.parameterToPairs("csv", "tags", tags)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -460,7 +462,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -573,16 +575,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -590,7 +591,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -695,16 +696,15 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/json", "application/xml" @@ -712,7 +712,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -816,20 +816,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (name != null) - localVarFormParams.put("name", name); - if (status != null) - localVarFormParams.put("status", status); + if (name != null) { + localVarFormParams.put("name", name); + } + + if (status != null) { + localVarFormParams.put("status", status); + } final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "application/x-www-form-urlencoded" @@ -837,7 +840,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -947,20 +950,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (additionalMetadata != null) - localVarFormParams.put("additionalMetadata", additionalMetadata); - if (file != null) - localVarFormParams.put("file", file); + if (additionalMetadata != null) { + localVarFormParams.put("additionalMetadata", additionalMetadata); + } + + if (file != null) { + localVarFormParams.put("file", file); + } final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "multipart/form-data" @@ -968,7 +974,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -1082,20 +1088,23 @@ public class PetApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - if (additionalMetadata != null) - localVarFormParams.put("additionalMetadata", additionalMetadata); - if (requiredFile != null) - localVarFormParams.put("requiredFile", requiredFile); + if (additionalMetadata != null) { + localVarFormParams.put("additionalMetadata", additionalMetadata); + } + + if (requiredFile != null) { + localVarFormParams.put("requiredFile", requiredFile); + } final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { "multipart/form-data" @@ -1103,7 +1112,7 @@ public class PetApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/StoreApi.java index c4669755c16..c9924191862 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/StoreApi.java @@ -71,16 +71,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -88,7 +87,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -188,16 +187,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -205,7 +203,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -303,16 +301,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -320,7 +317,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -425,16 +422,15 @@ public class StoreApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -442,7 +438,7 @@ public class StoreApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/UserApi.java index bf4c1fb77aa..ffb2e6bd52c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/org/openapitools/client/api/UserApi.java @@ -70,16 +70,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -87,7 +86,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -188,16 +187,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -205,7 +203,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -306,16 +304,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -323,7 +320,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -425,16 +422,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -442,7 +438,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -544,16 +540,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -561,7 +556,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -667,20 +662,23 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - if (username != null) - localVarQueryParams.addAll(apiClient.parameterToPair("username", username)); - if (password != null) - localVarQueryParams.addAll(apiClient.parameterToPair("password", password)); + if (username != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("username", username)); + } + + if (password != null) { + localVarQueryParams.addAll(apiClient.parameterToPair("password", password)); + } Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { "application/xml", "application/json" }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -688,7 +686,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -800,16 +798,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -817,7 +814,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { @@ -912,16 +909,15 @@ public class UserApi { List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); - Map localVarHeaderParams = new HashMap(); - Map localVarFormParams = new HashMap(); - final String[] localVarAccepts = { }; final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); + if (localVarAccept != null) { + localVarHeaderParams.put("Accept", localVarAccept); + } final String[] localVarContentTypes = { @@ -929,7 +925,7 @@ public class UserApi { final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); localVarHeaderParams.put("Content-Type", localVarContentType); - if(progressListener != null) { + if (progressListener != null) { apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { @Override public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { diff --git a/samples/client/petstore/java/rest-assured/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/rest-assured/src/main/java/org/openapitools/client/JSON.java index 64ff528f11c..8f1c98264dc 100644 --- a/samples/client/petstore/java/rest-assured/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/rest-assured/src/main/java/org/openapitools/client/JSON.java @@ -52,19 +52,17 @@ public class JSON { public static GsonBuilder createGson() { GsonFireBuilder fireBuilder = new GsonFireBuilder() - .registerTypeSelector(Animal.class, new TypeSelector() { - @Override - public Class getClassForElement(JsonElement readElement) { - Map classByDiscriminatorValue = new HashMap(); - classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); - classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); - classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); - return getClassByDiscriminator( - classByDiscriminatorValue, - getDiscriminatorValue(readElement, "className")); - } + .registerTypeSelector(Animal.class, new TypeSelector() { + @Override + public Class getClassForElement(JsonElement readElement) { + Map classByDiscriminatorValue = new HashMap(); + classByDiscriminatorValue.put("Dog".toUpperCase(Locale.ROOT), Dog.class); + classByDiscriminatorValue.put("Cat".toUpperCase(Locale.ROOT), Cat.class); + classByDiscriminatorValue.put("Animal".toUpperCase(Locale.ROOT), Animal.class); + return getClassByDiscriminator(classByDiscriminatorValue, + getDiscriminatorValue(readElement, "className")); + } }) - ; GsonBuilder builder = fireBuilder.createGsonBuilder(); return builder; @@ -72,7 +70,7 @@ public class JSON { private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) { JsonElement element = readElement.getAsJsonObject().get(discriminatorField); - if(null == element) { + if (null == element) { throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">"); } return element.getAsString(); @@ -80,7 +78,7 @@ public class JSON { private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) { Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue.toUpperCase(Locale.ROOT)); - if(null == clazz) { + if (null == clazz) { throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">"); } return clazz; @@ -153,9 +151,11 @@ public class JSON { } catch (JsonParseException e) { // Fallback processing when failed to parse JSON form response body: // return the response body string directly for the String return type; - if (returnType.equals(String.class)) + if (returnType.equals(String.class)) { return (T) body; - else throw (e); + } else { + throw (e); + } } } @@ -291,8 +291,7 @@ public class JSON { private DateFormat dateFormat; - public SqlDateTypeAdapter() { - } + public SqlDateTypeAdapter() {} public SqlDateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; @@ -345,8 +344,7 @@ public class JSON { private DateFormat dateFormat; - public DateTypeAdapter() { - } + public DateTypeAdapter() {} public DateTypeAdapter(DateFormat dateFormat) { this.dateFormat = dateFormat; diff --git a/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/resteasy/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2-play24/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2-play25/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2-play26/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2rx/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2rx/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2rx/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2rx/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/retrofit2rx2/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/retrofit2rx2/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/retrofit2rx2/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2rx2/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/vertx/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); diff --git a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/Pair.java b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/Pair.java index 18a0e96bfc7..0619e8c408b 100644 --- a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/Pair.java +++ b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/Pair.java @@ -24,13 +24,17 @@ public class Pair { } private void setName(String name) { - if (!isValidString(name)) return; + if (!isValidString(name)) { + return; + } this.name = name; } private void setValue(String value) { - if (!isValidString(value)) return; + if (!isValidString(value)) { + return; + } this.value = value; } @@ -44,8 +48,13 @@ public class Pair { } private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; + if (arg == null) { + return false; + } + + if (arg.trim().isEmpty()) { + return false; + } return true; } diff --git a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/StringUtil.java index b731bc530e2..c51b3bcf661 100644 --- a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/StringUtil.java +++ b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/StringUtil.java @@ -24,8 +24,12 @@ public class StringUtil { */ public static boolean containsIgnoreCase(String[] array, String value) { for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } } return false; } @@ -43,7 +47,9 @@ public class StringUtil { */ public static String join(String[] array, String separator) { int len = array.length; - if (len == 0) return ""; + if (len == 0) { + return ""; + } StringBuilder out = new StringBuilder(); out.append(array[0]); From e29f2639418e5728c5c050dc2f424ef301f8cbbe Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 6 Sep 2018 14:46:02 +0800 Subject: [PATCH 49/74] Add perltidy to format Perl code (#970) * add perl tidy without updating petstore samples * incldue pl file, update samples * use no backup option, perltidy on test.pl --- .../codegen/languages/PerlClientCodegen.java | 35 +- .../petstore/perl/.openapi-generator/VERSION | 2 +- samples/client/petstore/perl/README.md | 17 +- .../petstore/perl/docs/AnotherfakeApi.md | 12 +- samples/client/petstore/perl/docs/FakeApi.md | 48 +- samples/client/petstore/perl/docs/File.md | 15 + .../petstore/perl/docs/FileSchemaTestClass.md | 16 + samples/client/petstore/perl/docs/MapTest.md | 2 + samples/client/petstore/perl/docs/PetApi.md | 52 + .../petstore/perl/docs/StringBooleanMap.md | 14 + .../lib/WWW/OpenAPIClient/AnotherFakeApi.pm | 71 +- .../perl/lib/WWW/OpenAPIClient/ApiClient.pm | 410 ++++---- .../perl/lib/WWW/OpenAPIClient/ApiFactory.pm | 28 +- .../lib/WWW/OpenAPIClient/Configuration.pm | 118 +-- .../perl/lib/WWW/OpenAPIClient/FakeApi.pm | 957 ++++++++++-------- .../OpenAPIClient/FakeClassnameTags123Api.pm | 67 +- .../Object/AdditionalPropertiesClass.pm | 162 +-- .../lib/WWW/OpenAPIClient/Object/Animal.pm | 162 +-- .../WWW/OpenAPIClient/Object/AnimalFarm.pm | 122 ++- .../WWW/OpenAPIClient/Object/ApiResponse.pm | 180 ++-- .../Object/ArrayOfArrayOfNumberOnly.pm | 144 +-- .../OpenAPIClient/Object/ArrayOfNumberOnly.pm | 144 +-- .../lib/WWW/OpenAPIClient/Object/ArrayTest.pm | 179 ++-- .../OpenAPIClient/Object/Capitalization.pm | 234 +++-- .../perl/lib/WWW/OpenAPIClient/Object/Cat.pm | 179 ++-- .../lib/WWW/OpenAPIClient/Object/Category.pm | 162 +-- .../WWW/OpenAPIClient/Object/ClassModel.pm | 145 +-- .../lib/WWW/OpenAPIClient/Object/Client.pm | 144 +-- .../perl/lib/WWW/OpenAPIClient/Object/Dog.pm | 179 ++-- .../WWW/OpenAPIClient/Object/EnumArrays.pm | 162 +-- .../lib/WWW/OpenAPIClient/Object/EnumClass.pm | 123 +-- .../lib/WWW/OpenAPIClient/Object/EnumTest.pm | 215 ++-- .../perl/lib/WWW/OpenAPIClient/Object/File.pm | 178 ++++ .../Object/FileSchemaTestClass.pm | 189 ++++ .../WWW/OpenAPIClient/Object/FormatTest.pm | 360 +++---- .../OpenAPIClient/Object/HasOnlyReadOnly.pm | 162 +-- .../perl/lib/WWW/OpenAPIClient/Object/List.pm | 144 +-- .../lib/WWW/OpenAPIClient/Object/MapTest.pm | 180 ++-- ...dPropertiesAndAdditionalPropertiesClass.pm | 179 ++-- .../OpenAPIClient/Object/Model200Response.pm | 162 +-- .../WWW/OpenAPIClient/Object/ModelReturn.pm | 144 +-- .../perl/lib/WWW/OpenAPIClient/Object/Name.pm | 198 ++-- .../WWW/OpenAPIClient/Object/NumberOnly.pm | 144 +-- .../lib/WWW/OpenAPIClient/Object/Order.pm | 234 +++-- .../OpenAPIClient/Object/OuterComposite.pm | 180 ++-- .../lib/WWW/OpenAPIClient/Object/OuterEnum.pm | 123 +-- .../perl/lib/WWW/OpenAPIClient/Object/Pet.pm | 233 +++-- .../WWW/OpenAPIClient/Object/ReadOnlyFirst.pm | 162 +-- .../OpenAPIClient/Object/SpecialModelName.pm | 144 +-- .../OpenAPIClient/Object/StringBooleanMap.pm | 168 +++ .../perl/lib/WWW/OpenAPIClient/Object/Tag.pm | 162 +-- .../perl/lib/WWW/OpenAPIClient/Object/User.pm | 270 ++--- .../perl/lib/WWW/OpenAPIClient/PetApi.pm | 618 ++++++----- .../perl/lib/WWW/OpenAPIClient/Role.pm | 146 +-- .../lib/WWW/OpenAPIClient/Role/AutoDoc.pm | 387 +++---- .../perl/lib/WWW/OpenAPIClient/StoreApi.pm | 217 ++-- .../perl/lib/WWW/OpenAPIClient/UserApi.pm | 444 ++++---- .../petstore/perl/t/FileSchemaTestClassTest.t | 33 + samples/client/petstore/perl/t/FileTest.t | 33 + .../petstore/perl/t/StringBooleanMapTest.t | 33 + samples/client/petstore/perl/test.pl | 51 +- samples/client/petstore/perl/tests/04_role.t | 2 +- 62 files changed, 5968 insertions(+), 4212 deletions(-) create mode 100644 samples/client/petstore/perl/docs/File.md create mode 100644 samples/client/petstore/perl/docs/FileSchemaTestClass.md create mode 100644 samples/client/petstore/perl/docs/StringBooleanMap.md create mode 100644 samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/File.pm create mode 100644 samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FileSchemaTestClass.pm create mode 100644 samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/StringBooleanMap.pm create mode 100644 samples/client/petstore/perl/t/FileSchemaTestClassTest.t create mode 100644 samples/client/petstore/perl/t/FileTest.t create mode 100644 samples/client/petstore/perl/t/StringBooleanMapTest.t diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java index 1fcf07a9ede..2def779b8c0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java @@ -32,7 +32,7 @@ import java.util.HashSet; import java.util.regex.Matcher; import org.apache.commons.lang3.StringUtils; - +import org.apache.commons.io.FilenameUtils; public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(PerlClientCodegen.class); @@ -133,6 +133,10 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("PERLTIDY_PATH"))) { + LOGGER.info("Environment variable PERLTIDY_PATH not defined so the Perl code may not be properly formatted. To define it, try 'export PERLTIDY_PATH=/usr/local/bin/perltidy' (Linux/Mac)"); + } + if (additionalProperties.containsKey(MODULE_VERSION)) { setModuleVersion((String) additionalProperties.get(MODULE_VERSION)); } else { @@ -560,4 +564,33 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { // remove =end, =cut to avoid code injection return input.replace("=begin", "=_begin").replace("=end", "=_end").replace("=cut", "=_cut").replace("=pod", "=_pod"); } + + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + String perlTidyPath = System.getenv("PERLTIDY_PATH"); + if (StringUtils.isEmpty(perlTidyPath)) { + return; // skip if PERLTIDY_PATH env variable is not defined + } + + // only process files with .t, .pm extension + if ("t".equals(FilenameUtils.getExtension(file.toString())) || + "pm".equals(FilenameUtils.getExtension(file.toString())) || + "pl".equals(FilenameUtils.getExtension(file.toString()))) { + String command = perlTidyPath + " -b -bext='/' " + file.toString(); + try { + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}): {}", command, p.exitValue()); + } + } catch (Exception e) { + LOGGER.error("Error running the command ({}): {}", command, e.getMessage()); + } + LOGGER.info("Successfully executed: " + command); + } + } } diff --git a/samples/client/petstore/perl/.openapi-generator/VERSION b/samples/client/petstore/perl/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/perl/.openapi-generator/VERSION +++ b/samples/client/petstore/perl/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/perl/README.md b/samples/client/petstore/perl/README.md index 7b381e92c82..c64a6dbefe8 100644 --- a/samples/client/petstore/perl/README.md +++ b/samples/client/petstore/perl/README.md @@ -248,6 +248,8 @@ use WWW::OpenAPIClient::Object::Dog; use WWW::OpenAPIClient::Object::EnumArrays; use WWW::OpenAPIClient::Object::EnumClass; use WWW::OpenAPIClient::Object::EnumTest; +use WWW::OpenAPIClient::Object::File; +use WWW::OpenAPIClient::Object::FileSchemaTestClass; use WWW::OpenAPIClient::Object::FormatTest; use WWW::OpenAPIClient::Object::HasOnlyReadOnly; use WWW::OpenAPIClient::Object::List; @@ -263,6 +265,7 @@ use WWW::OpenAPIClient::Object::OuterEnum; use WWW::OpenAPIClient::Object::Pet; use WWW::OpenAPIClient::Object::ReadOnlyFirst; use WWW::OpenAPIClient::Object::SpecialModelName; +use WWW::OpenAPIClient::Object::StringBooleanMap; use WWW::OpenAPIClient::Object::Tag; use WWW::OpenAPIClient::Object::User; @@ -300,6 +303,8 @@ use WWW::OpenAPIClient::Object::Dog; use WWW::OpenAPIClient::Object::EnumArrays; use WWW::OpenAPIClient::Object::EnumClass; use WWW::OpenAPIClient::Object::EnumTest; +use WWW::OpenAPIClient::Object::File; +use WWW::OpenAPIClient::Object::FileSchemaTestClass; use WWW::OpenAPIClient::Object::FormatTest; use WWW::OpenAPIClient::Object::HasOnlyReadOnly; use WWW::OpenAPIClient::Object::List; @@ -315,6 +320,7 @@ use WWW::OpenAPIClient::Object::OuterEnum; use WWW::OpenAPIClient::Object::Pet; use WWW::OpenAPIClient::Object::ReadOnlyFirst; use WWW::OpenAPIClient::Object::SpecialModelName; +use WWW::OpenAPIClient::Object::StringBooleanMap; use WWW::OpenAPIClient::Object::Tag; use WWW::OpenAPIClient::Object::User; @@ -328,11 +334,11 @@ my $api_instance = WWW::OpenAPIClient::->new( my $client = WWW::OpenAPIClient::Object::Client->new(); # Client | client model eval { - my $result = $api_instance->test_special_tags(client => $client); + my $result = $api_instance->call_123_test_special_tags(client => $client); print Dumper($result); }; if ($@) { - warn "Exception when calling AnotherFakeApi->test_special_tags: $@\n"; + warn "Exception when calling AnotherFakeApi->call_123_test_special_tags: $@\n"; } ``` @@ -343,11 +349,12 @@ All URIs are relative to *http://petstore.swagger.io:80/v2* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*AnotherFakeApi* | [**test_special_tags**](docs/AnotherFakeApi.md#test_special_tags) | **PATCH** /another-fake/dummy | To test special tags +*AnotherFakeApi* | [**call_123_test_special_tags**](docs/AnotherFakeApi.md#call_123_test_special_tags) | **PATCH** /another-fake/dummy | To test special tags *FakeApi* | [**fake_outer_boolean_serialize**](docs/FakeApi.md#fake_outer_boolean_serialize) | **POST** /fake/outer/boolean | *FakeApi* | [**fake_outer_composite_serialize**](docs/FakeApi.md#fake_outer_composite_serialize) | **POST** /fake/outer/composite | *FakeApi* | [**fake_outer_number_serialize**](docs/FakeApi.md#fake_outer_number_serialize) | **POST** /fake/outer/number | *FakeApi* | [**fake_outer_string_serialize**](docs/FakeApi.md#fake_outer_string_serialize) | **POST** /fake/outer/string | +*FakeApi* | [**test_body_with_file_schema**](docs/FakeApi.md#test_body_with_file_schema) | **PUT** /fake/body-with-file-schema | *FakeApi* | [**test_body_with_query_params**](docs/FakeApi.md#test_body_with_query_params) | **PUT** /fake/body-with-query-params | *FakeApi* | [**test_client_model**](docs/FakeApi.md#test_client_model) | **PATCH** /fake | To test \"client\" model *FakeApi* | [**test_endpoint_parameters**](docs/FakeApi.md#test_endpoint_parameters) | **POST** /fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 @@ -363,6 +370,7 @@ Class | Method | HTTP request | Description *PetApi* | [**update_pet**](docs/PetApi.md#update_pet) | **PUT** /pet | Update an existing pet *PetApi* | [**update_pet_with_form**](docs/PetApi.md#update_pet_with_form) | **POST** /pet/{petId} | Updates a pet in the store with form data *PetApi* | [**upload_file**](docs/PetApi.md#upload_file) | **POST** /pet/{petId}/uploadImage | uploads an image +*PetApi* | [**upload_file_with_required_file**](docs/PetApi.md#upload_file_with_required_file) | **POST** /fake/{petId}/uploadImageWithRequiredFile | uploads an image (required) *StoreApi* | [**delete_order**](docs/StoreApi.md#delete_order) | **DELETE** /store/order/{order_id} | Delete purchase order by ID *StoreApi* | [**get_inventory**](docs/StoreApi.md#get_inventory) | **GET** /store/inventory | Returns pet inventories by status *StoreApi* | [**get_order_by_id**](docs/StoreApi.md#get_order_by_id) | **GET** /store/order/{order_id} | Find purchase order by ID @@ -394,6 +402,8 @@ Class | Method | HTTP request | Description - [WWW::OpenAPIClient::Object::EnumArrays](docs/EnumArrays.md) - [WWW::OpenAPIClient::Object::EnumClass](docs/EnumClass.md) - [WWW::OpenAPIClient::Object::EnumTest](docs/EnumTest.md) + - [WWW::OpenAPIClient::Object::File](docs/File.md) + - [WWW::OpenAPIClient::Object::FileSchemaTestClass](docs/FileSchemaTestClass.md) - [WWW::OpenAPIClient::Object::FormatTest](docs/FormatTest.md) - [WWW::OpenAPIClient::Object::HasOnlyReadOnly](docs/HasOnlyReadOnly.md) - [WWW::OpenAPIClient::Object::List](docs/List.md) @@ -409,6 +419,7 @@ Class | Method | HTTP request | Description - [WWW::OpenAPIClient::Object::Pet](docs/Pet.md) - [WWW::OpenAPIClient::Object::ReadOnlyFirst](docs/ReadOnlyFirst.md) - [WWW::OpenAPIClient::Object::SpecialModelName](docs/SpecialModelName.md) + - [WWW::OpenAPIClient::Object::StringBooleanMap](docs/StringBooleanMap.md) - [WWW::OpenAPIClient::Object::Tag](docs/Tag.md) - [WWW::OpenAPIClient::Object::User](docs/User.md) diff --git a/samples/client/petstore/perl/docs/AnotherfakeApi.md b/samples/client/petstore/perl/docs/AnotherfakeApi.md index 39008a4a53f..a0b0fd6f8ea 100644 --- a/samples/client/petstore/perl/docs/AnotherfakeApi.md +++ b/samples/client/petstore/perl/docs/AnotherfakeApi.md @@ -9,15 +9,15 @@ All URIs are relative to *http://petstore.swagger.io:80/v2* Method | HTTP request | Description ------------- | ------------- | ------------- -[**test_special_tags**](AnotherFakeApi.md#test_special_tags) | **PATCH** /another-fake/dummy | To test special tags +[**call_123_test_special_tags**](AnotherFakeApi.md#call_123_test_special_tags) | **PATCH** /another-fake/dummy | To test special tags -# **test_special_tags** -> Client test_special_tags(client => $client) +# **call_123_test_special_tags** +> Client call_123_test_special_tags(client => $client) To test special tags -To test special tags +To test special tags and operation ID starting with number ### Example ```perl @@ -29,11 +29,11 @@ my $api_instance = WWW::OpenAPIClient::AnotherFakeApi->new( my $client = WWW::OpenAPIClient::Object::Client->new(); # Client | client model eval { - my $result = $api_instance->test_special_tags(client => $client); + my $result = $api_instance->call_123_test_special_tags(client => $client); print Dumper($result); }; if ($@) { - warn "Exception when calling AnotherFakeApi->test_special_tags: $@\n"; + warn "Exception when calling AnotherFakeApi->call_123_test_special_tags: $@\n"; } ``` diff --git a/samples/client/petstore/perl/docs/FakeApi.md b/samples/client/petstore/perl/docs/FakeApi.md index 57f57988424..88f6b8336a3 100644 --- a/samples/client/petstore/perl/docs/FakeApi.md +++ b/samples/client/petstore/perl/docs/FakeApi.md @@ -13,6 +13,7 @@ Method | HTTP request | Description [**fake_outer_composite_serialize**](FakeApi.md#fake_outer_composite_serialize) | **POST** /fake/outer/composite | [**fake_outer_number_serialize**](FakeApi.md#fake_outer_number_serialize) | **POST** /fake/outer/number | [**fake_outer_string_serialize**](FakeApi.md#fake_outer_string_serialize) | **POST** /fake/outer/string | +[**test_body_with_file_schema**](FakeApi.md#test_body_with_file_schema) | **PUT** /fake/body-with-file-schema | [**test_body_with_query_params**](FakeApi.md#test_body_with_query_params) | **PUT** /fake/body-with-query-params | [**test_client_model**](FakeApi.md#test_client_model) | **PATCH** /fake | To test \"client\" model [**test_endpoint_parameters**](FakeApi.md#test_endpoint_parameters) | **POST** /fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 @@ -205,6 +206,51 @@ No authorization required [[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) +# **test_body_with_file_schema** +> test_body_with_file_schema(file_schema_test_class => $file_schema_test_class) + + + +For this test, the body for this request much reference a schema named `File`. + +### Example +```perl +use Data::Dumper; +use WWW::OpenAPIClient::FakeApi; +my $api_instance = WWW::OpenAPIClient::FakeApi->new( +); + +my $file_schema_test_class = WWW::OpenAPIClient::Object::FileSchemaTestClass->new(); # FileSchemaTestClass | + +eval { + $api_instance->test_body_with_file_schema(file_schema_test_class => $file_schema_test_class); +}; +if ($@) { + warn "Exception when calling FakeApi->test_body_with_file_schema: $@\n"; +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **file_schema_test_class** | [**FileSchemaTestClass**](FileSchemaTestClass.md)| | + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + +[[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) + # **test_body_with_query_params** > test_body_with_query_params(query => $query, user => $user) @@ -412,7 +458,7 @@ Name | Type | Description | Notes **enum_query_string** | **string**| Query parameter enum test (string) | [optional] [default to '-efg'] **enum_query_integer** | **int**| Query parameter enum test (double) | [optional] **enum_query_double** | **double**| Query parameter enum test (double) | [optional] - **enum_form_string_array** | **ARRAY[string]**| Form parameter enum test (string array) | [optional] [default to '$'] + **enum_form_string_array** | [**ARRAY[string]**](string.md)| Form parameter enum test (string array) | [optional] [default to '$'] **enum_form_string** | **string**| Form parameter enum test (string) | [optional] [default to '-efg'] ### Return type diff --git a/samples/client/petstore/perl/docs/File.md b/samples/client/petstore/perl/docs/File.md new file mode 100644 index 00000000000..88bcb085e93 --- /dev/null +++ b/samples/client/petstore/perl/docs/File.md @@ -0,0 +1,15 @@ +# WWW::OpenAPIClient::Object::File + +## Load the model package +```perl +use WWW::OpenAPIClient::Object::File; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**source_uri** | **string** | Test capitalization | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/perl/docs/FileSchemaTestClass.md b/samples/client/petstore/perl/docs/FileSchemaTestClass.md new file mode 100644 index 00000000000..4749ac0f87b --- /dev/null +++ b/samples/client/petstore/perl/docs/FileSchemaTestClass.md @@ -0,0 +1,16 @@ +# WWW::OpenAPIClient::Object::FileSchemaTestClass + +## Load the model package +```perl +use WWW::OpenAPIClient::Object::FileSchemaTestClass; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**file** | [**File**](File.md) | | [optional] +**files** | [**ARRAY[File]**](File.md) | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/perl/docs/MapTest.md b/samples/client/petstore/perl/docs/MapTest.md index 88df848ff99..822e4db49a2 100644 --- a/samples/client/petstore/perl/docs/MapTest.md +++ b/samples/client/petstore/perl/docs/MapTest.md @@ -10,6 +10,8 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **map_map_of_string** | **HASH[string,HASH[string,string]]** | | [optional] **map_of_enum_string** | **HASH[string,string]** | | [optional] +**direct_map** | **HASH[string,boolean]** | | [optional] +**indirect_map** | [**StringBooleanMap**](StringBooleanMap.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/perl/docs/PetApi.md b/samples/client/petstore/perl/docs/PetApi.md index 5ad3f6f41fa..d18aca84067 100644 --- a/samples/client/petstore/perl/docs/PetApi.md +++ b/samples/client/petstore/perl/docs/PetApi.md @@ -17,6 +17,7 @@ Method | HTTP request | Description [**update_pet**](PetApi.md#update_pet) | **PUT** /pet | Update an existing pet [**update_pet_with_form**](PetApi.md#update_pet_with_form) | **POST** /pet/{petId} | Updates a pet in the store with form data [**upload_file**](PetApi.md#upload_file) | **POST** /pet/{petId}/uploadImage | uploads an image +[**upload_file_with_required_file**](PetApi.md#upload_file_with_required_file) | **POST** /fake/{petId}/uploadImageWithRequiredFile | uploads an image (required) # **add_pet** @@ -409,3 +410,54 @@ Name | Type | Description | Notes [[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) +# **upload_file_with_required_file** +> ApiResponse upload_file_with_required_file(pet_id => $pet_id, required_file => $required_file, additional_metadata => $additional_metadata) + +uploads an image (required) + +### Example +```perl +use Data::Dumper; +use WWW::OpenAPIClient::PetApi; +my $api_instance = WWW::OpenAPIClient::PetApi->new( + + # Configure OAuth2 access token for authorization: petstore_auth + access_token => 'YOUR_ACCESS_TOKEN', +); + +my $pet_id = 789; # int | ID of pet to update +my $required_file = "/path/to/file"; # string | file to upload +my $additional_metadata = "additional_metadata_example"; # string | Additional data to pass to server + +eval { + my $result = $api_instance->upload_file_with_required_file(pet_id => $pet_id, required_file => $required_file, additional_metadata => $additional_metadata); + print Dumper($result); +}; +if ($@) { + warn "Exception when calling PetApi->upload_file_with_required_file: $@\n"; +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **pet_id** | **int**| ID of pet to update | + **required_file** | **string****string**| file to upload | + **additional_metadata** | **string**| Additional data to pass to server | [optional] + +### Return type + +[**ApiResponse**](ApiResponse.md) + +### Authorization + +[petstore_auth](../README.md#petstore_auth) + +### HTTP request headers + + - **Content-Type**: multipart/form-data + - **Accept**: application/json + +[[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) + diff --git a/samples/client/petstore/perl/docs/StringBooleanMap.md b/samples/client/petstore/perl/docs/StringBooleanMap.md new file mode 100644 index 00000000000..83c9a6f5f17 --- /dev/null +++ b/samples/client/petstore/perl/docs/StringBooleanMap.md @@ -0,0 +1,14 @@ +# WWW::OpenAPIClient::Object::StringBooleanMap + +## Load the model package +```perl +use WWW::OpenAPIClient::Object::StringBooleanMap; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/AnotherFakeApi.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/AnotherFakeApi.pm index 20b9eac7c0c..d1ac90a73b4 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/AnotherFakeApi.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/AnotherFakeApi.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::AnotherFakeApi; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,55 +49,60 @@ sub new { } - # -# test_special_tags +# call_123_test_special_tags # # To test special tags -# +# # @param Client $client client model (required) { my $params = { - 'client' => { - data_type => 'Client', - description => 'client model', - required => '1', - }, + 'client' => { + data_type => 'Client', + description => 'client model', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_special_tags' } = { - summary => 'To test special tags', - params => $params, + __PACKAGE__->method_documentation->{'call_123_test_special_tags'} = { + summary => 'To test special tags', + params => $params, returns => 'Client', - }; + }; } + # @return Client # -sub test_special_tags { - my ($self, %args) = @_; +sub call_123_test_special_tags { + my ( $self, %args ) = @_; # verify the required parameter 'client' is set - unless (exists $args{'client'}) { - croak("Missing the required parameter 'client' when calling test_special_tags"); + unless ( exists $args{'client'} ) { + croak( +"Missing the required parameter 'client' when calling call_123_test_special_tags" + ); } # parse inputs my $_resource_path = '/another-fake/dummy'; - my $_method = 'PATCH'; - my $query_params = {}; + my $_method = 'PATCH'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/json'); + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); my $_body_data; + # body params - if ( exists $args{'client'}) { + if ( exists $args{'client'} ) { $_body_data = $args{'client'}; } @@ -103,13 +110,15 @@ sub test_special_tags { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Client', $response); + my $_response_object = + $self->{api_client}->deserialize( 'Client', $response ); return $_response_object; } diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiClient.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiClient.pm index 573fb1ca581..9f3d65d82ad 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiClient.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiClient.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -39,22 +40,25 @@ use Module::Runtime qw(use_module); use WWW::OpenAPIClient::Configuration; - sub new { my $class = shift; my $config; - if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::Configuration' ) { + if ( $_[0] + && ref $_[0] + && ref $_[0] eq 'WWW::OpenAPIClient::Configuration' ) + { $config = $_[0]; - } else { + } + else { $config = WWW::OpenAPIClient::Configuration->new(@_); } my (%args) = ( - 'ua' => LWP::UserAgent->new, + 'ua' => LWP::UserAgent->new, 'config' => $config, ); - + return bless \%args, $class; } @@ -63,17 +67,17 @@ sub new { # @param string $user_agent The user agent of the API client # sub set_user_agent { - my ($self, $user_agent) = @_; - $self->{http_user_agent}= $user_agent; + my ( $self, $user_agent ) = @_; + $self->{http_user_agent} = $user_agent; } # Set timeout # # @param integer $seconds Number of seconds before timing out [set to 0 for no timeout] -# +# sub set_timeout { - my ($self, $seconds) = @_; - if (!looks_like_number($seconds)) { + my ( $self, $seconds ) = @_; + if ( !looks_like_number($seconds) ) { croak('Timeout variable must be numeric.'); } $self->{http_timeout} = $seconds; @@ -88,72 +92,86 @@ sub set_timeout { # @return mixed sub call_api { my $self = shift; - my ($resource_path, $method, $query_params, $post_params, $header_params, $body_data, $auth_settings) = @_; - + my ( + $resource_path, $method, $query_params, $post_params, + $header_params, $body_data, $auth_settings + ) = @_; + # update parameters based on authentication settings - $self->update_params_for_auth($header_params, $query_params, $auth_settings); - - + $self->update_params_for_auth( $header_params, $query_params, + $auth_settings ); + my $_url = $self->{config}{base_url} . $resource_path; - - # build query + + # build query if (%$query_params) { - $_url = ($_url . '?' . eval { URI::Query->new($query_params)->stringify }); + $_url = + ( $_url . '?' . eval { URI::Query->new($query_params)->stringify } ); } - - + # body data - $body_data = to_json($body_data->to_hash) if defined $body_data && $body_data->can('to_hash'); # model to json string + $body_data = to_json( $body_data->to_hash ) + if defined $body_data + && $body_data->can('to_hash'); # model to json string my $_body_data = %$post_params ? $post_params : $body_data; - + # Make the HTTP request my $_request; - if ($method eq 'POST') { + if ( $method eq 'POST' ) { + # multipart - $header_params->{'Content-Type'} = lc $header_params->{'Content-Type'} eq 'multipart/form' ? - 'form-data' : $header_params->{'Content-Type'}; - - $_request = POST($_url, %$header_params, Content => $_body_data); - + $header_params->{'Content-Type'} = + lc $header_params->{'Content-Type'} eq 'multipart/form' + ? 'form-data' + : $header_params->{'Content-Type'}; + + $_request = POST( $_url, %$header_params, Content => $_body_data ); + } - elsif ($method eq 'PUT') { + elsif ( $method eq 'PUT' ) { + # multipart - $header_params->{'Content-Type'} = lc $header_params->{'Content-Type'} eq 'multipart/form' ? - 'form-data' : $header_params->{'Content-Type'}; - - $_request = PUT($_url, %$header_params, Content => $_body_data); - + $header_params->{'Content-Type'} = + lc $header_params->{'Content-Type'} eq 'multipart/form' + ? 'form-data' + : $header_params->{'Content-Type'}; + + $_request = PUT( $_url, %$header_params, Content => $_body_data ); + } - elsif ($method eq 'GET') { + elsif ( $method eq 'GET' ) { my $headers = HTTP::Headers->new(%$header_params); - $_request = GET($_url, %$header_params); + $_request = GET( $_url, %$header_params ); } - elsif ($method eq 'HEAD') { + elsif ( $method eq 'HEAD' ) { my $headers = HTTP::Headers->new(%$header_params); - $_request = HEAD($_url,%$header_params); + $_request = HEAD( $_url, %$header_params ); } - elsif ($method eq 'DELETE') { #TODO support form data + elsif ( $method eq 'DELETE' ) { #TODO support form data my $headers = HTTP::Headers->new(%$header_params); - $_request = DELETE($_url, %$headers); + $_request = DELETE( $_url, %$headers ); } - elsif ($method eq 'PATCH') { #TODO + elsif ( $method eq 'PATCH' ) { #TODO } else { } - - $self->{ua}->timeout($self->{http_timeout} || $self->{config}{http_timeout}); - $self->{ua}->agent($self->{http_user_agent} || $self->{config}{http_user_agent}); - - $log->debugf("REQUEST: %s", $_request->as_string); + + $self->{ua} + ->timeout( $self->{http_timeout} || $self->{config}{http_timeout} ); + $self->{ua} + ->agent( $self->{http_user_agent} || $self->{config}{http_user_agent} ); + + $log->debugf( "REQUEST: %s", $_request->as_string ); my $_response = $self->{ua}->request($_request); - $log->debugf("RESPONSE: %s", $_response->as_string); - - unless ($_response->is_success) { - croak(sprintf "API Exception(%s): %s\n%s", $_response->code, $_response->message, $_response->content); + $log->debugf( "RESPONSE: %s", $_response->as_string ); + + unless ( $_response->is_success ) { + croak( sprintf "API Exception(%s): %s\n%s", + $_response->code, $_response->message, $_response->content ); } - + return $_response->content; - + } # Take value and turn it into a string suitable for inclusion in @@ -161,11 +179,10 @@ sub call_api { # @param string $value a string which will be part of the path # @return string the serialized object sub to_path_value { - my ($self, $value) = @_; - return uri_escape($self->to_string($value)); + my ( $self, $value ) = @_; + return uri_escape( $self->to_string($value) ); } - # Take value and turn it into a string suitable for inclusion in # the query, by imploding comma-separated if it's an object. # If it's a string, pass through unchanged. It will be url-encoded @@ -173,22 +190,22 @@ sub to_path_value { # @param object $object an object to be serialized to a string # @return string the serialized object sub to_query_value { - my ($self, $object) = @_; - if (ref($object) eq 'ARRAY') { - return join(',', @$object); - } else { - return $self->to_string($object); - } + my ( $self, $object ) = @_; + if ( ref($object) eq 'ARRAY' ) { + return join( ',', @$object ); + } + else { + return $self->to_string($object); + } } - # Take value and turn it into a string suitable for inclusion in # the header. If it's a string, pass through unchanged # If it's a datetime object, format it in ISO8601 # @param string $value a string which will be part of the header # @return string the header string sub to_header_value { - my ($self, $value) = @_; + my ( $self, $value ) = @_; return $self->to_string($value); } @@ -198,7 +215,7 @@ sub to_header_value { # @param string $value the value of the form parameter # @return string the form string sub to_form_value { - my ($self, $value) = @_; + my ( $self, $value ) = @_; return $self->to_string($value); } @@ -208,8 +225,8 @@ sub to_form_value { # @param string $value the value of the parameter # @return string the header string sub to_string { - my ($self, $value) = @_; - if (ref($value) eq "DateTime") { # datetime in ISO8601 format + my ( $self, $value ) = @_; + if ( ref($value) eq "DateTime" ) { # datetime in ISO8601 format return $value->datetime(); } else { @@ -218,197 +235,216 @@ sub to_string { } # Deserialize a JSON string into an object -# +# # @param string $class class name is passed as a string # @param string $data data of the body # @return object an instance of $class -sub deserialize -{ - my ($self, $class, $data) = @_; - $log->debugf("deserializing %s for %s", $data, $class); - - if (not defined $data) { +sub deserialize { + my ( $self, $class, $data ) = @_; + $log->debugf( "deserializing %s for %s", $data, $class ); + + if ( not defined $data ) { return undef; - } elsif ( (substr($class, 0, 5)) eq 'HASH[') { #hash - if ($class =~ /^HASH\[(.*),(.*)\]$/) { - my ($key_type, $type) = ($1, $2); + } + elsif ( ( substr( $class, 0, 5 ) ) eq 'HASH[' ) { #hash + if ( $class =~ /^HASH\[(.*),(.*)\]$/ ) { + my ( $key_type, $type ) = ( $1, $2 ); my %hash; my $decoded_data = decode_json $data; - foreach my $key (keys %$decoded_data) { - if (ref $decoded_data->{$key} eq 'HASH') { - $hash{$key} = $self->deserialize($type, encode_json $decoded_data->{$key}); - } else { - $hash{$key} = $self->deserialize($type, $decoded_data->{$key}); + foreach my $key ( keys %$decoded_data ) { + if ( ref $decoded_data->{$key} eq 'HASH' ) { + $hash{$key} = $self->deserialize( $type, + encode_json $decoded_data->{$key} ); + } + else { + $hash{$key} = + $self->deserialize( $type, $decoded_data->{$key} ); } } return \%hash; - } else { - #TODO log error } - - } elsif ( (substr($class, 0, 6)) eq 'ARRAY[' ) { # array of data - return $data if $data eq '[]'; # return if empty array - - my $_sub_class = substr($class, 6, -1); + else { + #TODO log error + } + + } + elsif ( ( substr( $class, 0, 6 ) ) eq 'ARRAY[' ) { # array of data + return $data if $data eq '[]'; # return if empty array + + my $_sub_class = substr( $class, 6, -1 ); my $_json_data = decode_json $data; - my @_values = (); + my @_values = (); foreach my $_value (@$_json_data) { - if (ref $_value eq 'ARRAY') { - push @_values, $self->deserialize($_sub_class, encode_json $_value); - } else { - push @_values, $self->deserialize($_sub_class, $_value); + if ( ref $_value eq 'ARRAY' ) { + push @_values, + $self->deserialize( $_sub_class, encode_json $_value); + } + else { + push @_values, $self->deserialize( $_sub_class, $_value ); } } return \@_values; - } elsif ($class eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif (grep /^$class$/, ('string', 'int', 'float', 'bool', 'object')) { + } + elsif ( $class eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep /^$class$/, ( 'string', 'int', 'float', 'bool', 'object' ) ) { return $data; - } else { # model + } + else { # model my $_instance = use_module("WWW::OpenAPIClient::Object::$class")->new; - if (ref $data eq "HASH") { + if ( ref $data eq "HASH" ) { return $_instance->from_hash($data); - } else { # string, need to json decode first - return $_instance->from_hash(decode_json $data); + } + else { # string, need to json decode first + return $_instance->from_hash( decode_json $data); } } - + } # return 'Accept' based on an array of accept provided # @param [Array] header_accept_array Array fo 'Accept' # @return String Accept (e.g. application/json) -sub select_header_accept -{ - my ($self, @header) = @_; - - if (@header == 0 || (@header == 1 && $header[0] eq '')) { +sub select_header_accept { + my ( $self, @header ) = @_; + + if ( @header == 0 || ( @header == 1 && $header[0] eq '' ) ) { return undef; - } elsif (grep(/^application\/json$/i, @header)) { - return 'application/json'; - } else { - return join(',', @header); } - + elsif ( grep( /^application\/json$/i, @header ) ) { + return 'application/json'; + } + else { + return join( ',', @header ); + } + } # return the content type based on an array of content-type provided # @param [Array] content_type_array Array fo content-type # @return String Content-Type (e.g. application/json) -sub select_header_content_type -{ - my ($self, @header) = @_; - - if (@header == 0 || (@header == 1 && $header[0] eq '')) { - return 'application/json'; # default to application/json - } elsif (grep(/^application\/json$/i, @header)) { - return 'application/json'; - } else { - return join(',', @header); +sub select_header_content_type { + my ( $self, @header ) = @_; + + if ( @header == 0 || ( @header == 1 && $header[0] eq '' ) ) { + return 'application/json'; # default to application/json } - + elsif ( grep( /^application\/json$/i, @header ) ) { + return 'application/json'; + } + else { + return join( ',', @header ); + } + } # Get API key (with prefix if set) # @param string key name # @return string API key with the prefix -sub get_api_key_with_prefix -{ - my ($self, $key_name) = @_; +sub get_api_key_with_prefix { + my ( $self, $key_name ) = @_; - my $api_key = $self->{config}{api_key}{$key_name}; - - return unless $api_key; - - my $prefix = $self->{config}{api_key_prefix}{$key_name}; - return $prefix ? "$prefix $api_key" : $api_key; -} + my $api_key = $self->{config}{api_key}{$key_name}; + + return unless $api_key; + + my $prefix = $self->{config}{api_key_prefix}{$key_name}; + return $prefix ? "$prefix $api_key" : $api_key; +} # update header and query param based on authentication setting -# +# # @param array $headerParams header parameters (by ref) # @param array $queryParams query parameters (by ref) # @param array $authSettings array of authentication scheme (e.g ['api_key']) sub update_params_for_auth { - my ($self, $header_params, $query_params, $auth_settings) = @_; - - return $self->_global_auth_setup($header_params, $query_params) - unless $auth_settings && @$auth_settings; - + my ( $self, $header_params, $query_params, $auth_settings ) = @_; + + return $self->_global_auth_setup( $header_params, $query_params ) + unless $auth_settings && @$auth_settings; + # one endpoint can have more than 1 auth settings foreach my $auth (@$auth_settings) { + # determine which one to use - if (!defined($auth)) { + if ( !defined($auth) ) { + # TODO show warning about auth setting not defined } - elsif ($auth eq 'api_key') { - + elsif ( $auth eq 'api_key' ) { + my $api_key = $self->get_api_key_with_prefix('api_key'); if ($api_key) { $header_params->{'api_key'} = $api_key; } } -elsif ($auth eq 'api_key_query') { - + elsif ( $auth eq 'api_key_query' ) { + my $api_key = $self->get_api_key_with_prefix('api_key_query'); if ($api_key) { $query_params->{'api_key_query'} = $api_key; } } -elsif ($auth eq 'http_basic_test') { - - if ($self->{config}{username} || $self->{config}{password}) { - $header_params->{'Authorization'} = 'Basic ' . encode_base64($self->{config}{username} . ":" . $self->{config}{password}); + elsif ( $auth eq 'http_basic_test' ) { + + if ( $self->{config}{username} || $self->{config}{password} ) { + $header_params->{'Authorization'} = + 'Basic ' + . encode_base64( $self->{config}{username} . ":" + . $self->{config}{password} ); } } -elsif ($auth eq 'petstore_auth') { - - if ($self->{config}{access_token}) { - $header_params->{'Authorization'} = 'Bearer ' . $self->{config}{access_token}; + elsif ( $auth eq 'petstore_auth' ) { + + if ( $self->{config}{access_token} ) { + $header_params->{'Authorization'} = + 'Bearer ' . $self->{config}{access_token}; } } else { - # TODO show warning about security definition not found + # TODO show warning about security definition not found } } } -# The endpoint API class has not found any settings for auth. This may be deliberate, -# in which case update_params_for_auth() will be a no-op. But it may also be that the -# OpenAPI Spec does not describe the intended authorization. So we check in the config for any -# auth tokens and if we find any, we use them for all endpoints; +# The endpoint API class has not found any settings for auth. This may be deliberate, +# in which case update_params_for_auth() will be a no-op. But it may also be that the +# OpenAPI Spec does not describe the intended authorization. So we check in the config for any +# auth tokens and if we find any, we use them for all endpoints; sub _global_auth_setup { - my ($self, $header_params, $query_params) = @_; - - my $tokens = $self->{config}->get_tokens; - return unless keys %$tokens; - - # basic - if (my $uname = delete $tokens->{username}) { - my $pword = delete $tokens->{password}; - $header_params->{'Authorization'} = 'Basic '.encode_base64($uname.":".$pword); - } - - # oauth - if (my $access_token = delete $tokens->{access_token}) { - $header_params->{'Authorization'} = 'Bearer ' . $access_token; - } - - # other keys - foreach my $token_name (keys %$tokens) { - my $in = $tokens->{$token_name}->{in}; - my $token = $self->get_api_key_with_prefix($token_name); - if ($in eq 'head') { - $header_params->{$token_name} = $token; - } - elsif ($in eq 'query') { - $query_params->{$token_name} = $token; - } - else { - die "Don't know where to put token '$token_name' ('$in' is not 'head' or 'query')"; - } - } + my ( $self, $header_params, $query_params ) = @_; + + my $tokens = $self->{config}->get_tokens; + return unless keys %$tokens; + + # basic + if ( my $uname = delete $tokens->{username} ) { + my $pword = delete $tokens->{password}; + $header_params->{'Authorization'} = + 'Basic ' . encode_base64( $uname . ":" . $pword ); + } + + # oauth + if ( my $access_token = delete $tokens->{access_token} ) { + $header_params->{'Authorization'} = 'Bearer ' . $access_token; + } + + # other keys + foreach my $token_name ( keys %$tokens ) { + my $in = $tokens->{$token_name}->{in}; + my $token = $self->get_api_key_with_prefix($token_name); + if ( $in eq 'head' ) { + $header_params->{$token_name} = $token; + } + elsif ( $in eq 'query' ) { + $query_params->{$token_name} = $token; + } + else { + die +"Don't know where to put token '$token_name' ('$in' is not 'head' or 'query')"; + } + } } - 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiFactory.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiFactory.pm index e9fa1328dc9..68583ecd0c5 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiFactory.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/ApiFactory.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -58,9 +59,8 @@ use WWW::OpenAPIClient::ApiClient; =cut # Load all the API classes and construct a lookup table at startup time -my %_apis = map { $_ =~ /^WWW::OpenAPIClient::(.*)$/; $1 => $_ } - grep {$_ =~ /Api$/} - usesub 'WWW::OpenAPIClient'; +my %_apis = map { $_ =~ /^WWW::OpenAPIClient::(.*)$/; $1 => $_ } + grep { $_ =~ /Api$/ } usesub 'WWW::OpenAPIClient'; =head1 new($api_client) @@ -78,9 +78,10 @@ sub new { my ($class) = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } bless { api_client => $api_client }, $class; @@ -97,10 +98,10 @@ sub new { =cut sub get_api { - my ($self, $which) = @_; - croak "API not specified" unless $which; - my $api_class = $_apis{"${which}Api"} || croak "No known API for '$which'"; - return $api_class->new($self->api_client); + my ( $self, $which ) = @_; + croak "API not specified" unless $which; + my $api_class = $_apis{"${which}Api"} || croak "No known API for '$which'"; + return $api_class->new( $self->api_client ); } =head1 api_client() @@ -114,15 +115,16 @@ sub api_client { $_[0]->{api_client} } =head1 apis_available() =cut -sub apis_available { return map { $_ =~ s/Api$//; $_ } sort keys %_apis } +sub apis_available { + return map { $_ =~ s/Api$//; $_ } sort keys %_apis; +} =head1 classname_for() =cut sub classname_for { - my ($self, $api_name) = @_; - return $_apis{"${api_name}Api"}; + my ( $self, $api_name ) = @_; + return $_apis{"${api_name}Api"}; } - 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Configuration.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Configuration.pm index 678f097cbac..acd0f34f705 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Configuration.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Configuration.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -91,80 +92,81 @@ default: http://petstore.swagger.io:80/v2 =cut sub new { - my ($self, %p) = (shift,@_); + my ( $self, %p ) = ( shift, @_ ); - # class/static variables - $p{http_timeout} //= 180; - $p{http_user_agent} //= 'OpenAPI-Generator/1.0.0/perl'; + # class/static variables + $p{http_timeout} //= 180; + $p{http_user_agent} //= 'OpenAPI-Generator/1.0.0/perl'; - # authentication setting - $p{api_key} //= {}; - $p{api_key_prefix} //= {}; - $p{api_key_in} //= {}; + # authentication setting + $p{api_key} //= {}; + $p{api_key_prefix} //= {}; + $p{api_key_in} //= {}; - # username and password for HTTP basic authentication - $p{username} //= ''; - $p{password} //= ''; + # username and password for HTTP basic authentication + $p{username} //= ''; + $p{password} //= ''; - # access token for OAuth - $p{access_token} //= ''; + # access token for OAuth + $p{access_token} //= ''; - # base_url - $p{base_url} //= 'http://petstore.swagger.io:80/v2'; + # base_url + $p{base_url} //= 'http://petstore.swagger.io:80/v2'; - return bless \%p => $self; + return bless \%p => $self; } - sub get_tokens { - my $self = shift; - - my $tokens = {}; - $tokens->{username} = $self->{username} if $self->{username}; - $tokens->{password} = $self->{password} if $self->{password}; - $tokens->{access_token} = $self->{access_token} if $self->{access_token}; - - foreach my $token_name (keys %{ $self->{api_key} }) { - $tokens->{$token_name}->{token} = $self->{api_key}{$token_name}; - $tokens->{$token_name}->{prefix} = $self->{api_key_prefix}{$token_name}; - $tokens->{$token_name}->{in} = $self->{api_key_in}{$token_name}; - } + my $self = shift; - return $tokens; + my $tokens = {}; + $tokens->{username} = $self->{username} if $self->{username}; + $tokens->{password} = $self->{password} if $self->{password}; + $tokens->{access_token} = $self->{access_token} if $self->{access_token}; + + foreach my $token_name ( keys %{ $self->{api_key} } ) { + $tokens->{$token_name}->{token} = $self->{api_key}{$token_name}; + $tokens->{$token_name}->{prefix} = $self->{api_key_prefix}{$token_name}; + $tokens->{$token_name}->{in} = $self->{api_key_in}{$token_name}; + } + + return $tokens; } sub clear_tokens { - my $self = shift; - my %tokens = %{$self->get_tokens}; # copy - - $self->{username} = ''; - $self->{password} = ''; - $self->{access_token} = ''; + my $self = shift; + my %tokens = %{ $self->get_tokens }; # copy - $self->{api_key} = {}; - $self->{api_key_prefix} = {}; - $self->{api_key_in} = {}; - - return \%tokens; + $self->{username} = ''; + $self->{password} = ''; + $self->{access_token} = ''; + + $self->{api_key} = {}; + $self->{api_key_prefix} = {}; + $self->{api_key_in} = {}; + + return \%tokens; } sub accept_tokens { - my ($self, $tokens) = @_; - - foreach my $known_name (qw(username password access_token)) { - next unless $tokens->{$known_name}; - $self->{$known_name} = delete $tokens->{$known_name}; - } - - foreach my $token_name (keys %$tokens) { - $self->{api_key}{$token_name} = $tokens->{$token_name}{token}; - if ($tokens->{$token_name}{prefix}) { - $self->{api_key_prefix}{$token_name} = $tokens->{$token_name}{prefix}; - } - my $in = $tokens->{$token_name}->{in} || 'head'; - croak "Tokens can only go in 'head' or 'query' (not in '$in')" unless $in =~ /^(?:head|query)$/; - $self->{api_key_in}{$token_name} = $in; - } -} + my ( $self, $tokens ) = @_; + + foreach my $known_name (qw(username password access_token)) { + next unless $tokens->{$known_name}; + $self->{$known_name} = delete $tokens->{$known_name}; + } + + foreach my $token_name ( keys %$tokens ) { + $self->{api_key}{$token_name} = $tokens->{$token_name}{token}; + if ( $tokens->{$token_name}{prefix} ) { + $self->{api_key_prefix}{$token_name} = + $tokens->{$token_name}{prefix}; + } + my $in = $tokens->{$token_name}->{in} || 'head'; + croak "Tokens can only go in 'head' or 'query' (not in '$in')" + unless $in =~ /^(?:head|query)$/; + $self->{api_key_in}{$token_name} = $in; + } +} 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeApi.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeApi.pm index 03644d1fb18..c7a953b2ec1 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeApi.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeApi.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::FakeApi; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,50 +49,52 @@ sub new { } - # # fake_outer_boolean_serialize # -# -# +# +# # @param boolean $body Input boolean as post body (optional) { my $params = { - 'body' => { - data_type => 'boolean', - description => 'Input boolean as post body', - required => '0', - }, + 'body' => { + data_type => 'boolean', + description => 'Input boolean as post body', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'fake_outer_boolean_serialize' } = { - summary => '', - params => $params, + __PACKAGE__->method_documentation->{'fake_outer_boolean_serialize'} = { + summary => '', + params => $params, returns => 'boolean', - }; + }; } + # @return boolean # sub fake_outer_boolean_serialize { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/fake/outer/boolean'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept('*/*'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'body'}) { + if ( exists $args{'body'} ) { $_body_data = $args{'body'}; } @@ -98,59 +102,64 @@ sub fake_outer_boolean_serialize { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('boolean', $response); + my $_response_object = + $self->{api_client}->deserialize( 'boolean', $response ); return $_response_object; } # # fake_outer_composite_serialize # -# -# +# +# # @param OuterComposite $outer_composite Input composite as post body (optional) { my $params = { - 'outer_composite' => { - data_type => 'OuterComposite', - description => 'Input composite as post body', - required => '0', - }, + 'outer_composite' => { + data_type => 'OuterComposite', + description => 'Input composite as post body', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'fake_outer_composite_serialize' } = { - summary => '', - params => $params, + __PACKAGE__->method_documentation->{'fake_outer_composite_serialize'} = { + summary => '', + params => $params, returns => 'OuterComposite', - }; + }; } + # @return OuterComposite # sub fake_outer_composite_serialize { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/fake/outer/composite'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept('*/*'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'outer_composite'}) { + if ( exists $args{'outer_composite'} ) { $_body_data = $args{'outer_composite'}; } @@ -158,59 +167,64 @@ sub fake_outer_composite_serialize { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('OuterComposite', $response); + my $_response_object = + $self->{api_client}->deserialize( 'OuterComposite', $response ); return $_response_object; } # # fake_outer_number_serialize # -# -# +# +# # @param double $body Input number as post body (optional) { my $params = { - 'body' => { - data_type => 'double', - description => 'Input number as post body', - required => '0', - }, + 'body' => { + data_type => 'double', + description => 'Input number as post body', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'fake_outer_number_serialize' } = { - summary => '', - params => $params, + __PACKAGE__->method_documentation->{'fake_outer_number_serialize'} = { + summary => '', + params => $params, returns => 'double', - }; + }; } + # @return double # sub fake_outer_number_serialize { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/fake/outer/number'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept('*/*'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'body'}) { + if ( exists $args{'body'} ) { $_body_data = $args{'body'}; } @@ -218,59 +232,64 @@ sub fake_outer_number_serialize { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('double', $response); + my $_response_object = + $self->{api_client}->deserialize( 'double', $response ); return $_response_object; } # # fake_outer_string_serialize # -# -# +# +# # @param string $body Input string as post body (optional) { my $params = { - 'body' => { - data_type => 'string', - description => 'Input string as post body', - required => '0', - }, + 'body' => { + data_type => 'string', + description => 'Input string as post body', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'fake_outer_string_serialize' } = { - summary => '', - params => $params, + __PACKAGE__->method_documentation->{'fake_outer_string_serialize'} = { + summary => '', + params => $params, returns => 'string', - }; + }; } + # @return string # sub fake_outer_string_serialize { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/fake/outer/string'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept('*/*'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'body'}) { + if ( exists $args{'body'} ) { $_body_data = $args{'body'}; } @@ -278,80 +297,157 @@ sub fake_outer_string_serialize { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('string', $response); + my $_response_object = + $self->{api_client}->deserialize( 'string', $response ); return $_response_object; } # -# test_body_with_query_params +# test_body_with_file_schema # -# -# -# @param string $query (required) -# @param User $user (required) +# +# +# @param FileSchemaTestClass $file_schema_test_class (required) { my $params = { - 'query' => { - data_type => 'string', - description => '', - required => '1', - }, - 'user' => { - data_type => 'User', - description => '', - required => '1', - }, + 'file_schema_test_class' => { + data_type => 'FileSchemaTestClass', + description => '', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_body_with_query_params' } = { - summary => '', - params => $params, + __PACKAGE__->method_documentation->{'test_body_with_file_schema'} = { + summary => '', + params => $params, returns => undef, - }; + }; } + # @return void # -sub test_body_with_query_params { - my ($self, %args) = @_; +sub test_body_with_file_schema { + my ( $self, %args ) = @_; - # verify the required parameter 'query' is set - unless (exists $args{'query'}) { - croak("Missing the required parameter 'query' when calling test_body_with_query_params"); - } - - # verify the required parameter 'user' is set - unless (exists $args{'user'}) { - croak("Missing the required parameter 'user' when calling test_body_with_query_params"); + # verify the required parameter 'file_schema_test_class' is set + unless ( exists $args{'file_schema_test_class'} ) { + croak( +"Missing the required parameter 'file_schema_test_class' when calling test_body_with_file_schema" + ); } # parse inputs - my $_resource_path = '/fake/body-with-query-params'; + my $_resource_path = '/fake/body-with-file-schema'; - my $_method = 'PUT'; - my $query_params = {}; + my $_method = 'PUT'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); + + my $_body_data; + + # body params + if ( exists $args{'file_schema_test_class'} ) { + $_body_data = $args{'file_schema_test_class'}; + } + + # authentication setting, if any + my $auth_settings = [qw()]; + + # make the API Call + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + return; +} + +# +# test_body_with_query_params +# +# +# +# @param string $query (required) +# @param User $user (required) +{ + my $params = { + 'query' => { + data_type => 'string', + description => '', + required => '1', + }, + 'user' => { + data_type => 'User', + description => '', + required => '1', + }, + }; + __PACKAGE__->method_documentation->{'test_body_with_query_params'} = { + summary => '', + params => $params, + returns => undef, + }; +} + +# @return void +# +sub test_body_with_query_params { + my ( $self, %args ) = @_; + + # verify the required parameter 'query' is set + unless ( exists $args{'query'} ) { + croak( +"Missing the required parameter 'query' when calling test_body_with_query_params" + ); + } + + # verify the required parameter 'user' is set + unless ( exists $args{'user'} ) { + croak( +"Missing the required parameter 'user' when calling test_body_with_query_params" + ); + } + + # parse inputs + my $_resource_path = '/fake/body-with-query-params'; + + my $_method = 'PUT'; + my $query_params = {}; + my $header_params = {}; + my $form_params = {}; + + # 'Accept' and 'Content-Type' header + my $_header_accept = $self->{api_client}->select_header_accept(); + if ($_header_accept) { + $header_params->{'Accept'} = $_header_accept; + } + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); # query params - if ( exists $args{'query'}) { - $query_params->{'query'} = $self->{api_client}->to_query_value($args{'query'}); + if ( exists $args{'query'} ) { + $query_params->{'query'} = + $self->{api_client}->to_query_value( $args{'query'} ); } my $_body_data; + # body params - if ( exists $args{'user'}) { + if ( exists $args{'user'} ) { $_body_data = $args{'user'}; } @@ -359,9 +455,10 @@ sub test_body_with_query_params { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -369,50 +466,56 @@ sub test_body_with_query_params { # test_client_model # # To test \"client\" model -# +# # @param Client $client client model (required) { my $params = { - 'client' => { - data_type => 'Client', - description => 'client model', - required => '1', - }, + 'client' => { + data_type => 'Client', + description => 'client model', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_client_model' } = { - summary => 'To test \"client\" model', - params => $params, + __PACKAGE__->method_documentation->{'test_client_model'} = { + summary => 'To test \"client\" model', + params => $params, returns => 'Client', - }; + }; } + # @return Client # sub test_client_model { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'client' is set - unless (exists $args{'client'}) { - croak("Missing the required parameter 'client' when calling test_client_model"); + unless ( exists $args{'client'} ) { + croak( +"Missing the required parameter 'client' when calling test_client_model" + ); } # parse inputs my $_resource_path = '/fake'; - my $_method = 'PATCH'; - my $query_params = {}; + my $_method = 'PATCH'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/json'); + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); my $_body_data; + # body params - if ( exists $args{'client'}) { + if ( exists $args{'client'} ) { $_body_data = $args{'client'}; } @@ -420,21 +523,23 @@ sub test_client_model { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Client', $response); + my $_response_object = + $self->{api_client}->deserialize( 'Client', $response ); return $_response_object; } # # test_endpoint_parameters # -# Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 -# +# Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 +# # @param double $number None (required) # @param double $double None (required) # @param string $pattern_without_delimiter None (required) @@ -451,202 +556,228 @@ sub test_client_model { # @param string $callback None (optional) { my $params = { - 'number' => { - data_type => 'double', - description => 'None', - required => '1', - }, - 'double' => { - data_type => 'double', - description => 'None', - required => '1', - }, - 'pattern_without_delimiter' => { - data_type => 'string', - description => 'None', - required => '1', - }, - 'byte' => { - data_type => 'string', - description => 'None', - required => '1', - }, - 'integer' => { - data_type => 'int', - description => 'None', - required => '0', - }, - 'int32' => { - data_type => 'int', - description => 'None', - required => '0', - }, - 'int64' => { - data_type => 'int', - description => 'None', - required => '0', - }, - 'float' => { - data_type => 'double', - description => 'None', - required => '0', - }, - 'string' => { - data_type => 'string', - description => 'None', - required => '0', - }, - 'binary' => { - data_type => 'string', - description => 'None', - required => '0', - }, - 'date' => { - data_type => 'DateTime', - description => 'None', - required => '0', - }, - 'date_time' => { - data_type => 'DateTime', - description => 'None', - required => '0', - }, - 'password' => { - data_type => 'string', - description => 'None', - required => '0', - }, - 'callback' => { - data_type => 'string', - description => 'None', - required => '0', - }, + 'number' => { + data_type => 'double', + description => 'None', + required => '1', + }, + 'double' => { + data_type => 'double', + description => 'None', + required => '1', + }, + 'pattern_without_delimiter' => { + data_type => 'string', + description => 'None', + required => '1', + }, + 'byte' => { + data_type => 'string', + description => 'None', + required => '1', + }, + 'integer' => { + data_type => 'int', + description => 'None', + required => '0', + }, + 'int32' => { + data_type => 'int', + description => 'None', + required => '0', + }, + 'int64' => { + data_type => 'int', + description => 'None', + required => '0', + }, + 'float' => { + data_type => 'double', + description => 'None', + required => '0', + }, + 'string' => { + data_type => 'string', + description => 'None', + required => '0', + }, + 'binary' => { + data_type => 'string', + description => 'None', + required => '0', + }, + 'date' => { + data_type => 'DateTime', + description => 'None', + required => '0', + }, + 'date_time' => { + data_type => 'DateTime', + description => 'None', + required => '0', + }, + 'password' => { + data_type => 'string', + description => 'None', + required => '0', + }, + 'callback' => { + data_type => 'string', + description => 'None', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'test_endpoint_parameters' } = { - summary => 'Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ', - params => $params, + __PACKAGE__->method_documentation->{'test_endpoint_parameters'} = { + summary => +'Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 ', + params => $params, returns => undef, - }; + }; } + # @return void # sub test_endpoint_parameters { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'number' is set - unless (exists $args{'number'}) { - croak("Missing the required parameter 'number' when calling test_endpoint_parameters"); + unless ( exists $args{'number'} ) { + croak( +"Missing the required parameter 'number' when calling test_endpoint_parameters" + ); } # verify the required parameter 'double' is set - unless (exists $args{'double'}) { - croak("Missing the required parameter 'double' when calling test_endpoint_parameters"); + unless ( exists $args{'double'} ) { + croak( +"Missing the required parameter 'double' when calling test_endpoint_parameters" + ); } # verify the required parameter 'pattern_without_delimiter' is set - unless (exists $args{'pattern_without_delimiter'}) { - croak("Missing the required parameter 'pattern_without_delimiter' when calling test_endpoint_parameters"); + unless ( exists $args{'pattern_without_delimiter'} ) { + croak( +"Missing the required parameter 'pattern_without_delimiter' when calling test_endpoint_parameters" + ); } # verify the required parameter 'byte' is set - unless (exists $args{'byte'}) { - croak("Missing the required parameter 'byte' when calling test_endpoint_parameters"); + unless ( exists $args{'byte'} ) { + croak( +"Missing the required parameter 'byte' when calling test_endpoint_parameters" + ); } # parse inputs my $_resource_path = '/fake'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/x-www-form-urlencoded'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type('application/x-www-form-urlencoded'); # form params if ( exists $args{'integer'} ) { - $form_params->{'integer'} = $self->{api_client}->to_form_value($args{'integer'}); + $form_params->{'integer'} = + $self->{api_client}->to_form_value( $args{'integer'} ); } - + # form params if ( exists $args{'int32'} ) { - $form_params->{'int32'} = $self->{api_client}->to_form_value($args{'int32'}); + $form_params->{'int32'} = + $self->{api_client}->to_form_value( $args{'int32'} ); } - + # form params if ( exists $args{'int64'} ) { - $form_params->{'int64'} = $self->{api_client}->to_form_value($args{'int64'}); + $form_params->{'int64'} = + $self->{api_client}->to_form_value( $args{'int64'} ); } - + # form params if ( exists $args{'number'} ) { - $form_params->{'number'} = $self->{api_client}->to_form_value($args{'number'}); + $form_params->{'number'} = + $self->{api_client}->to_form_value( $args{'number'} ); } - + # form params if ( exists $args{'float'} ) { - $form_params->{'float'} = $self->{api_client}->to_form_value($args{'float'}); + $form_params->{'float'} = + $self->{api_client}->to_form_value( $args{'float'} ); } - + # form params if ( exists $args{'double'} ) { - $form_params->{'double'} = $self->{api_client}->to_form_value($args{'double'}); + $form_params->{'double'} = + $self->{api_client}->to_form_value( $args{'double'} ); } - + # form params if ( exists $args{'string'} ) { - $form_params->{'string'} = $self->{api_client}->to_form_value($args{'string'}); + $form_params->{'string'} = + $self->{api_client}->to_form_value( $args{'string'} ); } - + # form params if ( exists $args{'pattern_without_delimiter'} ) { - $form_params->{'pattern_without_delimiter'} = $self->{api_client}->to_form_value($args{'pattern_without_delimiter'}); + $form_params->{'pattern_without_delimiter'} = $self->{api_client} + ->to_form_value( $args{'pattern_without_delimiter'} ); } - + # form params if ( exists $args{'byte'} ) { - $form_params->{'byte'} = $self->{api_client}->to_form_value($args{'byte'}); + $form_params->{'byte'} = + $self->{api_client}->to_form_value( $args{'byte'} ); } - + # form params if ( exists $args{'binary'} ) { $form_params->{'binary'} = [] unless defined $form_params->{'binary'}; - push @{$form_params->{'binary'}}, $args{'binary'}; - } - + push @{ $form_params->{'binary'} }, $args{'binary'}; + } + # form params if ( exists $args{'date'} ) { - $form_params->{'date'} = $self->{api_client}->to_form_value($args{'date'}); + $form_params->{'date'} = + $self->{api_client}->to_form_value( $args{'date'} ); } - + # form params if ( exists $args{'date_time'} ) { - $form_params->{'dateTime'} = $self->{api_client}->to_form_value($args{'date_time'}); + $form_params->{'dateTime'} = + $self->{api_client}->to_form_value( $args{'date_time'} ); } - + # form params if ( exists $args{'password'} ) { - $form_params->{'password'} = $self->{api_client}->to_form_value($args{'password'}); + $form_params->{'password'} = + $self->{api_client}->to_form_value( $args{'password'} ); } - + # form params if ( exists $args{'callback'} ) { - $form_params->{'callback'} = $self->{api_client}->to_form_value($args{'callback'}); + $form_params->{'callback'} = + $self->{api_client}->to_form_value( $args{'callback'} ); } - + my $_body_data; + # authentication setting, if any my $auth_settings = [qw(http_basic_test )]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -654,7 +785,7 @@ sub test_endpoint_parameters { # test_enum_parameters # # To test enum parameters -# +# # @param ARRAY[string] $enum_header_string_array Header parameter enum test (string array) (optional) # @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg') # @param ARRAY[string] $enum_query_string_array Query parameter enum test (string array) (optional) @@ -665,121 +796,133 @@ sub test_endpoint_parameters { # @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg') { my $params = { - 'enum_header_string_array' => { - data_type => 'ARRAY[string]', - description => 'Header parameter enum test (string array)', - required => '0', - }, - 'enum_header_string' => { - data_type => 'string', - description => 'Header parameter enum test (string)', - required => '0', - }, - 'enum_query_string_array' => { - data_type => 'ARRAY[string]', - description => 'Query parameter enum test (string array)', - required => '0', - }, - 'enum_query_string' => { - data_type => 'string', - description => 'Query parameter enum test (string)', - required => '0', - }, - 'enum_query_integer' => { - data_type => 'int', - description => 'Query parameter enum test (double)', - required => '0', - }, - 'enum_query_double' => { - data_type => 'double', - description => 'Query parameter enum test (double)', - required => '0', - }, - 'enum_form_string_array' => { - data_type => 'ARRAY[string]', - description => 'Form parameter enum test (string array)', - required => '0', - }, - 'enum_form_string' => { - data_type => 'string', - description => 'Form parameter enum test (string)', - required => '0', - }, + 'enum_header_string_array' => { + data_type => 'ARRAY[string]', + description => 'Header parameter enum test (string array)', + required => '0', + }, + 'enum_header_string' => { + data_type => 'string', + description => 'Header parameter enum test (string)', + required => '0', + }, + 'enum_query_string_array' => { + data_type => 'ARRAY[string]', + description => 'Query parameter enum test (string array)', + required => '0', + }, + 'enum_query_string' => { + data_type => 'string', + description => 'Query parameter enum test (string)', + required => '0', + }, + 'enum_query_integer' => { + data_type => 'int', + description => 'Query parameter enum test (double)', + required => '0', + }, + 'enum_query_double' => { + data_type => 'double', + description => 'Query parameter enum test (double)', + required => '0', + }, + 'enum_form_string_array' => { + data_type => 'ARRAY[string]', + description => 'Form parameter enum test (string array)', + required => '0', + }, + 'enum_form_string' => { + data_type => 'string', + description => 'Form parameter enum test (string)', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'test_enum_parameters' } = { - summary => 'To test enum parameters', - params => $params, + __PACKAGE__->method_documentation->{'test_enum_parameters'} = { + summary => 'To test enum parameters', + params => $params, returns => undef, - }; + }; } + # @return void # sub test_enum_parameters { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/fake'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/x-www-form-urlencoded'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type('application/x-www-form-urlencoded'); # query params - if ( exists $args{'enum_query_string_array'}) { - $query_params->{'enum_query_string_array'} = $self->{api_client}->to_query_value($args{'enum_query_string_array'}); + if ( exists $args{'enum_query_string_array'} ) { + $query_params->{'enum_query_string_array'} = $self->{api_client} + ->to_query_value( $args{'enum_query_string_array'} ); } # query params - if ( exists $args{'enum_query_string'}) { - $query_params->{'enum_query_string'} = $self->{api_client}->to_query_value($args{'enum_query_string'}); + if ( exists $args{'enum_query_string'} ) { + $query_params->{'enum_query_string'} = + $self->{api_client}->to_query_value( $args{'enum_query_string'} ); } # query params - if ( exists $args{'enum_query_integer'}) { - $query_params->{'enum_query_integer'} = $self->{api_client}->to_query_value($args{'enum_query_integer'}); + if ( exists $args{'enum_query_integer'} ) { + $query_params->{'enum_query_integer'} = + $self->{api_client}->to_query_value( $args{'enum_query_integer'} ); } # query params - if ( exists $args{'enum_query_double'}) { - $query_params->{'enum_query_double'} = $self->{api_client}->to_query_value($args{'enum_query_double'}); + if ( exists $args{'enum_query_double'} ) { + $query_params->{'enum_query_double'} = + $self->{api_client}->to_query_value( $args{'enum_query_double'} ); } # header params - if ( exists $args{'enum_header_string_array'}) { - $header_params->{'enum_header_string_array'} = $self->{api_client}->to_header_value($args{'enum_header_string_array'}); + if ( exists $args{'enum_header_string_array'} ) { + $header_params->{'enum_header_string_array'} = $self->{api_client} + ->to_header_value( $args{'enum_header_string_array'} ); } # header params - if ( exists $args{'enum_header_string'}) { - $header_params->{'enum_header_string'} = $self->{api_client}->to_header_value($args{'enum_header_string'}); + if ( exists $args{'enum_header_string'} ) { + $header_params->{'enum_header_string'} = + $self->{api_client}->to_header_value( $args{'enum_header_string'} ); } # form params if ( exists $args{'enum_form_string_array'} ) { - $form_params->{'enum_form_string_array'} = $self->{api_client}->to_form_value($args{'enum_form_string_array'}); + $form_params->{'enum_form_string_array'} = + $self->{api_client}->to_form_value( $args{'enum_form_string_array'} ); } - + # form params if ( exists $args{'enum_form_string'} ) { - $form_params->{'enum_form_string'} = $self->{api_client}->to_form_value($args{'enum_form_string'}); + $form_params->{'enum_form_string'} = + $self->{api_client}->to_form_value( $args{'enum_form_string'} ); } - + my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -787,50 +930,55 @@ sub test_enum_parameters { # test_inline_additional_properties # # test inline additionalProperties -# +# # @param HASH[string,string] $request_body request body (required) { my $params = { - 'request_body' => { - data_type => 'HASH[string,string]', - description => 'request body', - required => '1', - }, + 'request_body' => { + data_type => 'HASH[string,string]', + description => 'request body', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_inline_additional_properties' } = { - summary => 'test inline additionalProperties', - params => $params, + __PACKAGE__->method_documentation->{'test_inline_additional_properties'} = { + summary => 'test inline additionalProperties', + params => $params, returns => undef, - }; + }; } + # @return void # sub test_inline_additional_properties { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'request_body' is set - unless (exists $args{'request_body'}) { - croak("Missing the required parameter 'request_body' when calling test_inline_additional_properties"); + unless ( exists $args{'request_body'} ) { + croak( +"Missing the required parameter 'request_body' when calling test_inline_additional_properties" + ); } # parse inputs my $_resource_path = '/fake/inline-additionalProperties'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); my $_body_data; + # body params - if ( exists $args{'request_body'}) { + if ( exists $args{'request_body'} ) { $_body_data = $args{'request_body'}; } @@ -838,9 +986,10 @@ sub test_inline_additional_properties { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -848,76 +997,86 @@ sub test_inline_additional_properties { # test_json_form_data # # test json serialization of form data -# +# # @param string $param field1 (required) # @param string $param2 field2 (required) { my $params = { - 'param' => { - data_type => 'string', - description => 'field1', - required => '1', - }, - 'param2' => { - data_type => 'string', - description => 'field2', - required => '1', - }, + 'param' => { + data_type => 'string', + description => 'field1', + required => '1', + }, + 'param2' => { + data_type => 'string', + description => 'field2', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_json_form_data' } = { - summary => 'test json serialization of form data', - params => $params, + __PACKAGE__->method_documentation->{'test_json_form_data'} = { + summary => 'test json serialization of form data', + params => $params, returns => undef, - }; + }; } + # @return void # sub test_json_form_data { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'param' is set - unless (exists $args{'param'}) { - croak("Missing the required parameter 'param' when calling test_json_form_data"); + unless ( exists $args{'param'} ) { + croak( +"Missing the required parameter 'param' when calling test_json_form_data" + ); } # verify the required parameter 'param2' is set - unless (exists $args{'param2'}) { - croak("Missing the required parameter 'param2' when calling test_json_form_data"); + unless ( exists $args{'param2'} ) { + croak( +"Missing the required parameter 'param2' when calling test_json_form_data" + ); } # parse inputs my $_resource_path = '/fake/jsonFormData'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/x-www-form-urlencoded'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type('application/x-www-form-urlencoded'); # form params if ( exists $args{'param'} ) { - $form_params->{'param'} = $self->{api_client}->to_form_value($args{'param'}); + $form_params->{'param'} = + $self->{api_client}->to_form_value( $args{'param'} ); } - + # form params if ( exists $args{'param2'} ) { - $form_params->{'param2'} = $self->{api_client}->to_form_value($args{'param2'}); + $form_params->{'param2'} = + $self->{api_client}->to_form_value( $args{'param2'} ); } - + my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeClassnameTags123Api.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeClassnameTags123Api.pm index 382b1a27925..1d84194e76e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeClassnameTags123Api.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/FakeClassnameTags123Api.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::FakeClassnameTags123Api; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,55 +49,60 @@ sub new { } - # # test_classname # # To test class name in snake case -# +# # @param Client $client client model (required) { my $params = { - 'client' => { - data_type => 'Client', - description => 'client model', - required => '1', - }, + 'client' => { + data_type => 'Client', + description => 'client model', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'test_classname' } = { - summary => 'To test class name in snake case', - params => $params, + __PACKAGE__->method_documentation->{'test_classname'} = { + summary => 'To test class name in snake case', + params => $params, returns => 'Client', - }; + }; } + # @return Client # sub test_classname { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'client' is set - unless (exists $args{'client'}) { - croak("Missing the required parameter 'client' when calling test_classname"); + unless ( exists $args{'client'} ) { + croak( +"Missing the required parameter 'client' when calling test_classname" + ); } # parse inputs my $_resource_path = '/fake_classname_test'; - my $_method = 'PATCH'; - my $query_params = {}; + my $_method = 'PATCH'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/json'); + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('application/json'); my $_body_data; + # body params - if ( exists $args{'client'}) { + if ( exists $args{'client'} ) { $_body_data = $args{'client'}; } @@ -103,13 +110,15 @@ sub test_classname { my $auth_settings = [qw(api_key_query )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Client', $response); + my $_response_object = + $self->{api_client}->deserialize( 'Client', $response ); return $_response_object; } diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AdditionalPropertiesClass.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AdditionalPropertiesClass.pm index 5df24d81a47..f675161eba1 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AdditionalPropertiesClass.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AdditionalPropertiesClass.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'AdditionalPropertiesClass', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'map_property' => { + datatype => 'HASH[string,string]', + base_name => 'map_property', + description => '', + format => '', + read_only => '', + }, + 'map_of_map_property' => { + datatype => 'HASH[string,HASH[string,string]]', + base_name => 'map_of_map_property', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'AdditionalPropertiesClass', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'map_property' => 'HASH[string,string]', + 'map_of_map_property' => 'HASH[string,HASH[string,string]]' + } +); -__PACKAGE__->method_documentation({ - 'map_property' => { - datatype => 'HASH[string,string]', - base_name => 'map_property', - description => '', - format => '', - read_only => '', - }, - 'map_of_map_property' => { - datatype => 'HASH[string,HASH[string,string]]', - base_name => 'map_of_map_property', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'map_property' => 'HASH[string,string]', - 'map_of_map_property' => 'HASH[string,HASH[string,string]]' -} ); - -__PACKAGE__->attribute_map( { - 'map_property' => 'map_property', - 'map_of_map_property' => 'map_of_map_property' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'map_property' => 'map_property', + 'map_of_map_property' => 'map_of_map_property' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Animal.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Animal.pm index 2d2e89fecb1..8cb4ba10272 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Animal.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Animal.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Animal', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'class_name' => { + datatype => 'string', + base_name => 'className', + description => '', + format => '', + read_only => '', + }, + 'color' => { + datatype => 'string', + base_name => 'color', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Animal', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'class_name' => 'string', + 'color' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'class_name' => { - datatype => 'string', - base_name => 'className', - description => '', - format => '', - read_only => '', - }, - 'color' => { - datatype => 'string', - base_name => 'color', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'class_name' => 'string', - 'color' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'class_name' => 'className', - 'color' => 'color' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'class_name' => 'className', + 'color' => 'color' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AnimalFarm.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AnimalFarm.pm index 27d93be1436..9a9fd1a4538 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AnimalFarm.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/AnimalFarm.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::Animal; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,62 +99,72 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'AnimalFarm', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( {} ); -__PACKAGE__->class_documentation({description => '', - class => 'AnimalFarm', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { -__PACKAGE__->method_documentation({ -}); + } +); -__PACKAGE__->openapi_types( { - -} ); +__PACKAGE__->attribute_map( + { -__PACKAGE__->attribute_map( { - -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ApiResponse.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ApiResponse.pm index ddbe5c5a211..701001ede4e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ApiResponse.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ApiResponse.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,87 +97,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'ApiResponse', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'code' => { + datatype => 'int', + base_name => 'code', + description => '', + format => '', + read_only => '', + }, + 'type' => { + datatype => 'string', + base_name => 'type', + description => '', + format => '', + read_only => '', + }, + 'message' => { + datatype => 'string', + base_name => 'message', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'ApiResponse', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'code' => 'int', + 'type' => 'string', + 'message' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'code' => { - datatype => 'int', - base_name => 'code', - description => '', - format => '', - read_only => '', - }, - 'type' => { - datatype => 'string', - base_name => 'type', - description => '', - format => '', - read_only => '', - }, - 'message' => { - datatype => 'string', - base_name => 'message', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'code' => 'int', - 'type' => 'string', - 'message' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'code' => 'code', - 'type' => 'type', - 'message' => 'message' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'code' => 'code', + 'type' => 'type', + 'message' => 'message' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfArrayOfNumberOnly.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfArrayOfNumberOnly.pm index 6ba81c73888..f3765dca2f0 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfArrayOfNumberOnly.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfArrayOfNumberOnly.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'ArrayOfArrayOfNumberOnly', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'array_array_number' => { + datatype => 'ARRAY[ARRAY[double]]', + base_name => 'ArrayArrayNumber', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'ArrayOfArrayOfNumberOnly', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'array_array_number' => 'ARRAY[ARRAY[double]]' + } +); -__PACKAGE__->method_documentation({ - 'array_array_number' => { - datatype => 'ARRAY[ARRAY[double]]', - base_name => 'ArrayArrayNumber', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'array_array_number' => 'ARRAY[ARRAY[double]]' -} ); - -__PACKAGE__->attribute_map( { - 'array_array_number' => 'ArrayArrayNumber' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'array_array_number' => 'ArrayArrayNumber' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfNumberOnly.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfNumberOnly.pm index 0dd88817e11..ff843ba89e9 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfNumberOnly.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayOfNumberOnly.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'ArrayOfNumberOnly', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'array_number' => { + datatype => 'ARRAY[double]', + base_name => 'ArrayNumber', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'ArrayOfNumberOnly', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'array_number' => 'ARRAY[double]' + } +); -__PACKAGE__->method_documentation({ - 'array_number' => { - datatype => 'ARRAY[double]', - base_name => 'ArrayNumber', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'array_number' => 'ARRAY[double]' -} ); - -__PACKAGE__->attribute_map( { - 'array_number' => 'ArrayNumber' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'array_number' => 'ArrayNumber' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayTest.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayTest.pm index 2f04d5a797c..a8650160c4c 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayTest.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ArrayTest.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::ReadOnlyFirst; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,87 +99,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'ArrayTest', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'array_of_string' => { + datatype => 'ARRAY[string]', + base_name => 'array_of_string', + description => '', + format => '', + read_only => '', + }, + 'array_array_of_integer' => { + datatype => 'ARRAY[ARRAY[int]]', + base_name => 'array_array_of_integer', + description => '', + format => '', + read_only => '', + }, + 'array_array_of_model' => { + datatype => 'ARRAY[ARRAY[ReadOnlyFirst]]', + base_name => 'array_array_of_model', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'ArrayTest', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'array_of_string' => 'ARRAY[string]', + 'array_array_of_integer' => 'ARRAY[ARRAY[int]]', + 'array_array_of_model' => 'ARRAY[ARRAY[ReadOnlyFirst]]' + } +); -__PACKAGE__->method_documentation({ - 'array_of_string' => { - datatype => 'ARRAY[string]', - base_name => 'array_of_string', - description => '', - format => '', - read_only => '', - }, - 'array_array_of_integer' => { - datatype => 'ARRAY[ARRAY[int]]', - base_name => 'array_array_of_integer', - description => '', - format => '', - read_only => '', - }, - 'array_array_of_model' => { - datatype => 'ARRAY[ARRAY[ReadOnlyFirst]]', - base_name => 'array_array_of_model', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'array_of_string' => 'ARRAY[string]', - 'array_array_of_integer' => 'ARRAY[ARRAY[int]]', - 'array_array_of_model' => 'ARRAY[ARRAY[ReadOnlyFirst]]' -} ); - -__PACKAGE__->attribute_map( { - 'array_of_string' => 'array_of_string', - 'array_array_of_integer' => 'array_array_of_integer', - 'array_array_of_model' => 'array_array_of_model' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'array_of_string' => 'array_of_string', + 'array_array_of_integer' => 'array_array_of_integer', + 'array_array_of_model' => 'array_array_of_model' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Capitalization.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Capitalization.pm index 34739279f57..493e82e13e2 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Capitalization.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Capitalization.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,114 +97,127 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Capitalization', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'small_camel' => { + datatype => 'string', + base_name => 'smallCamel', + description => '', + format => '', + read_only => '', + }, + 'capital_camel' => { + datatype => 'string', + base_name => 'CapitalCamel', + description => '', + format => '', + read_only => '', + }, + 'small_snake' => { + datatype => 'string', + base_name => 'small_Snake', + description => '', + format => '', + read_only => '', + }, + 'capital_snake' => { + datatype => 'string', + base_name => 'Capital_Snake', + description => '', + format => '', + read_only => '', + }, + 'sca_eth_flow_points' => { + datatype => 'string', + base_name => 'SCA_ETH_Flow_Points', + description => '', + format => '', + read_only => '', + }, + 'att_name' => { + datatype => 'string', + base_name => 'ATT_NAME', + description => 'Name of the pet ', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Capitalization', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'small_camel' => 'string', + 'capital_camel' => 'string', + 'small_snake' => 'string', + 'capital_snake' => 'string', + 'sca_eth_flow_points' => 'string', + 'att_name' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'small_camel' => { - datatype => 'string', - base_name => 'smallCamel', - description => '', - format => '', - read_only => '', - }, - 'capital_camel' => { - datatype => 'string', - base_name => 'CapitalCamel', - description => '', - format => '', - read_only => '', - }, - 'small_snake' => { - datatype => 'string', - base_name => 'small_Snake', - description => '', - format => '', - read_only => '', - }, - 'capital_snake' => { - datatype => 'string', - base_name => 'Capital_Snake', - description => '', - format => '', - read_only => '', - }, - 'sca_eth_flow_points' => { - datatype => 'string', - base_name => 'SCA_ETH_Flow_Points', - description => '', - format => '', - read_only => '', - }, - 'att_name' => { - datatype => 'string', - base_name => 'ATT_NAME', - description => 'Name of the pet ', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'small_camel' => 'string', - 'capital_camel' => 'string', - 'small_snake' => 'string', - 'capital_snake' => 'string', - 'sca_eth_flow_points' => 'string', - 'att_name' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'small_camel' => 'smallCamel', - 'capital_camel' => 'CapitalCamel', - 'small_snake' => 'small_Snake', - 'capital_snake' => 'Capital_Snake', - 'sca_eth_flow_points' => 'SCA_ETH_Flow_Points', - 'att_name' => 'ATT_NAME' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'small_camel' => 'smallCamel', + 'capital_camel' => 'CapitalCamel', + 'small_snake' => 'small_Snake', + 'capital_snake' => 'Capital_Snake', + 'sca_eth_flow_points' => 'SCA_ETH_Flow_Points', + 'att_name' => 'ATT_NAME' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Cat.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Cat.pm index 183755cde92..0e22589604e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Cat.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Cat.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::Animal; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,87 +99,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Cat', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'class_name' => { + datatype => 'string', + base_name => 'className', + description => '', + format => '', + read_only => '', + }, + 'color' => { + datatype => 'string', + base_name => 'color', + description => '', + format => '', + read_only => '', + }, + 'declawed' => { + datatype => 'boolean', + base_name => 'declawed', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Cat', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'class_name' => 'string', + 'color' => 'string', + 'declawed' => 'boolean' + } +); -__PACKAGE__->method_documentation({ - 'class_name' => { - datatype => 'string', - base_name => 'className', - description => '', - format => '', - read_only => '', - }, - 'color' => { - datatype => 'string', - base_name => 'color', - description => '', - format => '', - read_only => '', - }, - 'declawed' => { - datatype => 'boolean', - base_name => 'declawed', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'class_name' => 'string', - 'color' => 'string', - 'declawed' => 'boolean' -} ); - -__PACKAGE__->attribute_map( { - 'class_name' => 'className', - 'color' => 'color', - 'declawed' => 'declawed' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'class_name' => 'className', + 'color' => 'color', + 'declawed' => 'declawed' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Category.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Category.pm index 017b17928dc..31ca1111722 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Category.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Category.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Category', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'id' => { + datatype => 'int', + base_name => 'id', + description => '', + format => '', + read_only => '', + }, + 'name' => { + datatype => 'string', + base_name => 'name', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Category', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'id' => 'int', + 'name' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'id' => { - datatype => 'int', - base_name => 'id', - description => '', - format => '', - read_only => '', - }, - 'name' => { - datatype => 'string', - base_name => 'name', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'id' => 'int', - 'name' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'id' => 'id', - 'name' => 'name' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'id' => 'id', + 'name' => 'name' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ClassModel.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ClassModel.pm index 62a1bcefb6a..21862aa4c2f 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ClassModel.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ClassModel.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # #Model for testing model with \"_class\" property @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,83 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => + 'Model for testing model with \"_class\" property', + class => 'ClassModel', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + '_class' => { + datatype => 'string', + base_name => '_class', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => 'Model for testing model with \"_class\" property', - class => 'ClassModel', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + '_class' => 'string' + } +); -__PACKAGE__->method_documentation({ - '_class' => { - datatype => 'string', - base_name => '_class', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - '_class' => 'string' -} ); - -__PACKAGE__->attribute_map( { - '_class' => '_class' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + '_class' => '_class' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Client.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Client.pm index fb5375afd37..3f066f5e7be 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Client.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Client.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Client', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'client' => { + datatype => 'string', + base_name => 'client', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Client', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'client' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'client' => { - datatype => 'string', - base_name => 'client', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'client' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'client' => 'client' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'client' => 'client' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Dog.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Dog.pm index 7574b9ab1ed..0c3f8affbe2 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Dog.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Dog.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::Animal; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,87 +99,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Dog', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'class_name' => { + datatype => 'string', + base_name => 'className', + description => '', + format => '', + read_only => '', + }, + 'color' => { + datatype => 'string', + base_name => 'color', + description => '', + format => '', + read_only => '', + }, + 'breed' => { + datatype => 'string', + base_name => 'breed', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Dog', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'class_name' => 'string', + 'color' => 'string', + 'breed' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'class_name' => { - datatype => 'string', - base_name => 'className', - description => '', - format => '', - read_only => '', - }, - 'color' => { - datatype => 'string', - base_name => 'color', - description => '', - format => '', - read_only => '', - }, - 'breed' => { - datatype => 'string', - base_name => 'breed', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'class_name' => 'string', - 'color' => 'string', - 'breed' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'class_name' => 'className', - 'color' => 'color', - 'breed' => 'breed' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'class_name' => 'className', + 'color' => 'color', + 'breed' => 'breed' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumArrays.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumArrays.pm index b9bc8ee4c51..1fd1ff7f64c 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumArrays.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumArrays.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'EnumArrays', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'just_symbol' => { + datatype => 'string', + base_name => 'just_symbol', + description => '', + format => '', + read_only => '', + }, + 'array_enum' => { + datatype => 'ARRAY[string]', + base_name => 'array_enum', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'EnumArrays', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'just_symbol' => 'string', + 'array_enum' => 'ARRAY[string]' + } +); -__PACKAGE__->method_documentation({ - 'just_symbol' => { - datatype => 'string', - base_name => 'just_symbol', - description => '', - format => '', - read_only => '', - }, - 'array_enum' => { - datatype => 'ARRAY[string]', - base_name => 'array_enum', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'just_symbol' => 'string', - 'array_enum' => 'ARRAY[string]' -} ); - -__PACKAGE__->attribute_map( { - 'just_symbol' => 'just_symbol', - 'array_enum' => 'array_enum' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'just_symbol' => 'just_symbol', + 'array_enum' => 'array_enum' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumClass.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumClass.pm index 72fd7cd34da..536a4704b9e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumClass.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumClass.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,62 +97,72 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'EnumClass', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( {} ); -__PACKAGE__->class_documentation({description => '', - class => 'EnumClass', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { -__PACKAGE__->method_documentation({ -}); + } +); -__PACKAGE__->openapi_types( { - -} ); +__PACKAGE__->attribute_map( + { -__PACKAGE__->attribute_map( { - -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumTest.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumTest.pm index 3fbffd72c15..eae5b321562 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumTest.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/EnumTest.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::OuterEnum; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,105 +99,118 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'EnumTest', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'enum_string' => { + datatype => 'string', + base_name => 'enum_string', + description => '', + format => '', + read_only => '', + }, + 'enum_string_required' => { + datatype => 'string', + base_name => 'enum_string_required', + description => '', + format => '', + read_only => '', + }, + 'enum_integer' => { + datatype => 'int', + base_name => 'enum_integer', + description => '', + format => '', + read_only => '', + }, + 'enum_number' => { + datatype => 'double', + base_name => 'enum_number', + description => '', + format => '', + read_only => '', + }, + 'outer_enum' => { + datatype => 'OuterEnum', + base_name => 'outerEnum', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'EnumTest', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'enum_string' => 'string', + 'enum_string_required' => 'string', + 'enum_integer' => 'int', + 'enum_number' => 'double', + 'outer_enum' => 'OuterEnum' + } +); -__PACKAGE__->method_documentation({ - 'enum_string' => { - datatype => 'string', - base_name => 'enum_string', - description => '', - format => '', - read_only => '', - }, - 'enum_string_required' => { - datatype => 'string', - base_name => 'enum_string_required', - description => '', - format => '', - read_only => '', - }, - 'enum_integer' => { - datatype => 'int', - base_name => 'enum_integer', - description => '', - format => '', - read_only => '', - }, - 'enum_number' => { - datatype => 'double', - base_name => 'enum_number', - description => '', - format => '', - read_only => '', - }, - 'outer_enum' => { - datatype => 'OuterEnum', - base_name => 'outerEnum', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'enum_string' => 'string', - 'enum_string_required' => 'string', - 'enum_integer' => 'int', - 'enum_number' => 'double', - 'outer_enum' => 'OuterEnum' -} ); - -__PACKAGE__->attribute_map( { - 'enum_string' => 'enum_string', - 'enum_string_required' => 'enum_string_required', - 'enum_integer' => 'enum_integer', - 'enum_number' => 'enum_number', - 'outer_enum' => 'outerEnum' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'enum_string' => 'enum_string', + 'enum_string_required' => 'enum_string_required', + 'enum_integer' => 'enum_integer', + 'enum_number' => 'enum_number', + 'outer_enum' => 'outerEnum' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/File.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/File.pm new file mode 100644 index 00000000000..cc2bb1d41d6 --- /dev/null +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/File.pm @@ -0,0 +1,178 @@ + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +package WWW::OpenAPIClient::Object::File; + +require 5.6.0; +use strict; +use warnings; +use utf8; +use JSON qw(decode_json); +use Data::Dumper; +use Module::Runtime qw(use_module); +use Log::Any qw($log); +use Date::Parse; +use DateTime; + +use base ( "Class::Accessor", "Class::Data::Inheritable" ); + +# +#Must be named `File` for test. +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). Do not edit the class manually. +# REF: https://openapi-generator.tech +# + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); + +# new object +sub new { + my ( $class, %args ) = @_; + + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json( JSON->new->convert_blessed->encode(shift) ); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ( $self, $hash ) = @_; + + # loop through attributes and use openapi_types to deserialize the data + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); + my @_array = (); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); + } + $self->{$_key} = \@_array; + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { + return $data; + } + else { # hash(model) + my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + +__PACKAGE__->class_documentation( + { + description => 'Must be named `File` for test.', + class => 'File', + required => [], # TODO + } +); + +__PACKAGE__->method_documentation( + { + 'source_uri' => { + datatype => 'string', + base_name => 'sourceURI', + description => 'Test capitalization', + format => '', + read_only => '', + }, + } +); + +__PACKAGE__->openapi_types( + { + 'source_uri' => 'string' + } +); + +__PACKAGE__->attribute_map( + { + 'source_uri' => 'sourceURI' + } +); + +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); + +1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FileSchemaTestClass.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FileSchemaTestClass.pm new file mode 100644 index 00000000000..5a77413ba12 --- /dev/null +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FileSchemaTestClass.pm @@ -0,0 +1,189 @@ + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +package WWW::OpenAPIClient::Object::FileSchemaTestClass; + +require 5.6.0; +use strict; +use warnings; +use utf8; +use JSON qw(decode_json); +use Data::Dumper; +use Module::Runtime qw(use_module); +use Log::Any qw($log); +use Date::Parse; +use DateTime; + +use WWW::OpenAPIClient::Object::File; + +use base ( "Class::Accessor", "Class::Data::Inheritable" ); + +# +# +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). Do not edit the class manually. +# REF: https://openapi-generator.tech +# + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); + +# new object +sub new { + my ( $class, %args ) = @_; + + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json( JSON->new->convert_blessed->encode(shift) ); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ( $self, $hash ) = @_; + + # loop through attributes and use openapi_types to deserialize the data + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); + my @_array = (); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); + } + $self->{$_key} = \@_array; + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { + return $data; + } + else { # hash(model) + my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + +__PACKAGE__->class_documentation( + { + description => '', + class => 'FileSchemaTestClass', + required => [], # TODO + } +); + +__PACKAGE__->method_documentation( + { + 'file' => { + datatype => 'File', + base_name => 'file', + description => '', + format => '', + read_only => '', + }, + 'files' => { + datatype => 'ARRAY[File]', + base_name => 'files', + description => '', + format => '', + read_only => '', + }, + } +); + +__PACKAGE__->openapi_types( + { + 'file' => 'File', + 'files' => 'ARRAY[File]' + } +); + +__PACKAGE__->attribute_map( + { + 'file' => 'file', + 'files' => 'files' + } +); + +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); + +1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FormatTest.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FormatTest.pm index c796d794c84..625631c4773 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FormatTest.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/FormatTest.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,177 +97,190 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'FormatTest', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'integer' => { + datatype => 'int', + base_name => 'integer', + description => '', + format => '', + read_only => '', + }, + 'int32' => { + datatype => 'int', + base_name => 'int32', + description => '', + format => '', + read_only => '', + }, + 'int64' => { + datatype => 'int', + base_name => 'int64', + description => '', + format => '', + read_only => '', + }, + 'number' => { + datatype => 'double', + base_name => 'number', + description => '', + format => '', + read_only => '', + }, + 'float' => { + datatype => 'double', + base_name => 'float', + description => '', + format => '', + read_only => '', + }, + 'double' => { + datatype => 'double', + base_name => 'double', + description => '', + format => '', + read_only => '', + }, + 'string' => { + datatype => 'string', + base_name => 'string', + description => '', + format => '', + read_only => '', + }, + 'byte' => { + datatype => 'string', + base_name => 'byte', + description => '', + format => '', + read_only => '', + }, + 'binary' => { + datatype => 'string', + base_name => 'binary', + description => '', + format => '', + read_only => '', + }, + 'date' => { + datatype => 'DateTime', + base_name => 'date', + description => '', + format => '', + read_only => '', + }, + 'date_time' => { + datatype => 'DateTime', + base_name => 'dateTime', + description => '', + format => '', + read_only => '', + }, + 'uuid' => { + datatype => 'string', + base_name => 'uuid', + description => '', + format => '', + read_only => '', + }, + 'password' => { + datatype => 'string', + base_name => 'password', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'FormatTest', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'integer' => 'int', + 'int32' => 'int', + 'int64' => 'int', + 'number' => 'double', + 'float' => 'double', + 'double' => 'double', + 'string' => 'string', + 'byte' => 'string', + 'binary' => 'string', + 'date' => 'DateTime', + 'date_time' => 'DateTime', + 'uuid' => 'string', + 'password' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'integer' => { - datatype => 'int', - base_name => 'integer', - description => '', - format => '', - read_only => '', - }, - 'int32' => { - datatype => 'int', - base_name => 'int32', - description => '', - format => '', - read_only => '', - }, - 'int64' => { - datatype => 'int', - base_name => 'int64', - description => '', - format => '', - read_only => '', - }, - 'number' => { - datatype => 'double', - base_name => 'number', - description => '', - format => '', - read_only => '', - }, - 'float' => { - datatype => 'double', - base_name => 'float', - description => '', - format => '', - read_only => '', - }, - 'double' => { - datatype => 'double', - base_name => 'double', - description => '', - format => '', - read_only => '', - }, - 'string' => { - datatype => 'string', - base_name => 'string', - description => '', - format => '', - read_only => '', - }, - 'byte' => { - datatype => 'string', - base_name => 'byte', - description => '', - format => '', - read_only => '', - }, - 'binary' => { - datatype => 'string', - base_name => 'binary', - description => '', - format => '', - read_only => '', - }, - 'date' => { - datatype => 'DateTime', - base_name => 'date', - description => '', - format => '', - read_only => '', - }, - 'date_time' => { - datatype => 'DateTime', - base_name => 'dateTime', - description => '', - format => '', - read_only => '', - }, - 'uuid' => { - datatype => 'string', - base_name => 'uuid', - description => '', - format => '', - read_only => '', - }, - 'password' => { - datatype => 'string', - base_name => 'password', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'integer' => 'int', - 'int32' => 'int', - 'int64' => 'int', - 'number' => 'double', - 'float' => 'double', - 'double' => 'double', - 'string' => 'string', - 'byte' => 'string', - 'binary' => 'string', - 'date' => 'DateTime', - 'date_time' => 'DateTime', - 'uuid' => 'string', - 'password' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'integer' => 'integer', - 'int32' => 'int32', - 'int64' => 'int64', - 'number' => 'number', - 'float' => 'float', - 'double' => 'double', - 'string' => 'string', - 'byte' => 'byte', - 'binary' => 'binary', - 'date' => 'date', - 'date_time' => 'dateTime', - 'uuid' => 'uuid', - 'password' => 'password' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'integer' => 'integer', + 'int32' => 'int32', + 'int64' => 'int64', + 'number' => 'number', + 'float' => 'float', + 'double' => 'double', + 'string' => 'string', + 'byte' => 'byte', + 'binary' => 'binary', + 'date' => 'date', + 'date_time' => 'dateTime', + 'uuid' => 'uuid', + 'password' => 'password' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/HasOnlyReadOnly.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/HasOnlyReadOnly.pm index 0c35e214512..843d7de9a6a 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/HasOnlyReadOnly.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/HasOnlyReadOnly.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'HasOnlyReadOnly', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'bar' => { + datatype => 'string', + base_name => 'bar', + description => '', + format => '', + read_only => '', + }, + 'foo' => { + datatype => 'string', + base_name => 'foo', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'HasOnlyReadOnly', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'bar' => 'string', + 'foo' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'bar' => { - datatype => 'string', - base_name => 'bar', - description => '', - format => '', - read_only => '', - }, - 'foo' => { - datatype => 'string', - base_name => 'foo', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'bar' => 'string', - 'foo' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'bar' => 'bar', - 'foo' => 'foo' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'bar' => 'bar', + 'foo' => 'foo' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/List.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/List.pm index 63ee13919e2..15fe1d4dab3 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/List.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/List.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'List', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + '_123_list' => { + datatype => 'string', + base_name => '123-list', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'List', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + '_123_list' => 'string' + } +); -__PACKAGE__->method_documentation({ - '_123_list' => { - datatype => 'string', - base_name => '123-list', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - '_123_list' => 'string' -} ); - -__PACKAGE__->attribute_map( { - '_123_list' => '123-list' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + '_123_list' => '123-list' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MapTest.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MapTest.pm index f5e16474b54..43bbd6ec8c1 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MapTest.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MapTest.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,9 @@ use Log::Any qw($log); use Date::Parse; use DateTime; +use WWW::OpenAPIClient::Object::StringBooleanMap; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +99,109 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'MapTest', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'map_map_of_string' => { + datatype => 'HASH[string,HASH[string,string]]', + base_name => 'map_map_of_string', + description => '', + format => '', + read_only => '', + }, + 'map_of_enum_string' => { + datatype => 'HASH[string,string]', + base_name => 'map_of_enum_string', + description => '', + format => '', + read_only => '', + }, + 'direct_map' => { + datatype => 'HASH[string,boolean]', + base_name => 'direct_map', + description => '', + format => '', + read_only => '', + }, + 'indirect_map' => { + datatype => 'StringBooleanMap', + base_name => 'indirect_map', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'MapTest', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'map_map_of_string' => 'HASH[string,HASH[string,string]]', + 'map_of_enum_string' => 'HASH[string,string]', + 'direct_map' => 'HASH[string,boolean]', + 'indirect_map' => 'StringBooleanMap' + } +); -__PACKAGE__->method_documentation({ - 'map_map_of_string' => { - datatype => 'HASH[string,HASH[string,string]]', - base_name => 'map_map_of_string', - description => '', - format => '', - read_only => '', - }, - 'map_of_enum_string' => { - datatype => 'HASH[string,string]', - base_name => 'map_of_enum_string', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'map_map_of_string' => 'HASH[string,HASH[string,string]]', - 'map_of_enum_string' => 'HASH[string,string]' -} ); - -__PACKAGE__->attribute_map( { - 'map_map_of_string' => 'map_map_of_string', - 'map_of_enum_string' => 'map_of_enum_string' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'map_map_of_string' => 'map_map_of_string', + 'map_of_enum_string' => 'map_of_enum_string', + 'direct_map' => 'direct_map', + 'indirect_map' => 'indirect_map' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MixedPropertiesAndAdditionalPropertiesClass.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MixedPropertiesAndAdditionalPropertiesClass.pm index 114601dec2b..690a897fd2a 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MixedPropertiesAndAdditionalPropertiesClass.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/MixedPropertiesAndAdditionalPropertiesClass.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -32,8 +33,7 @@ use DateTime; use WWW::OpenAPIClient::Object::Animal; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -61,37 +61,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -99,87 +99,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'MixedPropertiesAndAdditionalPropertiesClass', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'uuid' => { + datatype => 'string', + base_name => 'uuid', + description => '', + format => '', + read_only => '', + }, + 'date_time' => { + datatype => 'DateTime', + base_name => 'dateTime', + description => '', + format => '', + read_only => '', + }, + 'map' => { + datatype => 'HASH[string,Animal]', + base_name => 'map', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'MixedPropertiesAndAdditionalPropertiesClass', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'uuid' => 'string', + 'date_time' => 'DateTime', + 'map' => 'HASH[string,Animal]' + } +); -__PACKAGE__->method_documentation({ - 'uuid' => { - datatype => 'string', - base_name => 'uuid', - description => '', - format => '', - read_only => '', - }, - 'date_time' => { - datatype => 'DateTime', - base_name => 'dateTime', - description => '', - format => '', - read_only => '', - }, - 'map' => { - datatype => 'HASH[string,Animal]', - base_name => 'map', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'uuid' => 'string', - 'date_time' => 'DateTime', - 'map' => 'HASH[string,Animal]' -} ); - -__PACKAGE__->attribute_map( { - 'uuid' => 'uuid', - 'date_time' => 'dateTime', - 'map' => 'map' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'uuid' => 'uuid', + 'date_time' => 'dateTime', + 'map' => 'map' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Model200Response.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Model200Response.pm index 295e5d11979..ddf6ce2b49b 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Model200Response.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Model200Response.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # #Model for testing model name starting with number @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => 'Model for testing model name starting with number', + class => 'Model200Response', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'name' => { + datatype => 'int', + base_name => 'name', + description => '', + format => '', + read_only => '', + }, + 'class' => { + datatype => 'string', + base_name => 'class', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => 'Model for testing model name starting with number', - class => 'Model200Response', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'name' => 'int', + 'class' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'name' => { - datatype => 'int', - base_name => 'name', - description => '', - format => '', - read_only => '', - }, - 'class' => { - datatype => 'string', - base_name => 'class', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'name' => 'int', - 'class' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'name' => 'name', - 'class' => 'class' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'name' => 'name', + 'class' => 'class' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ModelReturn.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ModelReturn.pm index 787855c6e8a..be6304706e4 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ModelReturn.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ModelReturn.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # #Model for testing reserved words @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => 'Model for testing reserved words', + class => 'ModelReturn', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'return' => { + datatype => 'int', + base_name => 'return', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => 'Model for testing reserved words', - class => 'ModelReturn', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'return' => 'int' + } +); -__PACKAGE__->method_documentation({ - 'return' => { - datatype => 'int', - base_name => 'return', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'return' => 'int' -} ); - -__PACKAGE__->attribute_map( { - 'return' => 'return' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'return' => 'return' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Name.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Name.pm index ec2b61fc315..28263037b06 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Name.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Name.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # #Model for testing model name same as property name @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,96 +97,109 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => 'Model for testing model name same as property name', + class => 'Name', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'name' => { + datatype => 'int', + base_name => 'name', + description => '', + format => '', + read_only => '', + }, + 'snake_case' => { + datatype => 'int', + base_name => 'snake_case', + description => '', + format => '', + read_only => '', + }, + 'property' => { + datatype => 'string', + base_name => 'property', + description => '', + format => '', + read_only => '', + }, + '_123_number' => { + datatype => 'int', + base_name => '123Number', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => 'Model for testing model name same as property name', - class => 'Name', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'name' => 'int', + 'snake_case' => 'int', + 'property' => 'string', + '_123_number' => 'int' + } +); -__PACKAGE__->method_documentation({ - 'name' => { - datatype => 'int', - base_name => 'name', - description => '', - format => '', - read_only => '', - }, - 'snake_case' => { - datatype => 'int', - base_name => 'snake_case', - description => '', - format => '', - read_only => '', - }, - 'property' => { - datatype => 'string', - base_name => 'property', - description => '', - format => '', - read_only => '', - }, - '_123_number' => { - datatype => 'int', - base_name => '123Number', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'name' => 'int', - 'snake_case' => 'int', - 'property' => 'string', - '_123_number' => 'int' -} ); - -__PACKAGE__->attribute_map( { - 'name' => 'name', - 'snake_case' => 'snake_case', - 'property' => 'property', - '_123_number' => '123Number' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'name' => 'name', + 'snake_case' => 'snake_case', + 'property' => 'property', + '_123_number' => '123Number' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/NumberOnly.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/NumberOnly.pm index e02ff8f11d5..f510f275e31 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/NumberOnly.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/NumberOnly.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'NumberOnly', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'just_number' => { + datatype => 'double', + base_name => 'JustNumber', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'NumberOnly', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'just_number' => 'double' + } +); -__PACKAGE__->method_documentation({ - 'just_number' => { - datatype => 'double', - base_name => 'JustNumber', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'just_number' => 'double' -} ); - -__PACKAGE__->attribute_map( { - 'just_number' => 'JustNumber' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'just_number' => 'JustNumber' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Order.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Order.pm index 3ce9a8542af..5cf212416dd 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Order.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Order.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,114 +97,127 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Order', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'id' => { + datatype => 'int', + base_name => 'id', + description => '', + format => '', + read_only => '', + }, + 'pet_id' => { + datatype => 'int', + base_name => 'petId', + description => '', + format => '', + read_only => '', + }, + 'quantity' => { + datatype => 'int', + base_name => 'quantity', + description => '', + format => '', + read_only => '', + }, + 'ship_date' => { + datatype => 'DateTime', + base_name => 'shipDate', + description => '', + format => '', + read_only => '', + }, + 'status' => { + datatype => 'string', + base_name => 'status', + description => 'Order Status', + format => '', + read_only => '', + }, + 'complete' => { + datatype => 'boolean', + base_name => 'complete', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Order', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'id' => 'int', + 'pet_id' => 'int', + 'quantity' => 'int', + 'ship_date' => 'DateTime', + 'status' => 'string', + 'complete' => 'boolean' + } +); -__PACKAGE__->method_documentation({ - 'id' => { - datatype => 'int', - base_name => 'id', - description => '', - format => '', - read_only => '', - }, - 'pet_id' => { - datatype => 'int', - base_name => 'petId', - description => '', - format => '', - read_only => '', - }, - 'quantity' => { - datatype => 'int', - base_name => 'quantity', - description => '', - format => '', - read_only => '', - }, - 'ship_date' => { - datatype => 'DateTime', - base_name => 'shipDate', - description => '', - format => '', - read_only => '', - }, - 'status' => { - datatype => 'string', - base_name => 'status', - description => 'Order Status', - format => '', - read_only => '', - }, - 'complete' => { - datatype => 'boolean', - base_name => 'complete', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'id' => 'int', - 'pet_id' => 'int', - 'quantity' => 'int', - 'ship_date' => 'DateTime', - 'status' => 'string', - 'complete' => 'boolean' -} ); - -__PACKAGE__->attribute_map( { - 'id' => 'id', - 'pet_id' => 'petId', - 'quantity' => 'quantity', - 'ship_date' => 'shipDate', - 'status' => 'status', - 'complete' => 'complete' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'id' => 'id', + 'pet_id' => 'petId', + 'quantity' => 'quantity', + 'ship_date' => 'shipDate', + 'status' => 'status', + 'complete' => 'complete' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterComposite.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterComposite.pm index 1d6d19287a1..2fd1f0c90b7 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterComposite.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterComposite.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,87 +97,100 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'OuterComposite', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'my_number' => { + datatype => 'double', + base_name => 'my_number', + description => '', + format => '', + read_only => '', + }, + 'my_string' => { + datatype => 'string', + base_name => 'my_string', + description => '', + format => '', + read_only => '', + }, + 'my_boolean' => { + datatype => 'boolean', + base_name => 'my_boolean', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'OuterComposite', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'my_number' => 'double', + 'my_string' => 'string', + 'my_boolean' => 'boolean' + } +); -__PACKAGE__->method_documentation({ - 'my_number' => { - datatype => 'double', - base_name => 'my_number', - description => '', - format => '', - read_only => '', - }, - 'my_string' => { - datatype => 'string', - base_name => 'my_string', - description => '', - format => '', - read_only => '', - }, - 'my_boolean' => { - datatype => 'boolean', - base_name => 'my_boolean', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'my_number' => 'double', - 'my_string' => 'string', - 'my_boolean' => 'boolean' -} ); - -__PACKAGE__->attribute_map( { - 'my_number' => 'my_number', - 'my_string' => 'my_string', - 'my_boolean' => 'my_boolean' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'my_number' => 'my_number', + 'my_string' => 'my_string', + 'my_boolean' => 'my_boolean' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterEnum.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterEnum.pm index bc3db9cb9a2..8971becbd38 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterEnum.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/OuterEnum.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,62 +97,72 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'OuterEnum', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( {} ); -__PACKAGE__->class_documentation({description => '', - class => 'OuterEnum', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { -__PACKAGE__->method_documentation({ -}); + } +); -__PACKAGE__->openapi_types( { - -} ); +__PACKAGE__->attribute_map( + { -__PACKAGE__->attribute_map( { - -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Pet.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Pet.pm index 926a64d7f8f..a0514b51706 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Pet.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Pet.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -33,8 +34,7 @@ use DateTime; use WWW::OpenAPIClient::Object::Category; use WWW::OpenAPIClient::Object::Tag; -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -62,37 +62,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -100,114 +100,127 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Pet', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'id' => { + datatype => 'int', + base_name => 'id', + description => '', + format => '', + read_only => '', + }, + 'category' => { + datatype => 'Category', + base_name => 'category', + description => '', + format => '', + read_only => '', + }, + 'name' => { + datatype => 'string', + base_name => 'name', + description => '', + format => '', + read_only => '', + }, + 'photo_urls' => { + datatype => 'ARRAY[string]', + base_name => 'photoUrls', + description => '', + format => '', + read_only => '', + }, + 'tags' => { + datatype => 'ARRAY[Tag]', + base_name => 'tags', + description => '', + format => '', + read_only => '', + }, + 'status' => { + datatype => 'string', + base_name => 'status', + description => 'pet status in the store', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Pet', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'id' => 'int', + 'category' => 'Category', + 'name' => 'string', + 'photo_urls' => 'ARRAY[string]', + 'tags' => 'ARRAY[Tag]', + 'status' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'id' => { - datatype => 'int', - base_name => 'id', - description => '', - format => '', - read_only => '', - }, - 'category' => { - datatype => 'Category', - base_name => 'category', - description => '', - format => '', - read_only => '', - }, - 'name' => { - datatype => 'string', - base_name => 'name', - description => '', - format => '', - read_only => '', - }, - 'photo_urls' => { - datatype => 'ARRAY[string]', - base_name => 'photoUrls', - description => '', - format => '', - read_only => '', - }, - 'tags' => { - datatype => 'ARRAY[Tag]', - base_name => 'tags', - description => '', - format => '', - read_only => '', - }, - 'status' => { - datatype => 'string', - base_name => 'status', - description => 'pet status in the store', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'id' => 'int', - 'category' => 'Category', - 'name' => 'string', - 'photo_urls' => 'ARRAY[string]', - 'tags' => 'ARRAY[Tag]', - 'status' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'id' => 'id', - 'category' => 'category', - 'name' => 'name', - 'photo_urls' => 'photoUrls', - 'tags' => 'tags', - 'status' => 'status' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'id' => 'id', + 'category' => 'category', + 'name' => 'name', + 'photo_urls' => 'photoUrls', + 'tags' => 'tags', + 'status' => 'status' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ReadOnlyFirst.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ReadOnlyFirst.pm index cfe76277e97..eff226b18ac 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ReadOnlyFirst.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/ReadOnlyFirst.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'ReadOnlyFirst', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'bar' => { + datatype => 'string', + base_name => 'bar', + description => '', + format => '', + read_only => '', + }, + 'baz' => { + datatype => 'string', + base_name => 'baz', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'ReadOnlyFirst', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'bar' => 'string', + 'baz' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'bar' => { - datatype => 'string', - base_name => 'bar', - description => '', - format => '', - read_only => '', - }, - 'baz' => { - datatype => 'string', - base_name => 'baz', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'bar' => 'string', - 'baz' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'bar' => 'bar', - 'baz' => 'baz' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'bar' => 'bar', + 'baz' => 'baz' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/SpecialModelName.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/SpecialModelName.pm index 04a7e156cec..48968ba008e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/SpecialModelName.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/SpecialModelName.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,69 +97,82 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'SpecialModelName', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + '__special[property/name]' => { + datatype => 'int', + base_name => '$special[property.name]', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'SpecialModelName', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + '__special[property/name]' => 'int' + } +); -__PACKAGE__->method_documentation({ - '__special[property/name]' => { - datatype => 'int', - base_name => '$special[property.name]', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - '__special[property/name]' => 'int' -} ); - -__PACKAGE__->attribute_map( { - '__special[property/name]' => '$special[property.name]' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + '__special[property/name]' => '$special[property.name]' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/StringBooleanMap.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/StringBooleanMap.pm new file mode 100644 index 00000000000..95cc675bf78 --- /dev/null +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/StringBooleanMap.pm @@ -0,0 +1,168 @@ + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +package WWW::OpenAPIClient::Object::StringBooleanMap; + +require 5.6.0; +use strict; +use warnings; +use utf8; +use JSON qw(decode_json); +use Data::Dumper; +use Module::Runtime qw(use_module); +use Log::Any qw($log); +use Date::Parse; +use DateTime; + +use base ( "Class::Accessor", "Class::Data::Inheritable" ); + +# +# +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). Do not edit the class manually. +# REF: https://openapi-generator.tech +# + +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +# Do not edit the class manually. +# Ref: https://openapi-generator.tech +# +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); + +# new object +sub new { + my ( $class, %args ) = @_; + + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} + +# return perl hash +sub to_hash { + return decode_json( JSON->new->convert_blessed->encode(shift) ); +} + +# used by JSON for serialization +sub TO_JSON { + my $self = shift; + my $_data = {}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; + } + } + return $_data; +} + +# from Perl hashref +sub from_hash { + my ( $self, $hash ) = @_; + + # loop through attributes and use openapi_types to deserialize the data + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); + my @_array = (); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); + } + $self->{$_key} = \@_array; + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); + } + } + + return $self; +} + +# deserialize non-array data +sub _deserialize { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { + return $data; + } + else { # hash(model) + my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; + return $_instance->from_hash($data); + } +} + +__PACKAGE__->class_documentation( + { + description => '', + class => 'StringBooleanMap', + required => [], # TODO + } +); + +__PACKAGE__->method_documentation( {} ); + +__PACKAGE__->openapi_types( + { + + } +); + +__PACKAGE__->attribute_map( + { + + } +); + +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); + +1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Tag.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Tag.pm index 835f6668a5f..9f15607bd84 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Tag.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/Tag.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,78 +97,91 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'Tag', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'id' => { + datatype => 'int', + base_name => 'id', + description => '', + format => '', + read_only => '', + }, + 'name' => { + datatype => 'string', + base_name => 'name', + description => '', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'Tag', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'id' => 'int', + 'name' => 'string' + } +); -__PACKAGE__->method_documentation({ - 'id' => { - datatype => 'int', - base_name => 'id', - description => '', - format => '', - read_only => '', - }, - 'name' => { - datatype => 'string', - base_name => 'name', - description => '', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'id' => 'int', - 'name' => 'string' -} ); - -__PACKAGE__->attribute_map( { - 'id' => 'id', - 'name' => 'name' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'id' => 'id', + 'name' => 'name' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/User.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/User.pm index fecadeff77f..3712522fbb4 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/User.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Object/User.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -30,9 +31,7 @@ use Log::Any qw($log); use Date::Parse; use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - +use base ( "Class::Accessor", "Class::Data::Inheritable" ); # # @@ -60,37 +59,37 @@ Generated by: https://openapi-generator.tech # Do not edit the class manually. # Ref: https://openapi-generator.tech # -__PACKAGE__->mk_classdata('attribute_map' => {}); -__PACKAGE__->mk_classdata('openapi_types' => {}); -__PACKAGE__->mk_classdata('method_documentation' => {}); -__PACKAGE__->mk_classdata('class_documentation' => {}); +__PACKAGE__->mk_classdata( 'attribute_map' => {} ); +__PACKAGE__->mk_classdata( 'openapi_types' => {} ); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); +__PACKAGE__->mk_classdata( 'class_documentation' => {} ); # new object -sub new { - my ($class, %args) = @_; +sub new { + my ( $class, %args ) = @_; - my $self = bless {}, $class; - - foreach my $attribute (keys %{$class->attribute_map}) { - my $args_key = $class->attribute_map->{$attribute}; - $self->$attribute( $args{ $args_key } ); - } - - return $self; -} + my $self = bless {}, $class; + + foreach my $attribute ( keys %{ $class->attribute_map } ) { + my $args_key = $class->attribute_map->{$attribute}; + $self->$attribute( $args{$args_key} ); + } + + return $self; +} # return perl hash sub to_hash { - return decode_json(JSON->new->convert_blessed->encode( shift )); + return decode_json( JSON->new->convert_blessed->encode(shift) ); } # used by JSON for serialization -sub TO_JSON { - my $self = shift; +sub TO_JSON { + my $self = shift; my $_data = {}; - foreach my $_key (keys %{$self->attribute_map}) { - if (defined $self->{$_key}) { - $_data->{$self->attribute_map->{$_key}} = $self->{$_key}; + foreach my $_key ( keys %{ $self->attribute_map } ) { + if ( defined $self->{$_key} ) { + $_data->{ $self->attribute_map->{$_key} } = $self->{$_key}; } } return $_data; @@ -98,132 +97,145 @@ sub TO_JSON { # from Perl hashref sub from_hash { - my ($self, $hash) = @_; + my ( $self, $hash ) = @_; # loop through attributes and use openapi_types to deserialize the data - while ( my ($_key, $_type) = each %{$self->openapi_types} ) { - my $_json_attribute = $self->attribute_map->{$_key}; - if ($_type =~ /^array\[/i) { # array - my $_subclass = substr($_type, 6, -1); + while ( my ( $_key, $_type ) = each %{ $self->openapi_types } ) { + my $_json_attribute = $self->attribute_map->{$_key}; + if ( $_type =~ /^array\[/i ) { # array + my $_subclass = substr( $_type, 6, -1 ); my @_array = (); - foreach my $_element (@{$hash->{$_json_attribute}}) { - push @_array, $self->_deserialize($_subclass, $_element); + foreach my $_element ( @{ $hash->{$_json_attribute} } ) { + push @_array, $self->_deserialize( $_subclass, $_element ); } $self->{$_key} = \@_array; - } elsif (exists $hash->{$_json_attribute}) { #hash(model), primitive, datetime - $self->{$_key} = $self->_deserialize($_type, $hash->{$_json_attribute}); - } else { - $log->debugf("Warning: %s (%s) does not exist in input hash\n", $_key, $_json_attribute); + } + elsif ( exists $hash->{$_json_attribute} ) + { #hash(model), primitive, datetime + $self->{$_key} = + $self->_deserialize( $_type, $hash->{$_json_attribute} ); + } + else { + $log->debugf( "Warning: %s (%s) does not exist in input hash\n", + $_key, $_json_attribute ); } } - + return $self; } # deserialize non-array data sub _deserialize { - my ($self, $type, $data) = @_; - $log->debugf("deserializing %s with %s",Dumper($data), $type); - - if ($type eq 'DateTime') { - return DateTime->from_epoch(epoch => str2time($data)); - } elsif ( grep( /^$type$/, ('int', 'double', 'string', 'boolean'))) { + my ( $self, $type, $data ) = @_; + $log->debugf( "deserializing %s with %s", Dumper($data), $type ); + + if ( $type eq 'DateTime' ) { + return DateTime->from_epoch( epoch => str2time($data) ); + } + elsif ( grep( /^$type$/, ( 'int', 'double', 'string', 'boolean' ) ) ) { return $data; - } else { # hash(model) + } + else { # hash(model) my $_instance = eval "WWW::OpenAPIClient::Object::$type->new()"; return $_instance->from_hash($data); } } +__PACKAGE__->class_documentation( + { + description => '', + class => 'User', + required => [], # TODO + } +); +__PACKAGE__->method_documentation( + { + 'id' => { + datatype => 'int', + base_name => 'id', + description => '', + format => '', + read_only => '', + }, + 'username' => { + datatype => 'string', + base_name => 'username', + description => '', + format => '', + read_only => '', + }, + 'first_name' => { + datatype => 'string', + base_name => 'firstName', + description => '', + format => '', + read_only => '', + }, + 'last_name' => { + datatype => 'string', + base_name => 'lastName', + description => '', + format => '', + read_only => '', + }, + 'email' => { + datatype => 'string', + base_name => 'email', + description => '', + format => '', + read_only => '', + }, + 'password' => { + datatype => 'string', + base_name => 'password', + description => '', + format => '', + read_only => '', + }, + 'phone' => { + datatype => 'string', + base_name => 'phone', + description => '', + format => '', + read_only => '', + }, + 'user_status' => { + datatype => 'int', + base_name => 'userStatus', + description => 'User Status', + format => '', + read_only => '', + }, + } +); -__PACKAGE__->class_documentation({description => '', - class => 'User', - required => [], # TODO -} ); +__PACKAGE__->openapi_types( + { + 'id' => 'int', + 'username' => 'string', + 'first_name' => 'string', + 'last_name' => 'string', + 'email' => 'string', + 'password' => 'string', + 'phone' => 'string', + 'user_status' => 'int' + } +); -__PACKAGE__->method_documentation({ - 'id' => { - datatype => 'int', - base_name => 'id', - description => '', - format => '', - read_only => '', - }, - 'username' => { - datatype => 'string', - base_name => 'username', - description => '', - format => '', - read_only => '', - }, - 'first_name' => { - datatype => 'string', - base_name => 'firstName', - description => '', - format => '', - read_only => '', - }, - 'last_name' => { - datatype => 'string', - base_name => 'lastName', - description => '', - format => '', - read_only => '', - }, - 'email' => { - datatype => 'string', - base_name => 'email', - description => '', - format => '', - read_only => '', - }, - 'password' => { - datatype => 'string', - base_name => 'password', - description => '', - format => '', - read_only => '', - }, - 'phone' => { - datatype => 'string', - base_name => 'phone', - description => '', - format => '', - read_only => '', - }, - 'user_status' => { - datatype => 'int', - base_name => 'userStatus', - description => 'User Status', - format => '', - read_only => '', - }, -}); - -__PACKAGE__->openapi_types( { - 'id' => 'int', - 'username' => 'string', - 'first_name' => 'string', - 'last_name' => 'string', - 'email' => 'string', - 'password' => 'string', - 'phone' => 'string', - 'user_status' => 'int' -} ); - -__PACKAGE__->attribute_map( { - 'id' => 'id', - 'username' => 'username', - 'first_name' => 'firstName', - 'last_name' => 'lastName', - 'email' => 'email', - 'password' => 'password', - 'phone' => 'phone', - 'user_status' => 'userStatus' -} ); - -__PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); +__PACKAGE__->attribute_map( + { + 'id' => 'id', + 'username' => 'username', + 'first_name' => 'firstName', + 'last_name' => 'lastName', + 'email' => 'email', + 'password' => 'password', + 'phone' => 'phone', + 'user_status' => 'userStatus' + } +); +__PACKAGE__->mk_accessors( keys %{ __PACKAGE__->attribute_map } ); 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/PetApi.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/PetApi.pm index 4bbf6bc58ce..9961299544e 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/PetApi.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/PetApi.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::PetApi; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,55 +49,57 @@ sub new { } - # # add_pet # # Add a new pet to the store -# +# # @param Pet $pet Pet object that needs to be added to the store (required) { my $params = { - 'pet' => { - data_type => 'Pet', - description => 'Pet object that needs to be added to the store', - required => '1', - }, + 'pet' => { + data_type => 'Pet', + description => 'Pet object that needs to be added to the store', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'add_pet' } = { - summary => 'Add a new pet to the store', - params => $params, + __PACKAGE__->method_documentation->{'add_pet'} = { + summary => 'Add a new pet to the store', + params => $params, returns => undef, - }; + }; } + # @return void # sub add_pet { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet' is set - unless (exists $args{'pet'}) { - croak("Missing the required parameter 'pet' when calling add_pet"); + unless ( exists $args{'pet'} ) { + croak("Missing the required parameter 'pet' when calling add_pet"); } # parse inputs my $_resource_path = '/pet'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json', 'application/xml'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type( 'application/json', 'application/xml' ); my $_body_data; + # body params - if ( exists $args{'pet'}) { + if ( exists $args{'pet'} ) { $_body_data = $args{'pet'}; } @@ -103,9 +107,10 @@ sub add_pet { my $auth_settings = [qw(petstore_auth )]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -113,73 +118,79 @@ sub add_pet { # delete_pet # # Deletes a pet -# +# # @param int $pet_id Pet id to delete (required) # @param string $api_key (optional) { my $params = { - 'pet_id' => { - data_type => 'int', - description => 'Pet id to delete', - required => '1', - }, - 'api_key' => { - data_type => 'string', - description => '', - required => '0', - }, + 'pet_id' => { + data_type => 'int', + description => 'Pet id to delete', + required => '1', + }, + 'api_key' => { + data_type => 'string', + description => '', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'delete_pet' } = { - summary => 'Deletes a pet', - params => $params, + __PACKAGE__->method_documentation->{'delete_pet'} = { + summary => 'Deletes a pet', + params => $params, returns => undef, - }; + }; } + # @return void # sub delete_pet { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet_id' is set - unless (exists $args{'pet_id'}) { - croak("Missing the required parameter 'pet_id' when calling delete_pet"); + unless ( exists $args{'pet_id'} ) { + croak( + "Missing the required parameter 'pet_id' when calling delete_pet"); } # parse inputs my $_resource_path = '/pet/{petId}'; - my $_method = 'DELETE'; - my $query_params = {}; + my $_method = 'DELETE'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # header params - if ( exists $args{'api_key'}) { - $header_params->{'api_key'} = $self->{api_client}->to_header_value($args{'api_key'}); + if ( exists $args{'api_key'} ) { + $header_params->{'api_key'} = + $self->{api_client}->to_header_value( $args{'api_key'} ); } # path params - if ( exists $args{'pet_id'}) { + if ( exists $args{'pet_id'} ) { my $_base_variable = "{" . "petId" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'pet_id'}); + my $_base_value = $self->{api_client}->to_path_value( $args{'pet_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw(petstore_auth )]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -187,64 +198,74 @@ sub delete_pet { # find_pets_by_status # # Finds Pets by status -# +# # @param ARRAY[string] $status Status values that need to be considered for filter (required) { my $params = { - 'status' => { - data_type => 'ARRAY[string]', - description => 'Status values that need to be considered for filter', - required => '1', - }, + 'status' => { + data_type => 'ARRAY[string]', + description => + 'Status values that need to be considered for filter', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'find_pets_by_status' } = { - summary => 'Finds Pets by status', - params => $params, + __PACKAGE__->method_documentation->{'find_pets_by_status'} = { + summary => 'Finds Pets by status', + params => $params, returns => 'ARRAY[Pet]', - }; + }; } + # @return ARRAY[Pet] # sub find_pets_by_status { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'status' is set - unless (exists $args{'status'}) { - croak("Missing the required parameter 'status' when calling find_pets_by_status"); + unless ( exists $args{'status'} ) { + croak( +"Missing the required parameter 'status' when calling find_pets_by_status" + ); } # parse inputs my $_resource_path = '/pet/findByStatus'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # query params - if ( exists $args{'status'}) { - $query_params->{'status'} = $self->{api_client}->to_query_value($args{'status'}); + if ( exists $args{'status'} ) { + $query_params->{'status'} = + $self->{api_client}->to_query_value( $args{'status'} ); } my $_body_data; + # authentication setting, if any my $auth_settings = [qw(petstore_auth )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('ARRAY[Pet]', $response); + my $_response_object = + $self->{api_client}->deserialize( 'ARRAY[Pet]', $response ); return $_response_object; } @@ -252,64 +273,73 @@ sub find_pets_by_status { # find_pets_by_tags # # Finds Pets by tags -# +# # @param ARRAY[string] $tags Tags to filter by (required) { my $params = { - 'tags' => { - data_type => 'ARRAY[string]', - description => 'Tags to filter by', - required => '1', - }, + 'tags' => { + data_type => 'ARRAY[string]', + description => 'Tags to filter by', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'find_pets_by_tags' } = { - summary => 'Finds Pets by tags', - params => $params, + __PACKAGE__->method_documentation->{'find_pets_by_tags'} = { + summary => 'Finds Pets by tags', + params => $params, returns => 'ARRAY[Pet]', - }; + }; } + # @return ARRAY[Pet] # sub find_pets_by_tags { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'tags' is set - unless (exists $args{'tags'}) { - croak("Missing the required parameter 'tags' when calling find_pets_by_tags"); + unless ( exists $args{'tags'} ) { + croak( +"Missing the required parameter 'tags' when calling find_pets_by_tags" + ); } # parse inputs my $_resource_path = '/pet/findByTags'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # query params - if ( exists $args{'tags'}) { - $query_params->{'tags'} = $self->{api_client}->to_query_value($args{'tags'}); + if ( exists $args{'tags'} ) { + $query_params->{'tags'} = + $self->{api_client}->to_query_value( $args{'tags'} ); } my $_body_data; + # authentication setting, if any my $auth_settings = [qw(petstore_auth )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('ARRAY[Pet]', $response); + my $_response_object = + $self->{api_client}->deserialize( 'ARRAY[Pet]', $response ); return $_response_object; } @@ -317,66 +347,73 @@ sub find_pets_by_tags { # get_pet_by_id # # Find pet by ID -# +# # @param int $pet_id ID of pet to return (required) { my $params = { - 'pet_id' => { - data_type => 'int', - description => 'ID of pet to return', - required => '1', - }, + 'pet_id' => { + data_type => 'int', + description => 'ID of pet to return', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'get_pet_by_id' } = { - summary => 'Find pet by ID', - params => $params, + __PACKAGE__->method_documentation->{'get_pet_by_id'} = { + summary => 'Find pet by ID', + params => $params, returns => 'Pet', - }; + }; } + # @return Pet # sub get_pet_by_id { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet_id' is set - unless (exists $args{'pet_id'}) { - croak("Missing the required parameter 'pet_id' when calling get_pet_by_id"); + unless ( exists $args{'pet_id'} ) { + croak( + "Missing the required parameter 'pet_id' when calling get_pet_by_id" + ); } # parse inputs my $_resource_path = '/pet/{petId}'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'pet_id'}) { + if ( exists $args{'pet_id'} ) { my $_base_variable = "{" . "petId" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'pet_id'}); + my $_base_value = $self->{api_client}->to_path_value( $args{'pet_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw(api_key )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Pet', $response); + my $_response_object = $self->{api_client}->deserialize( 'Pet', $response ); return $_response_object; } @@ -384,50 +421,53 @@ sub get_pet_by_id { # update_pet # # Update an existing pet -# +# # @param Pet $pet Pet object that needs to be added to the store (required) { my $params = { - 'pet' => { - data_type => 'Pet', - description => 'Pet object that needs to be added to the store', - required => '1', - }, + 'pet' => { + data_type => 'Pet', + description => 'Pet object that needs to be added to the store', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'update_pet' } = { - summary => 'Update an existing pet', - params => $params, + __PACKAGE__->method_documentation->{'update_pet'} = { + summary => 'Update an existing pet', + params => $params, returns => undef, - }; + }; } + # @return void # sub update_pet { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet' is set - unless (exists $args{'pet'}) { - croak("Missing the required parameter 'pet' when calling update_pet"); + unless ( exists $args{'pet'} ) { + croak("Missing the required parameter 'pet' when calling update_pet"); } # parse inputs my $_resource_path = '/pet'; - my $_method = 'PUT'; - my $query_params = {}; + my $_method = 'PUT'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/json', 'application/xml'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type( 'application/json', 'application/xml' ); my $_body_data; + # body params - if ( exists $args{'pet'}) { + if ( exists $args{'pet'} ) { $_body_data = $args{'pet'}; } @@ -435,9 +475,10 @@ sub update_pet { my $auth_settings = [qw(petstore_auth )]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -445,84 +486,92 @@ sub update_pet { # update_pet_with_form # # Updates a pet in the store with form data -# +# # @param int $pet_id ID of pet that needs to be updated (required) # @param string $name Updated name of the pet (optional) # @param string $status Updated status of the pet (optional) { my $params = { - 'pet_id' => { - data_type => 'int', - description => 'ID of pet that needs to be updated', - required => '1', - }, - 'name' => { - data_type => 'string', - description => 'Updated name of the pet', - required => '0', - }, - 'status' => { - data_type => 'string', - description => 'Updated status of the pet', - required => '0', - }, + 'pet_id' => { + data_type => 'int', + description => 'ID of pet that needs to be updated', + required => '1', + }, + 'name' => { + data_type => 'string', + description => 'Updated name of the pet', + required => '0', + }, + 'status' => { + data_type => 'string', + description => 'Updated status of the pet', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'update_pet_with_form' } = { - summary => 'Updates a pet in the store with form data', - params => $params, + __PACKAGE__->method_documentation->{'update_pet_with_form'} = { + summary => 'Updates a pet in the store with form data', + params => $params, returns => undef, - }; + }; } + # @return void # sub update_pet_with_form { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet_id' is set - unless (exists $args{'pet_id'}) { - croak("Missing the required parameter 'pet_id' when calling update_pet_with_form"); + unless ( exists $args{'pet_id'} ) { + croak( +"Missing the required parameter 'pet_id' when calling update_pet_with_form" + ); } # parse inputs my $_resource_path = '/pet/{petId}'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('application/x-www-form-urlencoded'); + $header_params->{'Content-Type'} = $self->{api_client} + ->select_header_content_type('application/x-www-form-urlencoded'); # path params - if ( exists $args{'pet_id'}) { + if ( exists $args{'pet_id'} ) { my $_base_variable = "{" . "petId" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'pet_id'}); + my $_base_value = $self->{api_client}->to_path_value( $args{'pet_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } # form params if ( exists $args{'name'} ) { - $form_params->{'name'} = $self->{api_client}->to_form_value($args{'name'}); + $form_params->{'name'} = + $self->{api_client}->to_form_value( $args{'name'} ); } - + # form params if ( exists $args{'status'} ) { - $form_params->{'status'} = $self->{api_client}->to_form_value($args{'status'}); + $form_params->{'status'} = + $self->{api_client}->to_form_value( $args{'status'} ); } - + my $_body_data; + # authentication setting, if any my $auth_settings = [qw(petstore_auth )]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -530,89 +579,204 @@ sub update_pet_with_form { # upload_file # # uploads an image -# +# # @param int $pet_id ID of pet to update (required) # @param string $additional_metadata Additional data to pass to server (optional) # @param string $file file to upload (optional) { my $params = { - 'pet_id' => { - data_type => 'int', - description => 'ID of pet to update', - required => '1', - }, - 'additional_metadata' => { - data_type => 'string', - description => 'Additional data to pass to server', - required => '0', - }, - 'file' => { - data_type => 'string', - description => 'file to upload', - required => '0', - }, + 'pet_id' => { + data_type => 'int', + description => 'ID of pet to update', + required => '1', + }, + 'additional_metadata' => { + data_type => 'string', + description => 'Additional data to pass to server', + required => '0', + }, + 'file' => { + data_type => 'string', + description => 'file to upload', + required => '0', + }, }; - __PACKAGE__->method_documentation->{ 'upload_file' } = { - summary => 'uploads an image', - params => $params, + __PACKAGE__->method_documentation->{'upload_file'} = { + summary => 'uploads an image', + params => $params, returns => 'ApiResponse', - }; + }; } + # @return ApiResponse # sub upload_file { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'pet_id' is set - unless (exists $args{'pet_id'}) { - croak("Missing the required parameter 'pet_id' when calling upload_file"); + unless ( exists $args{'pet_id'} ) { + croak( + "Missing the required parameter 'pet_id' when calling upload_file"); } # parse inputs my $_resource_path = '/pet/{petId}/uploadImage'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/json'); + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type('multipart/form-data'); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('multipart/form-data'); # path params - if ( exists $args{'pet_id'}) { + if ( exists $args{'pet_id'} ) { my $_base_variable = "{" . "petId" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'pet_id'}); + my $_base_value = $self->{api_client}->to_path_value( $args{'pet_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } # form params if ( exists $args{'additional_metadata'} ) { - $form_params->{'additionalMetadata'} = $self->{api_client}->to_form_value($args{'additional_metadata'}); + $form_params->{'additionalMetadata'} = + $self->{api_client}->to_form_value( $args{'additional_metadata'} ); } - + # form params if ( exists $args{'file'} ) { $form_params->{'file'} = [] unless defined $form_params->{'file'}; - push @{$form_params->{'file'}}, $args{'file'}; - } - + push @{ $form_params->{'file'} }, $args{'file'}; + } + my $_body_data; + # authentication setting, if any my $auth_settings = [qw(petstore_auth )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('ApiResponse', $response); + my $_response_object = + $self->{api_client}->deserialize( 'ApiResponse', $response ); + return $_response_object; +} + +# +# upload_file_with_required_file +# +# uploads an image (required) +# +# @param int $pet_id ID of pet to update (required) +# @param string $required_file file to upload (required) +# @param string $additional_metadata Additional data to pass to server (optional) +{ + my $params = { + 'pet_id' => { + data_type => 'int', + description => 'ID of pet to update', + required => '1', + }, + 'required_file' => { + data_type => 'string', + description => 'file to upload', + required => '1', + }, + 'additional_metadata' => { + data_type => 'string', + description => 'Additional data to pass to server', + required => '0', + }, + }; + __PACKAGE__->method_documentation->{'upload_file_with_required_file'} = { + summary => 'uploads an image (required)', + params => $params, + returns => 'ApiResponse', + }; +} + +# @return ApiResponse +# +sub upload_file_with_required_file { + my ( $self, %args ) = @_; + + # verify the required parameter 'pet_id' is set + unless ( exists $args{'pet_id'} ) { + croak( +"Missing the required parameter 'pet_id' when calling upload_file_with_required_file" + ); + } + + # verify the required parameter 'required_file' is set + unless ( exists $args{'required_file'} ) { + croak( +"Missing the required parameter 'required_file' when calling upload_file_with_required_file" + ); + } + + # parse inputs + my $_resource_path = '/fake/{petId}/uploadImageWithRequiredFile'; + + my $_method = 'POST'; + my $query_params = {}; + my $header_params = {}; + my $form_params = {}; + + # 'Accept' and 'Content-Type' header + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); + if ($_header_accept) { + $header_params->{'Accept'} = $_header_accept; + } + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type('multipart/form-data'); + + # path params + if ( exists $args{'pet_id'} ) { + my $_base_variable = "{" . "petId" . "}"; + my $_base_value = $self->{api_client}->to_path_value( $args{'pet_id'} ); + $_resource_path =~ s/$_base_variable/$_base_value/g; + } + + # form params + if ( exists $args{'additional_metadata'} ) { + $form_params->{'additionalMetadata'} = + $self->{api_client}->to_form_value( $args{'additional_metadata'} ); + } + + # form params + if ( exists $args{'required_file'} ) { + $form_params->{'requiredFile'} = [] + unless defined $form_params->{'requiredFile'}; + push @{ $form_params->{'requiredFile'} }, $args{'required_file'}; + } + + my $_body_data; + + # authentication setting, if any + my $auth_settings = [qw(petstore_auth )]; + + # make the API Call + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { + return; + } + my $_response_object = + $self->{api_client}->deserialize( 'ApiResponse', $response ); return $_response_object; } diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role.pm index aeaffd41547..aa58fdae4b0 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -26,87 +27,108 @@ use Class::Inspector; use Log::Any qw($log); use WWW::OpenAPIClient::ApiFactory; -has base_url => ( is => 'ro', - required => 0, - isa => 'Str', - documentation => 'Root of the server that requests are sent to', - ); +has base_url => ( + is => 'ro', + required => 0, + isa => 'Str', + documentation => 'Root of the server that requests are sent to', +); -has api_factory => ( is => 'ro', - isa => 'WWW::OpenAPIClient::ApiFactory', - builder => '_build_af', - lazy => 1, - documentation => 'Builds an instance of the endpoint API class', - ); +has api_factory => ( + is => 'ro', + isa => 'WWW::OpenAPIClient::ApiFactory', + builder => '_build_af', + lazy => 1, + documentation => 'Builds an instance of the endpoint API class', +); -has tokens => ( is => 'ro', - isa => 'HashRef', - required => 0, - default => sub { {} }, - documentation => 'The auth tokens required by the application - basic, OAuth and/or API key(s)', - ); +has tokens => ( + is => 'ro', + isa => 'HashRef', + required => 0, + default => sub { {} }, + documentation => +'The auth tokens required by the application - basic, OAuth and/or API key(s)', +); -has _cfg => ( is => 'ro', - isa => 'WWW::OpenAPIClient::Configuration', - default => sub { WWW::OpenAPIClient::Configuration->new() }, - ); +has _cfg => ( + is => 'ro', + isa => 'WWW::OpenAPIClient::Configuration', + default => sub { WWW::OpenAPIClient::Configuration->new() }, +); -has version_info => ( is => 'ro', - isa => 'HashRef', - default => sub { { - app_name => 'OpenAPI Petstore', - app_version => '1.0.0', - generator_class => 'org.openapitools.codegen.languages.PerlClientCodegen', - } }, - documentation => 'Information about the application version and the codegen codebase version' - ); +has version_info => ( + is => 'ro', + isa => 'HashRef', + default => sub { + { + app_name => 'OpenAPI Petstore', + app_version => '1.0.0', + generator_class => + 'org.openapitools.codegen.languages.PerlClientCodegen', + } + }, + documentation => +'Information about the application version and the codegen codebase version' +); sub BUILD { - my $self = shift; + my $self = shift; - $self->_cfg->accept_tokens( $self->tokens ) if keys %{$self->tokens}; + $self->_cfg->accept_tokens( $self->tokens ) if keys %{ $self->tokens }; - # ignore these symbols imported into API namespaces - my %outsiders = map {$_ => 1} qw( croak ); + # ignore these symbols imported into API namespaces + my %outsiders = map { $_ => 1 } qw( croak ); - my %delegates; + my %delegates; - # collect the methods callable on each API - foreach my $api_name ($self->api_factory->apis_available) { - my $api_class = $self->api_factory->classname_for($api_name); - my $methods = Class::Inspector->methods($api_class, 'expanded'); # not Moose, so use CI instead - my @local_methods = grep {! /^_/} grep {! $outsiders{$_}} map {$_->[2]} grep {$_->[1] eq $api_class} @$methods; - push( @{$delegates{$_}}, {api_name => $api_name, api_class => $api_class} ) for @local_methods; - } + # collect the methods callable on each API + foreach my $api_name ( $self->api_factory->apis_available ) { + my $api_class = $self->api_factory->classname_for($api_name); + my $methods = Class::Inspector->methods( $api_class, 'expanded' ) + ; # not Moose, so use CI instead + my @local_methods = + grep { !/^_/ } + grep { !$outsiders{$_} } + map { $_->[2] } grep { $_->[1] eq $api_class } @$methods; + push( + @{ $delegates{$_} }, + { api_name => $api_name, api_class => $api_class } + ) for @local_methods; + } - # remove clashes - foreach my $method (keys %delegates) { - if ( @{$delegates{$method}} > 1 ) { - my ($apis) = delete $delegates{$method}; - } - } + # remove clashes + foreach my $method ( keys %delegates ) { + if ( @{ $delegates{$method} } > 1 ) { + my ($apis) = delete $delegates{$method}; + } + } # build the flattened API - foreach my $api_name ($self->api_factory->apis_available) { + foreach my $api_name ( $self->api_factory->apis_available ) { my $att_name = sprintf "%s_api", lc($api_name); my $api_class = $self->api_factory->classname_for($api_name); - my @delegated = grep { $delegates{$_}->[0]->{api_name} eq $api_name } keys %delegates; - $log->debugf("Adding API: '%s' handles %s", $att_name, join ', ', @delegated); - $self->meta->add_attribute( $att_name => ( - is => 'ro', - isa => $api_class, - default => sub {$self->api_factory->get_api($api_name)}, - lazy => 1, - handles => \@delegated, - ) ); + my @delegated = + grep { $delegates{$_}->[0]->{api_name} eq $api_name } keys %delegates; + $log->debugf( "Adding API: '%s' handles %s", + $att_name, join ', ', @delegated ); + $self->meta->add_attribute( + $att_name => ( + is => 'ro', + isa => $api_class, + default => sub { $self->api_factory->get_api($api_name) }, + lazy => 1, + handles => \@delegated, + ) + ); } } sub _build_af { - my $self = shift; - my %args; - $args{base_url} = $self->base_url if $self->base_url; - return WWW::OpenAPIClient::ApiFactory->new(%args); + my $self = shift; + my %args; + $args{base_url} = $self->base_url if $self->base_url; + return WWW::OpenAPIClient::ApiFactory->new(%args); } =head1 NAME diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role/AutoDoc.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role/AutoDoc.pm index 03bcc0b9eee..a9c82e1644a 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role/AutoDoc.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/Role/AutoDoc.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -23,56 +24,57 @@ use List::MoreUtils qw(uniq); use Moose::Role; sub autodoc { - my ($self, $how) = @_; - - die "Unknown format '$how'" unless $how =~ /^(pod|wide|narrow)$/; - - $self->_printisa($how); - $self->_printmethods($how); - $self->_printattrs($how); - print "\n"; + my ( $self, $how ) = @_; + + die "Unknown format '$how'" unless $how =~ /^(pod|wide|narrow)$/; + + $self->_printisa($how); + $self->_printmethods($how); + $self->_printattrs($how); + print "\n"; } sub _printisa { - my ($self, $how) = @_; - my $meta = $self->meta; - - my $myclass = ref $self; - - my $super = join ', ', $meta->superclasses; - my @roles = $meta->calculate_all_roles; - #shift(@roles) if @roles > 1; # if > 1, the first is a composite, the rest are the roles + my ( $self, $how ) = @_; + my $meta = $self->meta; - my $isa = join ', ', grep {$_ ne $myclass} $meta->linearized_isa; - my $sub = join ', ', $meta->subclasses; - my $dsub = join ', ', $meta->direct_subclasses; - - my $app_name = $self->version_info->{app_name}; - my $app_version = $self->version_info->{app_version}; - my $generated_date = $self->version_info->{generated_date}; + my $myclass = ref $self; + + my $super = join ', ', $meta->superclasses; + my @roles = $meta->calculate_all_roles; + +#shift(@roles) if @roles > 1; # if > 1, the first is a composite, the rest are the roles + + my $isa = join ', ', grep { $_ ne $myclass } $meta->linearized_isa; + my $sub = join ', ', $meta->subclasses; + my $dsub = join ', ', $meta->direct_subclasses; + + my $app_name = $self->version_info->{app_name}; + my $app_version = $self->version_info->{app_version}; + my $generated_date = $self->version_info->{generated_date}; my $generator_class = $self->version_info->{generator_class}; $~ = $how eq 'pod' ? 'INHERIT_POD' : 'INHERIT'; write; - - my ($rolepkg, $role_reqs); - - foreach my $role (@roles) { - $rolepkg = $role->{package} || next; # some are anonymous, or something - next if $rolepkg eq 'WWW::OpenAPIClient::Role::AutoDoc'; - $role_reqs = join ', ', keys %{$role->{required_methods}}; - $role_reqs ||= ''; - $~ = $how eq 'pod' ? 'ROLES_POD' : 'ROLES'; - write; - } - - if ($how eq 'pod') { - $~ = 'ROLES_POD_CLOSE'; - write; - } - -# ----- format specs ----- - format INHERIT = + + my ( $rolepkg, $role_reqs ); + + foreach my $role (@roles) { + $rolepkg = $role->{package} || next; # some are anonymous, or something + next if $rolepkg eq 'WWW::OpenAPIClient::Role::AutoDoc'; + $role_reqs = join ', ', keys %{ $role->{required_methods} }; + $role_reqs ||= ''; + $~ = $how eq 'pod' ? 'ROLES_POD' : 'ROLES'; + write; + } + + if ( $how eq 'pod' ) { + $~ = 'ROLES_POD_CLOSE'; + write; + } + + # ----- format specs ----- + format INHERIT = @* - $myclass @@ -91,7 +93,7 @@ $myclass $generator_class . - format ROLES = + format ROLES = Composes: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~ $rolepkg requires: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~ @@ -100,7 +102,7 @@ $myclass $role_reqs . - format INHERIT_POD = + format INHERIT_POD = =head1 NAME @* @@ -151,7 +153,7 @@ $myclass . - format ROLES_POD = + format ROLES_POD = =head2 C<@*> $rolepkg @@ -161,104 +163,108 @@ Requires: $role_reqs . - format ROLES_POD_CLOSE = + format ROLES_POD_CLOSE = . -# ----- / format specs ----- + + # ----- / format specs ----- } sub _printmethods { - my ($self, $how) = @_; - - if ($how eq 'narrow') { - print <_printmethod($_, $how) for uniq sort $self->meta->get_all_method_names; #$self->meta->get_method_list, - - if ($how eq 'pod') { - $~ = 'METHOD_POD_CLOSE'; - write; - } + } + elsif ( $how eq 'wide' ) { + $~ = 'METHODHEAD'; + write; + } + elsif ( $how eq 'pod' ) { + $~ = 'METHODHEAD_POD'; + write; + } + else { + die "Don't know how to print '$how'"; + } + $self->_printmethod( $_, $how ) + for uniq + sort $self->meta->get_all_method_names; #$self->meta->get_method_list, + + if ( $how eq 'pod' ) { + $~ = 'METHOD_POD_CLOSE'; + write; + } } sub _printmethod { - my ($self, $methodname, $how) = @_; - return if $methodname =~ /^_/; - return if $self->meta->has_attribute($methodname); - my %internal = map {$_ => 1} qw(BUILD BUILDARGS meta can new DEMOLISHALL DESTROY - DOES isa BUILDALL does VERSION dump - ); - return if $internal{$methodname}; - my $method = $self->meta->get_method($methodname) or return; # symbols imported into namespaces i.e. not known by Moose - - return if $method->original_package_name eq __PACKAGE__; - - my $delegate_to = ''; - my $via = ''; - my $on = ''; - my $doc = ''; - my $original_pkg = $method->original_package_name; - if ($method->can('associated_attribute')) { - $delegate_to = $method->delegate_to_method; - my $aa = $method->associated_attribute; - $on = $aa->{isa}; - $via = $aa->{name}; - $original_pkg = $on; - $doc = $original_pkg->method_documentation->{$delegate_to}->{summary}; - } - else { - $doc = $method->documentation; - } - - if ($how eq 'narrow') { - $~ = 'METHOD_NARROW'; - write; - } - elsif ($how eq 'pod' and $delegate_to) { - $~ = 'METHOD_POD_DELEGATED'; - write; - } - elsif ($how eq 'pod') { - $~ = 'METHOD_POD'; - write; - } - else { - $~ = 'METHOD'; - write; - } - -# ----- format specs ----- - format METHODHEAD = + my ( $self, $methodname, $how ) = @_; + return if $methodname =~ /^_/; + return if $self->meta->has_attribute($methodname); + my %internal = map { $_ => 1 } + qw(BUILD BUILDARGS meta can new DEMOLISHALL DESTROY + DOES isa BUILDALL does VERSION dump + ); + return if $internal{$methodname}; + my $method = $self->meta->get_method($methodname) + or return; # symbols imported into namespaces i.e. not known by Moose + + return if $method->original_package_name eq __PACKAGE__; + + my $delegate_to = ''; + my $via = ''; + my $on = ''; + my $doc = ''; + my $original_pkg = $method->original_package_name; + if ( $method->can('associated_attribute') ) { + $delegate_to = $method->delegate_to_method; + my $aa = $method->associated_attribute; + $on = $aa->{isa}; + $via = $aa->{name}; + $original_pkg = $on; + $doc = $original_pkg->method_documentation->{$delegate_to}->{summary}; + } + else { + $doc = $method->documentation; + } + + if ( $how eq 'narrow' ) { + $~ = 'METHOD_NARROW'; + write; + } + elsif ( $how eq 'pod' and $delegate_to ) { + $~ = 'METHOD_POD_DELEGATED'; + write; + } + elsif ( $how eq 'pod' ) { + $~ = 'METHOD_POD'; + write; + } + else { + $~ = 'METHOD'; + write; + } + + # ----- format specs ----- + format METHODHEAD = METHODS ------- Name delegates to on via =========================================================================================================================================================================== . - format METHOD = + format METHOD = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... @<<<<<<<<<<<<<<<<... $methodname, $delegate_to, $on, $via . - format METHOD_NARROW = + format METHOD_NARROW = @* $methodname original pkg: @* @@ -272,13 +278,13 @@ $methodname . - format METHODHEAD_POD = + format METHODHEAD_POD = =head1 METHODS . - - format METHOD_POD = + + format METHOD_POD = =head2 C<@*()> $methodname @@ -288,7 +294,7 @@ $methodname . - format METHOD_POD_DELEGATED = + format METHOD_POD_DELEGATED = =head2 C<@*()> $methodname @@ -307,90 +313,96 @@ $methodname $via, $delegate_to . - format METHOD_POD_CLOSE = + format METHOD_POD_CLOSE = . -# ----- / format specs ----- + + # ----- / format specs ----- } sub _printattrs { - my ($self, $how) = @_; - - if ($how eq 'narrow') { - print <_printattr($_, $how) for sort $self->meta->get_attribute_list; - - if ($how eq 'pod') { - $~ = 'ATTR_POD_CLOSE'; - write; - } + } + elsif ( $how eq 'wide' ) { + $~ = 'ATTRHEAD'; + write; + } + elsif ( $how eq 'pod' ) { + $~ = 'ATTRHEAD_POD'; + write; + } + else { + die "Don't know how to print attributes '$how'"; + } + + $self->_printattr( $_, $how ) for sort $self->meta->get_attribute_list; + + if ( $how eq 'pod' ) { + $~ = 'ATTR_POD_CLOSE'; + write; + } } sub _printattr { - my ($self, $attrname, $how) = @_; - return if $attrname =~ /^_/; - my $attr = $self->meta->get_attribute($attrname) or die "No attr for $attrname"; - - my $is; - $is = 'rw' if $attr->get_read_method && $attr->get_write_method; - $is = 'ro' if $attr->get_read_method && ! $attr->get_write_method; - $is = 'wo' if $attr->get_write_method && ! $attr->get_read_method; - $is = '--' if ! $attr->get_write_method && ! $attr->get_read_method; - $is or die "No \$is for $attrname"; - - my $tc = $attr->type_constraint || ''; - my $from = $attr->associated_class->name || ''; - my $reqd = $attr->is_required ? 'yes' : 'no'; - my $lazy = $attr->is_lazy ? 'yes' : 'no'; - my $has_doc = $attr->has_documentation ? 'yes' : 'no'; # *_api attributes will never have doc, but other attributes might have - my $doc = $attr->documentation || ''; - my $handles = join ', ', sort @{$attr->handles || []}; - $handles ||= ''; - - if ($how eq 'narrow') { - $~ = 'ATTR_NARROW'; - } - elsif ($how eq 'pod') { - $~ = 'ATTR_POD'; - } - else { - $~ = 'ATTR'; - } + my ( $self, $attrname, $how ) = @_; + return if $attrname =~ /^_/; + my $attr = $self->meta->get_attribute($attrname) + or die "No attr for $attrname"; - write; + my $is; + $is = 'rw' if $attr->get_read_method && $attr->get_write_method; + $is = 'ro' if $attr->get_read_method && !$attr->get_write_method; + $is = 'wo' if $attr->get_write_method && !$attr->get_read_method; + $is = '--' if !$attr->get_write_method && !$attr->get_read_method; + $is or die "No \$is for $attrname"; -# ----- format specs ----- - format ATTRHEAD = + my $tc = $attr->type_constraint || ''; + my $from = $attr->associated_class->name || ''; + my $reqd = $attr->is_required ? 'yes' : 'no'; + my $lazy = $attr->is_lazy ? 'yes' : 'no'; + my $has_doc = + $attr->has_documentation + ? 'yes' + : 'no' + ; # *_api attributes will never have doc, but other attributes might have + my $doc = $attr->documentation || ''; + my $handles = join ', ', sort @{ $attr->handles || [] }; + $handles ||= ''; + + if ( $how eq 'narrow' ) { + $~ = 'ATTR_NARROW'; + } + elsif ( $how eq 'pod' ) { + $~ = 'ATTR_POD'; + } + else { + $~ = 'ATTR'; + } + + write; + + # ----- format specs ----- + format ATTRHEAD = ATTRIBUTES ---------- Name is isa reqd lazy doc handles ============================================================================================================== . - format ATTR = + format ATTR = @<<<<<<<<<<<<<<<<< @< @<<<<<<<<<<<<<<<<<<<<<<<< @<<< @<<< @<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $attrname, $is, $tc, $reqd, $lazy, $has_doc, $handles ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ $handles . - format ATTR_NARROW = + format ATTR_NARROW = @* $attrname is: @* @@ -409,11 +421,11 @@ $attrname $handles . - format ATTRHEAD_POD = + format ATTRHEAD_POD = =head1 ATTRIBUTES . - format ATTR_POD = + format ATTR_POD = =head2 C<@*> $attrname @@ -434,13 +446,12 @@ $attrname $handles . - format ATTR_POD_CLOSE = + format ATTR_POD_CLOSE = . -# ----- / format specs ----- + + # ----- / format specs ----- } - - 1; diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/StoreApi.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/StoreApi.pm index 3ffb3283251..e38450e14df 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/StoreApi.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/StoreApi.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::StoreApi; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,67 +49,73 @@ sub new { } - # # delete_order # # Delete purchase order by ID -# +# # @param string $order_id ID of the order that needs to be deleted (required) { my $params = { - 'order_id' => { - data_type => 'string', - description => 'ID of the order that needs to be deleted', - required => '1', - }, + 'order_id' => { + data_type => 'string', + description => 'ID of the order that needs to be deleted', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'delete_order' } = { - summary => 'Delete purchase order by ID', - params => $params, + __PACKAGE__->method_documentation->{'delete_order'} = { + summary => 'Delete purchase order by ID', + params => $params, returns => undef, - }; + }; } + # @return void # sub delete_order { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'order_id' is set - unless (exists $args{'order_id'}) { - croak("Missing the required parameter 'order_id' when calling delete_order"); + unless ( exists $args{'order_id'} ) { + croak( +"Missing the required parameter 'order_id' when calling delete_order" + ); } # parse inputs my $_resource_path = '/store/order/{order_id}'; - my $_method = 'DELETE'; - my $query_params = {}; + my $_method = 'DELETE'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'order_id'}) { + if ( exists $args{'order_id'} ) { my $_base_variable = "{" . "order_id" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'order_id'}); + my $_base_value = + $self->{api_client}->to_path_value( $args{'order_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -115,48 +123,53 @@ sub delete_order { # get_inventory # # Returns pet inventories by status -# +# { - my $params = { - }; - __PACKAGE__->method_documentation->{ 'get_inventory' } = { - summary => 'Returns pet inventories by status', - params => $params, + my $params = {}; + __PACKAGE__->method_documentation->{'get_inventory'} = { + summary => 'Returns pet inventories by status', + params => $params, returns => 'HASH[string,int]', - }; + }; } + # @return HASH[string,int] # sub get_inventory { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/store/inventory'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/json'); + my $_header_accept = + $self->{api_client}->select_header_accept('application/json'); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # authentication setting, if any my $auth_settings = [qw(api_key )]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('HASH[string,int]', $response); + my $_response_object = + $self->{api_client}->deserialize( 'HASH[string,int]', $response ); return $_response_object; } @@ -164,66 +177,75 @@ sub get_inventory { # get_order_by_id # # Find purchase order by ID -# +# # @param int $order_id ID of pet that needs to be fetched (required) { my $params = { - 'order_id' => { - data_type => 'int', - description => 'ID of pet that needs to be fetched', - required => '1', - }, + 'order_id' => { + data_type => 'int', + description => 'ID of pet that needs to be fetched', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'get_order_by_id' } = { - summary => 'Find purchase order by ID', - params => $params, + __PACKAGE__->method_documentation->{'get_order_by_id'} = { + summary => 'Find purchase order by ID', + params => $params, returns => 'Order', - }; + }; } + # @return Order # sub get_order_by_id { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'order_id' is set - unless (exists $args{'order_id'}) { - croak("Missing the required parameter 'order_id' when calling get_order_by_id"); + unless ( exists $args{'order_id'} ) { + croak( +"Missing the required parameter 'order_id' when calling get_order_by_id" + ); } # parse inputs my $_resource_path = '/store/order/{order_id}'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'order_id'}) { + if ( exists $args{'order_id'} ) { my $_base_variable = "{" . "order_id" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'order_id'}); + my $_base_value = + $self->{api_client}->to_path_value( $args{'order_id'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Order', $response); + my $_response_object = + $self->{api_client}->deserialize( 'Order', $response ); return $_response_object; } @@ -231,50 +253,55 @@ sub get_order_by_id { # place_order # # Place an order for a pet -# +# # @param Order $order order placed for purchasing the pet (required) { my $params = { - 'order' => { - data_type => 'Order', - description => 'order placed for purchasing the pet', - required => '1', - }, + 'order' => { + data_type => 'Order', + description => 'order placed for purchasing the pet', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'place_order' } = { - summary => 'Place an order for a pet', - params => $params, + __PACKAGE__->method_documentation->{'place_order'} = { + summary => 'Place an order for a pet', + params => $params, returns => 'Order', - }; + }; } + # @return Order # sub place_order { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'order' is set - unless (exists $args{'order'}) { - croak("Missing the required parameter 'order' when calling place_order"); + unless ( exists $args{'order'} ) { + croak( + "Missing the required parameter 'order' when calling place_order"); } # parse inputs my $_resource_path = '/store/order'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'order'}) { + if ( exists $args{'order'} ) { $_body_data = $args{'order'}; } @@ -282,13 +309,15 @@ sub place_order { my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('Order', $response); + my $_response_object = + $self->{api_client}->deserialize( 'Order', $response ); return $_response_object; } diff --git a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/UserApi.pm b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/UserApi.pm index c9aa7fe6d8b..cbcc5df92e3 100644 --- a/samples/client/petstore/perl/lib/WWW/OpenAPIClient/UserApi.pm +++ b/samples/client/petstore/perl/lib/WWW/OpenAPIClient/UserApi.pm @@ -1,3 +1,4 @@ + =begin comment OpenAPI Petstore @@ -22,7 +23,7 @@ package WWW::OpenAPIClient::UserApi; require 5.6.0; use strict; use warnings; -use utf8; +use utf8; use Exporter; use Carp qw( croak ); use Log::Any qw($log); @@ -31,15 +32,16 @@ use WWW::OpenAPIClient::ApiClient; use base "Class::Data::Inheritable"; -__PACKAGE__->mk_classdata('method_documentation' => {}); +__PACKAGE__->mk_classdata( 'method_documentation' => {} ); sub new { my $class = shift; my $api_client; - if ($_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { + if ( $_[0] && ref $_[0] && ref $_[0] eq 'WWW::OpenAPIClient::ApiClient' ) { $api_client = $_[0]; - } else { + } + else { $api_client = WWW::OpenAPIClient::ApiClient->new(@_); } @@ -47,55 +49,57 @@ sub new { } - # # create_user # # Create user -# +# # @param User $user Created user object (required) { my $params = { - 'user' => { - data_type => 'User', - description => 'Created user object', - required => '1', - }, + 'user' => { + data_type => 'User', + description => 'Created user object', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'create_user' } = { - summary => 'Create user', - params => $params, + __PACKAGE__->method_documentation->{'create_user'} = { + summary => 'Create user', + params => $params, returns => undef, - }; + }; } + # @return void # sub create_user { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'user' is set - unless (exists $args{'user'}) { - croak("Missing the required parameter 'user' when calling create_user"); + unless ( exists $args{'user'} ) { + croak("Missing the required parameter 'user' when calling create_user"); } # parse inputs my $_resource_path = '/user'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'user'}) { + if ( exists $args{'user'} ) { $_body_data = $args{'user'}; } @@ -103,9 +107,10 @@ sub create_user { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -113,50 +118,55 @@ sub create_user { # create_users_with_array_input # # Creates list of users with given input array -# +# # @param ARRAY[User] $user List of user object (required) { my $params = { - 'user' => { - data_type => 'ARRAY[User]', - description => 'List of user object', - required => '1', - }, + 'user' => { + data_type => 'ARRAY[User]', + description => 'List of user object', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'create_users_with_array_input' } = { - summary => 'Creates list of users with given input array', - params => $params, + __PACKAGE__->method_documentation->{'create_users_with_array_input'} = { + summary => 'Creates list of users with given input array', + params => $params, returns => undef, - }; + }; } + # @return void # sub create_users_with_array_input { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'user' is set - unless (exists $args{'user'}) { - croak("Missing the required parameter 'user' when calling create_users_with_array_input"); + unless ( exists $args{'user'} ) { + croak( +"Missing the required parameter 'user' when calling create_users_with_array_input" + ); } # parse inputs my $_resource_path = '/user/createWithArray'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'user'}) { + if ( exists $args{'user'} ) { $_body_data = $args{'user'}; } @@ -164,9 +174,10 @@ sub create_users_with_array_input { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -174,50 +185,55 @@ sub create_users_with_array_input { # create_users_with_list_input # # Creates list of users with given input array -# +# # @param ARRAY[User] $user List of user object (required) { my $params = { - 'user' => { - data_type => 'ARRAY[User]', - description => 'List of user object', - required => '1', - }, + 'user' => { + data_type => 'ARRAY[User]', + description => 'List of user object', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'create_users_with_list_input' } = { - summary => 'Creates list of users with given input array', - params => $params, + __PACKAGE__->method_documentation->{'create_users_with_list_input'} = { + summary => 'Creates list of users with given input array', + params => $params, returns => undef, - }; + }; } + # @return void # sub create_users_with_list_input { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'user' is set - unless (exists $args{'user'}) { - croak("Missing the required parameter 'user' when calling create_users_with_list_input"); + unless ( exists $args{'user'} ) { + croak( +"Missing the required parameter 'user' when calling create_users_with_list_input" + ); } # parse inputs my $_resource_path = '/user/createWithList'; - my $_method = 'POST'; - my $query_params = {}; + my $_method = 'POST'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # body params - if ( exists $args{'user'}) { + if ( exists $args{'user'} ) { $_body_data = $args{'user'}; } @@ -225,9 +241,10 @@ sub create_users_with_list_input { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -235,62 +252,69 @@ sub create_users_with_list_input { # delete_user # # Delete user -# +# # @param string $username The name that needs to be deleted (required) { my $params = { - 'username' => { - data_type => 'string', - description => 'The name that needs to be deleted', - required => '1', - }, + 'username' => { + data_type => 'string', + description => 'The name that needs to be deleted', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'delete_user' } = { - summary => 'Delete user', - params => $params, + __PACKAGE__->method_documentation->{'delete_user'} = { + summary => 'Delete user', + params => $params, returns => undef, - }; + }; } + # @return void # sub delete_user { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'username' is set - unless (exists $args{'username'}) { - croak("Missing the required parameter 'username' when calling delete_user"); + unless ( exists $args{'username'} ) { + croak( + "Missing the required parameter 'username' when calling delete_user" + ); } # parse inputs my $_resource_path = '/user/{username}'; - my $_method = 'DELETE'; - my $query_params = {}; + my $_method = 'DELETE'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'username'}) { + if ( exists $args{'username'} ) { my $_base_variable = "{" . "username" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'username'}); + my $_base_value = + $self->{api_client}->to_path_value( $args{'username'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -298,66 +322,76 @@ sub delete_user { # get_user_by_name # # Get user by user name -# +# # @param string $username The name that needs to be fetched. Use user1 for testing. (required) { my $params = { - 'username' => { - data_type => 'string', - description => 'The name that needs to be fetched. Use user1 for testing.', - required => '1', - }, + 'username' => { + data_type => 'string', + description => + 'The name that needs to be fetched. Use user1 for testing.', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'get_user_by_name' } = { - summary => 'Get user by user name', - params => $params, + __PACKAGE__->method_documentation->{'get_user_by_name'} = { + summary => 'Get user by user name', + params => $params, returns => 'User', - }; + }; } + # @return User # sub get_user_by_name { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'username' is set - unless (exists $args{'username'}) { - croak("Missing the required parameter 'username' when calling get_user_by_name"); + unless ( exists $args{'username'} ) { + croak( +"Missing the required parameter 'username' when calling get_user_by_name" + ); } # parse inputs my $_resource_path = '/user/{username}'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'username'}) { + if ( exists $args{'username'} ) { my $_base_variable = "{" . "username" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'username'}); + my $_base_value = + $self->{api_client}->to_path_value( $args{'username'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('User', $response); + my $_response_object = + $self->{api_client}->deserialize( 'User', $response ); return $_response_object; } @@ -365,80 +399,92 @@ sub get_user_by_name { # login_user # # Logs user into the system -# +# # @param string $username The user name for login (required) # @param string $password The password for login in clear text (required) { my $params = { - 'username' => { - data_type => 'string', - description => 'The user name for login', - required => '1', - }, - 'password' => { - data_type => 'string', - description => 'The password for login in clear text', - required => '1', - }, + 'username' => { + data_type => 'string', + description => 'The user name for login', + required => '1', + }, + 'password' => { + data_type => 'string', + description => 'The password for login in clear text', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'login_user' } = { - summary => 'Logs user into the system', - params => $params, + __PACKAGE__->method_documentation->{'login_user'} = { + summary => 'Logs user into the system', + params => $params, returns => 'string', - }; + }; } + # @return string # sub login_user { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'username' is set - unless (exists $args{'username'}) { - croak("Missing the required parameter 'username' when calling login_user"); + unless ( exists $args{'username'} ) { + croak( + "Missing the required parameter 'username' when calling login_user" + ); } # verify the required parameter 'password' is set - unless (exists $args{'password'}) { - croak("Missing the required parameter 'password' when calling login_user"); + unless ( exists $args{'password'} ) { + croak( + "Missing the required parameter 'password' when calling login_user" + ); } # parse inputs my $_resource_path = '/user/login'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header - my $_header_accept = $self->{api_client}->select_header_accept('application/xml', 'application/json'); + my $_header_accept = $self->{api_client} + ->select_header_accept( 'application/xml', 'application/json' ); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # query params - if ( exists $args{'username'}) { - $query_params->{'username'} = $self->{api_client}->to_query_value($args{'username'}); + if ( exists $args{'username'} ) { + $query_params->{'username'} = + $self->{api_client}->to_query_value( $args{'username'} ); } # query params - if ( exists $args{'password'}) { - $query_params->{'password'} = $self->{api_client}->to_query_value($args{'password'}); + if ( exists $args{'password'} ) { + $query_params->{'password'} = + $self->{api_client}->to_query_value( $args{'password'} ); } my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - my $response = $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); - if (!$response) { + my $response = $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); + if ( !$response ) { return; } - my $_response_object = $self->{api_client}->deserialize('string', $response); + my $_response_object = + $self->{api_client}->deserialize( 'string', $response ); return $_response_object; } @@ -446,44 +492,47 @@ sub login_user { # logout_user # # Logs out current logged in user session -# +# { - my $params = { - }; - __PACKAGE__->method_documentation->{ 'logout_user' } = { - summary => 'Logs out current logged in user session', - params => $params, + my $params = {}; + __PACKAGE__->method_documentation->{'logout_user'} = { + summary => 'Logs out current logged in user session', + params => $params, returns => undef, - }; + }; } + # @return void # sub logout_user { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # parse inputs my $_resource_path = '/user/logout'; - my $_method = 'GET'; - my $query_params = {}; + my $_method = 'GET'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); my $_body_data; + # authentication setting, if any my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } @@ -491,68 +540,74 @@ sub logout_user { # update_user # # Updated user -# +# # @param string $username name that need to be deleted (required) # @param User $user Updated user object (required) { my $params = { - 'username' => { - data_type => 'string', - description => 'name that need to be deleted', - required => '1', - }, - 'user' => { - data_type => 'User', - description => 'Updated user object', - required => '1', - }, + 'username' => { + data_type => 'string', + description => 'name that need to be deleted', + required => '1', + }, + 'user' => { + data_type => 'User', + description => 'Updated user object', + required => '1', + }, }; - __PACKAGE__->method_documentation->{ 'update_user' } = { - summary => 'Updated user', - params => $params, + __PACKAGE__->method_documentation->{'update_user'} = { + summary => 'Updated user', + params => $params, returns => undef, - }; + }; } + # @return void # sub update_user { - my ($self, %args) = @_; + my ( $self, %args ) = @_; # verify the required parameter 'username' is set - unless (exists $args{'username'}) { - croak("Missing the required parameter 'username' when calling update_user"); + unless ( exists $args{'username'} ) { + croak( + "Missing the required parameter 'username' when calling update_user" + ); } # verify the required parameter 'user' is set - unless (exists $args{'user'}) { - croak("Missing the required parameter 'user' when calling update_user"); + unless ( exists $args{'user'} ) { + croak("Missing the required parameter 'user' when calling update_user"); } # parse inputs my $_resource_path = '/user/{username}'; - my $_method = 'PUT'; - my $query_params = {}; + my $_method = 'PUT'; + my $query_params = {}; my $header_params = {}; - my $form_params = {}; + my $form_params = {}; # 'Accept' and 'Content-Type' header my $_header_accept = $self->{api_client}->select_header_accept(); if ($_header_accept) { $header_params->{'Accept'} = $_header_accept; } - $header_params->{'Content-Type'} = $self->{api_client}->select_header_content_type(); + $header_params->{'Content-Type'} = + $self->{api_client}->select_header_content_type(); # path params - if ( exists $args{'username'}) { + if ( exists $args{'username'} ) { my $_base_variable = "{" . "username" . "}"; - my $_base_value = $self->{api_client}->to_path_value($args{'username'}); + my $_base_value = + $self->{api_client}->to_path_value( $args{'username'} ); $_resource_path =~ s/$_base_variable/$_base_value/g; } my $_body_data; + # body params - if ( exists $args{'user'}) { + if ( exists $args{'user'} ) { $_body_data = $args{'user'}; } @@ -560,9 +615,10 @@ sub update_user { my $auth_settings = [qw()]; # make the API Call - $self->{api_client}->call_api($_resource_path, $_method, - $query_params, $form_params, - $header_params, $_body_data, $auth_settings); + $self->{api_client}->call_api( + $_resource_path, $_method, $query_params, $form_params, + $header_params, $_body_data, $auth_settings + ); return; } diff --git a/samples/client/petstore/perl/t/FileSchemaTestClassTest.t b/samples/client/petstore/perl/t/FileSchemaTestClassTest.t new file mode 100644 index 00000000000..b7a2a6d282e --- /dev/null +++ b/samples/client/petstore/perl/t/FileSchemaTestClassTest.t @@ -0,0 +1,33 @@ +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by the OpenAPI Generator +# Please update the test cases below to test the model. +# Ref: https://openapi-generator.tech +# +use Test::More tests => 2; +use Test::Exception; + +use lib 'lib'; +use strict; +use warnings; + + +use_ok('WWW::OpenAPIClient::Object::FileSchemaTestClass'); + +my $instance = WWW::OpenAPIClient::Object::FileSchemaTestClass->new(); + +isa_ok($instance, 'WWW::OpenAPIClient::Object::FileSchemaTestClass'); + diff --git a/samples/client/petstore/perl/t/FileTest.t b/samples/client/petstore/perl/t/FileTest.t new file mode 100644 index 00000000000..99f8eca953f --- /dev/null +++ b/samples/client/petstore/perl/t/FileTest.t @@ -0,0 +1,33 @@ +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by the OpenAPI Generator +# Please update the test cases below to test the model. +# Ref: https://openapi-generator.tech +# +use Test::More tests => 2; +use Test::Exception; + +use lib 'lib'; +use strict; +use warnings; + + +use_ok('WWW::OpenAPIClient::Object::File'); + +my $instance = WWW::OpenAPIClient::Object::File->new(); + +isa_ok($instance, 'WWW::OpenAPIClient::Object::File'); + diff --git a/samples/client/petstore/perl/t/StringBooleanMapTest.t b/samples/client/petstore/perl/t/StringBooleanMapTest.t new file mode 100644 index 00000000000..ffcac0b77a0 --- /dev/null +++ b/samples/client/petstore/perl/t/StringBooleanMapTest.t @@ -0,0 +1,33 @@ +=begin comment + +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +OpenAPI spec version: 1.0.0 + +Generated by: https://openapi-generator.tech + +=end comment + +=cut + +# +# NOTE: This class is auto generated by the OpenAPI Generator +# Please update the test cases below to test the model. +# Ref: https://openapi-generator.tech +# +use Test::More tests => 2; +use Test::Exception; + +use lib 'lib'; +use strict; +use warnings; + + +use_ok('WWW::OpenAPIClient::Object::StringBooleanMap'); + +my $instance = WWW::OpenAPIClient::Object::StringBooleanMap->new(); + +isa_ok($instance, 'WWW::OpenAPIClient::Object::StringBooleanMap'); + diff --git a/samples/client/petstore/perl/test.pl b/samples/client/petstore/perl/test.pl index b1690b09973..3f00dc9fb67 100755 --- a/samples/client/petstore/perl/test.pl +++ b/samples/client/petstore/perl/test.pl @@ -17,8 +17,8 @@ use DateTime; my $api = WWW::OpenAPIClient::PetApi->new( http_user_agent => 'Perl-Swagger-Test', - api_key => { api_key => 'ZZZZZZZZZZZZZZ' }, - api_key_prefix => { api_key => 'Bearer' }, + api_key => { api_key => 'ZZZZZZZZZZZZZZ' }, + api_key_prefix => { api_key => 'Bearer' }, username => 'username', password => 'password', @@ -34,27 +34,45 @@ my $api = WWW::OpenAPIClient::PetApi->new( my $pet_id = 10008; -my $category = WWW::OpenAPIClient::Object::Category->new('id' => '2', 'name' => 'perl'); -my $tag = WWW::OpenAPIClient::Object::Tag->new('id' => '1', 'name' => 'just kidding'); -my $pet = WWW::OpenAPIClient::Object::Pet->new('id' => $pet_id, 'name' => 'perl test', - "photoUrls" => ['123', 'oop'], 'tags' => [$tag], 'status' => 'pending', 'category' => $category); +my $category = + WWW::OpenAPIClient::Object::Category->new( 'id' => '2', 'name' => 'perl' ); +my $tag = + WWW::OpenAPIClient::Object::Tag->new( 'id' => '1', 'name' => 'just kidding' ); +my $pet = WWW::OpenAPIClient::Object::Pet->new( + 'id' => $pet_id, + 'name' => 'perl test', + "photoUrls" => [ '123', 'oop' ], + 'tags' => [$tag], + 'status' => 'pending', + 'category' => $category +); -print "\npet(object)=".Dumper $pet; +print "\npet(object)=" . Dumper $pet; my $json = JSON->new->convert_blessed; my $new_pet = WWW::OpenAPIClient::Object::Pet->new(); -$new_pet = $new_pet->from_hash($pet->to_hash); -print "new_pet(hash):".Dumper($new_pet->to_hash); +$new_pet = $new_pet->from_hash( $pet->to_hash ); +print "new_pet(hash):" . Dumper( $new_pet->to_hash ); print "\nTest Petstore endpoints\n"; -print "\nupload_file:".Dumper $api->upload_file(pet_id => $pet_id, additional_metadata => 'testabc', file => './test.pl'); -print "\nadd_pet:".Dumper $api->add_pet(body => $pet); -print "\nget_pet_by_id:".Dumper $api->get_pet_by_id(pet_id => $pet_id); -print "\nupdate_pet_with_form:".Dumper $api->update_pet_with_form(pet_id => $pet_id, name => 'test_name', status => 'test status'); -print "\ndelete_pet:".Dumper $api->delete_pet(pet_id => $pet_id); +print "\nupload_file:" + . Dumper $api->upload_file( + pet_id => $pet_id, + additional_metadata => 'testabc', + file => './test.pl' + ); +print "\nadd_pet:" . Dumper $api->add_pet( body => $pet ); +print "\nget_pet_by_id:" . Dumper $api->get_pet_by_id( pet_id => $pet_id ); +print "\nupdate_pet_with_form:" + . Dumper $api->update_pet_with_form( + pet_id => $pet_id, + name => 'test_name', + status => 'test status' + ); +print "\ndelete_pet:" . Dumper $api->delete_pet( pet_id => $pet_id ); my $store_api = WWW::OpenAPIClient::StoreApi->new(); -print "\nget_inventory:".Dumper $store_api->get_inventory(); +print "\nget_inventory:" . Dumper $store_api->get_inventory(); my $pet_json = <deserialize:".Dumper($api->{api_client}->deserialize("HASH[string,Pet]", $pet_json)); +print "\napi_client->deserialize:" + . Dumper( $api->{api_client}->deserialize( "HASH[string,Pet]", $pet_json ) ); diff --git a/samples/client/petstore/perl/tests/04_role.t b/samples/client/petstore/perl/tests/04_role.t index 2e074dfdc21..6cd994dd5b3 100644 --- a/samples/client/petstore/perl/tests/04_role.t +++ b/samples/client/petstore/perl/tests/04_role.t @@ -50,7 +50,7 @@ is $get_pet->tags->[0]->id, '11', 'stored and retrieved: got the proper tag id'; # API method docs is_deeply( [sort keys %{$api->pet_api->method_documentation}], - [ 'add_pet', 'delete_pet', 'find_pets_by_status', 'find_pets_by_tags', 'get_pet_by_id', 'update_pet', 'update_pet_with_form', 'upload_file'], + [ 'add_pet', 'delete_pet', 'find_pets_by_status', 'find_pets_by_tags', 'get_pet_by_id', 'update_pet', 'update_pet_with_form', 'upload_file', 'upload_file_with_required_file'], "Pet API method_documentation has the correct keys"); is $api->pet_api->method_documentation->{get_pet_by_id}->{params}->{pet_id}->{description}, 'ID of pet to return', 'get_pet_by_id parameter pet_id description is correct'; From 5d259952b3aaa816ed1e7ca179c4f873ea8e08b4 Mon Sep 17 00:00:00 2001 From: Nathan Broadbent Date: Thu, 6 Sep 2018 17:19:31 +0700 Subject: [PATCH 50/74] Added pry-byebug to debug Ruby client (#979) --- .../main/resources/ruby-client/Gemfile.lock.mustache | 10 ++++++++++ .../src/main/resources/ruby-client/Gemfile.mustache | 1 + samples/client/petstore/ruby/Gemfile | 1 + samples/client/petstore/ruby/Gemfile.lock | 10 ++++++++++ 4 files changed, 22 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache index 1c472281127..bb7eb9d3f79 100644 --- a/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache +++ b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.lock.mustache @@ -17,6 +17,8 @@ GEM sys-uname autotest-growl (0.2.16) autotest-rails-pure (4.1.2) + byebug (10.0.2) + coderay (1.1.2) crack (0.4.3) safe_yaml (~> 1.0.0) diff-lcs (1.3) @@ -25,6 +27,13 @@ GEM ffi (1.9.25) hashdiff (0.3.7) json (2.1.0) + method_source (0.9.0) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-byebug (3.6.0) + byebug (~> 10.0) + pry (~> 0.10) public_suffix (3.0.3) rake (12.0.0) rspec (3.8.0) @@ -60,6 +69,7 @@ DEPENDENCIES autotest-growl (~> 0.2, >= 0.2.16) autotest-rails-pure (~> 4.1, >= 4.1.2) {{gemName}}{{^gemName}}{{{appName}}}{{/gemName}}! + pry-byebug rake (~> 12.0.0) rspec (~> 3.6, >= 3.6.0) vcr (~> 3.0, >= 3.0.1) diff --git a/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.mustache b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.mustache index d255a3ab238..01ba313fe12 100644 --- a/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.mustache +++ b/modules/openapi-generator/src/main/resources/ruby-client/Gemfile.mustache @@ -4,4 +4,5 @@ gemspec group :development, :test do gem 'rake', '~> 12.0.0' + gem 'pry-byebug' end diff --git a/samples/client/petstore/ruby/Gemfile b/samples/client/petstore/ruby/Gemfile index d255a3ab238..01ba313fe12 100644 --- a/samples/client/petstore/ruby/Gemfile +++ b/samples/client/petstore/ruby/Gemfile @@ -4,4 +4,5 @@ gemspec group :development, :test do gem 'rake', '~> 12.0.0' + gem 'pry-byebug' end diff --git a/samples/client/petstore/ruby/Gemfile.lock b/samples/client/petstore/ruby/Gemfile.lock index 246be6b0386..0a4edb9a91b 100644 --- a/samples/client/petstore/ruby/Gemfile.lock +++ b/samples/client/petstore/ruby/Gemfile.lock @@ -17,6 +17,8 @@ GEM sys-uname autotest-growl (0.2.16) autotest-rails-pure (4.1.2) + byebug (10.0.2) + coderay (1.1.2) crack (0.4.3) safe_yaml (~> 1.0.0) diff-lcs (1.3) @@ -25,6 +27,13 @@ GEM ffi (1.9.25) hashdiff (0.3.7) json (2.1.0) + method_source (0.9.0) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-byebug (3.6.0) + byebug (~> 10.0) + pry (~> 0.10) public_suffix (3.0.3) rake (12.0.0) rspec (3.8.0) @@ -60,6 +69,7 @@ DEPENDENCIES autotest-growl (~> 0.2, >= 0.2.16) autotest-rails-pure (~> 4.1, >= 4.1.2) petstore! + pry-byebug rake (~> 12.0.0) rspec (~> 3.6, >= 3.6.0) vcr (~> 3.0, >= 3.0.1) From b9e9f54dabb0aa71c661eaf195fbd86c5a9d3600 Mon Sep 17 00:00:00 2001 From: Esteban Marin Date: Thu, 6 Sep 2018 12:21:05 +0200 Subject: [PATCH 51/74] [Typescript] add missing type mapping (#973) * #957: add missing type mapping * #957: generate samples --- .../codegen/languages/AbstractTypeScriptClientCodegen.java | 1 + .../petstore/typescript-angularjs/.openapi-generator/VERSION | 2 +- .../typescript-aurelia/default/.openapi-generator/VERSION | 2 +- .../typescript-jquery/default/.openapi-generator/VERSION | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 313588199fb..77756cf99ff 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -98,6 +98,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp typeMapping.put("object", "any"); typeMapping.put("integer", "number"); typeMapping.put("Map", "any"); + typeMapping.put("map", "any"); typeMapping.put("date", "string"); typeMapping.put("DateTime", "Date"); typeMapping.put("binary", "any"); diff --git a/samples/client/petstore/typescript-angularjs/.openapi-generator/VERSION b/samples/client/petstore/typescript-angularjs/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/typescript-angularjs/.openapi-generator/VERSION +++ b/samples/client/petstore/typescript-angularjs/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/typescript-aurelia/default/.openapi-generator/VERSION b/samples/client/petstore/typescript-aurelia/default/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/typescript-aurelia/default/.openapi-generator/VERSION +++ b/samples/client/petstore/typescript-aurelia/default/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/typescript-jquery/default/.openapi-generator/VERSION b/samples/client/petstore/typescript-jquery/default/.openapi-generator/VERSION index 14900cee60e..6d94c9c2e12 100644 --- a/samples/client/petstore/typescript-jquery/default/.openapi-generator/VERSION +++ b/samples/client/petstore/typescript-jquery/default/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file From a8cbae4dc89a7beab3ddc924a1be95092ac71f46 Mon Sep 17 00:00:00 2001 From: Matt Melling Date: Thu, 6 Sep 2018 12:48:00 +0100 Subject: [PATCH 52/74] [PHP] Upgrade php-cs-fixer to 2.12, enables PHP >= 7.2 support (#769) * upgrade php-cs-fixer to 2.12 * ran petstore-security-test for php * updating openapi3 php petstore example --- .../src/main/resources/php/.php_cs | 33 +- .../resources/php/ObjectSerializer.mustache | 4 +- .../src/main/resources/php/composer.mustache | 2 +- .../main/resources/php/model_generic.mustache | 2 +- .../php/.openapi-generator/VERSION | 2 +- .../client/petstore-security-test/php/.php_cs | 23 + .../petstore-security-test/php/.travis.yml | 10 + .../petstore-security-test/php/README.md | 112 +++++ .../petstore-security-test/php/composer.json | 38 ++ .../php/docs/Api/FakeApi.md | 57 +++ .../php/docs/Model/ModelReturn.md | 10 + .../petstore-security-test/php/git_push.sh | 52 +++ .../php/lib/Api/FakeApi.php | 321 +++++++++++++ .../php/lib/ApiException.php | 121 +++++ .../php/lib/Configuration.php | 429 ++++++++++++++++++ .../php/lib/HeaderSelector.php | 110 +++++ .../php/lib/Model/ModelInterface.php | 96 ++++ .../php/lib/Model/ModelReturn.php | 298 ++++++++++++ .../php/lib/ObjectSerializer.php | 317 +++++++++++++ .../php/phpunit.xml.dist | 21 + .../php/test/Api/FakeApiTest.php | 83 ++++ .../php/test/Model/ModelReturnTest.php | 85 ++++ .../petstore/php/OpenAPIClient-php/.php_cs | 33 +- .../php/OpenAPIClient-php/composer.json | 2 +- .../OpenAPIClient-php/lib/Model/Animal.php | 2 +- .../lib/ObjectSerializer.php | 4 +- .../petstore/php/OpenAPIClient-php/.php_cs | 33 +- .../php/OpenAPIClient-php/composer.json | 2 +- .../OpenAPIClient-php/lib/Model/Animal.php | 2 +- .../lib/ObjectSerializer.php | 4 +- 30 files changed, 2253 insertions(+), 55 deletions(-) create mode 100644 samples/client/petstore-security-test/php/.php_cs create mode 100644 samples/client/petstore-security-test/php/.travis.yml create mode 100644 samples/client/petstore-security-test/php/README.md create mode 100644 samples/client/petstore-security-test/php/composer.json create mode 100644 samples/client/petstore-security-test/php/docs/Api/FakeApi.md create mode 100644 samples/client/petstore-security-test/php/docs/Model/ModelReturn.md create mode 100644 samples/client/petstore-security-test/php/git_push.sh create mode 100644 samples/client/petstore-security-test/php/lib/Api/FakeApi.php create mode 100644 samples/client/petstore-security-test/php/lib/ApiException.php create mode 100644 samples/client/petstore-security-test/php/lib/Configuration.php create mode 100644 samples/client/petstore-security-test/php/lib/HeaderSelector.php create mode 100644 samples/client/petstore-security-test/php/lib/Model/ModelInterface.php create mode 100644 samples/client/petstore-security-test/php/lib/Model/ModelReturn.php create mode 100644 samples/client/petstore-security-test/php/lib/ObjectSerializer.php create mode 100644 samples/client/petstore-security-test/php/phpunit.xml.dist create mode 100644 samples/client/petstore-security-test/php/test/Api/FakeApiTest.php create mode 100644 samples/client/petstore-security-test/php/test/Model/ModelReturnTest.php diff --git a/modules/openapi-generator/src/main/resources/php/.php_cs b/modules/openapi-generator/src/main/resources/php/.php_cs index 6b8e23c818a..4fbe53ec5ff 100644 --- a/modules/openapi-generator/src/main/resources/php/.php_cs +++ b/modules/openapi-generator/src/main/resources/php/.php_cs @@ -1,18 +1,23 @@ level(Symfony\CS\FixerInterface::PSR2_LEVEL) +return PhpCsFixer\Config::create() ->setUsingCache(true) - ->fixers( - [ - 'ordered_use', - 'phpdoc_order', - 'short_array_syntax', - 'strict', - 'strict_param' - ] - ) - ->finder( - Symfony\CS\Finder\DefaultFinder::create() - ->in(__DIR__) + ->setRules([ + '@PSR2' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => [ 'syntax' => 'short' ], + 'strict_comparison' => true, + 'strict_param' => true, + 'no_trailing_whitespace' => false, + 'no_trailing_whitespace_in_comment' => false, + 'braces' => false, + 'single_blank_line_at_eof' => false, + 'blank_line_after_namespace' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('test') + ->exclude('tests') + ->in(__DIR__) ); diff --git a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache index 3b526da5fec..a51b202861e 100644 --- a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache +++ b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache @@ -58,7 +58,7 @@ class ObjectSerializer if ($value !== null && !in_array($openAPIType, [{{&primitives}}], true) && method_exists($openAPIType, 'getAllowableEnumValues') - && !in_array($value, $openAPIType::getAllowableEnumValues())) { + && !in_array($value, $openAPIType::getAllowableEnumValues(), true)) { $imploded = implode("', '", $openAPIType::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'"); } @@ -274,7 +274,7 @@ class ObjectSerializer return new \SplFileObject($filename, 'r'); } elseif (method_exists($class, 'getAllowableEnumValues')) { - if (!in_array($data, $class::getAllowableEnumValues())) { + if (!in_array($data, $class::getAllowableEnumValues(), true)) { $imploded = implode("', '", $class::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); } diff --git a/modules/openapi-generator/src/main/resources/php/composer.mustache b/modules/openapi-generator/src/main/resources/php/composer.mustache index 8d9b8f4674d..308241e0a00 100644 --- a/modules/openapi-generator/src/main/resources/php/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php/composer.mustache @@ -30,7 +30,7 @@ "require-dev": { "phpunit/phpunit": "^4.8", "squizlabs/php_codesniffer": "~2.6", - "friendsofphp/php-cs-fixer": "~1.12" + "friendsofphp/php-cs-fixer": "~2.12" }, "autoload": { "psr-4": { "{{escapedInvokerPackage}}\\" : "{{srcBasePath}}/" } diff --git a/modules/openapi-generator/src/main/resources/php/model_generic.mustache b/modules/openapi-generator/src/main/resources/php/model_generic.mustache index 57f557e75a0..85610c2f572 100644 --- a/modules/openapi-generator/src/main/resources/php/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/php/model_generic.mustache @@ -166,7 +166,7 @@ class {{classname}} {{#parentSchema}}extends {{{parent}}} {{/parentSchema}}{{^pa {{#discriminator}} // Initialize discriminator property with the model name. - $discriminator = array_search('{{discriminatorName}}', self::$attributeMap); + $discriminator = array_search('{{discriminatorName}}', self::$attributeMap, true); $this->container[$discriminator] = static::$openAPIModelName; {{/discriminator}} } diff --git a/samples/client/petstore-security-test/php/.openapi-generator/VERSION b/samples/client/petstore-security-test/php/.openapi-generator/VERSION index dde25ef08e8..14900cee60e 100644 --- a/samples/client/petstore-security-test/php/.openapi-generator/VERSION +++ b/samples/client/petstore-security-test/php/.openapi-generator/VERSION @@ -1 +1 @@ -3.1.1-SNAPSHOT \ No newline at end of file +3.2.1-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore-security-test/php/.php_cs b/samples/client/petstore-security-test/php/.php_cs new file mode 100644 index 00000000000..4fbe53ec5ff --- /dev/null +++ b/samples/client/petstore-security-test/php/.php_cs @@ -0,0 +1,23 @@ +setUsingCache(true) + ->setRules([ + '@PSR2' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => [ 'syntax' => 'short' ], + 'strict_comparison' => true, + 'strict_param' => true, + 'no_trailing_whitespace' => false, + 'no_trailing_whitespace_in_comment' => false, + 'braces' => false, + 'single_blank_line_at_eof' => false, + 'blank_line_after_namespace' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('test') + ->exclude('tests') + ->in(__DIR__) + ); diff --git a/samples/client/petstore-security-test/php/.travis.yml b/samples/client/petstore-security-test/php/.travis.yml new file mode 100644 index 00000000000..d77f3825f6f --- /dev/null +++ b/samples/client/petstore-security-test/php/.travis.yml @@ -0,0 +1,10 @@ +language: php +sudo: false +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - hhvm +before_install: "composer install" +script: "vendor/bin/phpunit" diff --git a/samples/client/petstore-security-test/php/README.md b/samples/client/petstore-security-test/php/README.md new file mode 100644 index 00000000000..72e324853a6 --- /dev/null +++ b/samples/client/petstore-security-test/php/README.md @@ -0,0 +1,112 @@ +# OpenAPIClient-php +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ *_/ ' \" =end -- + +This PHP package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r +- Build package: org.openapitools.codegen.languages.PhpClientCodegen + +## Requirements + +PHP 5.5 and later + +## Installation & Usage +### Composer + +To install the bindings via [Composer](http://getcomposer.org/), add the following to `composer.json`: + +``` +{ + "repositories": [ + { + "type": "git", + "url": "https://github.com/GIT_USER_ID/GIT_REPO_ID.git" + } + ], + "require": { + "GIT_USER_ID/GIT_REPO_ID": "*@dev" + } +} +``` + +Then run `composer install` + +### Manual Installation + +Download the files and include `autoload.php`: + +```php + require_once('/path/to/OpenAPIClient-php/vendor/autoload.php'); +``` + +## Tests + +To run the unit tests: + +``` +composer install +./vendor/bin/phpunit +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```php +testCodeInjectEndRnNR($unknown_base_type); +} catch (Exception $e) { + echo 'Exception when calling FakeApi->testCodeInjectEndRnNR: ', $e->getMessage(), PHP_EOL; +} + +?> +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*FakeApi* | [**testCodeInjectEndRnNR**](docs/Api/FakeApi.md#testcodeinjectendrnnr) | **PUT** /fake | To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + + +## Documentation For Models + + - [ModelReturn](docs/Model/ModelReturn.md) + + +## Documentation For Authorization + + +## api_key + +- **Type**: API key +- **API key parameter name**: api_key */ ' " =end -- \r\n \n \r +- **Location**: HTTP header + +## petstore_auth + +- **Type**: OAuth +- **Flow**: implicit +- **Authorization URL**: http://petstore.swagger.io/api/oauth/dialog +- **Scopes**: + - **write:pets**: modify pets in your account *_/ ' \" =end -- \\r\\n \\n \\r + - **read:pets**: read your pets *_/ ' \" =end -- \\r\\n \\n \\r + + +## Author + +something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r + + diff --git a/samples/client/petstore-security-test/php/composer.json b/samples/client/petstore-security-test/php/composer.json new file mode 100644 index 00000000000..834ab01d201 --- /dev/null +++ b/samples/client/petstore-security-test/php/composer.json @@ -0,0 +1,38 @@ +{ + "name": "GIT_USER_ID/GIT_REPO_ID", + "description": "", + "keywords": [ + "openapitools", + "openapi-generator", + "php", + "sdk", + "rest", + "api" + ], + "homepage": "http://openapi-generator.tech", + "license": "proprietary", + "authors": [ + { + "name": "OpenAPI-Generator contributors", + "homepage": "https://openapi-generator.tech" + } + ], + "require": { + "php": ">=5.5", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/guzzle": "^6.2" + }, + "require-dev": { + "phpunit/phpunit": "^4.8", + "squizlabs/php_codesniffer": "~2.6", + "friendsofphp/php-cs-fixer": "~2.12" + }, + "autoload": { + "psr-4": { "OpenAPI\\Client\\" : "lib/" } + }, + "autoload-dev": { + "psr-4": { "OpenAPI\\Client\\" : "test/" } + } +} diff --git a/samples/client/petstore-security-test/php/docs/Api/FakeApi.md b/samples/client/petstore-security-test/php/docs/Api/FakeApi.md new file mode 100644 index 00000000000..afee7db1162 --- /dev/null +++ b/samples/client/petstore-security-test/php/docs/Api/FakeApi.md @@ -0,0 +1,57 @@ +# OpenAPI\Client\FakeApi + +All URIs are relative to *http://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**testCodeInjectEndRnNR**](FakeApi.md#testCodeInjectEndRnNR) | **PUT** /fake | To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + + +# **testCodeInjectEndRnNR** +> testCodeInjectEndRnNR($unknown_base_type) + +To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + +To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + +### Example +```php +testCodeInjectEndRnNR($unknown_base_type); +} catch (Exception $e) { + echo 'Exception when calling FakeApi->testCodeInjectEndRnNR: ', $e->getMessage(), PHP_EOL; +} +?> +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **unknown_base_type** | [**\OpenAPI\Client\Model\UNKNOWN_BASE_TYPE**](../Model/UNKNOWN_BASE_TYPE.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json, *_/ \" =end -- + - **Accept**: Not defined + +[[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) + diff --git a/samples/client/petstore-security-test/php/docs/Model/ModelReturn.md b/samples/client/petstore-security-test/php/docs/Model/ModelReturn.md new file mode 100644 index 00000000000..efd25fe6d22 --- /dev/null +++ b/samples/client/petstore-security-test/php/docs/Model/ModelReturn.md @@ -0,0 +1,10 @@ +# ModelReturn + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**return** | **int** | property description *_/ ' \" =end -- \\r\\n \\n \\r | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/client/petstore-security-test/php/git_push.sh b/samples/client/petstore-security-test/php/git_push.sh new file mode 100644 index 00000000000..20057f67ade --- /dev/null +++ b/samples/client/petstore-security-test/php/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore-security-test/php/lib/Api/FakeApi.php b/samples/client/petstore-security-test/php/lib/Api/FakeApi.php new file mode 100644 index 00000000000..9908f6d7075 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/Api/FakeApi.php @@ -0,0 +1,321 @@ +client = $client ?: new Client(); + $this->config = $config ?: new Configuration(); + $this->headerSelector = $selector ?: new HeaderSelector(); + } + + /** + * @return Configuration + */ + public function getConfig() + { + return $this->config; + } + + /** + * Operation testCodeInjectEndRnNR + * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + * + * @param \OpenAPI\Client\Model\UNKNOWN_BASE_TYPE $unknown_base_type unknown_base_type (optional) + * + * @throws \OpenAPI\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return void + */ + public function testCodeInjectEndRnNR($unknown_base_type = null) + { + $this->testCodeInjectEndRnNRWithHttpInfo($unknown_base_type); + } + + /** + * Operation testCodeInjectEndRnNRWithHttpInfo + * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + * + * @param \OpenAPI\Client\Model\UNKNOWN_BASE_TYPE $unknown_base_type (optional) + * + * @throws \OpenAPI\Client\ApiException on non-2xx response + * @throws \InvalidArgumentException + * @return array of null, HTTP status code, HTTP response headers (array of strings) + */ + public function testCodeInjectEndRnNRWithHttpInfo($unknown_base_type = null) + { + $request = $this->testCodeInjectEndRnNRRequest($unknown_base_type); + + try { + $options = $this->createHttpClientOption(); + try { + $response = $this->client->send($request, $options); + } catch (RequestException $e) { + throw new ApiException( + "[{$e->getCode()}] {$e->getMessage()}", + $e->getCode(), + $e->getResponse() ? $e->getResponse()->getHeaders() : null, + $e->getResponse() ? $e->getResponse()->getBody()->getContents() : null + ); + } + + $statusCode = $response->getStatusCode(); + + if ($statusCode < 200 || $statusCode > 299) { + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $request->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + + return [null, $statusCode, $response->getHeaders()]; + + } catch (ApiException $e) { + switch ($e->getCode()) { + } + throw $e; + } + } + + /** + * Operation testCodeInjectEndRnNRAsync + * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + * + * @param \OpenAPI\Client\Model\UNKNOWN_BASE_TYPE $unknown_base_type (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function testCodeInjectEndRnNRAsync($unknown_base_type = null) + { + return $this->testCodeInjectEndRnNRAsyncWithHttpInfo($unknown_base_type) + ->then( + function ($response) { + return $response[0]; + } + ); + } + + /** + * Operation testCodeInjectEndRnNRAsyncWithHttpInfo + * + * To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + * + * @param \OpenAPI\Client\Model\UNKNOWN_BASE_TYPE $unknown_base_type (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Promise\PromiseInterface + */ + public function testCodeInjectEndRnNRAsyncWithHttpInfo($unknown_base_type = null) + { + $returnType = ''; + $request = $this->testCodeInjectEndRnNRRequest($unknown_base_type); + + return $this->client + ->sendAsync($request, $this->createHttpClientOption()) + ->then( + function ($response) use ($returnType) { + return [null, $response->getStatusCode(), $response->getHeaders()]; + }, + function ($exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + throw new ApiException( + sprintf( + '[%d] Error connecting to the API (%s)', + $statusCode, + $exception->getRequest()->getUri() + ), + $statusCode, + $response->getHeaders(), + $response->getBody() + ); + } + ); + } + + /** + * Create request for operation 'testCodeInjectEndRnNR' + * + * @param \OpenAPI\Client\Model\UNKNOWN_BASE_TYPE $unknown_base_type (optional) + * + * @throws \InvalidArgumentException + * @return \GuzzleHttp\Psr7\Request + */ + protected function testCodeInjectEndRnNRRequest($unknown_base_type = null) + { + + $resourcePath = '/fake'; + $formParams = []; + $queryParams = []; + $headerParams = []; + $httpBody = ''; + $multipart = false; + + + + // body params + $_tempBody = null; + if (isset($unknown_base_type)) { + $_tempBody = $unknown_base_type; + } + + if ($multipart) { + $headers = $this->headerSelector->selectHeadersForMultipart( + [] + ); + } else { + $headers = $this->headerSelector->selectHeaders( + [], + ['application/json', '*_/ \" =end --'] + ); + } + + // for model (json/xml) + if (isset($_tempBody)) { + // $_tempBody is the method argument, if present + $httpBody = $_tempBody; + // \stdClass has no __toString(), so we should encode it manually + if ($httpBody instanceof \stdClass && $headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($httpBody); + } + } elseif (count($formParams) > 0) { + if ($multipart) { + $multipartContents = []; + foreach ($formParams as $formParamName => $formParamValue) { + $multipartContents[] = [ + 'name' => $formParamName, + 'contents' => $formParamValue + ]; + } + // for HTTP post (form) + $httpBody = new MultipartStream($multipartContents); + + } elseif ($headers['Content-Type'] === 'application/json') { + $httpBody = \GuzzleHttp\json_encode($formParams); + + } else { + // for HTTP post (form) + $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + } + } + + + $defaultHeaders = []; + if ($this->config->getUserAgent()) { + $defaultHeaders['User-Agent'] = $this->config->getUserAgent(); + } + + $headers = array_merge( + $defaultHeaders, + $headerParams, + $headers + ); + + $query = \GuzzleHttp\Psr7\build_query($queryParams); + return new Request( + 'PUT', + $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), + $headers, + $httpBody + ); + } + + /** + * Create http client option + * + * @throws \RuntimeException on file opening failure + * @return array of http client options + */ + protected function createHttpClientOption() + { + $options = []; + if ($this->config->getDebug()) { + $options[RequestOptions::DEBUG] = fopen($this->config->getDebugFile(), 'a'); + if (!$options[RequestOptions::DEBUG]) { + throw new \RuntimeException('Failed to open the debug file: ' . $this->config->getDebugFile()); + } + } + + return $options; + } +} diff --git a/samples/client/petstore-security-test/php/lib/ApiException.php b/samples/client/petstore-security-test/php/lib/ApiException.php new file mode 100644 index 00000000000..06960702b35 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/ApiException.php @@ -0,0 +1,121 @@ +responseHeaders = $responseHeaders; + $this->responseBody = $responseBody; + } + + /** + * Gets the HTTP response header + * + * @return string[]|null HTTP response header + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * Gets the HTTP body of the server response either as Json or string + * + * @return mixed HTTP body of the server response either as \stdClass or string + */ + public function getResponseBody() + { + return $this->responseBody; + } + + /** + * Sets the deseralized response object (during deserialization) + * + * @param mixed $obj Deserialized response object + * + * @return void + */ + public function setResponseObject($obj) + { + $this->responseObject = $obj; + } + + /** + * Gets the deseralized response object (during deserialization) + * + * @return mixed the deserialized response object + */ + public function getResponseObject() + { + return $this->responseObject; + } +} diff --git a/samples/client/petstore-security-test/php/lib/Configuration.php b/samples/client/petstore-security-test/php/lib/Configuration.php new file mode 100644 index 00000000000..1e2b013ccf0 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/Configuration.php @@ -0,0 +1,429 @@ +tempFolderPath = sys_get_temp_dir(); + } + + /** + * Sets API key + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * @param string $key API key or token + * + * @return $this + */ + public function setApiKey($apiKeyIdentifier, $key) + { + $this->apiKeys[$apiKeyIdentifier] = $key; + return $this; + } + + /** + * Gets API key + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * + * @return string API key or token + */ + public function getApiKey($apiKeyIdentifier) + { + return isset($this->apiKeys[$apiKeyIdentifier]) ? $this->apiKeys[$apiKeyIdentifier] : null; + } + + /** + * Sets the prefix for API key (e.g. Bearer) + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * @param string $prefix API key prefix, e.g. Bearer + * + * @return $this + */ + public function setApiKeyPrefix($apiKeyIdentifier, $prefix) + { + $this->apiKeyPrefixes[$apiKeyIdentifier] = $prefix; + return $this; + } + + /** + * Gets API key prefix + * + * @param string $apiKeyIdentifier API key identifier (authentication scheme) + * + * @return string + */ + public function getApiKeyPrefix($apiKeyIdentifier) + { + return isset($this->apiKeyPrefixes[$apiKeyIdentifier]) ? $this->apiKeyPrefixes[$apiKeyIdentifier] : null; + } + + /** + * Sets the access token for OAuth + * + * @param string $accessToken Token for OAuth + * + * @return $this + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + return $this; + } + + /** + * Gets the access token for OAuth + * + * @return string Access token for OAuth + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Sets the username for HTTP basic authentication + * + * @param string $username Username for HTTP basic authentication + * + * @return $this + */ + public function setUsername($username) + { + $this->username = $username; + return $this; + } + + /** + * Gets the username for HTTP basic authentication + * + * @return string Username for HTTP basic authentication + */ + public function getUsername() + { + return $this->username; + } + + /** + * Sets the password for HTTP basic authentication + * + * @param string $password Password for HTTP basic authentication + * + * @return $this + */ + public function setPassword($password) + { + $this->password = $password; + return $this; + } + + /** + * Gets the password for HTTP basic authentication + * + * @return string Password for HTTP basic authentication + */ + public function getPassword() + { + return $this->password; + } + + /** + * Sets the host + * + * @param string $host Host + * + * @return $this + */ + public function setHost($host) + { + $this->host = $host; + return $this; + } + + /** + * Gets the host + * + * @return string Host + */ + public function getHost() + { + return $this->host; + } + + /** + * Sets the user agent of the api client + * + * @param string $userAgent the user agent of the api client + * + * @throws \InvalidArgumentException + * @return $this + */ + public function setUserAgent($userAgent) + { + if (!is_string($userAgent)) { + throw new \InvalidArgumentException('User-agent must be a string.'); + } + + $this->userAgent = $userAgent; + return $this; + } + + /** + * Gets the user agent of the api client + * + * @return string user agent + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Sets debug flag + * + * @param bool $debug Debug flag + * + * @return $this + */ + public function setDebug($debug) + { + $this->debug = $debug; + return $this; + } + + /** + * Gets the debug flag + * + * @return bool + */ + public function getDebug() + { + return $this->debug; + } + + /** + * Sets the debug file + * + * @param string $debugFile Debug file + * + * @return $this + */ + public function setDebugFile($debugFile) + { + $this->debugFile = $debugFile; + return $this; + } + + /** + * Gets the debug file + * + * @return string + */ + public function getDebugFile() + { + return $this->debugFile; + } + + /** + * Sets the temp folder path + * + * @param string $tempFolderPath Temp folder path + * + * @return $this + */ + public function setTempFolderPath($tempFolderPath) + { + $this->tempFolderPath = $tempFolderPath; + return $this; + } + + /** + * Gets the temp folder path + * + * @return string Temp folder path + */ + public function getTempFolderPath() + { + return $this->tempFolderPath; + } + + /** + * Gets the default configuration instance + * + * @return Configuration + */ + public static function getDefaultConfiguration() + { + if (self::$defaultConfiguration === null) { + self::$defaultConfiguration = new Configuration(); + } + + return self::$defaultConfiguration; + } + + /** + * Sets the detault configuration instance + * + * @param Configuration $config An instance of the Configuration Object + * + * @return void + */ + public static function setDefaultConfiguration(Configuration $config) + { + self::$defaultConfiguration = $config; + } + + /** + * Gets the essential information for debugging + * + * @return string The report for debugging + */ + public static function toDebugReport() + { + $report = 'PHP SDK (OpenAPI\Client) Debug Report:' . PHP_EOL; + $report .= ' OS: ' . php_uname() . PHP_EOL; + $report .= ' PHP Version: ' . PHP_VERSION . PHP_EOL; + $report .= ' OpenAPI Spec Version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r' . PHP_EOL; + $report .= ' Temp Folder Path: ' . self::getDefaultConfiguration()->getTempFolderPath() . PHP_EOL; + + return $report; + } + + /** + * Get API key (with prefix if set) + * + * @param string $apiKeyIdentifier name of apikey + * + * @return string API key with the prefix + */ + public function getApiKeyWithPrefix($apiKeyIdentifier) + { + $prefix = $this->getApiKeyPrefix($apiKeyIdentifier); + $apiKey = $this->getApiKey($apiKeyIdentifier); + + if ($apiKey === null) { + return null; + } + + if ($prefix === null) { + $keyWithPrefix = $apiKey; + } else { + $keyWithPrefix = $prefix . ' ' . $apiKey; + } + + return $keyWithPrefix; + } +} diff --git a/samples/client/petstore-security-test/php/lib/HeaderSelector.php b/samples/client/petstore-security-test/php/lib/HeaderSelector.php new file mode 100644 index 00000000000..fac0c0df7d8 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/HeaderSelector.php @@ -0,0 +1,110 @@ +selectAcceptHeader($accept); + if ($accept !== null) { + $headers['Accept'] = $accept; + } + + $headers['Content-Type'] = $this->selectContentTypeHeader($contentTypes); + return $headers; + } + + /** + * @param string[] $accept + * @return array + */ + public function selectHeadersForMultipart($accept) + { + $headers = $this->selectHeaders($accept, []); + + unset($headers['Content-Type']); + return $headers; + } + + /** + * Return the header 'Accept' based on an array of Accept provided + * + * @param string[] $accept Array of header + * + * @return string Accept (e.g. application/json) + */ + private function selectAcceptHeader($accept) + { + if (count($accept) === 0 || (count($accept) === 1 && $accept[0] === '')) { + return null; + } elseif (preg_grep("/application\/json/i", $accept)) { + return 'application/json'; + } else { + return implode(',', $accept); + } + } + + /** + * Return the content type based on an array of content-type provided + * + * @param string[] $contentType Array fo content-type + * + * @return string Content-Type (e.g. application/json) + */ + private function selectContentTypeHeader($contentType) + { + if (count($contentType) === 0 || (count($contentType) === 1 && $contentType[0] === '')) { + return 'application/json'; + } elseif (preg_grep("/application\/json/i", $contentType)) { + return 'application/json'; + } else { + return implode(',', $contentType); + } + } +} + diff --git a/samples/client/petstore-security-test/php/lib/Model/ModelInterface.php b/samples/client/petstore-security-test/php/lib/Model/ModelInterface.php new file mode 100644 index 00000000000..b1bff06abb2 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/Model/ModelInterface.php @@ -0,0 +1,96 @@ + 'int' + ]; + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @var string[] + */ + protected static $openAPIFormats = [ + 'return' => 'int32' + ]; + + /** + * Array of property to type mappings. Used for (de)serialization + * + * @return array + */ + public static function openAPITypes() + { + return self::$openAPITypes; + } + + /** + * Array of property to format mappings. Used for (de)serialization + * + * @return array + */ + public static function openAPIFormats() + { + return self::$openAPIFormats; + } + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @var string[] + */ + protected static $attributeMap = [ + 'return' => 'return' + ]; + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @var string[] + */ + protected static $setters = [ + 'return' => 'setReturn' + ]; + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @var string[] + */ + protected static $getters = [ + 'return' => 'getReturn' + ]; + + /** + * Array of attributes where the key is the local name, + * and the value is the original name + * + * @return array + */ + public static function attributeMap() + { + return self::$attributeMap; + } + + /** + * Array of attributes to setter functions (for deserialization of responses) + * + * @return array + */ + public static function setters() + { + return self::$setters; + } + + /** + * Array of attributes to getter functions (for serialization of requests) + * + * @return array + */ + public static function getters() + { + return self::$getters; + } + + /** + * The original name of the model. + * + * @return string + */ + public function getModelName() + { + return self::$openAPIModelName; + } + + + + + + /** + * Associative array for storing property values + * + * @var mixed[] + */ + protected $container = []; + + /** + * Constructor + * + * @param mixed[] $data Associated array of property values + * initializing the model + */ + public function __construct(array $data = null) + { + $this->container['return'] = isset($data['return']) ? $data['return'] : null; + } + + /** + * Show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() + { + $invalidProperties = []; + + return $invalidProperties; + } + + /** + * Validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() + { + return count($this->listInvalidProperties()) === 0; + } + + + /** + * Gets return + * + * @return int|null + */ + public function getReturn() + { + return $this->container['return']; + } + + /** + * Sets return + * + * @param int|null $return property description *_/ ' \" =end -- \\r\\n \\n \\r + * + * @return $this + */ + public function setReturn($return) + { + $this->container['return'] = $return; + + return $this; + } + /** + * Returns true if offset exists. False otherwise. + * + * @param integer $offset Offset + * + * @return boolean + */ + public function offsetExists($offset) + { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * + * @param integer $offset Offset + * + * @return mixed + */ + public function offsetGet($offset) + { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * + * @param integer $offset Offset + * @param mixed $value Value to be set + * + * @return void + */ + public function offsetSet($offset, $value) + { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * + * @param integer $offset Offset + * + * @return void + */ + public function offsetUnset($offset) + { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * + * @return string + */ + public function __toString() + { + return json_encode( + ObjectSerializer::sanitizeForSerialization($this), + JSON_PRETTY_PRINT + ); + } +} + + diff --git a/samples/client/petstore-security-test/php/lib/ObjectSerializer.php b/samples/client/petstore-security-test/php/lib/ObjectSerializer.php new file mode 100644 index 00000000000..4cc6b43e564 --- /dev/null +++ b/samples/client/petstore-security-test/php/lib/ObjectSerializer.php @@ -0,0 +1,317 @@ +format('Y-m-d') : $data->format(\DateTime::ATOM); + } elseif (is_array($data)) { + foreach ($data as $property => $value) { + $data[$property] = self::sanitizeForSerialization($value); + } + return $data; + } elseif (is_object($data)) { + $values = []; + $formats = $data::openAPIFormats(); + foreach ($data::openAPITypes() as $property => $openAPIType) { + $getter = $data::getters()[$property]; + $value = $data->$getter(); + if ($value !== null + && !in_array($openAPIType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) + && method_exists($openAPIType, 'getAllowableEnumValues') + && !in_array($value, $openAPIType::getAllowableEnumValues(), true)) { + $imploded = implode("', '", $openAPIType::getAllowableEnumValues()); + throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'"); + } + if ($value !== null) { + $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]); + } + } + return (object)$values; + } else { + return (string)$data; + } + } + + /** + * Sanitize filename by removing path. + * e.g. ../../sun.gif becomes sun.gif + * + * @param string $filename filename to be sanitized + * + * @return string the sanitized filename + */ + public static function sanitizeFilename($filename) + { + if (preg_match("/.*[\/\\\\](.*)$/", $filename, $match)) { + return $match[1]; + } else { + return $filename; + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the path, by url-encoding. + * + * @param string $value a string which will be part of the path + * + * @return string the serialized object + */ + public static function toPathValue($value) + { + return rawurlencode(self::toString($value)); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the query, by imploding comma-separated if it's an object. + * If it's a string, pass through unchanged. It will be url-encoded + * later. + * + * @param string[]|string|\DateTime $object an object to be serialized to a string + * + * @return string the serialized object + */ + public static function toQueryValue($object) + { + if (is_array($object)) { + return implode(',', $object); + } else { + return self::toString($object); + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the header. If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string $value a string which will be part of the header + * + * @return string the header string + */ + public static function toHeaderValue($value) + { + return self::toString($value); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the http body (form parameter). If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string|\SplFileObject $value the value of the form parameter + * + * @return string the form string + */ + public static function toFormValue($value) + { + if ($value instanceof \SplFileObject) { + return $value->getRealPath(); + } else { + return self::toString($value); + } + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the parameter. If it's a string, pass through unchanged + * If it's a datetime object, format it in ISO8601 + * + * @param string|\DateTime $value the value of the parameter + * + * @return string the header string + */ + public static function toString($value) + { + if ($value instanceof \DateTime) { // datetime in ISO8601 format + return $value->format(\DateTime::ATOM); + } else { + return $value; + } + } + + /** + * Serialize an array to a string. + * + * @param array $collection collection to serialize to a string + * @param string $collectionFormat the format use for serialization (csv, + * ssv, tsv, pipes, multi) + * @param bool $allowCollectionFormatMulti allow collection format to be a multidimensional array + * + * @return string + */ + public static function serializeCollection(array $collection, $collectionFormat, $allowCollectionFormatMulti = false) + { + if ($allowCollectionFormatMulti && ('multi' === $collectionFormat)) { + // http_build_query() almost does the job for us. We just + // need to fix the result of multidimensional arrays. + return preg_replace('/%5B[0-9]+%5D=/', '=', http_build_query($collection, '', '&')); + } + switch ($collectionFormat) { + case 'pipes': + return implode('|', $collection); + + case 'tsv': + return implode("\t", $collection); + + case 'ssv': + return implode(' ', $collection); + + case 'csv': + // Deliberate fall through. CSV is default format. + default: + return implode(',', $collection); + } + } + + /** + * Deserialize a JSON string into an object + * + * @param mixed $data object or primitive to be deserialized + * @param string $class class name is passed as a string + * @param string[] $httpHeaders HTTP headers + * @param string $discriminator discriminator if polymorphism is used + * + * @return object|array|null a single or an array of $class instances + */ + public static function deserialize($data, $class, $httpHeaders = null) + { + if (null === $data) { + return null; + } elseif (substr($class, 0, 4) === 'map[') { // for associative array e.g. map[string,int] + $inner = substr($class, 4, -1); + $deserialized = []; + if (strrpos($inner, ",") !== false) { + $subClass_array = explode(',', $inner, 2); + $subClass = $subClass_array[1]; + foreach ($data as $key => $value) { + $deserialized[$key] = self::deserialize($value, $subClass, null); + } + } + return $deserialized; + } elseif (strcasecmp(substr($class, -2), '[]') === 0) { + $subClass = substr($class, 0, -2); + $values = []; + foreach ($data as $key => $value) { + $values[] = self::deserialize($value, $subClass, null); + } + return $values; + } elseif ($class === 'object') { + settype($data, 'array'); + return $data; + } elseif ($class === '\DateTime') { + // Some API's return an invalid, empty string as a + // date-time property. DateTime::__construct() will return + // the current time for empty input which is probably not + // what is meant. The invalid empty string is probably to + // be interpreted as a missing field/value. Let's handle + // this graceful. + if (!empty($data)) { + return new \DateTime($data); + } else { + return null; + } + } elseif (in_array($class, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) { + settype($data, $class); + return $data; + } elseif ($class === '\SplFileObject') { + /** @var \Psr\Http\Message\StreamInterface $data */ + + // determine file name + if (array_key_exists('Content-Disposition', $httpHeaders) && + preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeaders['Content-Disposition'], $match)) { + $filename = Configuration::getDefaultConfiguration()->getTempFolderPath() . DIRECTORY_SEPARATOR . self::sanitizeFilename($match[1]); + } else { + $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), ''); + } + + $file = fopen($filename, 'w'); + while ($chunk = $data->read(200)) { + fwrite($file, $chunk); + } + fclose($file); + + return new \SplFileObject($filename, 'r'); + } elseif (method_exists($class, 'getAllowableEnumValues')) { + if (!in_array($data, $class::getAllowableEnumValues(), true)) { + $imploded = implode("', '", $class::getAllowableEnumValues()); + throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); + } + return $data; + } else { + // If a discriminator is defined and points to a valid subclass, use it. + $discriminator = $class::DISCRIMINATOR; + if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { + $subclass = '\OpenAPI\Client\Model\\' . $data->{$discriminator}; + if (is_subclass_of($subclass, $class)) { + $class = $subclass; + } + } + $instance = new $class(); + foreach ($instance::openAPITypes() as $property => $type) { + $propertySetter = $instance::setters()[$property]; + + if (!isset($propertySetter) || !isset($data->{$instance::attributeMap()[$property]})) { + continue; + } + + $propertyValue = $data->{$instance::attributeMap()[$property]}; + if (isset($propertyValue)) { + $instance->$propertySetter(self::deserialize($propertyValue, $type, null)); + } + } + return $instance; + } + } +} diff --git a/samples/client/petstore-security-test/php/phpunit.xml.dist b/samples/client/petstore-security-test/php/phpunit.xml.dist new file mode 100644 index 00000000000..c12ee148477 --- /dev/null +++ b/samples/client/petstore-security-test/php/phpunit.xml.dist @@ -0,0 +1,21 @@ + + + + + ./test/Api + ./test/Model + + + + + + ./lib/Api + ./lib/Model + + + diff --git a/samples/client/petstore-security-test/php/test/Api/FakeApiTest.php b/samples/client/petstore-security-test/php/test/Api/FakeApiTest.php new file mode 100644 index 00000000000..07057cd8a7f --- /dev/null +++ b/samples/client/petstore-security-test/php/test/Api/FakeApiTest.php @@ -0,0 +1,83 @@ +level(Symfony\CS\FixerInterface::PSR2_LEVEL) +return PhpCsFixer\Config::create() ->setUsingCache(true) - ->fixers( - [ - 'ordered_use', - 'phpdoc_order', - 'short_array_syntax', - 'strict', - 'strict_param' - ] - ) - ->finder( - Symfony\CS\Finder\DefaultFinder::create() - ->in(__DIR__) + ->setRules([ + '@PSR2' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => [ 'syntax' => 'short' ], + 'strict_comparison' => true, + 'strict_param' => true, + 'no_trailing_whitespace' => false, + 'no_trailing_whitespace_in_comment' => false, + 'braces' => false, + 'single_blank_line_at_eof' => false, + 'blank_line_after_namespace' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('test') + ->exclude('tests') + ->in(__DIR__) ); diff --git a/samples/client/petstore/php/OpenAPIClient-php/composer.json b/samples/client/petstore/php/OpenAPIClient-php/composer.json index 65d3c935fb8..834ab01d201 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/composer.json +++ b/samples/client/petstore/php/OpenAPIClient-php/composer.json @@ -27,7 +27,7 @@ "require-dev": { "phpunit/phpunit": "^4.8", "squizlabs/php_codesniffer": "~2.6", - "friendsofphp/php-cs-fixer": "~1.12" + "friendsofphp/php-cs-fixer": "~2.12" }, "autoload": { "psr-4": { "OpenAPI\\Client\\" : "lib/" } diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php index e82b58735b2..9fb1b1f0dbd 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php @@ -186,7 +186,7 @@ class Animal implements ModelInterface, ArrayAccess $this->container['color'] = isset($data['color']) ? $data['color'] : 'red'; // Initialize discriminator property with the model name. - $discriminator = array_search('className', self::$attributeMap); + $discriminator = array_search('className', self::$attributeMap, true); $this->container[$discriminator] = static::$openAPIModelName; } diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php index 36d3d8fd425..52cd983335e 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php @@ -68,7 +68,7 @@ class ObjectSerializer if ($value !== null && !in_array($openAPIType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) && method_exists($openAPIType, 'getAllowableEnumValues') - && !in_array($value, $openAPIType::getAllowableEnumValues())) { + && !in_array($value, $openAPIType::getAllowableEnumValues(), true)) { $imploded = implode("', '", $openAPIType::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'"); } @@ -284,7 +284,7 @@ class ObjectSerializer return new \SplFileObject($filename, 'r'); } elseif (method_exists($class, 'getAllowableEnumValues')) { - if (!in_array($data, $class::getAllowableEnumValues())) { + if (!in_array($data, $class::getAllowableEnumValues(), true)) { $imploded = implode("', '", $class::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); } diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/.php_cs b/samples/openapi3/client/petstore/php/OpenAPIClient-php/.php_cs index 6b8e23c818a..4fbe53ec5ff 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/.php_cs +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/.php_cs @@ -1,18 +1,23 @@ level(Symfony\CS\FixerInterface::PSR2_LEVEL) +return PhpCsFixer\Config::create() ->setUsingCache(true) - ->fixers( - [ - 'ordered_use', - 'phpdoc_order', - 'short_array_syntax', - 'strict', - 'strict_param' - ] - ) - ->finder( - Symfony\CS\Finder\DefaultFinder::create() - ->in(__DIR__) + ->setRules([ + '@PSR2' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => [ 'syntax' => 'short' ], + 'strict_comparison' => true, + 'strict_param' => true, + 'no_trailing_whitespace' => false, + 'no_trailing_whitespace_in_comment' => false, + 'braces' => false, + 'single_blank_line_at_eof' => false, + 'blank_line_after_namespace' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('test') + ->exclude('tests') + ->in(__DIR__) ); diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json b/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json index 65d3c935fb8..834ab01d201 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json @@ -27,7 +27,7 @@ "require-dev": { "phpunit/phpunit": "^4.8", "squizlabs/php_codesniffer": "~2.6", - "friendsofphp/php-cs-fixer": "~1.12" + "friendsofphp/php-cs-fixer": "~2.12" }, "autoload": { "psr-4": { "OpenAPI\\Client\\" : "lib/" } diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php index e82b58735b2..9fb1b1f0dbd 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Model/Animal.php @@ -186,7 +186,7 @@ class Animal implements ModelInterface, ArrayAccess $this->container['color'] = isset($data['color']) ? $data['color'] : 'red'; // Initialize discriminator property with the model name. - $discriminator = array_search('className', self::$attributeMap); + $discriminator = array_search('className', self::$attributeMap, true); $this->container[$discriminator] = static::$openAPIModelName; } diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php index 36d3d8fd425..52cd983335e 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php @@ -68,7 +68,7 @@ class ObjectSerializer if ($value !== null && !in_array($openAPIType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) && method_exists($openAPIType, 'getAllowableEnumValues') - && !in_array($value, $openAPIType::getAllowableEnumValues())) { + && !in_array($value, $openAPIType::getAllowableEnumValues(), true)) { $imploded = implode("', '", $openAPIType::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'"); } @@ -284,7 +284,7 @@ class ObjectSerializer return new \SplFileObject($filename, 'r'); } elseif (method_exists($class, 'getAllowableEnumValues')) { - if (!in_array($data, $class::getAllowableEnumValues())) { + if (!in_array($data, $class::getAllowableEnumValues(), true)) { $imploded = implode("', '", $class::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); } From c5463232d32bd69e809dc9f8f2a2c1e23d457cbf Mon Sep 17 00:00:00 2001 From: Yann Milin Date: Thu, 6 Sep 2018 17:52:59 +0200 Subject: [PATCH 53/74] [PHP] Fix deserialize ApiException as a Model (#757) * [PHP] Fix deserialize for default responses. Update samples * [PHP] Update sample files * Fix the distination ("-o") of petstore-security-test * Clean up "petstore-security-test" folder * Update petstore-security-test sample files * Update petstore OpenAPI3 sample files --- bin/security/php-petstore.sh | 2 +- .../resources/php/ObjectSerializer.mustache | 4 ++ .../src/main/resources/php/api.mustache | 9 ---- .../php/.openapi-generator/VERSION | 2 +- .../.openapi-generator-ignore | 23 ++++++++++ .../.openapi-generator/VERSION | 1 + .../php/OpenAPIClient-php/docs/Api/FakeApi.md | 2 + .../php/OpenAPIClient-php/lib/Api/FakeApi.php | 2 +- .../OpenAPIClient-php/lib/ApiException.php | 2 +- .../OpenAPIClient-php/lib/Configuration.php | 2 +- .../OpenAPIClient-php/lib/HeaderSelector.php | 2 +- .../lib/Model/ModelInterface.php | 2 +- .../lib/Model/ModelReturn.php | 2 +- .../lib/ObjectSerializer.php | 6 ++- .../lib/Api/AnotherFakeApi.php | 9 ---- .../php/OpenAPIClient-php/lib/Api/FakeApi.php | 45 ------------------- .../lib/Api/FakeClassnameTags123Api.php | 9 ---- .../php/OpenAPIClient-php/lib/Api/PetApi.php | 45 ------------------- .../OpenAPIClient-php/lib/Api/StoreApi.php | 27 ----------- .../php/OpenAPIClient-php/lib/Api/UserApi.php | 18 -------- .../lib/ObjectSerializer.php | 4 ++ .../lib/Api/AnotherFakeApi.php | 9 ---- .../php/OpenAPIClient-php/lib/Api/FakeApi.php | 45 ------------------- .../lib/Api/FakeClassnameTags123Api.php | 9 ---- .../php/OpenAPIClient-php/lib/Api/PetApi.php | 45 ------------------- .../OpenAPIClient-php/lib/Api/StoreApi.php | 27 ----------- .../php/OpenAPIClient-php/lib/Api/UserApi.php | 18 -------- .../lib/ObjectSerializer.php | 4 ++ 28 files changed, 51 insertions(+), 324 deletions(-) create mode 100644 samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator-ignore create mode 100644 samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION diff --git a/bin/security/php-petstore.sh b/bin/security/php-petstore.sh index 602a836b08d..0202a399e7b 100755 --- a/bin/security/php-petstore.sh +++ b/bin/security/php-petstore.sh @@ -33,6 +33,6 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="generate -t modules/openapi-generator/src/main/resources/php -i modules/openapi-generator/src/test/resources/2_0/petstore-security-test.yaml -g php -o samples/client/petstore-security-test/php $@" +ags="generate -t modules/openapi-generator/src/main/resources/php -i modules/openapi-generator/src/test/resources/2_0/petstore-security-test.yaml -g php -o samples/client/petstore-security-test/php/OpenAPIClient-php $@" java $JAVA_OPTS -jar $executable $ags diff --git a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache index a51b202861e..b9993c0410c 100644 --- a/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache +++ b/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache @@ -220,6 +220,8 @@ class ObjectSerializer if (null === $data) { return null; } elseif (substr($class, 0, 4) === 'map[') { // for associative array e.g. map[string,int] + $data = is_string($data) ? json_decode($data) : $data; + settype($data, 'array'); $inner = substr($class, 4, -1); $deserialized = []; if (strrpos($inner, ",") !== false) { @@ -231,6 +233,7 @@ class ObjectSerializer } return $deserialized; } elseif (strcasecmp(substr($class, -2), '[]') === 0) { + $data = is_string($data) ? json_decode($data) : $data; $subClass = substr($class, 0, -2); $values = []; foreach ($data as $key => $value) { @@ -280,6 +283,7 @@ class ObjectSerializer } return $data; } else { + $data = is_string($data) ? json_decode($data) : $data; // If a discriminator is defined and points to a valid subclass, use it. $discriminator = $class::DISCRIMINATOR; if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { diff --git a/modules/openapi-generator/src/main/resources/php/api.mustache b/modules/openapi-generator/src/main/resources/php/api.mustache index 776ebc14207..7ecf4fc9286 100644 --- a/modules/openapi-generator/src/main/resources/php/api.mustache +++ b/modules/openapi-generator/src/main/resources/php/api.mustache @@ -166,9 +166,6 @@ use {{invokerPackage}}\ObjectSerializer; $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('{{dataType}}' !== 'string') { - $content = json_decode($content); - } } return [ @@ -188,9 +185,6 @@ use {{invokerPackage}}\ObjectSerializer; $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -280,9 +274,6 @@ use {{invokerPackage}}\ObjectSerializer; $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore-security-test/php/.openapi-generator/VERSION b/samples/client/petstore-security-test/php/.openapi-generator/VERSION index 14900cee60e..67b096dafc9 100644 --- a/samples/client/petstore-security-test/php/.openapi-generator/VERSION +++ b/samples/client/petstore-security-test/php/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.1-SNAPSHOT \ No newline at end of file +3.2.1-SNAPSHOT diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator-ignore b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION new file mode 100644 index 00000000000..4395ff59232 --- /dev/null +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.2.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/docs/Api/FakeApi.md b/samples/client/petstore-security-test/php/OpenAPIClient-php/docs/Api/FakeApi.md index dae9ffabe9b..afee7db1162 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/docs/Api/FakeApi.md +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/docs/Api/FakeApi.md @@ -12,6 +12,8 @@ Method | HTTP request | Description To test code injection *_/ ' \" =end -- \\r\\n \\n \\r +To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + ### Example ```php $value) { @@ -290,6 +293,7 @@ class ObjectSerializer } return $data; } else { + $data = is_string($data) ? json_decode($data) : $data; // If a discriminator is defined and points to a valid subclass, use it. $discriminator = $class::DISCRIMINATOR; if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php index 9bbd137c862..644aaca9230 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php @@ -154,9 +154,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -172,9 +169,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -242,9 +236,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php index 970b4a1588d..c8691f7e932 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php @@ -150,9 +150,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('bool' !== 'string') { - $content = json_decode($content); - } } return [ @@ -168,9 +165,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -238,9 +232,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -416,9 +407,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\OuterComposite' !== 'string') { - $content = json_decode($content); - } } return [ @@ -434,9 +422,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -504,9 +489,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -682,9 +664,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('float' !== 'string') { - $content = json_decode($content); - } } return [ @@ -700,9 +679,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -770,9 +746,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -948,9 +921,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('string' !== 'string') { - $content = json_decode($content); - } } return [ @@ -966,9 +936,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1036,9 +1003,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1663,9 +1627,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1681,9 +1642,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1751,9 +1709,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php index 2abea2824ae..2870a4c9050 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php @@ -154,9 +154,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -172,9 +169,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -242,9 +236,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php index ba76970f694..40d4cb8e1b7 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php @@ -614,9 +614,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet[]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -632,9 +629,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -702,9 +696,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -898,9 +889,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet[]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -916,9 +904,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -986,9 +971,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1182,9 +1164,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1200,9 +1179,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1270,9 +1246,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1941,9 +1914,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\ApiResponse' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1959,9 +1929,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2033,9 +2000,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2245,9 +2209,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\ApiResponse' !== 'string') { - $content = json_decode($content); - } } return [ @@ -2263,9 +2224,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2337,9 +2295,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php index 807983a4a5a..f12f7270d96 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php @@ -376,9 +376,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('map[string,int]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -394,9 +391,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -462,9 +456,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -645,9 +636,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Order' !== 'string') { - $content = json_decode($content); - } } return [ @@ -663,9 +651,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -733,9 +718,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -933,9 +915,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Order' !== 'string') { - $content = json_decode($content); - } } return [ @@ -951,9 +930,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1021,9 +997,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php index 48f023c3d6c..492c68ff573 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php @@ -1035,9 +1035,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\User' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1053,9 +1050,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1123,9 +1117,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1318,9 +1309,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('string' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1336,9 +1324,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1408,9 +1393,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php index 52cd983335e..3592527a968 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php @@ -230,6 +230,8 @@ class ObjectSerializer if (null === $data) { return null; } elseif (substr($class, 0, 4) === 'map[') { // for associative array e.g. map[string,int] + $data = is_string($data) ? json_decode($data) : $data; + settype($data, 'array'); $inner = substr($class, 4, -1); $deserialized = []; if (strrpos($inner, ",") !== false) { @@ -241,6 +243,7 @@ class ObjectSerializer } return $deserialized; } elseif (strcasecmp(substr($class, -2), '[]') === 0) { + $data = is_string($data) ? json_decode($data) : $data; $subClass = substr($class, 0, -2); $values = []; foreach ($data as $key => $value) { @@ -290,6 +293,7 @@ class ObjectSerializer } return $data; } else { + $data = is_string($data) ? json_decode($data) : $data; // If a discriminator is defined and points to a valid subclass, use it. $discriminator = $class::DISCRIMINATOR; if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php index 9bbd137c862..644aaca9230 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/AnotherFakeApi.php @@ -154,9 +154,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -172,9 +169,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -242,9 +236,6 @@ class AnotherFakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php index d58d8ebedcd..8e18423c90a 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeApi.php @@ -150,9 +150,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('bool' !== 'string') { - $content = json_decode($content); - } } return [ @@ -168,9 +165,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -238,9 +232,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -416,9 +407,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\OuterComposite' !== 'string') { - $content = json_decode($content); - } } return [ @@ -434,9 +422,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -504,9 +489,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -682,9 +664,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('float' !== 'string') { - $content = json_decode($content); - } } return [ @@ -700,9 +679,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -770,9 +746,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -948,9 +921,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('string' !== 'string') { - $content = json_decode($content); - } } return [ @@ -966,9 +936,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1036,9 +1003,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1663,9 +1627,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1681,9 +1642,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1751,9 +1709,6 @@ class FakeApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php index 2abea2824ae..2870a4c9050 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/FakeClassnameTags123Api.php @@ -154,9 +154,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Client' !== 'string') { - $content = json_decode($content); - } } return [ @@ -172,9 +169,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -242,9 +236,6 @@ class FakeClassnameTags123Api $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php index ba76970f694..40d4cb8e1b7 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/PetApi.php @@ -614,9 +614,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet[]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -632,9 +629,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -702,9 +696,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -898,9 +889,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet[]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -916,9 +904,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -986,9 +971,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1182,9 +1164,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Pet' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1200,9 +1179,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1270,9 +1246,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1941,9 +1914,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\ApiResponse' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1959,9 +1929,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2033,9 +2000,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2245,9 +2209,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\ApiResponse' !== 'string') { - $content = json_decode($content); - } } return [ @@ -2263,9 +2224,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -2337,9 +2295,6 @@ class PetApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php index b0e2238a7d2..44c9421b2cb 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/StoreApi.php @@ -376,9 +376,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('map[string,int]' !== 'string') { - $content = json_decode($content); - } } return [ @@ -394,9 +391,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -462,9 +456,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -645,9 +636,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Order' !== 'string') { - $content = json_decode($content); - } } return [ @@ -663,9 +651,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -733,9 +718,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -933,9 +915,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\Order' !== 'string') { - $content = json_decode($content); - } } return [ @@ -951,9 +930,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1021,9 +997,6 @@ class StoreApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php index bd4a5d67f70..5f3227b2878 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/Api/UserApi.php @@ -1035,9 +1035,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('\OpenAPI\Client\Model\User' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1053,9 +1050,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1123,9 +1117,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1318,9 +1309,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ('string' !== 'string') { - $content = json_decode($content); - } } return [ @@ -1336,9 +1324,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ @@ -1408,9 +1393,6 @@ class UserApi $content = $responseBody; //stream goes to serializer } else { $content = $responseBody->getContents(); - if ($returnType !== 'string') { - $content = json_decode($content); - } } return [ diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php index 52cd983335e..3592527a968 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/lib/ObjectSerializer.php @@ -230,6 +230,8 @@ class ObjectSerializer if (null === $data) { return null; } elseif (substr($class, 0, 4) === 'map[') { // for associative array e.g. map[string,int] + $data = is_string($data) ? json_decode($data) : $data; + settype($data, 'array'); $inner = substr($class, 4, -1); $deserialized = []; if (strrpos($inner, ",") !== false) { @@ -241,6 +243,7 @@ class ObjectSerializer } return $deserialized; } elseif (strcasecmp(substr($class, -2), '[]') === 0) { + $data = is_string($data) ? json_decode($data) : $data; $subClass = substr($class, 0, -2); $values = []; foreach ($data as $key => $value) { @@ -290,6 +293,7 @@ class ObjectSerializer } return $data; } else { + $data = is_string($data) ? json_decode($data) : $data; // If a discriminator is defined and points to a valid subclass, use it. $discriminator = $class::DISCRIMINATOR; if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) { From abe741f9891d74aeb05260e6221c5bc9f870af5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Thu, 6 Sep 2018 20:33:37 +0200 Subject: [PATCH 54/74] Set swagger-parser and swagger-core to version 2.0.4 (#787) --- CI/pom.xml.bash | 4 ++-- CI/pom.xml.circleci | 4 ++-- CI/pom.xml.circleci.java7 | 4 ++-- CI/pom.xml.ios | 4 ++-- modules/openapi-generator/pom.xml | 4 ++-- pom.xml | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CI/pom.xml.bash b/CI/pom.xml.bash index a17e0ae51a9..7649a763c34 100644 --- a/CI/pom.xml.bash +++ b/CI/pom.xml.bash @@ -920,8 +920,8 @@ - 2.0.3-OpenAPITools.org-1 - 2.0.1 + 2.0.4 + 2.0.4 2.11.1 3.3.0 2.4 diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index e49833ab326..55c91d839bd 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -1030,8 +1030,8 @@ - 2.0.3-OpenAPITools.org-1 - 2.0.1 + 2.0.4 + 2.0.4 2.11.1 3.3.0 2.4 diff --git a/CI/pom.xml.circleci.java7 b/CI/pom.xml.circleci.java7 index 3713c48fa68..0af38632bcd 100644 --- a/CI/pom.xml.circleci.java7 +++ b/CI/pom.xml.circleci.java7 @@ -1000,8 +1000,8 @@ - 2.0.3-OpenAPITools.org-1 - 2.0.1 + 2.0.4 + 2.0.4 2.11.1 3.3.0 2.4 diff --git a/CI/pom.xml.ios b/CI/pom.xml.ios index ffbf423381e..a908b01e331 100644 --- a/CI/pom.xml.ios +++ b/CI/pom.xml.ios @@ -928,8 +928,8 @@ - 2.0.3-OpenAPITools.org-1 - 2.0.1 + 2.0.4 + 2.0.4 2.11.1 3.3.0 2.4 diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index dfdc864a55e..f060b3ac9e5 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -203,8 +203,8 @@ swagger-core ${swagger-core-version} - - org.openapitools.swagger.parser + + io.swagger.parser.v3 swagger-parser ${swagger-parser-version} diff --git a/pom.xml b/pom.xml index d54c14d4bd3..52b9d917058 100644 --- a/pom.xml +++ b/pom.xml @@ -1147,8 +1147,8 @@ 1.8 1.8 - 2.0.3-OpenAPITools.org-1 - 2.0.1 + 2.0.4 + 2.0.4 2.11.1 3.3.0 2.4 From a0f8c5e4680af624301110062e43215543d2a2e8 Mon Sep 17 00:00:00 2001 From: Nathan Broadbent Date: Fri, 7 Sep 2018 14:42:08 +0700 Subject: [PATCH 55/74] Ignore modules/openapi-generator-gradle-plugin/bin/ (#983) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9fd7f8b7a6f..aff6667ce66 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ out/ *.gpg classpath.txt version.properties +modules/openapi-generator-gradle-plugin/bin/ !modules/openapi-generator-cli/src/main/resources/version.properties .project .classpath From 4a9b0a91aa74171b9145dc868dffd8bf0c706aaf Mon Sep 17 00:00:00 2001 From: Akihito Nakano Date: Fri, 7 Sep 2018 17:37:35 +0900 Subject: [PATCH 56/74] [PHP]Generated lumen code can contain dots in routes (#985) * Update README * Remove the codes checking dots contained in path * Update samples --- .../languages/PhpLumenServerCodegen.java | 4 ---- .../src/main/resources/lumen/readme.md | 5 +++++ .../lumen/.openapi-generator/VERSION | 2 +- .../lumen/lib/app/Http/Controllers/FakeApi.php | 10 +++++----- .../lumen/lib/app/Http/routes.php | 18 +++++++++--------- .../petstore-security-test/lumen/lib/readme.md | 5 +++++ .../server/petstore/php-lumen/lib/readme.md | 5 +++++ 7 files changed, 30 insertions(+), 19 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLumenServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLumenServerCodegen.java index d81856c3134..57f737b6408 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLumenServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLumenServerCodegen.java @@ -118,10 +118,6 @@ public class PhpLumenServerCodegen extends AbstractPhpCodegen { for (CodegenOperation op : operations) { op.httpMethod = op.httpMethod.toLowerCase(Locale.ROOT); - // check to see if the path contains ".", which is not supported by Lumen - if (op.path != null && op.path.contains(".")) { - throw new IllegalArgumentException("'.' (dot) is not supported by PHP Lumen."); - } } // sort the endpoints in ascending to avoid the route priority issure. diff --git a/modules/openapi-generator/src/main/resources/lumen/readme.md b/modules/openapi-generator/src/main/resources/lumen/readme.md index b57e2fc40ba..01b8099336c 100644 --- a/modules/openapi-generator/src/main/resources/lumen/readme.md +++ b/modules/openapi-generator/src/main/resources/lumen/readme.md @@ -14,3 +14,8 @@ This example uses the [Lumen Framework](http://lumen.laravel.com/). To see how Using `composer install` to install the framework and dependencies via [Composer](http://getcomposer.org/). +### Running the generated server stub + +```bash +php -S localhost:8080 public/index.php +``` diff --git a/samples/server/petstore-security-test/lumen/.openapi-generator/VERSION b/samples/server/petstore-security-test/lumen/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/server/petstore-security-test/lumen/.openapi-generator/VERSION +++ b/samples/server/petstore-security-test/lumen/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore-security-test/lumen/lib/app/Http/Controllers/FakeApi.php b/samples/server/petstore-security-test/lumen/lib/app/Http/Controllers/FakeApi.php index 8e3320c2eef..c02ad03ba34 100644 --- a/samples/server/petstore-security-test/lumen/lib/app/Http/Controllers/FakeApi.php +++ b/samples/server/petstore-security-test/lumen/lib/app/Http/Controllers/FakeApi.php @@ -1,11 +1,11 @@ get('/', function () use ($app) { @@ -23,9 +23,9 @@ $app->get('/', function () use ($app) { /** * put testCodeInjectEndRnNR - * Summary: To test code injection ' \" =end -- \\r\\n \\n \\r - * Notes: + * Summary: To test code injection *_/ ' \" =end -- \\r\\n \\n \\r + * Notes: To test code injection *_/ ' \" =end -- \\r\\n \\n \\r */ -$app->put('/fake', 'FakeApi@testCodeInjectEndRnNR'); +$app->put('/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r/fake', 'FakeApi@testCodeInjectEndRnNR'); diff --git a/samples/server/petstore-security-test/lumen/lib/readme.md b/samples/server/petstore-security-test/lumen/lib/readme.md index b57e2fc40ba..01b8099336c 100644 --- a/samples/server/petstore-security-test/lumen/lib/readme.md +++ b/samples/server/petstore-security-test/lumen/lib/readme.md @@ -14,3 +14,8 @@ This example uses the [Lumen Framework](http://lumen.laravel.com/). To see how Using `composer install` to install the framework and dependencies via [Composer](http://getcomposer.org/). +### Running the generated server stub + +```bash +php -S localhost:8080 public/index.php +``` diff --git a/samples/server/petstore/php-lumen/lib/readme.md b/samples/server/petstore/php-lumen/lib/readme.md index b57e2fc40ba..01b8099336c 100644 --- a/samples/server/petstore/php-lumen/lib/readme.md +++ b/samples/server/petstore/php-lumen/lib/readme.md @@ -14,3 +14,8 @@ This example uses the [Lumen Framework](http://lumen.laravel.com/). To see how Using `composer install` to install the framework and dependencies via [Composer](http://getcomposer.org/). +### Running the generated server stub + +```bash +php -S localhost:8080 public/index.php +``` From 1ead8bcca5c662689010fa9205f0527a7479a35a Mon Sep 17 00:00:00 2001 From: Akihito Nakano Date: Fri, 7 Sep 2018 17:39:33 +0900 Subject: [PATCH 57/74] [PHP] Drop support for PHP5.5 on php-client (#993) * Drop suport for PHP5.5 on php-client * Update samples bin/php-petstore.sh bin/openapi3/php-petstore.sh * Update security samples bin/security/php-petstore.sh --- .../src/main/resources/php/composer.mustache | 2 +- .../php/OpenAPIClient-php/.gitignore | 8 +++++ .../.openapi-generator/VERSION | 2 +- .../php/OpenAPIClient-php/.php_cs | 33 +++++++++++-------- .../php/OpenAPIClient-php/composer.json | 4 +-- .../php/OpenAPIClient-php/lib/Api/FakeApi.php | 2 +- .../OpenAPIClient-php/lib/ApiException.php | 2 +- .../OpenAPIClient-php/lib/Configuration.php | 2 +- .../OpenAPIClient-php/lib/HeaderSelector.php | 2 +- .../lib/Model/ModelInterface.php | 2 +- .../lib/Model/ModelReturn.php | 2 +- .../lib/ObjectSerializer.php | 6 ++-- .../php/OpenAPIClient-php/composer.json | 2 +- .../php/OpenAPIClient-php/composer.json | 2 +- 14 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 samples/client/petstore-security-test/php/OpenAPIClient-php/.gitignore diff --git a/modules/openapi-generator/src/main/resources/php/composer.mustache b/modules/openapi-generator/src/main/resources/php/composer.mustache index 308241e0a00..e4860c99bf1 100644 --- a/modules/openapi-generator/src/main/resources/php/composer.mustache +++ b/modules/openapi-generator/src/main/resources/php/composer.mustache @@ -21,7 +21,7 @@ } ], "require": { - "php": ">=5.5", + "php": ">=5.6", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/.gitignore b/samples/client/petstore-security-test/php/OpenAPIClient-php/.gitignore new file mode 100644 index 00000000000..edcf63f6aee --- /dev/null +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/.gitignore @@ -0,0 +1,8 @@ +# ref: https://github.com/github/gitignore/blob/master/Composer.gitignore + +composer.phar +/vendor/ + +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +composer.lock \ No newline at end of file diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION index 4395ff59232..6d94c9c2e12 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/.php_cs b/samples/client/petstore-security-test/php/OpenAPIClient-php/.php_cs index 6b8e23c818a..4fbe53ec5ff 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/.php_cs +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/.php_cs @@ -1,18 +1,23 @@ level(Symfony\CS\FixerInterface::PSR2_LEVEL) +return PhpCsFixer\Config::create() ->setUsingCache(true) - ->fixers( - [ - 'ordered_use', - 'phpdoc_order', - 'short_array_syntax', - 'strict', - 'strict_param' - ] - ) - ->finder( - Symfony\CS\Finder\DefaultFinder::create() - ->in(__DIR__) + ->setRules([ + '@PSR2' => true, + 'ordered_imports' => true, + 'phpdoc_order' => true, + 'array_syntax' => [ 'syntax' => 'short' ], + 'strict_comparison' => true, + 'strict_param' => true, + 'no_trailing_whitespace' => false, + 'no_trailing_whitespace_in_comment' => false, + 'braces' => false, + 'single_blank_line_at_eof' => false, + 'blank_line_after_namespace' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('test') + ->exclude('tests') + ->in(__DIR__) ); diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/composer.json b/samples/client/petstore-security-test/php/OpenAPIClient-php/composer.json index 65d3c935fb8..45b3c697261 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/composer.json +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/composer.json @@ -18,7 +18,7 @@ } ], "require": { - "php": ">=5.5", + "php": ">=5.6", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", @@ -27,7 +27,7 @@ "require-dev": { "phpunit/phpunit": "^4.8", "squizlabs/php_codesniffer": "~2.6", - "friendsofphp/php-cs-fixer": "~1.12" + "friendsofphp/php-cs-fixer": "~2.12" }, "autoload": { "psr-4": { "OpenAPI\\Client\\" : "lib/" } diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Api/FakeApi.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Api/FakeApi.php index 863943a0292..b8df0f363de 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Api/FakeApi.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Api/FakeApi.php @@ -17,7 +17,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ApiException.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ApiException.php index a8a729d0026..516981727ba 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ApiException.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ApiException.php @@ -17,7 +17,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Configuration.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Configuration.php index f0de03c2a0d..38464086bf4 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Configuration.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Configuration.php @@ -17,7 +17,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/HeaderSelector.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/HeaderSelector.php index e17ea33291e..0a183e1a9ce 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/HeaderSelector.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/HeaderSelector.php @@ -17,7 +17,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelInterface.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelInterface.php index 53010cf2227..2970c2b72c0 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelInterface.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelInterface.php @@ -18,7 +18,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelReturn.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelReturn.php index d06063968bb..97a18252d86 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelReturn.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/Model/ModelReturn.php @@ -18,7 +18,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** diff --git a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ObjectSerializer.php b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ObjectSerializer.php index 9d90b816e09..f2142a2e86e 100644 --- a/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore-security-test/php/OpenAPIClient-php/lib/ObjectSerializer.php @@ -18,7 +18,7 @@ * OpenAPI spec version: 1.0.0 *_/ ' \" =end -- \\r\\n \\n \\r * Contact: something@something.abc *_/ ' \" =end -- \\r\\n \\n \\r * Generated by: https://openapi-generator.tech - * OpenAPI Generator version: 3.2.0-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT */ /** @@ -68,7 +68,7 @@ class ObjectSerializer if ($value !== null && !in_array($openAPIType, ['DateTime', 'bool', 'boolean', 'byte', 'double', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true) && method_exists($openAPIType, 'getAllowableEnumValues') - && !in_array($value, $openAPIType::getAllowableEnumValues())) { + && !in_array($value, $openAPIType::getAllowableEnumValues(), true)) { $imploded = implode("', '", $openAPIType::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'"); } @@ -287,7 +287,7 @@ class ObjectSerializer return new \SplFileObject($filename, 'r'); } elseif (method_exists($class, 'getAllowableEnumValues')) { - if (!in_array($data, $class::getAllowableEnumValues())) { + if (!in_array($data, $class::getAllowableEnumValues(), true)) { $imploded = implode("', '", $class::getAllowableEnumValues()); throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'"); } diff --git a/samples/client/petstore/php/OpenAPIClient-php/composer.json b/samples/client/petstore/php/OpenAPIClient-php/composer.json index 834ab01d201..45b3c697261 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/composer.json +++ b/samples/client/petstore/php/OpenAPIClient-php/composer.json @@ -18,7 +18,7 @@ } ], "require": { - "php": ">=5.5", + "php": ">=5.6", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", diff --git a/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json b/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json index 834ab01d201..45b3c697261 100644 --- a/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json +++ b/samples/openapi3/client/petstore/php/OpenAPIClient-php/composer.json @@ -18,7 +18,7 @@ } ], "require": { - "php": ">=5.5", + "php": ">=5.6", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", From 47b3210cb244003f3c243540339097511b50ad43 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 8 Sep 2018 18:06:27 +0800 Subject: [PATCH 58/74] Add js-beautify support to JS generator (#961) * add js-beautify support to JS generator * replace tab with space * update samples without JS_BEAUTIFY_PATH --- .../languages/JavascriptClientCodegen.java | 33 ++++++++++++++++++- .../javascript-es6/.openapi-generator/VERSION | 2 +- .../.openapi-generator/VERSION | 2 +- .../.openapi-generator/VERSION | 2 +- .../javascript-promise/src/ApiClient.js | 2 +- .../src/api/AnotherFakeApi.js | 2 +- .../javascript-promise/src/api/FakeApi.js | 2 +- .../src/api/FakeClassnameTags123Api.js | 2 +- .../javascript-promise/src/api/PetApi.js | 2 +- .../javascript-promise/src/api/StoreApi.js | 2 +- .../javascript-promise/src/api/UserApi.js | 2 +- .../petstore/javascript-promise/src/index.js | 2 +- .../src/model/AdditionalPropertiesClass.js | 2 +- .../javascript-promise/src/model/Animal.js | 2 +- .../src/model/AnimalFarm.js | 2 +- .../src/model/ApiResponse.js | 2 +- .../src/model/ArrayOfArrayOfNumberOnly.js | 2 +- .../src/model/ArrayOfNumberOnly.js | 2 +- .../javascript-promise/src/model/ArrayTest.js | 2 +- .../src/model/Capitalization.js | 2 +- .../javascript-promise/src/model/Cat.js | 2 +- .../javascript-promise/src/model/Category.js | 2 +- .../src/model/ClassModel.js | 2 +- .../javascript-promise/src/model/Client.js | 2 +- .../javascript-promise/src/model/Dog.js | 2 +- .../src/model/EnumArrays.js | 2 +- .../javascript-promise/src/model/EnumClass.js | 2 +- .../javascript-promise/src/model/EnumTest.js | 2 +- .../javascript-promise/src/model/File.js | 2 +- .../src/model/FileSchemaTestClass.js | 2 +- .../src/model/FormatTest.js | 2 +- .../src/model/HasOnlyReadOnly.js | 2 +- .../javascript-promise/src/model/List.js | 2 +- .../javascript-promise/src/model/MapTest.js | 2 +- ...dPropertiesAndAdditionalPropertiesClass.js | 2 +- .../src/model/Model200Response.js | 2 +- .../src/model/ModelReturn.js | 2 +- .../javascript-promise/src/model/Name.js | 2 +- .../src/model/NumberOnly.js | 2 +- .../javascript-promise/src/model/Order.js | 2 +- .../src/model/OuterComposite.js | 2 +- .../javascript-promise/src/model/OuterEnum.js | 2 +- .../javascript-promise/src/model/Pet.js | 2 +- .../src/model/ReadOnlyFirst.js | 2 +- .../src/model/SpecialModelName.js | 2 +- .../src/model/StringBooleanMap.js | 2 +- .../javascript-promise/src/model/Tag.js | 2 +- .../javascript-promise/src/model/User.js | 2 +- .../javascript/.openapi-generator/VERSION | 2 +- .../petstore/javascript/src/ApiClient.js | 2 +- .../javascript/src/api/AnotherFakeApi.js | 2 +- .../petstore/javascript/src/api/FakeApi.js | 2 +- .../src/api/FakeClassnameTags123Api.js | 2 +- .../petstore/javascript/src/api/PetApi.js | 2 +- .../petstore/javascript/src/api/StoreApi.js | 2 +- .../petstore/javascript/src/api/UserApi.js | 2 +- .../client/petstore/javascript/src/index.js | 2 +- .../src/model/AdditionalPropertiesClass.js | 2 +- .../petstore/javascript/src/model/Animal.js | 2 +- .../javascript/src/model/AnimalFarm.js | 2 +- .../javascript/src/model/ApiResponse.js | 2 +- .../src/model/ArrayOfArrayOfNumberOnly.js | 2 +- .../javascript/src/model/ArrayOfNumberOnly.js | 2 +- .../javascript/src/model/ArrayTest.js | 2 +- .../javascript/src/model/Capitalization.js | 2 +- .../petstore/javascript/src/model/Cat.js | 2 +- .../petstore/javascript/src/model/Category.js | 2 +- .../javascript/src/model/ClassModel.js | 2 +- .../petstore/javascript/src/model/Client.js | 2 +- .../petstore/javascript/src/model/Dog.js | 2 +- .../javascript/src/model/EnumArrays.js | 2 +- .../javascript/src/model/EnumClass.js | 2 +- .../petstore/javascript/src/model/EnumTest.js | 2 +- .../petstore/javascript/src/model/File.js | 2 +- .../src/model/FileSchemaTestClass.js | 2 +- .../javascript/src/model/FormatTest.js | 2 +- .../javascript/src/model/HasOnlyReadOnly.js | 2 +- .../petstore/javascript/src/model/List.js | 2 +- .../petstore/javascript/src/model/MapTest.js | 2 +- ...dPropertiesAndAdditionalPropertiesClass.js | 2 +- .../javascript/src/model/Model200Response.js | 2 +- .../javascript/src/model/ModelReturn.js | 2 +- .../petstore/javascript/src/model/Name.js | 2 +- .../javascript/src/model/NumberOnly.js | 2 +- .../petstore/javascript/src/model/Order.js | 2 +- .../javascript/src/model/OuterComposite.js | 2 +- .../javascript/src/model/OuterEnum.js | 2 +- .../petstore/javascript/src/model/Pet.js | 2 +- .../javascript/src/model/ReadOnlyFirst.js | 2 +- .../javascript/src/model/SpecialModelName.js | 2 +- .../javascript/src/model/StringBooleanMap.js | 2 +- .../petstore/javascript/src/model/Tag.js | 2 +- .../petstore/javascript/src/model/User.js | 2 +- 93 files changed, 124 insertions(+), 93 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java index e22c37a4504..2bbb3596124 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.io.FilenameUtils; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenConstants; @@ -47,7 +48,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; - public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { @SuppressWarnings("hiding") private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); @@ -232,6 +232,10 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } super.processOpts(); + if (StringUtils.isEmpty(System.getenv("JS_BEAUTIFY_PATH"))) { + LOGGER.info("Environment variable JS_BEAUTIFY_PATH not defined so the JS code may not be properly formatted. To define it, try 'export JS_BEAUTIFY_PATH=/usr/local/bin/js-beautify' (Linux/Mac)"); + } + if (additionalProperties.containsKey(PROJECT_NAME)) { setProjectName(((String) additionalProperties.get(PROJECT_NAME))); } @@ -1157,4 +1161,31 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return input.replace("*/", "*_/").replace("/*", "/_*"); } + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + String jsBeautifyPath = System.getenv("JS_BEAUTIFY_PATH"); + if (StringUtils.isEmpty(jsBeautifyPath)) { + return; // skip if JS_BEAUTIFY_PATH env variable is not defined + } + + // only process files with js extension + if ("js".equals(FilenameUtils.getExtension(file.toString()))) { + String command = jsBeautifyPath + " -r -f " + file.toString(); + try { + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}): {}", command, p.exitValue()); + } + } catch (Exception e) { + LOGGER.error("Error running the command ({}): {}", command, e.getMessage()); + } + LOGGER.info("Successfully executed: " + command); + } + } + } diff --git a/samples/client/petstore/javascript-es6/.openapi-generator/VERSION b/samples/client/petstore/javascript-es6/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/javascript-es6/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-es6/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION b/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-promise-es6/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-promise/.openapi-generator/VERSION b/samples/client/petstore/javascript-promise/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/javascript-promise/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript-promise/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript-promise/src/ApiClient.js b/samples/client/petstore/javascript-promise/src/ApiClient.js index 15e044368dc..dd286d4987c 100644 --- a/samples/client/petstore/javascript-promise/src/ApiClient.js +++ b/samples/client/petstore/javascript-promise/src/ApiClient.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js b/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js index d395a28c308..d744580ecdd 100644 --- a/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js +++ b/samples/client/petstore/javascript-promise/src/api/AnotherFakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/FakeApi.js b/samples/client/petstore/javascript-promise/src/api/FakeApi.js index fae50ab04ef..a26b09ce175 100644 --- a/samples/client/petstore/javascript-promise/src/api/FakeApi.js +++ b/samples/client/petstore/javascript-promise/src/api/FakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js b/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js index 3b55da896c7..b626387882b 100644 --- a/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js +++ b/samples/client/petstore/javascript-promise/src/api/FakeClassnameTags123Api.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/PetApi.js b/samples/client/petstore/javascript-promise/src/api/PetApi.js index f11646b2b2f..68519c5a1d5 100644 --- a/samples/client/petstore/javascript-promise/src/api/PetApi.js +++ b/samples/client/petstore/javascript-promise/src/api/PetApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/StoreApi.js b/samples/client/petstore/javascript-promise/src/api/StoreApi.js index 6aefe154739..d00779af1a2 100644 --- a/samples/client/petstore/javascript-promise/src/api/StoreApi.js +++ b/samples/client/petstore/javascript-promise/src/api/StoreApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/api/UserApi.js b/samples/client/petstore/javascript-promise/src/api/UserApi.js index d663102caff..82f0c1a06a6 100644 --- a/samples/client/petstore/javascript-promise/src/api/UserApi.js +++ b/samples/client/petstore/javascript-promise/src/api/UserApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/index.js b/samples/client/petstore/javascript-promise/src/index.js index 0a661df2958..1eebdbf5ff3 100644 --- a/samples/client/petstore/javascript-promise/src/index.js +++ b/samples/client/petstore/javascript-promise/src/index.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js b/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js index a0fecb58c62..e41dca8e660 100644 --- a/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript-promise/src/model/AdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Animal.js b/samples/client/petstore/javascript-promise/src/model/Animal.js index fe8092aca28..43aaacc12b5 100644 --- a/samples/client/petstore/javascript-promise/src/model/Animal.js +++ b/samples/client/petstore/javascript-promise/src/model/Animal.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js b/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js index dee8dc23b6b..f3d2c132d12 100644 --- a/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js +++ b/samples/client/petstore/javascript-promise/src/model/AnimalFarm.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ApiResponse.js b/samples/client/petstore/javascript-promise/src/model/ApiResponse.js index 019604926b1..2d33b0b7a23 100644 --- a/samples/client/petstore/javascript-promise/src/model/ApiResponse.js +++ b/samples/client/petstore/javascript-promise/src/model/ApiResponse.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js b/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js index db6766a51b3..41463b0e371 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayOfArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js b/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js index 3e805670939..f3b0ac217e1 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ArrayTest.js b/samples/client/petstore/javascript-promise/src/model/ArrayTest.js index 57ebe94e9f1..6b8aeade8b0 100644 --- a/samples/client/petstore/javascript-promise/src/model/ArrayTest.js +++ b/samples/client/petstore/javascript-promise/src/model/ArrayTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Capitalization.js b/samples/client/petstore/javascript-promise/src/model/Capitalization.js index 848ac1d0743..67c027686a9 100644 --- a/samples/client/petstore/javascript-promise/src/model/Capitalization.js +++ b/samples/client/petstore/javascript-promise/src/model/Capitalization.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Cat.js b/samples/client/petstore/javascript-promise/src/model/Cat.js index ee1b7683a14..6f8ca2e91fd 100644 --- a/samples/client/petstore/javascript-promise/src/model/Cat.js +++ b/samples/client/petstore/javascript-promise/src/model/Cat.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Category.js b/samples/client/petstore/javascript-promise/src/model/Category.js index 61577d4bd95..ba82e88bd49 100644 --- a/samples/client/petstore/javascript-promise/src/model/Category.js +++ b/samples/client/petstore/javascript-promise/src/model/Category.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ClassModel.js b/samples/client/petstore/javascript-promise/src/model/ClassModel.js index ce9f24d2afd..6592fdeebc9 100644 --- a/samples/client/petstore/javascript-promise/src/model/ClassModel.js +++ b/samples/client/petstore/javascript-promise/src/model/ClassModel.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Client.js b/samples/client/petstore/javascript-promise/src/model/Client.js index dbe1f639d35..00fe25ca2d7 100644 --- a/samples/client/petstore/javascript-promise/src/model/Client.js +++ b/samples/client/petstore/javascript-promise/src/model/Client.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Dog.js b/samples/client/petstore/javascript-promise/src/model/Dog.js index 7e2e6b91c61..7a74ef477b4 100644 --- a/samples/client/petstore/javascript-promise/src/model/Dog.js +++ b/samples/client/petstore/javascript-promise/src/model/Dog.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumArrays.js b/samples/client/petstore/javascript-promise/src/model/EnumArrays.js index 8af55604e77..7bbb3af35d2 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumArrays.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumArrays.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumClass.js b/samples/client/petstore/javascript-promise/src/model/EnumClass.js index 400a587b11e..3a8a7f52d94 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumClass.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/EnumTest.js b/samples/client/petstore/javascript-promise/src/model/EnumTest.js index 95c35adc4d8..25d166c5c8a 100644 --- a/samples/client/petstore/javascript-promise/src/model/EnumTest.js +++ b/samples/client/petstore/javascript-promise/src/model/EnumTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/File.js b/samples/client/petstore/javascript-promise/src/model/File.js index f0c412ed7e5..706f20eff08 100644 --- a/samples/client/petstore/javascript-promise/src/model/File.js +++ b/samples/client/petstore/javascript-promise/src/model/File.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js b/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js index 53f4b4659b6..2bc85b700b0 100644 --- a/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js +++ b/samples/client/petstore/javascript-promise/src/model/FileSchemaTestClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/FormatTest.js b/samples/client/petstore/javascript-promise/src/model/FormatTest.js index 296857d44ca..679e769b5b2 100644 --- a/samples/client/petstore/javascript-promise/src/model/FormatTest.js +++ b/samples/client/petstore/javascript-promise/src/model/FormatTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js b/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js index 9aa9cfca512..6b42db4416e 100644 --- a/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/HasOnlyReadOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/List.js b/samples/client/petstore/javascript-promise/src/model/List.js index 84b63989e85..05c95f2613a 100644 --- a/samples/client/petstore/javascript-promise/src/model/List.js +++ b/samples/client/petstore/javascript-promise/src/model/List.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/MapTest.js b/samples/client/petstore/javascript-promise/src/model/MapTest.js index ee5f5dd07cd..65b317db8b5 100644 --- a/samples/client/petstore/javascript-promise/src/model/MapTest.js +++ b/samples/client/petstore/javascript-promise/src/model/MapTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js b/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js index eaecc593817..9291b7ba8a4 100644 --- a/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript-promise/src/model/MixedPropertiesAndAdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Model200Response.js b/samples/client/petstore/javascript-promise/src/model/Model200Response.js index 7d22d9f50c1..82d0b362160 100644 --- a/samples/client/petstore/javascript-promise/src/model/Model200Response.js +++ b/samples/client/petstore/javascript-promise/src/model/Model200Response.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ModelReturn.js b/samples/client/petstore/javascript-promise/src/model/ModelReturn.js index 4e43daf99f8..b4ca8a7875d 100644 --- a/samples/client/petstore/javascript-promise/src/model/ModelReturn.js +++ b/samples/client/petstore/javascript-promise/src/model/ModelReturn.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Name.js b/samples/client/petstore/javascript-promise/src/model/Name.js index 076c04d87c1..a18ddecd8d9 100644 --- a/samples/client/petstore/javascript-promise/src/model/Name.js +++ b/samples/client/petstore/javascript-promise/src/model/Name.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/NumberOnly.js b/samples/client/petstore/javascript-promise/src/model/NumberOnly.js index aaf10683e71..f25c7bbc8b2 100644 --- a/samples/client/petstore/javascript-promise/src/model/NumberOnly.js +++ b/samples/client/petstore/javascript-promise/src/model/NumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Order.js b/samples/client/petstore/javascript-promise/src/model/Order.js index d4642cd267b..a65a0024885 100644 --- a/samples/client/petstore/javascript-promise/src/model/Order.js +++ b/samples/client/petstore/javascript-promise/src/model/Order.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/OuterComposite.js b/samples/client/petstore/javascript-promise/src/model/OuterComposite.js index 5d83a1632d1..e9c23b1e619 100644 --- a/samples/client/petstore/javascript-promise/src/model/OuterComposite.js +++ b/samples/client/petstore/javascript-promise/src/model/OuterComposite.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/OuterEnum.js b/samples/client/petstore/javascript-promise/src/model/OuterEnum.js index bf484fcdb5c..bca0fdf08ce 100644 --- a/samples/client/petstore/javascript-promise/src/model/OuterEnum.js +++ b/samples/client/petstore/javascript-promise/src/model/OuterEnum.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Pet.js b/samples/client/petstore/javascript-promise/src/model/Pet.js index a3232c511cb..a4edb988958 100644 --- a/samples/client/petstore/javascript-promise/src/model/Pet.js +++ b/samples/client/petstore/javascript-promise/src/model/Pet.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js b/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js index 74a2fe86277..f05c53ebab3 100644 --- a/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js +++ b/samples/client/petstore/javascript-promise/src/model/ReadOnlyFirst.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js b/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js index d6791c03805..3de755a7986 100644 --- a/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js +++ b/samples/client/petstore/javascript-promise/src/model/SpecialModelName.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js b/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js index 87274d44502..8a82f9d99ba 100644 --- a/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js +++ b/samples/client/petstore/javascript-promise/src/model/StringBooleanMap.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/Tag.js b/samples/client/petstore/javascript-promise/src/model/Tag.js index 228533a3157..c57bfb9ca07 100644 --- a/samples/client/petstore/javascript-promise/src/model/Tag.js +++ b/samples/client/petstore/javascript-promise/src/model/Tag.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript-promise/src/model/User.js b/samples/client/petstore/javascript-promise/src/model/User.js index e305e9756b0..6f2f6910f4d 100644 --- a/samples/client/petstore/javascript-promise/src/model/User.js +++ b/samples/client/petstore/javascript-promise/src/model/User.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/.openapi-generator/VERSION b/samples/client/petstore/javascript/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/client/petstore/javascript/.openapi-generator/VERSION +++ b/samples/client/petstore/javascript/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/ApiClient.js b/samples/client/petstore/javascript/src/ApiClient.js index a2d54c9b3ed..2e1ad976bf7 100644 --- a/samples/client/petstore/javascript/src/ApiClient.js +++ b/samples/client/petstore/javascript/src/ApiClient.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/AnotherFakeApi.js b/samples/client/petstore/javascript/src/api/AnotherFakeApi.js index ab4eada963d..4761e83415d 100644 --- a/samples/client/petstore/javascript/src/api/AnotherFakeApi.js +++ b/samples/client/petstore/javascript/src/api/AnotherFakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/FakeApi.js b/samples/client/petstore/javascript/src/api/FakeApi.js index 1ac41b6bf33..3f19f090267 100644 --- a/samples/client/petstore/javascript/src/api/FakeApi.js +++ b/samples/client/petstore/javascript/src/api/FakeApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js b/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js index d62d7d706de..1fda0fa1451 100644 --- a/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js +++ b/samples/client/petstore/javascript/src/api/FakeClassnameTags123Api.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index fc494798667..36243ed29e1 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index d7bb5ff5912..32ce6e83cfc 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 092528a7580..13c24345f72 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js index 0a661df2958..1eebdbf5ff3 100644 --- a/samples/client/petstore/javascript/src/index.js +++ b/samples/client/petstore/javascript/src/index.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js b/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js index a0fecb58c62..e41dca8e660 100644 --- a/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript/src/model/AdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Animal.js b/samples/client/petstore/javascript/src/model/Animal.js index fe8092aca28..43aaacc12b5 100644 --- a/samples/client/petstore/javascript/src/model/Animal.js +++ b/samples/client/petstore/javascript/src/model/Animal.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/AnimalFarm.js b/samples/client/petstore/javascript/src/model/AnimalFarm.js index dee8dc23b6b..f3d2c132d12 100644 --- a/samples/client/petstore/javascript/src/model/AnimalFarm.js +++ b/samples/client/petstore/javascript/src/model/AnimalFarm.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ApiResponse.js b/samples/client/petstore/javascript/src/model/ApiResponse.js index 019604926b1..2d33b0b7a23 100644 --- a/samples/client/petstore/javascript/src/model/ApiResponse.js +++ b/samples/client/petstore/javascript/src/model/ApiResponse.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js b/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js index db6766a51b3..41463b0e371 100644 --- a/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript/src/model/ArrayOfArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js b/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js index 3e805670939..f3b0ac217e1 100644 --- a/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js +++ b/samples/client/petstore/javascript/src/model/ArrayOfNumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ArrayTest.js b/samples/client/petstore/javascript/src/model/ArrayTest.js index 57ebe94e9f1..6b8aeade8b0 100644 --- a/samples/client/petstore/javascript/src/model/ArrayTest.js +++ b/samples/client/petstore/javascript/src/model/ArrayTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Capitalization.js b/samples/client/petstore/javascript/src/model/Capitalization.js index 848ac1d0743..67c027686a9 100644 --- a/samples/client/petstore/javascript/src/model/Capitalization.js +++ b/samples/client/petstore/javascript/src/model/Capitalization.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Cat.js b/samples/client/petstore/javascript/src/model/Cat.js index ee1b7683a14..6f8ca2e91fd 100644 --- a/samples/client/petstore/javascript/src/model/Cat.js +++ b/samples/client/petstore/javascript/src/model/Cat.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js index 61577d4bd95..ba82e88bd49 100644 --- a/samples/client/petstore/javascript/src/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ClassModel.js b/samples/client/petstore/javascript/src/model/ClassModel.js index ce9f24d2afd..6592fdeebc9 100644 --- a/samples/client/petstore/javascript/src/model/ClassModel.js +++ b/samples/client/petstore/javascript/src/model/ClassModel.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Client.js b/samples/client/petstore/javascript/src/model/Client.js index dbe1f639d35..00fe25ca2d7 100644 --- a/samples/client/petstore/javascript/src/model/Client.js +++ b/samples/client/petstore/javascript/src/model/Client.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Dog.js b/samples/client/petstore/javascript/src/model/Dog.js index 7e2e6b91c61..7a74ef477b4 100644 --- a/samples/client/petstore/javascript/src/model/Dog.js +++ b/samples/client/petstore/javascript/src/model/Dog.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumArrays.js b/samples/client/petstore/javascript/src/model/EnumArrays.js index 8af55604e77..7bbb3af35d2 100644 --- a/samples/client/petstore/javascript/src/model/EnumArrays.js +++ b/samples/client/petstore/javascript/src/model/EnumArrays.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumClass.js b/samples/client/petstore/javascript/src/model/EnumClass.js index 400a587b11e..3a8a7f52d94 100644 --- a/samples/client/petstore/javascript/src/model/EnumClass.js +++ b/samples/client/petstore/javascript/src/model/EnumClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/EnumTest.js b/samples/client/petstore/javascript/src/model/EnumTest.js index 95c35adc4d8..25d166c5c8a 100644 --- a/samples/client/petstore/javascript/src/model/EnumTest.js +++ b/samples/client/petstore/javascript/src/model/EnumTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/File.js b/samples/client/petstore/javascript/src/model/File.js index f0c412ed7e5..706f20eff08 100644 --- a/samples/client/petstore/javascript/src/model/File.js +++ b/samples/client/petstore/javascript/src/model/File.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js b/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js index 53f4b4659b6..2bc85b700b0 100644 --- a/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js +++ b/samples/client/petstore/javascript/src/model/FileSchemaTestClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/FormatTest.js b/samples/client/petstore/javascript/src/model/FormatTest.js index 296857d44ca..679e769b5b2 100644 --- a/samples/client/petstore/javascript/src/model/FormatTest.js +++ b/samples/client/petstore/javascript/src/model/FormatTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js b/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js index 9aa9cfca512..6b42db4416e 100644 --- a/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js +++ b/samples/client/petstore/javascript/src/model/HasOnlyReadOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/List.js b/samples/client/petstore/javascript/src/model/List.js index 84b63989e85..05c95f2613a 100644 --- a/samples/client/petstore/javascript/src/model/List.js +++ b/samples/client/petstore/javascript/src/model/List.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/MapTest.js b/samples/client/petstore/javascript/src/model/MapTest.js index ee5f5dd07cd..65b317db8b5 100644 --- a/samples/client/petstore/javascript/src/model/MapTest.js +++ b/samples/client/petstore/javascript/src/model/MapTest.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js b/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js index eaecc593817..9291b7ba8a4 100644 --- a/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js +++ b/samples/client/petstore/javascript/src/model/MixedPropertiesAndAdditionalPropertiesClass.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Model200Response.js b/samples/client/petstore/javascript/src/model/Model200Response.js index 7d22d9f50c1..82d0b362160 100644 --- a/samples/client/petstore/javascript/src/model/Model200Response.js +++ b/samples/client/petstore/javascript/src/model/Model200Response.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ModelReturn.js b/samples/client/petstore/javascript/src/model/ModelReturn.js index 4e43daf99f8..b4ca8a7875d 100644 --- a/samples/client/petstore/javascript/src/model/ModelReturn.js +++ b/samples/client/petstore/javascript/src/model/ModelReturn.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Name.js b/samples/client/petstore/javascript/src/model/Name.js index 076c04d87c1..a18ddecd8d9 100644 --- a/samples/client/petstore/javascript/src/model/Name.js +++ b/samples/client/petstore/javascript/src/model/Name.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/NumberOnly.js b/samples/client/petstore/javascript/src/model/NumberOnly.js index aaf10683e71..f25c7bbc8b2 100644 --- a/samples/client/petstore/javascript/src/model/NumberOnly.js +++ b/samples/client/petstore/javascript/src/model/NumberOnly.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js index d4642cd267b..a65a0024885 100644 --- a/samples/client/petstore/javascript/src/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/OuterComposite.js b/samples/client/petstore/javascript/src/model/OuterComposite.js index 5d83a1632d1..e9c23b1e619 100644 --- a/samples/client/petstore/javascript/src/model/OuterComposite.js +++ b/samples/client/petstore/javascript/src/model/OuterComposite.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/OuterEnum.js b/samples/client/petstore/javascript/src/model/OuterEnum.js index bf484fcdb5c..bca0fdf08ce 100644 --- a/samples/client/petstore/javascript/src/model/OuterEnum.js +++ b/samples/client/petstore/javascript/src/model/OuterEnum.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js index a3232c511cb..a4edb988958 100644 --- a/samples/client/petstore/javascript/src/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js b/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js index 74a2fe86277..f05c53ebab3 100644 --- a/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js +++ b/samples/client/petstore/javascript/src/model/ReadOnlyFirst.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/SpecialModelName.js b/samples/client/petstore/javascript/src/model/SpecialModelName.js index d6791c03805..3de755a7986 100644 --- a/samples/client/petstore/javascript/src/model/SpecialModelName.js +++ b/samples/client/petstore/javascript/src/model/SpecialModelName.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/StringBooleanMap.js b/samples/client/petstore/javascript/src/model/StringBooleanMap.js index 87274d44502..8a82f9d99ba 100644 --- a/samples/client/petstore/javascript/src/model/StringBooleanMap.js +++ b/samples/client/petstore/javascript/src/model/StringBooleanMap.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js index 228533a3157..c57bfb9ca07 100644 --- a/samples/client/petstore/javascript/src/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * diff --git a/samples/client/petstore/javascript/src/model/User.js b/samples/client/petstore/javascript/src/model/User.js index e305e9756b0..6f2f6910f4d 100644 --- a/samples/client/petstore/javascript/src/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -7,7 +7,7 @@ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * - * OpenAPI Generator version: 3.2.3-SNAPSHOT + * OpenAPI Generator version: 3.3.0-SNAPSHOT * * Do not edit the class manually. * From 825404a1dff9f7ddead2dc12bfcd28fb298e827e Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Sat, 8 Sep 2018 15:51:05 +0200 Subject: [PATCH 59/74] [Spring] Fix reactive + delegatePattern option (#978) --- bin/springboot-petstore-server-reactive.sh | 2 +- .../main/resources/JavaSpring/api.mustache | 2 +- .../resources/JavaSpring/apiDelegate.mustache | 11 +- .../api/AnotherFakeApiDelegate.java | 2 +- .../org/openapitools/api/FakeApiDelegate.java | 68 +++--- .../api/FakeClassnameTestApiDelegate.java | 2 +- .../org/openapitools/api/PetApiDelegate.java | 24 +- .../openapitools/api/StoreApiDelegate.java | 6 +- .../org/openapitools/api/UserApiDelegate.java | 18 +- .../api/AnotherFakeApiDelegate.java | 2 +- .../org/openapitools/api/FakeApiDelegate.java | 68 +++--- .../api/FakeClassnameTestApiDelegate.java | 2 +- .../org/openapitools/api/PetApiDelegate.java | 24 +- .../openapitools/api/StoreApiDelegate.java | 6 +- .../org/openapitools/api/UserApiDelegate.java | 18 +- .../org/openapitools/api/AnotherFakeApi.java | 18 +- .../api/AnotherFakeApiController.java | 12 +- .../api/AnotherFakeApiDelegate.java | 46 ++++ .../java/org/openapitools/api/FakeApi.java | 103 ++------ .../openapitools/api/FakeApiController.java | 12 +- .../org/openapitools/api/FakeApiDelegate.java | 230 ++++++++++++++++++ .../api/FakeClassnameTestApi.java | 18 +- .../api/FakeClassnameTestApiController.java | 12 +- .../api/FakeClassnameTestApiDelegate.java | 46 ++++ .../java/org/openapitools/api/PetApi.java | 83 +------ .../openapitools/api/PetApiController.java | 12 +- .../org/openapitools/api/PetApiDelegate.java | 160 ++++++++++++ .../java/org/openapitools/api/StoreApi.java | 47 +--- .../openapitools/api/StoreApiController.java | 12 +- .../openapitools/api/StoreApiDelegate.java | 93 +++++++ .../java/org/openapitools/api/UserApi.java | 57 +---- .../openapitools/api/UserApiController.java | 12 +- .../org/openapitools/api/UserApiDelegate.java | 129 ++++++++++ 33 files changed, 958 insertions(+), 399 deletions(-) create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiDelegate.java create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiDelegate.java create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiDelegate.java create mode 100644 samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiDelegate.java diff --git a/bin/springboot-petstore-server-reactive.sh b/bin/springboot-petstore-server-reactive.sh index 820daf1b8d6..f8936804ad2 100755 --- a/bin/springboot-petstore-server-reactive.sh +++ b/bin/springboot-petstore-server-reactive.sh @@ -26,7 +26,7 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="generate --artifact-id springboot-reactive -t modules/openapi-generator/src/main/resources/JavaSpring -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g spring -o samples/server/petstore/springboot-reactive -Dreactive=true,hideGenerationTimestamp=true $@" +ags="generate --artifact-id springboot-reactive -t modules/openapi-generator/src/main/resources/JavaSpring -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g spring -o samples/server/petstore/springboot-reactive -Dreactive=true,delegatePattern=true,hideGenerationTimestamp=true $@" echo "Removing files and folders under samples/server/petstore/springboot-reactive/src/main" rm -rf samples/server/petstore/springboot-reactive/src/main diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache index 6736878e6f0..08bebd3a975 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/api.mustache @@ -121,7 +121,7 @@ public interface {{classname}} { {{>methodBody}} {{/isDelegate}} {{#isDelegate}} - return getDelegate().{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#reactive}}, exchange{{/reactive}}); + return getDelegate().{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#reactive}}{{#hasParams}}, {{/hasParams}}exchange{{/reactive}}); {{/isDelegate}} }{{/jdk8}} diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/apiDelegate.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/apiDelegate.mustache index 45f31bd4e14..76bc71fbb33 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/apiDelegate.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/apiDelegate.mustache @@ -12,6 +12,11 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.NativeWebRequest; {{/jdk8}} import org.springframework.web.multipart.MultipartFile; +{{#reactive}} +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +{{/reactive}} import java.util.List; import java.util.Map; @@ -45,9 +50,9 @@ public interface {{classname}}Delegate { /** * @see {{classname}}#{{operationId}} */ - {{#jdk8}}default {{/jdk8}}{{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{operationId}}({{#allParams}}{{^isFile}} {{>optionalDataType}} {{/isFile}}{{#isFile}}MultipartFile{{/isFile}} {{paramName}}{{#hasMore}}, - {{/hasMore}}{{^hasMore}}{{#reactive}}, - {{/reactive}}{{/hasMore}}{{/allParams}}{{#reactive}}ServerWebExchange exchange{{/reactive}}){{^jdk8}};{{/jdk8}}{{#jdk8}} { + {{#jdk8}}default {{/jdk8}}{{#responseWrapper}}{{.}}<{{/responseWrapper}}ResponseEntity<{{>returnTypes}}>{{#responseWrapper}}>{{/responseWrapper}} {{operationId}}({{#allParams}}{{^isFile}}{{^isBodyParam}}{{>optionalDataType}}{{/isBodyParam}}{{#isBodyParam}}{{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isListContainer}}Mono{{/isListContainer}}{{#isListContainer}}Flux{{/isListContainer}}<{{{baseType}}}>{{/reactive}}{{/isBodyParam}}{{/isFile}}{{#isFile}}MultipartFile{{/isFile}} {{paramName}}{{#hasMore}}, + {{/hasMore}}{{/allParams}}{{#reactive}}{{#hasParams}}, + {{/hasParams}}ServerWebExchange exchange{{/reactive}}){{^jdk8}};{{/jdk8}}{{#jdk8}} { {{>methodBody}} }{{/jdk8}} diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java index 4db33947735..597b34a8c3a 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java @@ -26,7 +26,7 @@ public interface AnotherFakeApiDelegate { /** * @see AnotherFakeApi#call123testSpecialTags */ - default ResponseEntity call123testSpecialTags( Client client) { + default ResponseEntity call123testSpecialTags(Client client) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeApiDelegate.java index 6dfe4160b17..0ba0769182f 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeApiDelegate.java @@ -35,7 +35,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#fakeOuterBooleanSerialize */ - default ResponseEntity fakeOuterBooleanSerialize( Boolean body) { + default ResponseEntity fakeOuterBooleanSerialize(Boolean body) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { @@ -51,7 +51,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#fakeOuterCompositeSerialize */ - default ResponseEntity fakeOuterCompositeSerialize( OuterComposite outerComposite) { + default ResponseEntity fakeOuterCompositeSerialize(OuterComposite outerComposite) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { @@ -67,7 +67,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#fakeOuterNumberSerialize */ - default ResponseEntity fakeOuterNumberSerialize( BigDecimal body) { + default ResponseEntity fakeOuterNumberSerialize(BigDecimal body) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { @@ -83,7 +83,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#fakeOuterStringSerialize */ - default ResponseEntity fakeOuterStringSerialize( String body) { + default ResponseEntity fakeOuterStringSerialize(String body) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { @@ -99,7 +99,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#testBodyWithFileSchema */ - default ResponseEntity testBodyWithFileSchema( FileSchemaTestClass fileSchemaTestClass) { + default ResponseEntity testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -107,8 +107,8 @@ public interface FakeApiDelegate { /** * @see FakeApi#testBodyWithQueryParams */ - default ResponseEntity testBodyWithQueryParams( String query, - User user) { + default ResponseEntity testBodyWithQueryParams(String query, + User user) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -116,7 +116,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#testClientModel */ - default ResponseEntity testClientModel( Client client) { + default ResponseEntity testClientModel(Client client) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -132,20 +132,20 @@ public interface FakeApiDelegate { /** * @see FakeApi#testEndpointParameters */ - default ResponseEntity testEndpointParameters( BigDecimal number, - Double _double, - String patternWithoutDelimiter, - byte[] _byte, - Integer integer, - Integer int32, - Long int64, - Float _float, - String string, + default ResponseEntity testEndpointParameters(BigDecimal number, + Double _double, + String patternWithoutDelimiter, + byte[] _byte, + Integer integer, + Integer int32, + Long int64, + Float _float, + String string, MultipartFile binary, - LocalDate date, - OffsetDateTime dateTime, - String password, - String paramCallback) { + LocalDate date, + OffsetDateTime dateTime, + String password, + String paramCallback) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -153,14 +153,14 @@ public interface FakeApiDelegate { /** * @see FakeApi#testEnumParameters */ - default ResponseEntity testEnumParameters( List enumHeaderStringArray, - String enumHeaderString, - List enumQueryStringArray, - String enumQueryString, - Integer enumQueryInteger, - Double enumQueryDouble, - List enumFormStringArray, - String enumFormString) { + default ResponseEntity testEnumParameters(List enumHeaderStringArray, + String enumHeaderString, + List enumQueryStringArray, + String enumQueryString, + Integer enumQueryInteger, + Double enumQueryDouble, + List enumFormStringArray, + String enumFormString) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -168,7 +168,7 @@ public interface FakeApiDelegate { /** * @see FakeApi#testInlineAdditionalProperties */ - default ResponseEntity testInlineAdditionalProperties( Map requestBody) { + default ResponseEntity testInlineAdditionalProperties(Map requestBody) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -176,8 +176,8 @@ public interface FakeApiDelegate { /** * @see FakeApi#testJsonFormData */ - default ResponseEntity testJsonFormData( String param, - String param2) { + default ResponseEntity testJsonFormData(String param, + String param2) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -185,9 +185,9 @@ public interface FakeApiDelegate { /** * @see FakeApi#uploadFileWithRequiredFile */ - default ResponseEntity uploadFileWithRequiredFile( Long petId, + default ResponseEntity uploadFileWithRequiredFile(Long petId, MultipartFile requiredFile, - String additionalMetadata) { + String additionalMetadata) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java index 6cd8c3eb203..e94d222a6c7 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java @@ -26,7 +26,7 @@ public interface FakeClassnameTestApiDelegate { /** * @see FakeClassnameTestApi#testClassname */ - default ResponseEntity testClassname( Client client) { + default ResponseEntity testClassname(Client client) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/PetApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/PetApiDelegate.java index 88a778effd8..65c95bf1c1e 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/PetApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/PetApiDelegate.java @@ -28,7 +28,7 @@ public interface PetApiDelegate { /** * @see PetApi#addPet */ - default ResponseEntity addPet( Pet pet) { + default ResponseEntity addPet(Pet pet) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -36,8 +36,8 @@ public interface PetApiDelegate { /** * @see PetApi#deletePet */ - default ResponseEntity deletePet( Long petId, - String apiKey) { + default ResponseEntity deletePet(Long petId, + String apiKey) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -45,7 +45,7 @@ public interface PetApiDelegate { /** * @see PetApi#findPetsByStatus */ - default ResponseEntity> findPetsByStatus( List status) { + default ResponseEntity> findPetsByStatus(List status) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -65,7 +65,7 @@ public interface PetApiDelegate { /** * @see PetApi#findPetsByTags */ - default ResponseEntity> findPetsByTags( List tags) { + default ResponseEntity> findPetsByTags(List tags) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -85,7 +85,7 @@ public interface PetApiDelegate { /** * @see PetApi#getPetById */ - default ResponseEntity getPetById( Long petId) { + default ResponseEntity getPetById(Long petId) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -105,7 +105,7 @@ public interface PetApiDelegate { /** * @see PetApi#updatePet */ - default ResponseEntity updatePet( Pet pet) { + default ResponseEntity updatePet(Pet pet) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -113,9 +113,9 @@ public interface PetApiDelegate { /** * @see PetApi#updatePetWithForm */ - default ResponseEntity updatePetWithForm( Long petId, - String name, - String status) { + default ResponseEntity updatePetWithForm(Long petId, + String name, + String status) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -123,8 +123,8 @@ public interface PetApiDelegate { /** * @see PetApi#uploadFile */ - default ResponseEntity uploadFile( Long petId, - String additionalMetadata, + default ResponseEntity uploadFile(Long petId, + String additionalMetadata, MultipartFile file) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/StoreApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/StoreApiDelegate.java index c0a27ceb4ef..85a55dfcbda 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/StoreApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/StoreApiDelegate.java @@ -27,7 +27,7 @@ public interface StoreApiDelegate { /** * @see StoreApi#deleteOrder */ - default ResponseEntity deleteOrder( String orderId) { + default ResponseEntity deleteOrder(String orderId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -43,7 +43,7 @@ public interface StoreApiDelegate { /** * @see StoreApi#getOrderById */ - default ResponseEntity getOrderById( Long orderId) { + default ResponseEntity getOrderById(Long orderId) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -63,7 +63,7 @@ public interface StoreApiDelegate { /** * @see StoreApi#placeOrder */ - default ResponseEntity placeOrder( Order order) { + default ResponseEntity placeOrder(Order order) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { diff --git a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/UserApiDelegate.java b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/UserApiDelegate.java index 1920c36711a..aaf9227ee56 100644 --- a/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/UserApiDelegate.java +++ b/samples/server/petstore/springboot-delegate-j8/src/main/java/org/openapitools/api/UserApiDelegate.java @@ -27,7 +27,7 @@ public interface UserApiDelegate { /** * @see UserApi#createUser */ - default ResponseEntity createUser( User user) { + default ResponseEntity createUser(User user) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -35,7 +35,7 @@ public interface UserApiDelegate { /** * @see UserApi#createUsersWithArrayInput */ - default ResponseEntity createUsersWithArrayInput( List user) { + default ResponseEntity createUsersWithArrayInput(List user) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -43,7 +43,7 @@ public interface UserApiDelegate { /** * @see UserApi#createUsersWithListInput */ - default ResponseEntity createUsersWithListInput( List user) { + default ResponseEntity createUsersWithListInput(List user) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -51,7 +51,7 @@ public interface UserApiDelegate { /** * @see UserApi#deleteUser */ - default ResponseEntity deleteUser( String username) { + default ResponseEntity deleteUser(String username) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -59,7 +59,7 @@ public interface UserApiDelegate { /** * @see UserApi#getUserByName */ - default ResponseEntity getUserByName( String username) { + default ResponseEntity getUserByName(String username) { getRequest().ifPresent(request -> { for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { @@ -79,8 +79,8 @@ public interface UserApiDelegate { /** * @see UserApi#loginUser */ - default ResponseEntity loginUser( String username, - String password) { + default ResponseEntity loginUser(String username, + String password) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -96,8 +96,8 @@ public interface UserApiDelegate { /** * @see UserApi#updateUser */ - default ResponseEntity updateUser( String username, - User user) { + default ResponseEntity updateUser(String username, + User user) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java index 569d1299b99..0e835519fc6 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java @@ -18,6 +18,6 @@ public interface AnotherFakeApiDelegate { /** * @see AnotherFakeApi#call123testSpecialTags */ - ResponseEntity call123testSpecialTags( Client client); + ResponseEntity call123testSpecialTags(Client client); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeApiDelegate.java index 48963d95265..0d6eb018765 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeApiDelegate.java @@ -27,85 +27,85 @@ public interface FakeApiDelegate { /** * @see FakeApi#fakeOuterBooleanSerialize */ - ResponseEntity fakeOuterBooleanSerialize( Boolean body); + ResponseEntity fakeOuterBooleanSerialize(Boolean body); /** * @see FakeApi#fakeOuterCompositeSerialize */ - ResponseEntity fakeOuterCompositeSerialize( OuterComposite outerComposite); + ResponseEntity fakeOuterCompositeSerialize(OuterComposite outerComposite); /** * @see FakeApi#fakeOuterNumberSerialize */ - ResponseEntity fakeOuterNumberSerialize( BigDecimal body); + ResponseEntity fakeOuterNumberSerialize(BigDecimal body); /** * @see FakeApi#fakeOuterStringSerialize */ - ResponseEntity fakeOuterStringSerialize( String body); + ResponseEntity fakeOuterStringSerialize(String body); /** * @see FakeApi#testBodyWithFileSchema */ - ResponseEntity testBodyWithFileSchema( FileSchemaTestClass fileSchemaTestClass); + ResponseEntity testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass); /** * @see FakeApi#testBodyWithQueryParams */ - ResponseEntity testBodyWithQueryParams( String query, - User user); + ResponseEntity testBodyWithQueryParams(String query, + User user); /** * @see FakeApi#testClientModel */ - ResponseEntity testClientModel( Client client); + ResponseEntity testClientModel(Client client); /** * @see FakeApi#testEndpointParameters */ - ResponseEntity testEndpointParameters( BigDecimal number, - Double _double, - String patternWithoutDelimiter, - byte[] _byte, - Integer integer, - Integer int32, - Long int64, - Float _float, - String string, + ResponseEntity testEndpointParameters(BigDecimal number, + Double _double, + String patternWithoutDelimiter, + byte[] _byte, + Integer integer, + Integer int32, + Long int64, + Float _float, + String string, MultipartFile binary, - LocalDate date, - OffsetDateTime dateTime, - String password, - String paramCallback); + LocalDate date, + OffsetDateTime dateTime, + String password, + String paramCallback); /** * @see FakeApi#testEnumParameters */ - ResponseEntity testEnumParameters( List enumHeaderStringArray, - String enumHeaderString, - List enumQueryStringArray, - String enumQueryString, - Integer enumQueryInteger, - Double enumQueryDouble, - List enumFormStringArray, - String enumFormString); + ResponseEntity testEnumParameters(List enumHeaderStringArray, + String enumHeaderString, + List enumQueryStringArray, + String enumQueryString, + Integer enumQueryInteger, + Double enumQueryDouble, + List enumFormStringArray, + String enumFormString); /** * @see FakeApi#testInlineAdditionalProperties */ - ResponseEntity testInlineAdditionalProperties( Map requestBody); + ResponseEntity testInlineAdditionalProperties(Map requestBody); /** * @see FakeApi#testJsonFormData */ - ResponseEntity testJsonFormData( String param, - String param2); + ResponseEntity testJsonFormData(String param, + String param2); /** * @see FakeApi#uploadFileWithRequiredFile */ - ResponseEntity uploadFileWithRequiredFile( Long petId, + ResponseEntity uploadFileWithRequiredFile(Long petId, MultipartFile requiredFile, - String additionalMetadata); + String additionalMetadata); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java index c81f614a811..c0d42c3a3e7 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java @@ -18,6 +18,6 @@ public interface FakeClassnameTestApiDelegate { /** * @see FakeClassnameTestApi#testClassname */ - ResponseEntity testClassname( Client client); + ResponseEntity testClassname(Client client); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/PetApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/PetApiDelegate.java index 13f6acf44c7..bae746c1414 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/PetApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/PetApiDelegate.java @@ -20,46 +20,46 @@ public interface PetApiDelegate { /** * @see PetApi#addPet */ - ResponseEntity addPet( Pet pet); + ResponseEntity addPet(Pet pet); /** * @see PetApi#deletePet */ - ResponseEntity deletePet( Long petId, - String apiKey); + ResponseEntity deletePet(Long petId, + String apiKey); /** * @see PetApi#findPetsByStatus */ - ResponseEntity> findPetsByStatus( List status); + ResponseEntity> findPetsByStatus(List status); /** * @see PetApi#findPetsByTags */ - ResponseEntity> findPetsByTags( List tags); + ResponseEntity> findPetsByTags(List tags); /** * @see PetApi#getPetById */ - ResponseEntity getPetById( Long petId); + ResponseEntity getPetById(Long petId); /** * @see PetApi#updatePet */ - ResponseEntity updatePet( Pet pet); + ResponseEntity updatePet(Pet pet); /** * @see PetApi#updatePetWithForm */ - ResponseEntity updatePetWithForm( Long petId, - String name, - String status); + ResponseEntity updatePetWithForm(Long petId, + String name, + String status); /** * @see PetApi#uploadFile */ - ResponseEntity uploadFile( Long petId, - String additionalMetadata, + ResponseEntity uploadFile(Long petId, + String additionalMetadata, MultipartFile file); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/StoreApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/StoreApiDelegate.java index 1967f371327..6fa60ee6c17 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/StoreApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/StoreApiDelegate.java @@ -19,7 +19,7 @@ public interface StoreApiDelegate { /** * @see StoreApi#deleteOrder */ - ResponseEntity deleteOrder( String orderId); + ResponseEntity deleteOrder(String orderId); /** * @see StoreApi#getInventory @@ -29,11 +29,11 @@ public interface StoreApiDelegate { /** * @see StoreApi#getOrderById */ - ResponseEntity getOrderById( Long orderId); + ResponseEntity getOrderById(Long orderId); /** * @see StoreApi#placeOrder */ - ResponseEntity placeOrder( Order order); + ResponseEntity placeOrder(Order order); } diff --git a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/UserApiDelegate.java b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/UserApiDelegate.java index 1aefe4ec201..70404052360 100644 --- a/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/UserApiDelegate.java +++ b/samples/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/UserApiDelegate.java @@ -19,33 +19,33 @@ public interface UserApiDelegate { /** * @see UserApi#createUser */ - ResponseEntity createUser( User user); + ResponseEntity createUser(User user); /** * @see UserApi#createUsersWithArrayInput */ - ResponseEntity createUsersWithArrayInput( List user); + ResponseEntity createUsersWithArrayInput(List user); /** * @see UserApi#createUsersWithListInput */ - ResponseEntity createUsersWithListInput( List user); + ResponseEntity createUsersWithListInput(List user); /** * @see UserApi#deleteUser */ - ResponseEntity deleteUser( String username); + ResponseEntity deleteUser(String username); /** * @see UserApi#getUserByName */ - ResponseEntity getUserByName( String username); + ResponseEntity getUserByName(String username); /** * @see UserApi#loginUser */ - ResponseEntity loginUser( String username, - String password); + ResponseEntity loginUser(String username, + String password); /** * @see UserApi#logoutUser @@ -55,7 +55,7 @@ public interface UserApiDelegate { /** * @see UserApi#updateUser */ - ResponseEntity updateUser( String username, - User user); + ResponseEntity updateUser(String username, + User user); } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java index bc85f007ea5..3b15b7d64ef 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApi.java @@ -7,8 +7,6 @@ package org.openapitools.api; import org.openapitools.model.Client; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -27,12 +25,15 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "another-fake", description = "the another-fake API") public interface AnotherFakeApi { + default AnotherFakeApiDelegate getDelegate() { + return new AnotherFakeApiDelegate() {}; + } + @ApiOperation(value = "To test special tags", nickname = "call123testSpecialTags", notes = "To test special tags and operation ID starting with number", response = Client.class, tags={ "$another-fake?", }) @ApiResponses(value = { @ApiResponse(code = 200, message = "successful operation", response = Client.class) }) @@ -41,16 +42,7 @@ public interface AnotherFakeApi { consumes = { "application/json" }, method = RequestMethod.PATCH) default Mono> call123testSpecialTags(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().call123testSpecialTags(client, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiController.java index 997ef4798bb..3bc2df15df6 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class AnotherFakeApiController implements AnotherFakeApi { + private final AnotherFakeApiDelegate delegate; + + public AnotherFakeApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) AnotherFakeApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new AnotherFakeApiDelegate() {}); + } + + @Override + public AnotherFakeApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java new file mode 100644 index 00000000000..ddc7c2a0e8f --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/AnotherFakeApiDelegate.java @@ -0,0 +1,46 @@ +package org.openapitools.api; + +import org.openapitools.model.Client; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link AnotherFakeApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface AnotherFakeApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see AnotherFakeApi#call123testSpecialTags + */ + default Mono> call123testSpecialTags(Mono client, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); + break; + } + } + return result.then(Mono.empty()); + + } + +} diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java index 928e0e031f4..45ff9ab452c 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java @@ -16,8 +16,6 @@ import org.openapitools.model.OuterComposite; import org.springframework.core.io.Resource; import org.openapitools.model.User; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -36,12 +34,15 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "fake", description = "the fake API") public interface FakeApi { + default FakeApiDelegate getDelegate() { + return new FakeApiDelegate() {}; + } + @ApiOperation(value = "", nickname = "fakeOuterBooleanSerialize", notes = "Test serialization of outer boolean types", response = Boolean.class, tags={ "fake", }) @ApiResponses(value = { @ApiResponse(code = 200, message = "Output boolean", response = Boolean.class) }) @@ -49,16 +50,7 @@ public interface FakeApi { produces = { "*/*" }, method = RequestMethod.POST) default Mono> fakeOuterBooleanSerialize(@ApiParam(value = "Input boolean as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().fakeOuterBooleanSerialize(body, exchange); } @@ -69,16 +61,7 @@ public interface FakeApi { produces = { "*/*" }, method = RequestMethod.POST) default Mono> fakeOuterCompositeSerialize(@ApiParam(value = "Input composite as post body" ) @Valid @RequestBody Mono outerComposite, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"my_string\" : \"my_string\", \"my_number\" : 0.80082819046101150206595775671303272247314453125, \"my_boolean\" : true}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().fakeOuterCompositeSerialize(outerComposite, exchange); } @@ -89,16 +72,7 @@ public interface FakeApi { produces = { "*/*" }, method = RequestMethod.POST) default Mono> fakeOuterNumberSerialize(@ApiParam(value = "Input number as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().fakeOuterNumberSerialize(body, exchange); } @@ -109,16 +83,7 @@ public interface FakeApi { produces = { "*/*" }, method = RequestMethod.POST) default Mono> fakeOuterStringSerialize(@ApiParam(value = "Input string as post body" ) @Valid @RequestBody Mono body, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { - result = ApiUtil.getExampleResponse(exchange, "null"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().fakeOuterStringSerialize(body, exchange); } @@ -129,10 +94,7 @@ public interface FakeApi { consumes = { "application/json" }, method = RequestMethod.PUT) default Mono> testBodyWithFileSchema(@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono fileSchemaTestClass, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testBodyWithFileSchema(fileSchemaTestClass, exchange); } @@ -143,10 +105,7 @@ public interface FakeApi { consumes = { "application/json" }, method = RequestMethod.PUT) default Mono> testBodyWithQueryParams(@NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "query", required = true) String query,@ApiParam(value = "" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testBodyWithQueryParams(query, user, exchange); } @@ -158,16 +117,7 @@ public interface FakeApi { consumes = { "application/json" }, method = RequestMethod.PATCH) default Mono> testClientModel(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().testClientModel(client, exchange); } @@ -181,10 +131,7 @@ public interface FakeApi { consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.POST) default Mono> testEndpointParameters(@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="number", required=true) BigDecimal number,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="double", required=true) Double _double,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="pattern_without_delimiter", required=true) String patternWithoutDelimiter,@ApiParam(value = "None", required=true, defaultValue="null") @RequestParam(value="byte", required=true) byte[] _byte,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="integer", required=false) Integer integer,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int32", required=false) Integer int32,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="int64", required=false) Long int64,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="float", required=false) Float _float,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="string", required=false) String string,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile binary,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="date", required=false) LocalDate date,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="dateTime", required=false) OffsetDateTime dateTime,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="password", required=false) String password,@ApiParam(value = "None", defaultValue="null") @RequestParam(value="callback", required=false) String paramCallback, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback, exchange); } @@ -196,10 +143,7 @@ public interface FakeApi { consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.GET) default Mono> testEnumParameters(@ApiParam(value = "Header parameter enum test (string array)" , allowableValues=">, $") @RequestHeader(value="enum_header_string_array", required=false) List enumHeaderStringArray,@ApiParam(value = "Header parameter enum test (string)" , allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestHeader(value="enum_header_string", required=false) String enumHeaderString,@ApiParam(value = "Query parameter enum test (string array)", allowableValues = ">, $") @Valid @RequestParam(value = "enum_query_string_array", required = false) List enumQueryStringArray,@ApiParam(value = "Query parameter enum test (string)", allowableValues = "_abc, -efg, (xyz)", defaultValue = "-efg") @Valid @RequestParam(value = "enum_query_string", required = false, defaultValue="-efg") String enumQueryString,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1, -2") @Valid @RequestParam(value = "enum_query_integer", required = false) Integer enumQueryInteger,@ApiParam(value = "Query parameter enum test (double)", allowableValues = "1.1, -1.2") @Valid @RequestParam(value = "enum_query_double", required = false) Double enumQueryDouble,@ApiParam(value = "Form parameter enum test (string array)", allowableValues=">, $", defaultValue="$") @RequestParam(value="enum_form_string_array", required=false) List enumFormStringArray,@ApiParam(value = "Form parameter enum test (string)", allowableValues="_abc, -efg, (xyz)", defaultValue="-efg") @RequestParam(value="enum_form_string", required=false) String enumFormString, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString, exchange); } @@ -210,10 +154,7 @@ public interface FakeApi { consumes = { "application/json" }, method = RequestMethod.POST) default Mono> testInlineAdditionalProperties(@ApiParam(value = "request body" ,required=true ) @Valid @RequestBody Mono requestBody, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testInlineAdditionalProperties(requestBody, exchange); } @@ -224,10 +165,7 @@ public interface FakeApi { consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.GET) default Mono> testJsonFormData(@ApiParam(value = "field1", required=true, defaultValue="null") @RequestParam(value="param", required=true) String param,@ApiParam(value = "field2", required=true, defaultValue="null") @RequestParam(value="param2", required=true) String param2, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().testJsonFormData(param, param2, exchange); } @@ -244,16 +182,7 @@ public interface FakeApi { consumes = { "multipart/form-data" }, method = RequestMethod.POST) default Mono> uploadFileWithRequiredFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile requiredFile,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiController.java index 9d4b5917508..75c4b5587be 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class FakeApiController implements FakeApi { + private final FakeApiDelegate delegate; + + public FakeApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) FakeApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new FakeApiDelegate() {}); + } + + @Override + public FakeApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiDelegate.java new file mode 100644 index 00000000000..b7c338d094f --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApiDelegate.java @@ -0,0 +1,230 @@ +package org.openapitools.api; + +import java.math.BigDecimal; +import org.openapitools.model.Client; +import org.openapitools.model.FileSchemaTestClass; +import java.time.LocalDate; +import java.util.Map; +import org.openapitools.model.ModelApiResponse; +import java.time.OffsetDateTime; +import org.openapitools.model.OuterComposite; +import org.springframework.core.io.Resource; +import org.openapitools.model.User; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link FakeApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface FakeApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see FakeApi#fakeOuterBooleanSerialize + */ + default Mono> fakeOuterBooleanSerialize(Mono body, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + result = ApiUtil.getExampleResponse(exchange, "null"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#fakeOuterCompositeSerialize + */ + default Mono> fakeOuterCompositeSerialize(Mono outerComposite, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"my_string\" : \"my_string\", \"my_number\" : 0.80082819046101150206595775671303272247314453125, \"my_boolean\" : true}"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#fakeOuterNumberSerialize + */ + default Mono> fakeOuterNumberSerialize(Mono body, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + result = ApiUtil.getExampleResponse(exchange, "null"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#fakeOuterStringSerialize + */ + default Mono> fakeOuterStringSerialize(Mono body, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("*/*"))) { + result = ApiUtil.getExampleResponse(exchange, "null"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testBodyWithFileSchema + */ + default Mono> testBodyWithFileSchema(Mono fileSchemaTestClass, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testBodyWithQueryParams + */ + default Mono> testBodyWithQueryParams(String query, + Mono user, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testClientModel + */ + default Mono> testClientModel(Mono client, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testEndpointParameters + */ + default Mono> testEndpointParameters(BigDecimal number, + Double _double, + String patternWithoutDelimiter, + byte[] _byte, + Integer integer, + Integer int32, + Long int64, + Float _float, + String string, + MultipartFile binary, + LocalDate date, + OffsetDateTime dateTime, + String password, + String paramCallback, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testEnumParameters + */ + default Mono> testEnumParameters(List enumHeaderStringArray, + String enumHeaderString, + List enumQueryStringArray, + String enumQueryString, + Integer enumQueryInteger, + Double enumQueryDouble, + List enumFormStringArray, + String enumFormString, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testInlineAdditionalProperties + */ + default Mono> testInlineAdditionalProperties(Mono requestBody, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#testJsonFormData + */ + default Mono> testJsonFormData(String param, + String param2, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see FakeApi#uploadFileWithRequiredFile + */ + default Mono> uploadFileWithRequiredFile(Long petId, + MultipartFile requiredFile, + String additionalMetadata, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); + break; + } + } + return result.then(Mono.empty()); + + } + +} diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java index 7588711e585..edc63ea5b8d 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApi.java @@ -7,8 +7,6 @@ package org.openapitools.api; import org.openapitools.model.Client; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -27,12 +25,15 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "fake_classname_test", description = "the fake_classname_test API") public interface FakeClassnameTestApi { + default FakeClassnameTestApiDelegate getDelegate() { + return new FakeClassnameTestApiDelegate() {}; + } + @ApiOperation(value = "To test class name in snake case", nickname = "testClassname", notes = "To test class name in snake case", response = Client.class, authorizations = { @Authorization(value = "api_key_query") }, tags={ "fake_classname_tags 123#$%^", }) @@ -43,16 +44,7 @@ public interface FakeClassnameTestApi { consumes = { "application/json" }, method = RequestMethod.PATCH) default Mono> testClassname(@ApiParam(value = "client model" ,required=true ) @Valid @RequestBody Mono client, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().testClassname(client, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiController.java index 905d8b60bd7..6566359e66f 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class FakeClassnameTestApiController implements FakeClassnameTestApi { + private final FakeClassnameTestApiDelegate delegate; + + public FakeClassnameTestApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) FakeClassnameTestApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new FakeClassnameTestApiDelegate() {}); + } + + @Override + public FakeClassnameTestApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java new file mode 100644 index 00000000000..bffd475ef6b --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeClassnameTestApiDelegate.java @@ -0,0 +1,46 @@ +package org.openapitools.api; + +import org.openapitools.model.Client; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link FakeClassnameTestApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface FakeClassnameTestApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see FakeClassnameTestApi#testClassname + */ + default Mono> testClassname(Mono client, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"client\" : \"client\"}"); + break; + } + } + return result.then(Mono.empty()); + + } + +} diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java index 150a6658bf1..1fa5b4235c8 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApi.java @@ -9,8 +9,6 @@ import org.openapitools.model.ModelApiResponse; import org.openapitools.model.Pet; import org.springframework.core.io.Resource; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -29,12 +27,15 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "pet", description = "the pet API") public interface PetApi { + default PetApiDelegate getDelegate() { + return new PetApiDelegate() {}; + } + @ApiOperation(value = "Add a new pet to the store", nickname = "addPet", notes = "", authorizations = { @Authorization(value = "petstore_auth", scopes = { @AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), @@ -47,10 +48,7 @@ public interface PetApi { consumes = { "application/json", "application/xml" }, method = RequestMethod.POST) default Mono> addPet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().addPet(pet, exchange); } @@ -65,10 +63,7 @@ public interface PetApi { @RequestMapping(value = "/pet/{petId}", method = RequestMethod.DELETE) default Mono> deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "" ) @RequestHeader(value="api_key", required=false) String apiKey, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().deletePet(petId, apiKey, exchange); } @@ -85,20 +80,7 @@ public interface PetApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono>> findPetsByStatus(@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) List status, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().findPetsByStatus(status, exchange); } @@ -115,20 +97,7 @@ public interface PetApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono>> findPetsByTags(@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List tags, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().findPetsByTags(tags, exchange); } @@ -143,20 +112,7 @@ public interface PetApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono> getPetById(@ApiParam(value = "ID of pet to return",required=true) @PathVariable("petId") Long petId, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().getPetById(petId, exchange); } @@ -174,10 +130,7 @@ public interface PetApi { consumes = { "application/json", "application/xml" }, method = RequestMethod.PUT) default Mono> updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ,required=true ) @Valid @RequestBody Mono pet, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().updatePet(pet, exchange); } @@ -193,10 +146,7 @@ public interface PetApi { consumes = { "application/x-www-form-urlencoded" }, method = RequestMethod.POST) default Mono> updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Updated name of the pet", defaultValue="null") @RequestParam(value="name", required=false) String name,@ApiParam(value = "Updated status of the pet", defaultValue="null") @RequestParam(value="status", required=false) String status, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().updatePetWithForm(petId, name, status, exchange); } @@ -213,16 +163,7 @@ public interface PetApi { consumes = { "multipart/form-data" }, method = RequestMethod.POST) default Mono> uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathVariable("petId") Long petId,@ApiParam(value = "Additional data to pass to server", defaultValue="null") @RequestParam(value="additionalMetadata", required=false) String additionalMetadata,@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile file, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().uploadFile(petId, additionalMetadata, file, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiController.java index dba362fde18..a8c8c3765a6 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class PetApiController implements PetApi { + private final PetApiDelegate delegate; + + public PetApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) PetApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new PetApiDelegate() {}); + } + + @Override + public PetApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiDelegate.java new file mode 100644 index 00000000000..1084c1bfe49 --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/PetApiDelegate.java @@ -0,0 +1,160 @@ +package org.openapitools.api; + +import org.openapitools.model.ModelApiResponse; +import org.openapitools.model.Pet; +import org.springframework.core.io.Resource; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link PetApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface PetApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see PetApi#addPet + */ + default Mono> addPet(Mono pet, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#deletePet + */ + default Mono> deletePet(Long petId, + String apiKey, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#findPetsByStatus + */ + default Mono>> findPetsByStatus(List status, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#findPetsByTags + */ + default Mono>> findPetsByTags(List tags, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#getPetById + */ + default Mono> getPetById(Long petId, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 doggie aeiou aeiou"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#updatePet + */ + default Mono> updatePet(Mono pet, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#updatePetWithForm + */ + default Mono> updatePetWithForm(Long petId, + String name, + String status, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see PetApi#uploadFile + */ + default Mono> uploadFile(Long petId, + String additionalMetadata, + MultipartFile file, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\"}"); + break; + } + } + return result.then(Mono.empty()); + + } + +} diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java index 41c7a604a88..cd03846ff91 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApi.java @@ -8,8 +8,6 @@ package org.openapitools.api; import java.util.Map; import org.openapitools.model.Order; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -28,12 +26,15 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "store", description = "the store API") public interface StoreApi { + default StoreApiDelegate getDelegate() { + return new StoreApiDelegate() {}; + } + @ApiOperation(value = "Delete purchase order by ID", nickname = "deleteOrder", notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", tags={ "store", }) @ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"), @@ -41,10 +42,7 @@ public interface StoreApi { @RequestMapping(value = "/store/order/{order_id}", method = RequestMethod.DELETE) default Mono> deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathVariable("order_id") String orderId, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().deleteOrder(orderId, exchange); } @@ -57,10 +55,7 @@ public interface StoreApi { produces = { "application/json" }, method = RequestMethod.GET) default Mono>> getInventory(ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().getInventory(exchange); } @@ -73,20 +68,7 @@ public interface StoreApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono> getOrderById(@Min(1L) @Max(5L) @ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathVariable("order_id") Long orderId, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().getOrderById(orderId, exchange); } @@ -98,20 +80,7 @@ public interface StoreApi { produces = { "application/xml", "application/json" }, method = RequestMethod.POST) default Mono> placeOrder(@ApiParam(value = "order placed for purchasing the pet" ,required=true ) @Valid @RequestBody Mono order, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().placeOrder(order, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiController.java index f6d80aa6cce..d00b4841fc0 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class StoreApiController implements StoreApi { + private final StoreApiDelegate delegate; + + public StoreApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) StoreApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new StoreApiDelegate() {}); + } + + @Override + public StoreApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiDelegate.java new file mode 100644 index 00000000000..8e95e0178b0 --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/StoreApiDelegate.java @@ -0,0 +1,93 @@ +package org.openapitools.api; + +import java.util.Map; +import org.openapitools.model.Order; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link StoreApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface StoreApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see StoreApi#deleteOrder + */ + default Mono> deleteOrder(String orderId, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see StoreApi#getInventory + */ + default Mono>> getInventory(ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see StoreApi#getOrderById + */ + default Mono> getOrderById(Long orderId, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see StoreApi#placeOrder + */ + default Mono> placeOrder(Mono order, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"petId\" : 6, \"quantity\" : 1, \"id\" : 0, \"shipDate\" : \"2000-01-23T04:56:07.000+00:00\", \"complete\" : false, \"status\" : \"placed\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 123456789 123 2000-01-23T04:56:07.000Z aeiou true"); + break; + } + } + return result.then(Mono.empty()); + + } + +} diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java index 5e46fdae4f9..8f3bed7bb29 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApi.java @@ -8,8 +8,6 @@ package org.openapitools.api; import java.util.List; import org.openapitools.model.User; import io.swagger.annotations.*; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -28,22 +26,22 @@ import javax.validation.Valid; import javax.validation.constraints.*; import java.util.List; import java.util.Map; -import java.util.Optional; @Validated @Api(value = "user", description = "the user API") public interface UserApi { + default UserApiDelegate getDelegate() { + return new UserApiDelegate() {}; + } + @ApiOperation(value = "Create user", nickname = "createUser", notes = "This can only be done by the logged in user.", tags={ "user", }) @ApiResponses(value = { @ApiResponse(code = 200, message = "successful operation") }) @RequestMapping(value = "/user", method = RequestMethod.POST) default Mono> createUser(@ApiParam(value = "Created user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().createUser(user, exchange); } @@ -53,10 +51,7 @@ public interface UserApi { @RequestMapping(value = "/user/createWithArray", method = RequestMethod.POST) default Mono> createUsersWithArrayInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().createUsersWithArrayInput(user, exchange); } @@ -66,10 +61,7 @@ public interface UserApi { @RequestMapping(value = "/user/createWithList", method = RequestMethod.POST) default Mono> createUsersWithListInput(@ApiParam(value = "List of user object" ,required=true ) @Valid @RequestBody Flux user, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().createUsersWithListInput(user, exchange); } @@ -80,10 +72,7 @@ public interface UserApi { @RequestMapping(value = "/user/{username}", method = RequestMethod.DELETE) default Mono> deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().deleteUser(username, exchange); } @@ -96,20 +85,7 @@ public interface UserApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono> getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathVariable("username") String username, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { - if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { - result = ApiUtil.getExampleResponse(exchange, "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"password\" : \"password\", \"userStatus\" : 6, \"phone\" : \"phone\", \"id\" : 0, \"email\" : \"email\", \"username\" : \"username\"}"); - break; - } - if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { - result = ApiUtil.getExampleResponse(exchange, " 123456789 aeiou aeiou aeiou aeiou aeiou aeiou 123"); - break; - } - } - return result.then(Mono.empty()); - + return getDelegate().getUserByName(username, exchange); } @@ -121,10 +97,7 @@ public interface UserApi { produces = { "application/xml", "application/json" }, method = RequestMethod.GET) default Mono> loginUser(@NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) String username,@NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) String password, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().loginUser(username, password, exchange); } @@ -134,10 +107,7 @@ public interface UserApi { @RequestMapping(value = "/user/logout", method = RequestMethod.GET) default Mono> logoutUser(ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().logoutUser(exchange); } @@ -148,10 +118,7 @@ public interface UserApi { @RequestMapping(value = "/user/{username}", method = RequestMethod.PUT) default Mono> updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathVariable("username") String username,@ApiParam(value = "Updated user object" ,required=true ) @Valid @RequestBody Mono user, ServerWebExchange exchange) { - exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); - Mono result = Mono.empty(); - return result.then(Mono.empty()); - + return getDelegate().updateUser(username, user, exchange); } } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiController.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiController.java index 570a05d8d37..5bd8c1f9f57 100644 --- a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiController.java +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiController.java @@ -2,11 +2,21 @@ package org.openapitools.api; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.NativeWebRequest; import java.util.Optional; @Controller @RequestMapping("${openapi.openAPIPetstore.base-path:/v2}") public class UserApiController implements UserApi { + private final UserApiDelegate delegate; + + public UserApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) UserApiDelegate delegate) { + this.delegate = Optional.ofNullable(delegate).orElse(new UserApiDelegate() {}); + } + + @Override + public UserApiDelegate getDelegate() { + return delegate; + } + } diff --git a/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiDelegate.java b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiDelegate.java new file mode 100644 index 00000000000..03de7cd2b49 --- /dev/null +++ b/samples/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/UserApiDelegate.java @@ -0,0 +1,129 @@ +package org.openapitools.api; + +import java.util.List; +import org.openapitools.model.User; +import io.swagger.annotations.*; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * A delegate to be called by the {@link UserApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ + +public interface UserApiDelegate { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * @see UserApi#createUser + */ + default Mono> createUser(Mono user, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#createUsersWithArrayInput + */ + default Mono> createUsersWithArrayInput(Flux user, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#createUsersWithListInput + */ + default Mono> createUsersWithListInput(Flux user, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#deleteUser + */ + default Mono> deleteUser(String username, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#getUserByName + */ + default Mono> getUserByName(String username, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + for (MediaType mediaType : exchange.getRequest().getHeaders().getAccept()) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + result = ApiUtil.getExampleResponse(exchange, "{ \"firstName\" : \"firstName\", \"lastName\" : \"lastName\", \"password\" : \"password\", \"userStatus\" : 6, \"phone\" : \"phone\", \"id\" : 0, \"email\" : \"email\", \"username\" : \"username\"}"); + break; + } + if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) { + result = ApiUtil.getExampleResponse(exchange, " 123456789 aeiou aeiou aeiou aeiou aeiou aeiou 123"); + break; + } + } + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#loginUser + */ + default Mono> loginUser(String username, + String password, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#logoutUser + */ + default Mono> logoutUser(ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + + /** + * @see UserApi#updateUser + */ + default Mono> updateUser(String username, + Mono user, + ServerWebExchange exchange) { + exchange.getResponse().setStatusCode(HttpStatus.NOT_IMPLEMENTED); + Mono result = Mono.empty(); + return result.then(Mono.empty()); + + } + +} From aa29219f8cb8aafef82d0fe49448a5b77f26311a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilya=20Hranko=C5=ADski?= Date: Sun, 9 Sep 2018 13:11:59 +0300 Subject: [PATCH 60/74] [Java][Feign] Add support for Feign 10 (#977) (#988) --- bin/java-petstore-feign.json | 5 ++++- docs/generators/java.md | 2 +- .../resources/Java/libraries/feign/auth/OAuth.mustache | 8 ++++++++ .../resources/Java/libraries/feign/build.gradle.mustache | 2 +- .../resources/Java/libraries/feign/build.sbt.mustache | 6 +++--- .../src/main/resources/Java/libraries/feign/pom.mustache | 2 +- samples/client/petstore/java/feign/build.gradle | 2 +- samples/client/petstore/java/feign/build.sbt | 6 +++--- samples/client/petstore/java/feign/pom.xml | 2 +- .../src/main/java/org/openapitools/client/auth/OAuth.java | 3 ++- 10 files changed, 25 insertions(+), 13 deletions(-) diff --git a/bin/java-petstore-feign.json b/bin/java-petstore-feign.json index 2b1db7d5f96..f294b7bb682 100644 --- a/bin/java-petstore-feign.json +++ b/bin/java-petstore-feign.json @@ -1,4 +1,7 @@ { "library": "feign", - "artifactId": "petstore-feign" + "artifactId": "petstore-feign", + "additionalProperties": { + "useFeign10": true + } } diff --git a/docs/generators/java.md b/docs/generators/java.md index 3e9353b55a8..492b3b36d35 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -137,7 +137,7 @@ CONFIG OPTIONS for java library library template (sub-template) to use (Default: okhttp-gson) jersey1 - HTTP client: Jersey client 1.19.4. JSON processing: Jackson 2.8.9. Enable Java6 support using '-DsupportJava6=true'. Enable gzip request encoding using '-DuseGzipFeature=true'. - feign - HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.8.9 + feign - HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.8.9. Enable OpenFeign 10.0.1 using '-DuseFeign10=true'. jersey2 - HTTP client: Jersey client 2.25.1. JSON processing: Jackson 2.8.9 okhttp-gson - HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.8.1. Enable Parcelable models on Android using '-DparcelableModel=true'. Enable gzip request encoding using '-DuseGzipFeature=true'. retrofit - HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.3.1 (Retrofit 1.9.0). IMPORTANT NOTE: retrofit1.x is no longer actively maintained so please upgrade to 'retrofit2' instead. diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/auth/OAuth.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/auth/OAuth.mustache index 1df88d403a2..0ed92dbcae9 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/auth/OAuth.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/auth/OAuth.mustache @@ -19,6 +19,9 @@ import org.apache.oltu.oauth2.common.message.types.GrantType; import org.apache.oltu.oauth2.common.token.BasicOAuthToken; import feign.Client; +{{#useFeign10}} +import feign.Request.HttpMethod; +{{/useFeign10}} import feign.Request.Options; import feign.RequestInterceptor; import feign.RequestTemplate; @@ -92,7 +95,12 @@ public class OAuth implements RequestInterceptor { try { accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); } catch (Exception e) { + {{#useFeign10}} + throw new RetryableException(e.getMessage(), HttpMethod.POST, e, null); + {{/useFeign10}} + {{^useFeign10}} throw new RetryableException(e.getMessage(), e,null); + {{/useFeign10}} } if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache index a4e5ea5a791..b852a3d43af 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.gradle.mustache @@ -123,7 +123,7 @@ ext { {{#threetenbp}} threepane_version = "2.6.4" {{/threetenbp}} - feign_version = "9.4.0" + feign_version = "{{#useFeign10}}10.0.1{{/useFeign10}}{{^useFeign10}}9.4.0{{/useFeign10}}" feign_form_version = "2.1.0" junit_version = "4.12" oltu_version = "1.0.1" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache index a3dff942003..f5c8355a02b 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/build.sbt.mustache @@ -10,9 +10,9 @@ lazy val root = (project in file(".")). resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", - "io.github.openfeign" % "feign-core" % "9.4.0" % "compile", - "io.github.openfeign" % "feign-jackson" % "9.4.0" % "compile", - "io.github.openfeign" % "feign-slf4j" % "9.4.0" % "compile", + "io.github.openfeign" % "feign-core" % "{{#useFeign10}}10.0.1{{/useFeign10}}{{^useFeign10}}9.4.0{{/useFeign10}}" % "compile", + "io.github.openfeign" % "feign-jackson" % "{{#useFeign10}}10.0.1{{/useFeign10}}{{^useFeign10}}9.4.0{{/useFeign10}}" % "compile", + "io.github.openfeign" % "feign-slf4j" % "{{#useFeign10}}10.0.1{{/useFeign10}}{{^useFeign10}}9.4.0{{/useFeign10}}" % "compile", "io.github.openfeign.form" % "feign-form" % "2.1.0" % "compile", "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7" % "compile", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.7" % "compile", diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache index 7a81b340af9..bf74b39c617 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/feign/pom.mustache @@ -293,7 +293,7 @@ ${java.version} ${java.version} 1.5.21 - 9.4.0 + {{#useFeign10}}10.0.1{{/useFeign10}}{{^useFeign10}}9.4.0{{/useFeign10}} 2.1.0 2.8.9 {{#threetenbp}} diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle index e2126b12432..885747dfe2e 100644 --- a/samples/client/petstore/java/feign/build.gradle +++ b/samples/client/petstore/java/feign/build.gradle @@ -97,7 +97,7 @@ ext { swagger_annotations_version = "1.5.21" jackson_version = "2.8.7" threepane_version = "2.6.4" - feign_version = "9.4.0" + feign_version = "10.0.1" feign_form_version = "2.1.0" junit_version = "4.12" oltu_version = "1.0.1" diff --git a/samples/client/petstore/java/feign/build.sbt b/samples/client/petstore/java/feign/build.sbt index b387ad56e61..b60ee6257cd 100644 --- a/samples/client/petstore/java/feign/build.sbt +++ b/samples/client/petstore/java/feign/build.sbt @@ -10,9 +10,9 @@ lazy val root = (project in file(".")). resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", - "io.github.openfeign" % "feign-core" % "9.4.0" % "compile", - "io.github.openfeign" % "feign-jackson" % "9.4.0" % "compile", - "io.github.openfeign" % "feign-slf4j" % "9.4.0" % "compile", + "io.github.openfeign" % "feign-core" % "10.0.1" % "compile", + "io.github.openfeign" % "feign-jackson" % "10.0.1" % "compile", + "io.github.openfeign" % "feign-slf4j" % "10.0.1" % "compile", "io.github.openfeign.form" % "feign-form" % "2.1.0" % "compile", "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7" % "compile", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.7" % "compile", diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml index 58b7d4d7e0e..86f20428528 100644 --- a/samples/client/petstore/java/feign/pom.xml +++ b/samples/client/petstore/java/feign/pom.xml @@ -267,7 +267,7 @@ ${java.version} ${java.version} 1.5.21 - 9.4.0 + 10.0.1 2.1.0 2.8.9 2.6.4 diff --git a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java index 25593a0784a..75c86a7d61b 100644 --- a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java +++ b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java @@ -19,6 +19,7 @@ import org.apache.oltu.oauth2.common.message.types.GrantType; import org.apache.oltu.oauth2.common.token.BasicOAuthToken; import feign.Client; +import feign.Request.HttpMethod; import feign.Request.Options; import feign.RequestInterceptor; import feign.RequestTemplate; @@ -92,7 +93,7 @@ public class OAuth implements RequestInterceptor { try { accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); } catch (Exception e) { - throw new RetryableException(e.getMessage(), e,null); + throw new RetryableException(e.getMessage(), HttpMethod.POST, e, null); } if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); From 7596fb7119cdd59dd24234d997c3ddd6f62eae6d Mon Sep 17 00:00:00 2001 From: Jakob Schmutz Date: Sun, 9 Sep 2018 16:23:06 +0100 Subject: [PATCH 61/74] fix circular import issue in python flask (#946) * fix circular import issue in python flask This is very similar change to 3678eaff87dd95348470c All it intends to do is fix the problem of cirular imports (which was already fixed for python) in the python flask server. * removal of type hints in quotes --- .../resources/flaskConnexion/model.mustache | 12 +- .../.openapi-generator/VERSION | 2 +- .../openapi_server/models/api_response.py | 6 +- .../openapi_server/models/category.py | 4 +- .../openapi_server/models/order.py | 12 +- .../openapi_server/models/pet.py | 14 +- .../openapi_server/models/tag.py | 4 +- .../openapi_server/models/user.py | 16 +- .../openapi_server/openapi/openapi.yaml | 818 +++++++++--------- .../openapi_server/util.py | 2 +- .../flaskConnexion/.openapi-generator/VERSION | 2 +- .../openapi_server/models/api_response.py | 20 +- .../openapi_server/models/category.py | 14 +- .../openapi_server/models/order.py | 38 +- .../openapi_server/models/pet.py | 40 +- .../openapi_server/models/tag.py | 14 +- .../openapi_server/models/user.py | 50 +- .../openapi_server/openapi/openapi.yaml | 818 +++++++++--------- .../flaskConnexion/openapi_server/util.py | 2 +- 19 files changed, 939 insertions(+), 949 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/flaskConnexion/model.mustache b/modules/openapi-generator/src/main/resources/flaskConnexion/model.mustache index 8cf835e5f57..821eaa3a780 100644 --- a/modules/openapi-generator/src/main/resources/flaskConnexion/model.mustache +++ b/modules/openapi-generator/src/main/resources/flaskConnexion/model.mustache @@ -6,8 +6,6 @@ from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 from {{modelPackage}}.base_model_ import Model -{{#imports}}{{import}} # noqa: F401,E501 -{{/imports}} from {{packageName}} import util @@ -27,7 +25,7 @@ class {{classname}}(Model): {{/-last}} {{/enumVars}}{{/allowableValues}} - def __init__(self{{#vars}}, {{name}}{{^supportPython2}}: {{dataType}}{{/supportPython2}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}): # noqa: E501 + def __init__(self{{#vars}}, {{name}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}): # noqa: E501 """{{classname}} - a model defined in OpenAPI {{#vars}} @@ -37,7 +35,7 @@ class {{classname}}(Model): """ self.openapi_types = { {{#vars}} - '{{name}}': {{{dataType}}}{{#hasMore}},{{/hasMore}} + '{{name}}': '{{{dataType}}}'{{#hasMore}},{{/hasMore}} {{/vars}} } @@ -64,7 +62,7 @@ class {{classname}}(Model): {{/-first}} @property - def {{name}}(self){{^supportPython2}} -> {{dataType}}{{/supportPython2}}: + def {{name}}(self): """Gets the {{name}} of this {{classname}}. {{#description}} @@ -77,7 +75,7 @@ class {{classname}}(Model): return self._{{name}} @{{name}}.setter - def {{name}}(self, {{name}}{{^supportPython2}}: {{dataType}}{{/supportPython2}}): + def {{name}}(self, {{name}}): """Sets the {{name}} of this {{classname}}. {{#description}} @@ -158,4 +156,4 @@ class {{classname}}(Model): {{/vars}} {{/model}} -{{/models}} \ No newline at end of file +{{/models}} diff --git a/samples/server/petstore/flaskConnexion-python2/.openapi-generator/VERSION b/samples/server/petstore/flaskConnexion-python2/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/server/petstore/flaskConnexion-python2/.openapi-generator/VERSION +++ b/samples/server/petstore/flaskConnexion-python2/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/api_response.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/api_response.py index f4f26e834a2..1b740655f7d 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/api_response.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/api_response.py @@ -26,9 +26,9 @@ class ApiResponse(Model): :type message: str """ self.openapi_types = { - 'code': int, - 'type': str, - 'message': str + 'code': 'int', + 'type': 'str', + 'message': 'str' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/category.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/category.py index fc2b224078a..b11afbf6641 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/category.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/category.py @@ -24,8 +24,8 @@ class Category(Model): :type name: str """ self.openapi_types = { - 'id': long, - 'name': str + 'id': 'long', + 'name': 'str' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/order.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/order.py index 02ea8c4fd72..d63b9e1d009 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/order.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/order.py @@ -32,12 +32,12 @@ class Order(Model): :type complete: bool """ self.openapi_types = { - 'id': long, - 'pet_id': long, - 'quantity': int, - 'ship_date': datetime, - 'status': str, - 'complete': bool + 'id': 'long', + 'pet_id': 'long', + 'quantity': 'int', + 'ship_date': 'datetime', + 'status': 'str', + 'complete': 'bool' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/pet.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/pet.py index 411e9e12f52..aa880e600f8 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/pet.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/pet.py @@ -6,8 +6,6 @@ from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 from openapi_server.models.base_model_ import Model -from openapi_server.models.category import Category # noqa: F401,E501 -from openapi_server.models.tag import Tag # noqa: F401,E501 from openapi_server import util @@ -34,12 +32,12 @@ class Pet(Model): :type status: str """ self.openapi_types = { - 'id': long, - 'category': Category, - 'name': str, - 'photo_urls': List[str], - 'tags': List[Tag], - 'status': str + 'id': 'long', + 'category': 'Category', + 'name': 'str', + 'photo_urls': 'List[str]', + 'tags': 'List[Tag]', + 'status': 'str' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/tag.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/tag.py index 24a262951ed..0dc7e32f4f1 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/tag.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/tag.py @@ -24,8 +24,8 @@ class Tag(Model): :type name: str """ self.openapi_types = { - 'id': long, - 'name': str + 'id': 'long', + 'name': 'str' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/user.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/user.py index 3807bfe9978..c13e40f518c 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/models/user.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/models/user.py @@ -36,14 +36,14 @@ class User(Model): :type user_status: int """ self.openapi_types = { - 'id': long, - 'username': str, - 'first_name': str, - 'last_name': str, - 'email': str, - 'password': str, - 'phone': str, - 'user_status': int + 'id': 'long', + 'username': 'str', + 'first_name': 'str', + 'last_name': 'str', + 'email': 'str', + 'password': 'str', + 'phone': 'str', + 'user_status': 'int' } self.attribute_map = { diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/openapi/openapi.yaml b/samples/server/petstore/flaskConnexion-python2/openapi_server/openapi/openapi.yaml index cc02c545f9a..dca523e5557 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/openapi/openapi.yaml +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/openapi/openapi.yaml @@ -1,304 +1,325 @@ -openapi: 3.0.0 +openapi: 3.0.1 info: - title: OpenAPI Petstore description: This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. license: name: Apache-2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore version: 1.0.0 -externalDocs: - description: Find out more about Swagger - url: http://swagger.io servers: - url: http://petstore.swagger.io/v2 tags: -- name: pet - description: Everything about your Pets -- name: store - description: Access to Petstore orders -- name: user - description: Operations about user +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user paths: /pet: - put: + post: + operationId: add_pet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true + responses: + 405: + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store tags: - pet - summary: Update an existing pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + put: operationId: update_pet requestBody: - $ref: '#/components/requestBodies/Pet' + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true responses: 400: + content: {} description: Invalid ID supplied 404: + content: {} description: Pet not found 405: + content: {} description: Validation exception security: - petstore_auth: - write:pets - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller - post: + summary: Update an existing pet tags: - pet - summary: Add a new pet to the store - operationId: add_pet - requestBody: - $ref: '#/components/requestBodies/Pet' - responses: - 405: - description: Invalid input - security: - - petstore_auth: - - write:pets - - read:pets x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/findByStatus: get: - tags: - - pet - summary: Finds Pets by status description: Multiple status values can be provided with comma separated strings operationId: find_pets_by_status parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - style: form + - description: Status values that need to be considered for filter explode: false + in: query + name: status + required: true schema: - type: array items: - type: string default: available enum: - available - pending - sold + type: string + type: array + style: form responses: 200: - description: successful operation content: application/xml: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array application/json: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array + description: successful operation 400: + content: {} description: Invalid status value security: - petstore_auth: - write:pets - read:pets + summary: Finds Pets by status + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/findByTags: get: - tags: - - pet - summary: Finds Pets by tags + deprecated: true description: Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. operationId: find_pets_by_tags parameters: - - name: tags - in: query - description: Tags to filter by - required: true - style: form + - description: Tags to filter by explode: false + in: query + name: tags + required: true schema: - type: array items: type: string + type: array + style: form responses: 200: - description: successful operation content: application/xml: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array application/json: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array + description: successful operation 400: + content: {} description: Invalid tag value - deprecated: true security: - petstore_auth: - write:pets - read:pets + summary: Finds Pets by tags + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/{petId}: - get: - tags: - - pet - summary: Find pet by ID - description: Returns a single pet - operationId: get_pet_by_id - parameters: - - name: petId - in: path - description: ID of pet to return - required: true - style: simple - explode: false - schema: - type: integer - format: int64 - responses: - 200: - description: successful operation - content: - application/xml: - schema: - $ref: '#/components/schemas/Pet' - application/json: - schema: - $ref: '#/components/schemas/Pet' - 400: - description: Invalid ID supplied - 404: - description: Pet not found - security: - - api_key: [] - x-openapi-router-controller: openapi_server.controllers.pet_controller - post: - tags: - - pet - summary: Updates a pet in the store with form data - operationId: update_pet_with_form - parameters: - - name: petId - in: path - description: ID of pet that needs to be updated - required: true - style: simple - explode: false - schema: - type: integer - format: int64 - requestBody: - content: - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/body' - responses: - 405: - description: Invalid input - security: - - petstore_auth: - - write:pets - - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller delete: - tags: - - pet - summary: Deletes a pet operationId: delete_pet parameters: - - name: api_key - in: header - required: false - style: simple - explode: false + - in: header + name: api_key schema: type: string - - name: petId + - description: Pet id to delete in: path - description: Pet id to delete + name: petId required: true - style: simple - explode: false schema: - type: integer format: int64 + type: integer responses: 400: + content: {} description: Invalid pet value security: - petstore_auth: - write:pets - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller - /pet/{petId}/uploadImage: - post: + summary: Deletes a pet tags: - pet - summary: uploads an image - operationId: upload_file + x-openapi-router-controller: openapi_server.controllers.pet_controller + get: + description: Returns a single pet + operationId: get_pet_by_id parameters: - - name: petId + - description: ID of pet to return in: path - description: ID of pet to update + name: petId required: true - style: simple - explode: false schema: - type: integer format: int64 - requestBody: - content: - multipart/form-data: - schema: - $ref: '#/components/schemas/body_1' + type: integer responses: 200: - description: successful operation content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' application/json: schema: - $ref: '#/components/schemas/ApiResponse' + $ref: '#/components/schemas/Pet' + description: successful operation + 400: + content: {} + description: Invalid ID supplied + 404: + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + post: + operationId: update_pet_with_form + parameters: + - description: ID of pet that needs to be updated + in: path + name: petId + required: true + schema: + format: int64 + type: integer + requestBody: + content: + application/x-www-form-urlencoded: + schema: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + responses: + 405: + content: {} + description: Invalid input security: - petstore_auth: - write:pets - read:pets + summary: Updates a pet in the store with form data + tags: + - pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + /pet/{petId}/uploadImage: + post: + operationId: upload_file + parameters: + - description: ID of pet to update + in: path + name: petId + required: true + schema: + format: int64 + type: integer + requestBody: + content: + multipart/form-data: + schema: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + format: binary + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /store/inventory: get: - tags: - - store - summary: Returns pet inventories by status description: Returns a map of status codes to quantities operationId: get_inventory responses: 200: - description: successful operation content: application/json: schema: - type: object additionalProperties: - type: integer format: int32 + type: integer + type: object + description: successful operation security: - api_key: [] + summary: Returns pet inventories by status + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /store/order: post: - tags: - - store - summary: Place an order for a pet operationId: place_order requestBody: - description: order placed for purchasing the pet content: - application/json: + '*/*': schema: $ref: '#/components/schemas/Order' + description: order placed for purchasing the pet required: true responses: 200: - description: successful operation content: application/xml: schema: @@ -306,185 +327,216 @@ paths: application/json: schema: $ref: '#/components/schemas/Order' + description: successful operation 400: + content: {} description: Invalid Order + summary: Place an order for a pet + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /store/order/{orderId}: - get: - tags: - - store - summary: Find purchase order by ID - description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - operationId: get_order_by_id - parameters: - - name: orderId - in: path - description: ID of pet that needs to be fetched - required: true - style: simple - explode: false - schema: - maximum: 5 - minimum: 1 - type: integer - format: int64 - responses: - 200: - description: successful operation - content: - application/xml: - schema: - $ref: '#/components/schemas/Order' - application/json: - schema: - $ref: '#/components/schemas/Order' - 400: - description: Invalid ID supplied - 404: - description: Order not found - x-openapi-router-controller: openapi_server.controllers.store_controller delete: - tags: - - store - summary: Delete purchase order by ID description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors operationId: delete_order parameters: - - name: orderId + - description: ID of the order that needs to be deleted in: path - description: ID of the order that needs to be deleted + name: orderId required: true - style: simple - explode: false schema: type: string responses: 400: + content: {} description: Invalid ID supplied 404: + content: {} description: Order not found + summary: Delete purchase order by ID + tags: + - store + x-openapi-router-controller: openapi_server.controllers.store_controller + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + operationId: get_order_by_id + parameters: + - description: ID of pet that needs to be fetched + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + responses: + 200: + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + description: successful operation + 400: + content: {} + description: Invalid ID supplied + 404: + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /user: post: - tags: - - user - summary: Create user description: This can only be done by the logged in user. operationId: create_user requestBody: - description: Created user object content: - application/json: + '*/*': schema: $ref: '#/components/schemas/User' + description: Created user object required: true responses: default: + content: {} description: successful operation + summary: Create user + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/createWithArray: post: - tags: - - user - summary: Creates list of users with given input array operationId: create_users_with_array_input requestBody: - $ref: '#/components/requestBodies/UserArray' + content: + '*/*': + schema: + items: + $ref: '#/components/schemas/User' + type: array + description: List of user object + required: true responses: default: + content: {} description: successful operation + summary: Creates list of users with given input array + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/createWithList: post: - tags: - - user - summary: Creates list of users with given input array operationId: create_users_with_list_input requestBody: - $ref: '#/components/requestBodies/UserArray' + content: + '*/*': + schema: + items: + $ref: '#/components/schemas/User' + type: array + description: List of user object + required: true responses: default: + content: {} description: successful operation + summary: Creates list of users with given input array + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/login: get: - tags: - - user - summary: Logs user into the system operationId: login_user parameters: - - name: username + - description: The user name for login in: query - description: The user name for login + name: username required: true - style: form - explode: true schema: type: string - - name: password + - description: The password for login in clear text in: query - description: The password for login in clear text + name: password required: true - style: form - explode: true schema: type: string responses: 200: + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string description: successful operation headers: X-Rate-Limit: description: calls per hour allowed by the user - style: simple - explode: false schema: - type: integer format: int32 + type: integer X-Expires-After: description: date in UTC when toekn expires - style: simple - explode: false schema: - type: string format: date-time - content: - application/xml: - schema: - type: string - application/json: - schema: type: string 400: + content: {} description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/logout: get: - tags: - - user - summary: Logs out current logged in user session operationId: logout_user responses: default: + content: {} description: successful operation - x-openapi-router-controller: openapi_server.controllers.user_controller - /user/{username}: - get: + summary: Logs out current logged in user session tags: - user - summary: Get user by user name + x-openapi-router-controller: openapi_server.controllers.user_controller + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: delete_user + parameters: + - description: The name that needs to be deleted + in: path + name: username + required: true + schema: + type: string + responses: + 400: + content: {} + description: Invalid username supplied + 404: + content: {} + description: User not found + summary: Delete user + tags: + - user + x-openapi-router-controller: openapi_server.controllers.user_controller + get: operationId: get_user_by_name parameters: - - name: username + - description: The name that needs to be fetched. Use user1 for testing. in: path - description: The name that needs to be fetched. Use user1 for testing. + name: username required: true - style: simple - explode: false schema: type: string responses: 200: - description: successful operation content: application/xml: schema: @@ -492,88 +544,48 @@ paths: application/json: schema: $ref: '#/components/schemas/User' + description: successful operation 400: + content: {} description: Invalid username supplied 404: + content: {} description: User not found - x-openapi-router-controller: openapi_server.controllers.user_controller - put: + summary: Get user by user name tags: - user - summary: Updated user + x-openapi-router-controller: openapi_server.controllers.user_controller + put: description: This can only be done by the logged in user. operationId: update_user parameters: - - name: username + - description: name that need to be deleted in: path - description: name that need to be deleted + name: username required: true - style: simple - explode: false schema: type: string requestBody: - description: Updated user object content: - application/json: + '*/*': schema: $ref: '#/components/schemas/User' + description: Updated user object required: true responses: 400: + content: {} description: Invalid user supplied 404: + content: {} description: User not found - x-openapi-router-controller: openapi_server.controllers.user_controller - delete: + summary: Updated user tags: - user - summary: Delete user - description: This can only be done by the logged in user. - operationId: delete_user - parameters: - - name: username - in: path - description: The name that needs to be deleted - required: true - style: simple - explode: false - schema: - type: string - responses: - 400: - description: Invalid username supplied - 404: - description: User not found x-openapi-router-controller: openapi_server.controllers.user_controller components: schemas: Order: - title: Pet Order - type: object - properties: - id: - type: integer - format: int64 - petId: - type: integer - format: int64 - quantity: - type: integer - format: int32 - shipDate: - type: string - format: date-time - status: - type: string - description: Order Status - enum: - - placed - - approved - - delivered - complete: - type: boolean - default: false description: An order for a pets from the pet store example: petId: 6 @@ -582,30 +594,63 @@ components: shipDate: 2000-01-23T04:56:07.000+00:00 complete: false status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object xml: name: Order Category: - title: Pet category - type: object - properties: - id: - type: integer - format: int64 - name: - type: string description: A category for a pet example: name: name id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object xml: name: Category User: - title: a User - type: object + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username properties: id: - type: integer format: int64 + type: integer username: type: string firstName: @@ -619,72 +664,29 @@ components: phone: type: string userStatus: - type: integer description: User Status format: int32 - description: A User who is purchasing from the pet store - example: - firstName: firstName - lastName: lastName - password: password - userStatus: 6 - phone: phone - id: 0 - email: email - username: username + type: integer + title: a User + type: object xml: name: User Tag: - title: Pet Tag - type: object - properties: - id: - type: integer - format: int64 - name: - type: string description: A tag for a pet example: name: name id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object xml: name: Tag Pet: - title: a Pet - required: - - name - - photoUrls - type: object - properties: - id: - type: integer - format: int64 - category: - $ref: '#/components/schemas/Category' - name: - type: string - example: doggie - photoUrls: - type: array - xml: - name: photoUrl - wrapped: true - items: - type: string - tags: - type: array - xml: - name: tag - wrapped: true - items: - $ref: '#/components/schemas/Tag' - status: - type: string - description: pet status in the store - enum: - - available - - pending - - sold description: A pet for sale in the pet store example: photoUrls: @@ -701,73 +703,69 @@ components: - name: name id: 1 status: available + properties: + id: + format: int64 + type: integer + category: + $ref: '#/components/schemas/Category' + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: '#/components/schemas/Tag' + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object xml: name: Pet ApiResponse: - title: An uploaded response - type: object - properties: - code: - type: integer - format: int32 - type: - type: string - message: - type: string description: Describes the result of uploading an image resource example: code: 0 type: type message: message - body: - type: object properties: - name: + code: + format: int32 + type: integer + type: type: string - description: Updated name of the pet - status: + message: type: string - description: Updated status of the pet - body_1: + title: An uploaded response type: object - properties: - additionalMetadata: - type: string - description: Additional data to pass to server - file: - type: string - description: file to upload - format: binary - requestBodies: - UserArray: - description: List of user object - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/User' - required: true - Pet: - description: Pet object that needs to be added to the store - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - application/xml: - schema: - $ref: '#/components/schemas/Pet' - required: true securitySchemes: petstore_auth: - type: oauth2 flows: implicit: authorizationUrl: http://petstore.swagger.io/api/oauth/dialog scopes: write:pets: modify pets in your account read:pets: read your pets + type: oauth2 api_key: - type: apiKey - name: api_key in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/flaskConnexion-python2/openapi_server/util.py b/samples/server/petstore/flaskConnexion-python2/openapi_server/util.py index 4321570d5a0..c7340cd0005 100644 --- a/samples/server/petstore/flaskConnexion-python2/openapi_server/util.py +++ b/samples/server/petstore/flaskConnexion-python2/openapi_server/util.py @@ -51,7 +51,7 @@ def _deserialize_primitive(data, klass): def _deserialize_object(value): - """Return a original value. + """Return an original value. :return: object. """ diff --git a/samples/server/petstore/flaskConnexion/.openapi-generator/VERSION b/samples/server/petstore/flaskConnexion/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/server/petstore/flaskConnexion/.openapi-generator/VERSION +++ b/samples/server/petstore/flaskConnexion/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/api_response.py b/samples/server/petstore/flaskConnexion/openapi_server/models/api_response.py index 8d4483699ef..974c29c6a55 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/api_response.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/api_response.py @@ -15,7 +15,7 @@ class ApiResponse(Model): Do not edit the class manually. """ - def __init__(self, code: int=None, type: str=None, message: str=None): # noqa: E501 + def __init__(self, code=None, type=None, message=None): # noqa: E501 """ApiResponse - a model defined in OpenAPI :param code: The code of this ApiResponse. # noqa: E501 @@ -26,9 +26,9 @@ class ApiResponse(Model): :type message: str """ self.openapi_types = { - 'code': int, - 'type': str, - 'message': str + 'code': 'int', + 'type': 'str', + 'message': 'str' } self.attribute_map = { @@ -53,7 +53,7 @@ class ApiResponse(Model): return util.deserialize_model(dikt, cls) @property - def code(self) -> int: + def code(self): """Gets the code of this ApiResponse. @@ -63,7 +63,7 @@ class ApiResponse(Model): return self._code @code.setter - def code(self, code: int): + def code(self, code): """Sets the code of this ApiResponse. @@ -74,7 +74,7 @@ class ApiResponse(Model): self._code = code @property - def type(self) -> str: + def type(self): """Gets the type of this ApiResponse. @@ -84,7 +84,7 @@ class ApiResponse(Model): return self._type @type.setter - def type(self, type: str): + def type(self, type): """Sets the type of this ApiResponse. @@ -95,7 +95,7 @@ class ApiResponse(Model): self._type = type @property - def message(self) -> str: + def message(self): """Gets the message of this ApiResponse. @@ -105,7 +105,7 @@ class ApiResponse(Model): return self._message @message.setter - def message(self, message: str): + def message(self, message): """Sets the message of this ApiResponse. diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/category.py b/samples/server/petstore/flaskConnexion/openapi_server/models/category.py index 5f4ecd5c8ac..65ec5bd3886 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/category.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/category.py @@ -15,7 +15,7 @@ class Category(Model): Do not edit the class manually. """ - def __init__(self, id: int=None, name: str=None): # noqa: E501 + def __init__(self, id=None, name=None): # noqa: E501 """Category - a model defined in OpenAPI :param id: The id of this Category. # noqa: E501 @@ -24,8 +24,8 @@ class Category(Model): :type name: str """ self.openapi_types = { - 'id': int, - 'name': str + 'id': 'int', + 'name': 'str' } self.attribute_map = { @@ -48,7 +48,7 @@ class Category(Model): return util.deserialize_model(dikt, cls) @property - def id(self) -> int: + def id(self): """Gets the id of this Category. @@ -58,7 +58,7 @@ class Category(Model): return self._id @id.setter - def id(self, id: int): + def id(self, id): """Sets the id of this Category. @@ -69,7 +69,7 @@ class Category(Model): self._id = id @property - def name(self) -> str: + def name(self): """Gets the name of this Category. @@ -79,7 +79,7 @@ class Category(Model): return self._name @name.setter - def name(self, name: str): + def name(self, name): """Sets the name of this Category. diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/order.py b/samples/server/petstore/flaskConnexion/openapi_server/models/order.py index b0587cbe685..b0bbdd9d503 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/order.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/order.py @@ -15,7 +15,7 @@ class Order(Model): Do not edit the class manually. """ - def __init__(self, id: int=None, pet_id: int=None, quantity: int=None, ship_date: datetime=None, status: str=None, complete: bool=False): # noqa: E501 + def __init__(self, id=None, pet_id=None, quantity=None, ship_date=None, status=None, complete=False): # noqa: E501 """Order - a model defined in OpenAPI :param id: The id of this Order. # noqa: E501 @@ -32,12 +32,12 @@ class Order(Model): :type complete: bool """ self.openapi_types = { - 'id': int, - 'pet_id': int, - 'quantity': int, - 'ship_date': datetime, - 'status': str, - 'complete': bool + 'id': 'int', + 'pet_id': 'int', + 'quantity': 'int', + 'ship_date': 'datetime', + 'status': 'str', + 'complete': 'bool' } self.attribute_map = { @@ -68,7 +68,7 @@ class Order(Model): return util.deserialize_model(dikt, cls) @property - def id(self) -> int: + def id(self): """Gets the id of this Order. @@ -78,7 +78,7 @@ class Order(Model): return self._id @id.setter - def id(self, id: int): + def id(self, id): """Sets the id of this Order. @@ -89,7 +89,7 @@ class Order(Model): self._id = id @property - def pet_id(self) -> int: + def pet_id(self): """Gets the pet_id of this Order. @@ -99,7 +99,7 @@ class Order(Model): return self._pet_id @pet_id.setter - def pet_id(self, pet_id: int): + def pet_id(self, pet_id): """Sets the pet_id of this Order. @@ -110,7 +110,7 @@ class Order(Model): self._pet_id = pet_id @property - def quantity(self) -> int: + def quantity(self): """Gets the quantity of this Order. @@ -120,7 +120,7 @@ class Order(Model): return self._quantity @quantity.setter - def quantity(self, quantity: int): + def quantity(self, quantity): """Sets the quantity of this Order. @@ -131,7 +131,7 @@ class Order(Model): self._quantity = quantity @property - def ship_date(self) -> datetime: + def ship_date(self): """Gets the ship_date of this Order. @@ -141,7 +141,7 @@ class Order(Model): return self._ship_date @ship_date.setter - def ship_date(self, ship_date: datetime): + def ship_date(self, ship_date): """Sets the ship_date of this Order. @@ -152,7 +152,7 @@ class Order(Model): self._ship_date = ship_date @property - def status(self) -> str: + def status(self): """Gets the status of this Order. Order Status # noqa: E501 @@ -163,7 +163,7 @@ class Order(Model): return self._status @status.setter - def status(self, status: str): + def status(self, status): """Sets the status of this Order. Order Status # noqa: E501 @@ -181,7 +181,7 @@ class Order(Model): self._status = status @property - def complete(self) -> bool: + def complete(self): """Gets the complete of this Order. @@ -191,7 +191,7 @@ class Order(Model): return self._complete @complete.setter - def complete(self, complete: bool): + def complete(self, complete): """Sets the complete of this Order. diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/pet.py b/samples/server/petstore/flaskConnexion/openapi_server/models/pet.py index 7557b576150..7b384ad983f 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/pet.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/pet.py @@ -6,8 +6,6 @@ from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 from openapi_server.models.base_model_ import Model -from openapi_server.models.category import Category # noqa: F401,E501 -from openapi_server.models.tag import Tag # noqa: F401,E501 from openapi_server import util @@ -17,7 +15,7 @@ class Pet(Model): Do not edit the class manually. """ - def __init__(self, id: int=None, category: Category=None, name: str=None, photo_urls: List[str]=None, tags: List[Tag]=None, status: str=None): # noqa: E501 + def __init__(self, id=None, category=None, name=None, photo_urls=None, tags=None, status=None): # noqa: E501 """Pet - a model defined in OpenAPI :param id: The id of this Pet. # noqa: E501 @@ -34,12 +32,12 @@ class Pet(Model): :type status: str """ self.openapi_types = { - 'id': int, - 'category': Category, - 'name': str, - 'photo_urls': List[str], - 'tags': List[Tag], - 'status': str + 'id': 'int', + 'category': 'Category', + 'name': 'str', + 'photo_urls': 'List[str]', + 'tags': 'List[Tag]', + 'status': 'str' } self.attribute_map = { @@ -70,7 +68,7 @@ class Pet(Model): return util.deserialize_model(dikt, cls) @property - def id(self) -> int: + def id(self): """Gets the id of this Pet. @@ -80,7 +78,7 @@ class Pet(Model): return self._id @id.setter - def id(self, id: int): + def id(self, id): """Sets the id of this Pet. @@ -91,7 +89,7 @@ class Pet(Model): self._id = id @property - def category(self) -> Category: + def category(self): """Gets the category of this Pet. @@ -101,7 +99,7 @@ class Pet(Model): return self._category @category.setter - def category(self, category: Category): + def category(self, category): """Sets the category of this Pet. @@ -112,7 +110,7 @@ class Pet(Model): self._category = category @property - def name(self) -> str: + def name(self): """Gets the name of this Pet. @@ -122,7 +120,7 @@ class Pet(Model): return self._name @name.setter - def name(self, name: str): + def name(self, name): """Sets the name of this Pet. @@ -135,7 +133,7 @@ class Pet(Model): self._name = name @property - def photo_urls(self) -> List[str]: + def photo_urls(self): """Gets the photo_urls of this Pet. @@ -145,7 +143,7 @@ class Pet(Model): return self._photo_urls @photo_urls.setter - def photo_urls(self, photo_urls: List[str]): + def photo_urls(self, photo_urls): """Sets the photo_urls of this Pet. @@ -158,7 +156,7 @@ class Pet(Model): self._photo_urls = photo_urls @property - def tags(self) -> List[Tag]: + def tags(self): """Gets the tags of this Pet. @@ -168,7 +166,7 @@ class Pet(Model): return self._tags @tags.setter - def tags(self, tags: List[Tag]): + def tags(self, tags): """Sets the tags of this Pet. @@ -179,7 +177,7 @@ class Pet(Model): self._tags = tags @property - def status(self) -> str: + def status(self): """Gets the status of this Pet. pet status in the store # noqa: E501 @@ -190,7 +188,7 @@ class Pet(Model): return self._status @status.setter - def status(self, status: str): + def status(self, status): """Sets the status of this Pet. pet status in the store # noqa: E501 diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/tag.py b/samples/server/petstore/flaskConnexion/openapi_server/models/tag.py index dbf79c3a2af..06063ede934 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/tag.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/tag.py @@ -15,7 +15,7 @@ class Tag(Model): Do not edit the class manually. """ - def __init__(self, id: int=None, name: str=None): # noqa: E501 + def __init__(self, id=None, name=None): # noqa: E501 """Tag - a model defined in OpenAPI :param id: The id of this Tag. # noqa: E501 @@ -24,8 +24,8 @@ class Tag(Model): :type name: str """ self.openapi_types = { - 'id': int, - 'name': str + 'id': 'int', + 'name': 'str' } self.attribute_map = { @@ -48,7 +48,7 @@ class Tag(Model): return util.deserialize_model(dikt, cls) @property - def id(self) -> int: + def id(self): """Gets the id of this Tag. @@ -58,7 +58,7 @@ class Tag(Model): return self._id @id.setter - def id(self, id: int): + def id(self, id): """Sets the id of this Tag. @@ -69,7 +69,7 @@ class Tag(Model): self._id = id @property - def name(self) -> str: + def name(self): """Gets the name of this Tag. @@ -79,7 +79,7 @@ class Tag(Model): return self._name @name.setter - def name(self, name: str): + def name(self, name): """Sets the name of this Tag. diff --git a/samples/server/petstore/flaskConnexion/openapi_server/models/user.py b/samples/server/petstore/flaskConnexion/openapi_server/models/user.py index 048551da85c..59b3c6a50b8 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/models/user.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/models/user.py @@ -15,7 +15,7 @@ class User(Model): Do not edit the class manually. """ - def __init__(self, id: int=None, username: str=None, first_name: str=None, last_name: str=None, email: str=None, password: str=None, phone: str=None, user_status: int=None): # noqa: E501 + def __init__(self, id=None, username=None, first_name=None, last_name=None, email=None, password=None, phone=None, user_status=None): # noqa: E501 """User - a model defined in OpenAPI :param id: The id of this User. # noqa: E501 @@ -36,14 +36,14 @@ class User(Model): :type user_status: int """ self.openapi_types = { - 'id': int, - 'username': str, - 'first_name': str, - 'last_name': str, - 'email': str, - 'password': str, - 'phone': str, - 'user_status': int + 'id': 'int', + 'username': 'str', + 'first_name': 'str', + 'last_name': 'str', + 'email': 'str', + 'password': 'str', + 'phone': 'str', + 'user_status': 'int' } self.attribute_map = { @@ -78,7 +78,7 @@ class User(Model): return util.deserialize_model(dikt, cls) @property - def id(self) -> int: + def id(self): """Gets the id of this User. @@ -88,7 +88,7 @@ class User(Model): return self._id @id.setter - def id(self, id: int): + def id(self, id): """Sets the id of this User. @@ -99,7 +99,7 @@ class User(Model): self._id = id @property - def username(self) -> str: + def username(self): """Gets the username of this User. @@ -109,7 +109,7 @@ class User(Model): return self._username @username.setter - def username(self, username: str): + def username(self, username): """Sets the username of this User. @@ -120,7 +120,7 @@ class User(Model): self._username = username @property - def first_name(self) -> str: + def first_name(self): """Gets the first_name of this User. @@ -130,7 +130,7 @@ class User(Model): return self._first_name @first_name.setter - def first_name(self, first_name: str): + def first_name(self, first_name): """Sets the first_name of this User. @@ -141,7 +141,7 @@ class User(Model): self._first_name = first_name @property - def last_name(self) -> str: + def last_name(self): """Gets the last_name of this User. @@ -151,7 +151,7 @@ class User(Model): return self._last_name @last_name.setter - def last_name(self, last_name: str): + def last_name(self, last_name): """Sets the last_name of this User. @@ -162,7 +162,7 @@ class User(Model): self._last_name = last_name @property - def email(self) -> str: + def email(self): """Gets the email of this User. @@ -172,7 +172,7 @@ class User(Model): return self._email @email.setter - def email(self, email: str): + def email(self, email): """Sets the email of this User. @@ -183,7 +183,7 @@ class User(Model): self._email = email @property - def password(self) -> str: + def password(self): """Gets the password of this User. @@ -193,7 +193,7 @@ class User(Model): return self._password @password.setter - def password(self, password: str): + def password(self, password): """Sets the password of this User. @@ -204,7 +204,7 @@ class User(Model): self._password = password @property - def phone(self) -> str: + def phone(self): """Gets the phone of this User. @@ -214,7 +214,7 @@ class User(Model): return self._phone @phone.setter - def phone(self, phone: str): + def phone(self, phone): """Sets the phone of this User. @@ -225,7 +225,7 @@ class User(Model): self._phone = phone @property - def user_status(self) -> int: + def user_status(self): """Gets the user_status of this User. User Status # noqa: E501 @@ -236,7 +236,7 @@ class User(Model): return self._user_status @user_status.setter - def user_status(self, user_status: int): + def user_status(self, user_status): """Sets the user_status of this User. User Status # noqa: E501 diff --git a/samples/server/petstore/flaskConnexion/openapi_server/openapi/openapi.yaml b/samples/server/petstore/flaskConnexion/openapi_server/openapi/openapi.yaml index cc02c545f9a..dca523e5557 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/openapi/openapi.yaml +++ b/samples/server/petstore/flaskConnexion/openapi_server/openapi/openapi.yaml @@ -1,304 +1,325 @@ -openapi: 3.0.0 +openapi: 3.0.1 info: - title: OpenAPI Petstore description: This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. license: name: Apache-2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore version: 1.0.0 -externalDocs: - description: Find out more about Swagger - url: http://swagger.io servers: - url: http://petstore.swagger.io/v2 tags: -- name: pet - description: Everything about your Pets -- name: store - description: Access to Petstore orders -- name: user - description: Operations about user +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user paths: /pet: - put: + post: + operationId: add_pet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true + responses: + 405: + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store tags: - pet - summary: Update an existing pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + put: operationId: update_pet requestBody: - $ref: '#/components/requestBodies/Pet' + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true responses: 400: + content: {} description: Invalid ID supplied 404: + content: {} description: Pet not found 405: + content: {} description: Validation exception security: - petstore_auth: - write:pets - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller - post: + summary: Update an existing pet tags: - pet - summary: Add a new pet to the store - operationId: add_pet - requestBody: - $ref: '#/components/requestBodies/Pet' - responses: - 405: - description: Invalid input - security: - - petstore_auth: - - write:pets - - read:pets x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/findByStatus: get: - tags: - - pet - summary: Finds Pets by status description: Multiple status values can be provided with comma separated strings operationId: find_pets_by_status parameters: - - name: status - in: query - description: Status values that need to be considered for filter - required: true - style: form + - description: Status values that need to be considered for filter explode: false + in: query + name: status + required: true schema: - type: array items: - type: string default: available enum: - available - pending - sold + type: string + type: array + style: form responses: 200: - description: successful operation content: application/xml: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array application/json: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array + description: successful operation 400: + content: {} description: Invalid status value security: - petstore_auth: - write:pets - read:pets + summary: Finds Pets by status + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/findByTags: get: - tags: - - pet - summary: Finds Pets by tags + deprecated: true description: Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. operationId: find_pets_by_tags parameters: - - name: tags - in: query - description: Tags to filter by - required: true - style: form + - description: Tags to filter by explode: false + in: query + name: tags + required: true schema: - type: array items: type: string + type: array + style: form responses: 200: - description: successful operation content: application/xml: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array application/json: schema: - type: array items: $ref: '#/components/schemas/Pet' + type: array + description: successful operation 400: + content: {} description: Invalid tag value - deprecated: true security: - petstore_auth: - write:pets - read:pets + summary: Finds Pets by tags + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /pet/{petId}: - get: - tags: - - pet - summary: Find pet by ID - description: Returns a single pet - operationId: get_pet_by_id - parameters: - - name: petId - in: path - description: ID of pet to return - required: true - style: simple - explode: false - schema: - type: integer - format: int64 - responses: - 200: - description: successful operation - content: - application/xml: - schema: - $ref: '#/components/schemas/Pet' - application/json: - schema: - $ref: '#/components/schemas/Pet' - 400: - description: Invalid ID supplied - 404: - description: Pet not found - security: - - api_key: [] - x-openapi-router-controller: openapi_server.controllers.pet_controller - post: - tags: - - pet - summary: Updates a pet in the store with form data - operationId: update_pet_with_form - parameters: - - name: petId - in: path - description: ID of pet that needs to be updated - required: true - style: simple - explode: false - schema: - type: integer - format: int64 - requestBody: - content: - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/body' - responses: - 405: - description: Invalid input - security: - - petstore_auth: - - write:pets - - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller delete: - tags: - - pet - summary: Deletes a pet operationId: delete_pet parameters: - - name: api_key - in: header - required: false - style: simple - explode: false + - in: header + name: api_key schema: type: string - - name: petId + - description: Pet id to delete in: path - description: Pet id to delete + name: petId required: true - style: simple - explode: false schema: - type: integer format: int64 + type: integer responses: 400: + content: {} description: Invalid pet value security: - petstore_auth: - write:pets - read:pets - x-openapi-router-controller: openapi_server.controllers.pet_controller - /pet/{petId}/uploadImage: - post: + summary: Deletes a pet tags: - pet - summary: uploads an image - operationId: upload_file + x-openapi-router-controller: openapi_server.controllers.pet_controller + get: + description: Returns a single pet + operationId: get_pet_by_id parameters: - - name: petId + - description: ID of pet to return in: path - description: ID of pet to update + name: petId required: true - style: simple - explode: false schema: - type: integer format: int64 - requestBody: - content: - multipart/form-data: - schema: - $ref: '#/components/schemas/body_1' + type: integer responses: 200: - description: successful operation content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' application/json: schema: - $ref: '#/components/schemas/ApiResponse' + $ref: '#/components/schemas/Pet' + description: successful operation + 400: + content: {} + description: Invalid ID supplied + 404: + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + post: + operationId: update_pet_with_form + parameters: + - description: ID of pet that needs to be updated + in: path + name: petId + required: true + schema: + format: int64 + type: integer + requestBody: + content: + application/x-www-form-urlencoded: + schema: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + responses: + 405: + content: {} + description: Invalid input security: - petstore_auth: - write:pets - read:pets + summary: Updates a pet in the store with form data + tags: + - pet + x-openapi-router-controller: openapi_server.controllers.pet_controller + /pet/{petId}/uploadImage: + post: + operationId: upload_file + parameters: + - description: ID of pet to update + in: path + name: petId + required: true + schema: + format: int64 + type: integer + requestBody: + content: + multipart/form-data: + schema: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + format: binary + type: string + responses: + 200: + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet x-openapi-router-controller: openapi_server.controllers.pet_controller /store/inventory: get: - tags: - - store - summary: Returns pet inventories by status description: Returns a map of status codes to quantities operationId: get_inventory responses: 200: - description: successful operation content: application/json: schema: - type: object additionalProperties: - type: integer format: int32 + type: integer + type: object + description: successful operation security: - api_key: [] + summary: Returns pet inventories by status + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /store/order: post: - tags: - - store - summary: Place an order for a pet operationId: place_order requestBody: - description: order placed for purchasing the pet content: - application/json: + '*/*': schema: $ref: '#/components/schemas/Order' + description: order placed for purchasing the pet required: true responses: 200: - description: successful operation content: application/xml: schema: @@ -306,185 +327,216 @@ paths: application/json: schema: $ref: '#/components/schemas/Order' + description: successful operation 400: + content: {} description: Invalid Order + summary: Place an order for a pet + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /store/order/{orderId}: - get: - tags: - - store - summary: Find purchase order by ID - description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - operationId: get_order_by_id - parameters: - - name: orderId - in: path - description: ID of pet that needs to be fetched - required: true - style: simple - explode: false - schema: - maximum: 5 - minimum: 1 - type: integer - format: int64 - responses: - 200: - description: successful operation - content: - application/xml: - schema: - $ref: '#/components/schemas/Order' - application/json: - schema: - $ref: '#/components/schemas/Order' - 400: - description: Invalid ID supplied - 404: - description: Order not found - x-openapi-router-controller: openapi_server.controllers.store_controller delete: - tags: - - store - summary: Delete purchase order by ID description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors operationId: delete_order parameters: - - name: orderId + - description: ID of the order that needs to be deleted in: path - description: ID of the order that needs to be deleted + name: orderId required: true - style: simple - explode: false schema: type: string responses: 400: + content: {} description: Invalid ID supplied 404: + content: {} description: Order not found + summary: Delete purchase order by ID + tags: + - store + x-openapi-router-controller: openapi_server.controllers.store_controller + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + operationId: get_order_by_id + parameters: + - description: ID of pet that needs to be fetched + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + responses: + 200: + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + description: successful operation + 400: + content: {} + description: Invalid ID supplied + 404: + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store x-openapi-router-controller: openapi_server.controllers.store_controller /user: post: - tags: - - user - summary: Create user description: This can only be done by the logged in user. operationId: create_user requestBody: - description: Created user object content: - application/json: + '*/*': schema: $ref: '#/components/schemas/User' + description: Created user object required: true responses: default: + content: {} description: successful operation + summary: Create user + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/createWithArray: post: - tags: - - user - summary: Creates list of users with given input array operationId: create_users_with_array_input requestBody: - $ref: '#/components/requestBodies/UserArray' + content: + '*/*': + schema: + items: + $ref: '#/components/schemas/User' + type: array + description: List of user object + required: true responses: default: + content: {} description: successful operation + summary: Creates list of users with given input array + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/createWithList: post: - tags: - - user - summary: Creates list of users with given input array operationId: create_users_with_list_input requestBody: - $ref: '#/components/requestBodies/UserArray' + content: + '*/*': + schema: + items: + $ref: '#/components/schemas/User' + type: array + description: List of user object + required: true responses: default: + content: {} description: successful operation + summary: Creates list of users with given input array + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/login: get: - tags: - - user - summary: Logs user into the system operationId: login_user parameters: - - name: username + - description: The user name for login in: query - description: The user name for login + name: username required: true - style: form - explode: true schema: type: string - - name: password + - description: The password for login in clear text in: query - description: The password for login in clear text + name: password required: true - style: form - explode: true schema: type: string responses: 200: + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string description: successful operation headers: X-Rate-Limit: description: calls per hour allowed by the user - style: simple - explode: false schema: - type: integer format: int32 + type: integer X-Expires-After: description: date in UTC when toekn expires - style: simple - explode: false schema: - type: string format: date-time - content: - application/xml: - schema: - type: string - application/json: - schema: type: string 400: + content: {} description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user x-openapi-router-controller: openapi_server.controllers.user_controller /user/logout: get: - tags: - - user - summary: Logs out current logged in user session operationId: logout_user responses: default: + content: {} description: successful operation - x-openapi-router-controller: openapi_server.controllers.user_controller - /user/{username}: - get: + summary: Logs out current logged in user session tags: - user - summary: Get user by user name + x-openapi-router-controller: openapi_server.controllers.user_controller + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: delete_user + parameters: + - description: The name that needs to be deleted + in: path + name: username + required: true + schema: + type: string + responses: + 400: + content: {} + description: Invalid username supplied + 404: + content: {} + description: User not found + summary: Delete user + tags: + - user + x-openapi-router-controller: openapi_server.controllers.user_controller + get: operationId: get_user_by_name parameters: - - name: username + - description: The name that needs to be fetched. Use user1 for testing. in: path - description: The name that needs to be fetched. Use user1 for testing. + name: username required: true - style: simple - explode: false schema: type: string responses: 200: - description: successful operation content: application/xml: schema: @@ -492,88 +544,48 @@ paths: application/json: schema: $ref: '#/components/schemas/User' + description: successful operation 400: + content: {} description: Invalid username supplied 404: + content: {} description: User not found - x-openapi-router-controller: openapi_server.controllers.user_controller - put: + summary: Get user by user name tags: - user - summary: Updated user + x-openapi-router-controller: openapi_server.controllers.user_controller + put: description: This can only be done by the logged in user. operationId: update_user parameters: - - name: username + - description: name that need to be deleted in: path - description: name that need to be deleted + name: username required: true - style: simple - explode: false schema: type: string requestBody: - description: Updated user object content: - application/json: + '*/*': schema: $ref: '#/components/schemas/User' + description: Updated user object required: true responses: 400: + content: {} description: Invalid user supplied 404: + content: {} description: User not found - x-openapi-router-controller: openapi_server.controllers.user_controller - delete: + summary: Updated user tags: - user - summary: Delete user - description: This can only be done by the logged in user. - operationId: delete_user - parameters: - - name: username - in: path - description: The name that needs to be deleted - required: true - style: simple - explode: false - schema: - type: string - responses: - 400: - description: Invalid username supplied - 404: - description: User not found x-openapi-router-controller: openapi_server.controllers.user_controller components: schemas: Order: - title: Pet Order - type: object - properties: - id: - type: integer - format: int64 - petId: - type: integer - format: int64 - quantity: - type: integer - format: int32 - shipDate: - type: string - format: date-time - status: - type: string - description: Order Status - enum: - - placed - - approved - - delivered - complete: - type: boolean - default: false description: An order for a pets from the pet store example: petId: 6 @@ -582,30 +594,63 @@ components: shipDate: 2000-01-23T04:56:07.000+00:00 complete: false status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object xml: name: Order Category: - title: Pet category - type: object - properties: - id: - type: integer - format: int64 - name: - type: string description: A category for a pet example: name: name id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object xml: name: Category User: - title: a User - type: object + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username properties: id: - type: integer format: int64 + type: integer username: type: string firstName: @@ -619,72 +664,29 @@ components: phone: type: string userStatus: - type: integer description: User Status format: int32 - description: A User who is purchasing from the pet store - example: - firstName: firstName - lastName: lastName - password: password - userStatus: 6 - phone: phone - id: 0 - email: email - username: username + type: integer + title: a User + type: object xml: name: User Tag: - title: Pet Tag - type: object - properties: - id: - type: integer - format: int64 - name: - type: string description: A tag for a pet example: name: name id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object xml: name: Tag Pet: - title: a Pet - required: - - name - - photoUrls - type: object - properties: - id: - type: integer - format: int64 - category: - $ref: '#/components/schemas/Category' - name: - type: string - example: doggie - photoUrls: - type: array - xml: - name: photoUrl - wrapped: true - items: - type: string - tags: - type: array - xml: - name: tag - wrapped: true - items: - $ref: '#/components/schemas/Tag' - status: - type: string - description: pet status in the store - enum: - - available - - pending - - sold description: A pet for sale in the pet store example: photoUrls: @@ -701,73 +703,69 @@ components: - name: name id: 1 status: available + properties: + id: + format: int64 + type: integer + category: + $ref: '#/components/schemas/Category' + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: '#/components/schemas/Tag' + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object xml: name: Pet ApiResponse: - title: An uploaded response - type: object - properties: - code: - type: integer - format: int32 - type: - type: string - message: - type: string description: Describes the result of uploading an image resource example: code: 0 type: type message: message - body: - type: object properties: - name: + code: + format: int32 + type: integer + type: type: string - description: Updated name of the pet - status: + message: type: string - description: Updated status of the pet - body_1: + title: An uploaded response type: object - properties: - additionalMetadata: - type: string - description: Additional data to pass to server - file: - type: string - description: file to upload - format: binary - requestBodies: - UserArray: - description: List of user object - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/User' - required: true - Pet: - description: Pet object that needs to be added to the store - content: - application/json: - schema: - $ref: '#/components/schemas/Pet' - application/xml: - schema: - $ref: '#/components/schemas/Pet' - required: true securitySchemes: petstore_auth: - type: oauth2 flows: implicit: authorizationUrl: http://petstore.swagger.io/api/oauth/dialog scopes: write:pets: modify pets in your account read:pets: read your pets + type: oauth2 api_key: - type: apiKey - name: api_key in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/flaskConnexion/openapi_server/util.py b/samples/server/petstore/flaskConnexion/openapi_server/util.py index 4321570d5a0..c7340cd0005 100644 --- a/samples/server/petstore/flaskConnexion/openapi_server/util.py +++ b/samples/server/petstore/flaskConnexion/openapi_server/util.py @@ -51,7 +51,7 @@ def _deserialize_primitive(data, klass): def _deserialize_object(value): - """Return a original value. + """Return an original value. :return: object. """ From f80fa08a011618c7db63f161d4b622d02e6869db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Even=20Andr=C3=A9=20Fiskvik?= Date: Sun, 9 Sep 2018 18:18:49 +0200 Subject: [PATCH 62/74] [Swift4] Fix default value for enums (#652) (#656) This fixes an issue that makes the swift 4 api client fail to compile when using enums with a default value. The fix changes the toDefaultValue method to check if the property is of enum type, and then returns a properly formatted value. Looking into the code, I wonder why toEnumDefaultValue is not being used here, which seems to be the case for the java implementation. --- .../codegen/languages/Swift4Codegen.java | 5 ++ .../codegen/swift4/Swift4ModelEnumTest.java | 55 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/swift4/Swift4ModelEnumTest.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java index 99f2a83bd94..e4b37b98c4d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift4Codegen.java @@ -510,6 +510,11 @@ public class Swift4Codegen extends DefaultCodegen implements CodegenConfig { @Override public String toDefaultValue(Schema p) { + if (p.getEnum() != null && !p.getEnum().isEmpty()) { + if (p.getDefault() != null) { + return "." + escapeText((String) p.getDefault()); + } + } if (ModelUtils.isIntegerSchema(p) || ModelUtils.isNumberSchema(p) || ModelUtils.isBooleanSchema(p)) { if (p.getDefault() != null) { return p.getDefault().toString(); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift4/Swift4ModelEnumTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift4/Swift4ModelEnumTest.java new file mode 100644 index 00000000000..a5d989c6984 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift4/Swift4ModelEnumTest.java @@ -0,0 +1,55 @@ +/* + * 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 + * + * http://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.swift4; + +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.languages.Swift4Codegen; +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.Collections; + +@SuppressWarnings("static-method") +public class Swift4ModelEnumTest { + @Test(description = "convert a java model with an enum and a default value") + public void converterTest() { + final StringSchema enumSchema = new StringSchema(); + enumSchema.setEnum(Arrays.asList("VALUE1", "VALUE2", "VALUE3")); + enumSchema.setDefault("VALUE2"); + final Schema model = new Schema().type("object").addProperties("name", enumSchema); + + final DefaultCodegen codegen = new Swift4Codegen(); + final CodegenModel cm = codegen.fromModel("sample", model, Collections.singletonMap("sample", model)); + + Assert.assertEquals(cm.vars.size(), 1); + + final CodegenProperty enumVar = cm.vars.get(0); + Assert.assertEquals(enumVar.baseName, "name"); + Assert.assertEquals(enumVar.dataType, "String"); + Assert.assertEquals(enumVar.datatypeWithEnum, "Name"); + Assert.assertEquals(enumVar.name, "name"); + Assert.assertEquals(enumVar.defaultValue, ".VALUE2"); + Assert.assertEquals(enumVar.baseType, "String"); + Assert.assertTrue(enumVar.isEnum); + } +} From 6a1e560540e1178bf81ae593b05e3a2d565e97b8 Mon Sep 17 00:00:00 2001 From: ircecho Date: Mon, 10 Sep 2018 18:14:50 +0200 Subject: [PATCH 63/74] fix[dart2]: improved error reporting (#1006) * fix[dart]: improved error reporting * rebuilt dart2 petstore * rebuilt dart2 petstore with dartfmt --- .../main/resources/dart2/api_client.mustache | 2 +- .../openapi/lib/api/pet_api.dart | 12 ++++++++---- .../openapi/lib/api/store_api.dart | 3 ++- .../openapi/lib/api/user_api.dart | 18 ++++++++++++------ .../openapi/lib/api_client.dart | 2 +- .../lib/api/pet_api.dart | 12 ++++++++---- .../lib/api/store_api.dart | 3 ++- .../lib/api/user_api.dart | 18 ++++++++++++------ .../openapi-browser-client/lib/api_client.dart | 2 +- .../dart2/openapi/lib/api/pet_api.dart | 12 ++++++++---- .../dart2/openapi/lib/api/store_api.dart | 3 ++- .../dart2/openapi/lib/api/user_api.dart | 18 ++++++++++++------ .../petstore/dart2/openapi/lib/api_client.dart | 2 +- 13 files changed, 70 insertions(+), 37 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/dart2/api_client.mustache b/modules/openapi-generator/src/main/resources/dart2/api_client.mustache index 9b83baf71dd..a3cd3c2463b 100644 --- a/modules/openapi-generator/src/main/resources/dart2/api_client.mustache +++ b/modules/openapi-generator/src/main/resources/dart2/api_client.mustache @@ -70,7 +70,7 @@ class ApiClient { } } } - } catch (e, stack) { + } on Exception catch (e, stack) { throw ApiException.withInner(500, 'Exception during deserialization.', e, stack); } throw ApiException(500, 'Could not find a suitable class for deserialization'); diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart index 0c625c2b04a..83af6ca8e62 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/pet_api.dart @@ -41,7 +41,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -85,7 +86,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -265,7 +267,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -319,7 +322,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart index 5f88bf5ac99..3fc1364a102 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/store_api.dart @@ -43,7 +43,8 @@ class StoreApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart index 94b245a5609..52202df0ea4 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api/user_api.dart @@ -41,7 +41,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -82,7 +83,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -123,7 +125,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -166,7 +169,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -299,7 +303,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -345,7 +350,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart index 016e939e55d..d0db1fd65ec 100644 --- a/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart2/flutter_petstore/openapi/lib/api_client.dart @@ -65,7 +65,7 @@ class ApiClient { } } } - } catch (e, stack) { + } on Exception catch (e, stack) { throw ApiException.withInner( 500, 'Exception during deserialization.', e, stack); } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart index 0c625c2b04a..83af6ca8e62 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/pet_api.dart @@ -41,7 +41,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -85,7 +86,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -265,7 +267,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -319,7 +322,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart index 5f88bf5ac99..3fc1364a102 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/store_api.dart @@ -43,7 +43,8 @@ class StoreApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart index 94b245a5609..52202df0ea4 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api/user_api.dart @@ -41,7 +41,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -82,7 +83,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -123,7 +125,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -166,7 +169,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -299,7 +303,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -345,7 +350,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart index 72a7c0f345b..acf873a63b2 100644 --- a/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart +++ b/samples/client/petstore/dart2/openapi-browser-client/lib/api_client.dart @@ -65,7 +65,7 @@ class ApiClient { } } } - } catch (e, stack) { + } on Exception catch (e, stack) { throw ApiException.withInner( 500, 'Exception during deserialization.', e, stack); } diff --git a/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart index 0c625c2b04a..83af6ca8e62 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/pet_api.dart @@ -41,7 +41,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -85,7 +86,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -265,7 +267,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -319,7 +322,8 @@ class PetApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi/lib/api/store_api.dart b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart index 5f88bf5ac99..3fc1364a102 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/store_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/store_api.dart @@ -43,7 +43,8 @@ class StoreApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi/lib/api/user_api.dart b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart index 94b245a5609..52202df0ea4 100644 --- a/samples/client/petstore/dart2/openapi/lib/api/user_api.dart +++ b/samples/client/petstore/dart2/openapi/lib/api/user_api.dart @@ -41,7 +41,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -82,7 +83,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -123,7 +125,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -166,7 +169,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -299,7 +303,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } @@ -345,7 +350,8 @@ class UserApi { if (response.statusCode >= 400) { throw new ApiException(response.statusCode, response.body); - } else if (response.body != null) {} else { + } else if (response.body != null) { + } else { return; } } diff --git a/samples/client/petstore/dart2/openapi/lib/api_client.dart b/samples/client/petstore/dart2/openapi/lib/api_client.dart index 016e939e55d..d0db1fd65ec 100644 --- a/samples/client/petstore/dart2/openapi/lib/api_client.dart +++ b/samples/client/petstore/dart2/openapi/lib/api_client.dart @@ -65,7 +65,7 @@ class ApiClient { } } } - } catch (e, stack) { + } on Exception catch (e, stack) { throw ApiException.withInner( 500, 'Exception during deserialization.', e, stack); } From 2d99836e9047d74e958910aca1aa38b34e584daa Mon Sep 17 00:00:00 2001 From: Juan Eugenio Abadie Date: Mon, 10 Sep 2018 13:15:44 -0300 Subject: [PATCH 64/74] [C++] [cpp-rest-sdk] Check for null values (#990) * Check whether a value is present but null * Update Petstore sample --- .../cpp-rest-sdk-client/model-source.mustache | 41 ++++++++------- .../cpp-restsdk/.openapi-generator/VERSION | 2 +- .../client/petstore/cpp-restsdk/ApiClient.cpp | 2 +- .../client/petstore/cpp-restsdk/ApiClient.h | 2 +- .../petstore/cpp-restsdk/ApiConfiguration.cpp | 2 +- .../petstore/cpp-restsdk/ApiConfiguration.h | 2 +- .../petstore/cpp-restsdk/ApiException.cpp | 2 +- .../petstore/cpp-restsdk/ApiException.h | 2 +- .../petstore/cpp-restsdk/HttpContent.cpp | 2 +- .../client/petstore/cpp-restsdk/HttpContent.h | 2 +- .../client/petstore/cpp-restsdk/IHttpBody.h | 2 +- .../client/petstore/cpp-restsdk/JsonBody.cpp | 2 +- .../client/petstore/cpp-restsdk/JsonBody.h | 2 +- .../client/petstore/cpp-restsdk/ModelBase.cpp | 2 +- .../client/petstore/cpp-restsdk/ModelBase.h | 2 +- .../cpp-restsdk/MultipartFormData.cpp | 2 +- .../petstore/cpp-restsdk/MultipartFormData.h | 2 +- .../client/petstore/cpp-restsdk/Object.cpp | 2 +- samples/client/petstore/cpp-restsdk/Object.h | 2 +- .../petstore/cpp-restsdk/api/PetApi.cpp | 2 +- .../client/petstore/cpp-restsdk/api/PetApi.h | 2 +- .../petstore/cpp-restsdk/api/StoreApi.cpp | 2 +- .../petstore/cpp-restsdk/api/StoreApi.h | 2 +- .../petstore/cpp-restsdk/api/UserApi.cpp | 2 +- .../client/petstore/cpp-restsdk/api/UserApi.h | 2 +- .../cpp-restsdk/model/ApiResponse.cpp | 20 ++++++-- .../petstore/cpp-restsdk/model/ApiResponse.h | 2 +- .../petstore/cpp-restsdk/model/Category.cpp | 14 ++++-- .../petstore/cpp-restsdk/model/Category.h | 2 +- .../petstore/cpp-restsdk/model/Order.cpp | 38 +++++++++++--- .../client/petstore/cpp-restsdk/model/Order.h | 2 +- .../client/petstore/cpp-restsdk/model/Pet.cpp | 19 +++++-- .../client/petstore/cpp-restsdk/model/Pet.h | 2 +- .../client/petstore/cpp-restsdk/model/Tag.cpp | 14 ++++-- .../client/petstore/cpp-restsdk/model/Tag.h | 2 +- .../petstore/cpp-restsdk/model/User.cpp | 50 +++++++++++++++---- .../client/petstore/cpp-restsdk/model/User.h | 2 +- 37 files changed, 177 insertions(+), 79 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/model-source.mustache b/modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/model-source.mustache index 842571dcbef..2959ee7c9e4 100644 --- a/modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/model-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-rest-sdk-client/model-source.mustache @@ -140,7 +140,11 @@ void {{classname}}::fromJson(web::json::value& val) {{^required}} if(val.has_field(utility::conversions::to_string_t("{{baseName}}"))) { - {{setter}}(ModelBase::{{baseType}}FromJson(val[utility::conversions::to_string_t("{{baseName}}")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("{{baseName}}")]; + if(!fieldValue.is_null()) + { + {{setter}}(ModelBase::{{baseType}}FromJson(fieldValue)); + } } {{/required}} {{#required}} @@ -242,27 +246,28 @@ void {{classname}}::fromJson(web::json::value& val) {{^required}} if(val.has_field(utility::conversions::to_string_t("{{baseName}}"))) { - {{#isString}} - {{setter}}(ModelBase::stringFromJson(val[utility::conversions::to_string_t("{{baseName}}")])); - {{/isString}} - {{#isByteArray}} - {{setter}}(ModelBase::stringFromJson(val[utility::conversions::to_string_t("{{baseName}}")])); - {{/isByteArray}} - {{^isString}} - {{#isDateTime}} - {{setter}}(ModelBase::dateFromJson(val[utility::conversions::to_string_t("{{baseName}}")])); - {{/isDateTime}} - {{^isDateTime}} - {{^isByteArray}} - if(!val[utility::conversions::to_string_t("{{baseName}}")].is_null()) + web::json::value& fieldValue = val[utility::conversions::to_string_t("{{baseName}}")]; + if(!fieldValue.is_null()) { + {{#isString}} + {{setter}}(ModelBase::stringFromJson(fieldValue)); + {{/isString}} + {{#isByteArray}} + {{setter}}(ModelBase::stringFromJson(fieldValue)); + {{/isByteArray}} + {{^isString}} + {{#isDateTime}} + {{setter}}(ModelBase::dateFromJson(fieldValue)); + {{/isDateTime}} + {{^isDateTime}} + {{^isByteArray}} {{{dataType}}} newItem({{{defaultValue}}}); - newItem->fromJson(val[utility::conversions::to_string_t("{{baseName}}")]); + newItem->fromJson(fieldValue); {{setter}}( newItem ); + {{/isByteArray}} + {{/isDateTime}} + {{/isString}} } - {{/isByteArray}} - {{/isDateTime}} - {{/isString}} } {{/required}} {{#required}} diff --git a/samples/client/petstore/cpp-restsdk/.openapi-generator/VERSION b/samples/client/petstore/cpp-restsdk/.openapi-generator/VERSION index 105bb87d77b..6d94c9c2e12 100644 --- a/samples/client/petstore/cpp-restsdk/.openapi-generator/VERSION +++ b/samples/client/petstore/cpp-restsdk/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.2-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/cpp-restsdk/ApiClient.cpp b/samples/client/petstore/cpp-restsdk/ApiClient.cpp index 32a7e44548c..9b7ae17bd82 100644 --- a/samples/client/petstore/cpp-restsdk/ApiClient.cpp +++ b/samples/client/petstore/cpp-restsdk/ApiClient.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ApiClient.h b/samples/client/petstore/cpp-restsdk/ApiClient.h index 2381ce335a3..0ce3eeb4916 100644 --- a/samples/client/petstore/cpp-restsdk/ApiClient.h +++ b/samples/client/petstore/cpp-restsdk/ApiClient.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ApiConfiguration.cpp b/samples/client/petstore/cpp-restsdk/ApiConfiguration.cpp index 292054f38e6..95a6c5fc1b9 100644 --- a/samples/client/petstore/cpp-restsdk/ApiConfiguration.cpp +++ b/samples/client/petstore/cpp-restsdk/ApiConfiguration.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ApiConfiguration.h b/samples/client/petstore/cpp-restsdk/ApiConfiguration.h index c6dde17bc8c..218c92b403f 100644 --- a/samples/client/petstore/cpp-restsdk/ApiConfiguration.h +++ b/samples/client/petstore/cpp-restsdk/ApiConfiguration.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ApiException.cpp b/samples/client/petstore/cpp-restsdk/ApiException.cpp index 150d30bbd2c..f1eb81c2144 100644 --- a/samples/client/petstore/cpp-restsdk/ApiException.cpp +++ b/samples/client/petstore/cpp-restsdk/ApiException.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ApiException.h b/samples/client/petstore/cpp-restsdk/ApiException.h index 517313c47f5..4958f09ad74 100644 --- a/samples/client/petstore/cpp-restsdk/ApiException.h +++ b/samples/client/petstore/cpp-restsdk/ApiException.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/HttpContent.cpp b/samples/client/petstore/cpp-restsdk/HttpContent.cpp index 7c7ac5840ba..3f94dd84a97 100644 --- a/samples/client/petstore/cpp-restsdk/HttpContent.cpp +++ b/samples/client/petstore/cpp-restsdk/HttpContent.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/HttpContent.h b/samples/client/petstore/cpp-restsdk/HttpContent.h index 864ec2075e6..9cc76d8d114 100644 --- a/samples/client/petstore/cpp-restsdk/HttpContent.h +++ b/samples/client/petstore/cpp-restsdk/HttpContent.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/IHttpBody.h b/samples/client/petstore/cpp-restsdk/IHttpBody.h index dc9bc6f089c..c5e173490f7 100644 --- a/samples/client/petstore/cpp-restsdk/IHttpBody.h +++ b/samples/client/petstore/cpp-restsdk/IHttpBody.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/JsonBody.cpp b/samples/client/petstore/cpp-restsdk/JsonBody.cpp index c2f9c451061..276f83abbb2 100644 --- a/samples/client/petstore/cpp-restsdk/JsonBody.cpp +++ b/samples/client/petstore/cpp-restsdk/JsonBody.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/JsonBody.h b/samples/client/petstore/cpp-restsdk/JsonBody.h index 3f5702dfb88..ada2e9eb11b 100644 --- a/samples/client/petstore/cpp-restsdk/JsonBody.h +++ b/samples/client/petstore/cpp-restsdk/JsonBody.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ModelBase.cpp b/samples/client/petstore/cpp-restsdk/ModelBase.cpp index c0ef13e4ac2..10bffc4d1fa 100644 --- a/samples/client/petstore/cpp-restsdk/ModelBase.cpp +++ b/samples/client/petstore/cpp-restsdk/ModelBase.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/ModelBase.h b/samples/client/petstore/cpp-restsdk/ModelBase.h index 8c2a0d80a00..2eedce34bf1 100644 --- a/samples/client/petstore/cpp-restsdk/ModelBase.h +++ b/samples/client/petstore/cpp-restsdk/ModelBase.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/MultipartFormData.cpp b/samples/client/petstore/cpp-restsdk/MultipartFormData.cpp index b1cd75ded0e..af977862526 100644 --- a/samples/client/petstore/cpp-restsdk/MultipartFormData.cpp +++ b/samples/client/petstore/cpp-restsdk/MultipartFormData.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/MultipartFormData.h b/samples/client/petstore/cpp-restsdk/MultipartFormData.h index 6542845bcc1..3cc52c4990c 100644 --- a/samples/client/petstore/cpp-restsdk/MultipartFormData.h +++ b/samples/client/petstore/cpp-restsdk/MultipartFormData.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/Object.cpp b/samples/client/petstore/cpp-restsdk/Object.cpp index 42694b488ed..c732027e2ac 100644 --- a/samples/client/petstore/cpp-restsdk/Object.cpp +++ b/samples/client/petstore/cpp-restsdk/Object.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/Object.h b/samples/client/petstore/cpp-restsdk/Object.h index a8f58b43a97..0914c1fd7c1 100644 --- a/samples/client/petstore/cpp-restsdk/Object.h +++ b/samples/client/petstore/cpp-restsdk/Object.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/PetApi.cpp b/samples/client/petstore/cpp-restsdk/api/PetApi.cpp index 8d99e86ca8a..eb912354ea0 100644 --- a/samples/client/petstore/cpp-restsdk/api/PetApi.cpp +++ b/samples/client/petstore/cpp-restsdk/api/PetApi.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/PetApi.h b/samples/client/petstore/cpp-restsdk/api/PetApi.h index e63710124ca..ae7546f1150 100644 --- a/samples/client/petstore/cpp-restsdk/api/PetApi.h +++ b/samples/client/petstore/cpp-restsdk/api/PetApi.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/StoreApi.cpp b/samples/client/petstore/cpp-restsdk/api/StoreApi.cpp index c690f2be511..55cfb7850e9 100644 --- a/samples/client/petstore/cpp-restsdk/api/StoreApi.cpp +++ b/samples/client/petstore/cpp-restsdk/api/StoreApi.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/StoreApi.h b/samples/client/petstore/cpp-restsdk/api/StoreApi.h index f952506a16d..6380402473e 100644 --- a/samples/client/petstore/cpp-restsdk/api/StoreApi.h +++ b/samples/client/petstore/cpp-restsdk/api/StoreApi.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/UserApi.cpp b/samples/client/petstore/cpp-restsdk/api/UserApi.cpp index af3fb210b68..24376a87477 100644 --- a/samples/client/petstore/cpp-restsdk/api/UserApi.cpp +++ b/samples/client/petstore/cpp-restsdk/api/UserApi.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/api/UserApi.h b/samples/client/petstore/cpp-restsdk/api/UserApi.h index d74deecb3d0..2afa0af9281 100644 --- a/samples/client/petstore/cpp-restsdk/api/UserApi.h +++ b/samples/client/petstore/cpp-restsdk/api/UserApi.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/ApiResponse.cpp b/samples/client/petstore/cpp-restsdk/model/ApiResponse.cpp index b93cbb85328..ce86c5523e4 100644 --- a/samples/client/petstore/cpp-restsdk/model/ApiResponse.cpp +++ b/samples/client/petstore/cpp-restsdk/model/ApiResponse.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -61,15 +61,27 @@ void ApiResponse::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("code"))) { - setCode(ModelBase::int32_tFromJson(val[utility::conversions::to_string_t("code")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("code")]; + if(!fieldValue.is_null()) + { + setCode(ModelBase::int32_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("type"))) { - setType(ModelBase::stringFromJson(val[utility::conversions::to_string_t("type")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("type")]; + if(!fieldValue.is_null()) + { + setType(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("message"))) { - setMessage(ModelBase::stringFromJson(val[utility::conversions::to_string_t("message")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("message")]; + if(!fieldValue.is_null()) + { + setMessage(ModelBase::stringFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/ApiResponse.h b/samples/client/petstore/cpp-restsdk/model/ApiResponse.h index fc1bf4e6109..2c257ab297b 100644 --- a/samples/client/petstore/cpp-restsdk/model/ApiResponse.h +++ b/samples/client/petstore/cpp-restsdk/model/ApiResponse.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/Category.cpp b/samples/client/petstore/cpp-restsdk/model/Category.cpp index 53494010800..c39bf76fc8b 100644 --- a/samples/client/petstore/cpp-restsdk/model/Category.cpp +++ b/samples/client/petstore/cpp-restsdk/model/Category.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -55,11 +55,19 @@ void Category::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("id"))) { - setId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("id")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("id")]; + if(!fieldValue.is_null()) + { + setId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("name"))) { - setName(ModelBase::stringFromJson(val[utility::conversions::to_string_t("name")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("name")]; + if(!fieldValue.is_null()) + { + setName(ModelBase::stringFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/Category.h b/samples/client/petstore/cpp-restsdk/model/Category.h index ab370a4bb03..87f4224b2ab 100644 --- a/samples/client/petstore/cpp-restsdk/model/Category.h +++ b/samples/client/petstore/cpp-restsdk/model/Category.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/Order.cpp b/samples/client/petstore/cpp-restsdk/model/Order.cpp index 7f5b5464d5f..fe2ecb8ebe9 100644 --- a/samples/client/petstore/cpp-restsdk/model/Order.cpp +++ b/samples/client/petstore/cpp-restsdk/model/Order.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -79,27 +79,51 @@ void Order::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("id"))) { - setId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("id")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("id")]; + if(!fieldValue.is_null()) + { + setId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("petId"))) { - setPetId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("petId")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("petId")]; + if(!fieldValue.is_null()) + { + setPetId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("quantity"))) { - setQuantity(ModelBase::int32_tFromJson(val[utility::conversions::to_string_t("quantity")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("quantity")]; + if(!fieldValue.is_null()) + { + setQuantity(ModelBase::int32_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("shipDate"))) { - setShipDate(ModelBase::dateFromJson(val[utility::conversions::to_string_t("shipDate")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("shipDate")]; + if(!fieldValue.is_null()) + { + setShipDate(ModelBase::dateFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("status"))) { - setStatus(ModelBase::stringFromJson(val[utility::conversions::to_string_t("status")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("status")]; + if(!fieldValue.is_null()) + { + setStatus(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("complete"))) { - setComplete(ModelBase::boolFromJson(val[utility::conversions::to_string_t("complete")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("complete")]; + if(!fieldValue.is_null()) + { + setComplete(ModelBase::boolFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/Order.h b/samples/client/petstore/cpp-restsdk/model/Order.h index b2d4410d643..1b3b7f1e121 100644 --- a/samples/client/petstore/cpp-restsdk/model/Order.h +++ b/samples/client/petstore/cpp-restsdk/model/Order.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/Pet.cpp b/samples/client/petstore/cpp-restsdk/model/Pet.cpp index 78fed60be7d..ac8c2232b2d 100644 --- a/samples/client/petstore/cpp-restsdk/model/Pet.cpp +++ b/samples/client/petstore/cpp-restsdk/model/Pet.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -82,14 +82,19 @@ void Pet::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("id"))) { - setId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("id")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("id")]; + if(!fieldValue.is_null()) + { + setId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("category"))) { - if(!val[utility::conversions::to_string_t("category")].is_null()) + web::json::value& fieldValue = val[utility::conversions::to_string_t("category")]; + if(!fieldValue.is_null()) { std::shared_ptr newItem(new Category()); - newItem->fromJson(val[utility::conversions::to_string_t("category")]); + newItem->fromJson(fieldValue); setCategory( newItem ); } } @@ -124,7 +129,11 @@ void Pet::fromJson(web::json::value& val) } if(val.has_field(utility::conversions::to_string_t("status"))) { - setStatus(ModelBase::stringFromJson(val[utility::conversions::to_string_t("status")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("status")]; + if(!fieldValue.is_null()) + { + setStatus(ModelBase::stringFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/Pet.h b/samples/client/petstore/cpp-restsdk/model/Pet.h index c4e0d0b4978..a0d457cabac 100644 --- a/samples/client/petstore/cpp-restsdk/model/Pet.h +++ b/samples/client/petstore/cpp-restsdk/model/Pet.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/Tag.cpp b/samples/client/petstore/cpp-restsdk/model/Tag.cpp index 8c0c537cf26..416ec5e2de5 100644 --- a/samples/client/petstore/cpp-restsdk/model/Tag.cpp +++ b/samples/client/petstore/cpp-restsdk/model/Tag.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -55,11 +55,19 @@ void Tag::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("id"))) { - setId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("id")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("id")]; + if(!fieldValue.is_null()) + { + setId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("name"))) { - setName(ModelBase::stringFromJson(val[utility::conversions::to_string_t("name")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("name")]; + if(!fieldValue.is_null()) + { + setName(ModelBase::stringFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/Tag.h b/samples/client/petstore/cpp-restsdk/model/Tag.h index b2b49f58c43..d78e2c34001 100644 --- a/samples/client/petstore/cpp-restsdk/model/Tag.h +++ b/samples/client/petstore/cpp-restsdk/model/Tag.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ diff --git a/samples/client/petstore/cpp-restsdk/model/User.cpp b/samples/client/petstore/cpp-restsdk/model/User.cpp index 511811b9f08..d8ec0c8c437 100644 --- a/samples/client/petstore/cpp-restsdk/model/User.cpp +++ b/samples/client/petstore/cpp-restsdk/model/User.cpp @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ @@ -91,35 +91,67 @@ void User::fromJson(web::json::value& val) { if(val.has_field(utility::conversions::to_string_t("id"))) { - setId(ModelBase::int64_tFromJson(val[utility::conversions::to_string_t("id")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("id")]; + if(!fieldValue.is_null()) + { + setId(ModelBase::int64_tFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("username"))) { - setUsername(ModelBase::stringFromJson(val[utility::conversions::to_string_t("username")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("username")]; + if(!fieldValue.is_null()) + { + setUsername(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("firstName"))) { - setFirstName(ModelBase::stringFromJson(val[utility::conversions::to_string_t("firstName")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("firstName")]; + if(!fieldValue.is_null()) + { + setFirstName(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("lastName"))) { - setLastName(ModelBase::stringFromJson(val[utility::conversions::to_string_t("lastName")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("lastName")]; + if(!fieldValue.is_null()) + { + setLastName(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("email"))) { - setEmail(ModelBase::stringFromJson(val[utility::conversions::to_string_t("email")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("email")]; + if(!fieldValue.is_null()) + { + setEmail(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("password"))) { - setPassword(ModelBase::stringFromJson(val[utility::conversions::to_string_t("password")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("password")]; + if(!fieldValue.is_null()) + { + setPassword(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("phone"))) { - setPhone(ModelBase::stringFromJson(val[utility::conversions::to_string_t("phone")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("phone")]; + if(!fieldValue.is_null()) + { + setPhone(ModelBase::stringFromJson(fieldValue)); + } } if(val.has_field(utility::conversions::to_string_t("userStatus"))) { - setUserStatus(ModelBase::int32_tFromJson(val[utility::conversions::to_string_t("userStatus")])); + web::json::value& fieldValue = val[utility::conversions::to_string_t("userStatus")]; + if(!fieldValue.is_null()) + { + setUserStatus(ModelBase::int32_tFromJson(fieldValue)); + } } } diff --git a/samples/client/petstore/cpp-restsdk/model/User.h b/samples/client/petstore/cpp-restsdk/model/User.h index aca144de933..01c3271f934 100644 --- a/samples/client/petstore/cpp-restsdk/model/User.h +++ b/samples/client/petstore/cpp-restsdk/model/User.h @@ -4,7 +4,7 @@ * * OpenAPI spec version: 1.0.0 * - * NOTE: This class is auto generated by OpenAPI-Generator 3.2.2-SNAPSHOT. + * NOTE: This class is auto generated by OpenAPI-Generator 3.3.0-SNAPSHOT. * https://openapi-generator.tech * Do not edit the class manually. */ From 1ae3403f6d5a24330447355b1742a658d18afe74 Mon Sep 17 00:00:00 2001 From: Adam Drakeford Date: Wed, 12 Sep 2018 02:41:12 +0100 Subject: [PATCH 65/74] [KOTLIN] [SPRING] Minor bug fixes to generator (#1001) --- .../languages/KotlinSpringServerCodegen.java | 25 +++++++++++++++---- .../main/resources/kotlin-spring/api.mustache | 2 +- .../spring-boot/application.mustache | 13 +++++++--- .../spring-boot/buildGradleKts.mustache | 1 + .../libraries/spring-boot/pom.mustache | 4 +++ .../spring/KotlinSpringServerCodegenTest.java | 11 ++++++++ .../.openapi-generator/VERSION | 2 +- .../kotlin-springboot/build.gradle.kts | 1 + .../petstore/kotlin-springboot/pom.xml | 4 +++ .../kotlin/org/openapitools/api/PetApi.kt | 2 +- .../kotlin/org/openapitools/api/StoreApi.kt | 2 +- .../kotlin/org/openapitools/api/UserApi.kt | 2 +- .../src/main/resources/application.yaml | 13 +++++++--- .../.openapi-generator/VERSION | 2 +- .../kotlin-springboot/build.gradle.kts | 1 + .../server/petstore/kotlin-springboot/pom.xml | 4 +++ .../kotlin/org/openapitools/api/PetApi.kt | 2 +- .../kotlin/org/openapitools/api/StoreApi.kt | 2 +- .../kotlin/org/openapitools/api/UserApi.kt | 2 +- .../src/main/resources/application.yaml | 13 +++++++--- 20 files changed, 85 insertions(+), 23 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java index c06863cc373..3693f398074 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java @@ -59,6 +59,7 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen public static final String SERVICE_IMPLEMENTATION = "serviceImplementation"; private String basePackage; + private String invokerPackage; private String serverPort = "8080"; private String title = "OpenAPI Kotlin Spring"; private String resourceFolder = "src/main/resources"; @@ -79,12 +80,12 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen embeddedTemplateDir = templateDir = "kotlin-spring"; artifactId = "openapi-spring"; - basePackage = "org.openapitools"; + basePackage = invokerPackage = "org.openapitools"; apiPackage = "org.openapitools.api"; modelPackage = "org.openapitools.model"; addOption(TITLE, "server title name or client service name", title); - addOption(BASE_PACKAGE, "base package for generated code", basePackage); + addOption(BASE_PACKAGE, "base package (invokerPackage) for generated code", basePackage); addOption(SERVER_PORT, "configuration the port in which the sever is to run on", serverPort); addOption(CodegenConstants.MODEL_PACKAGE, "model package for generated code", modelPackage); addOption(CodegenConstants.API_PACKAGE, "api package for generated code", apiPackage); @@ -123,6 +124,14 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen this.basePackage = basePackage; } + public String getInvokerPackage() { + return this.invokerPackage; + } + + public void setInvokerPackage(String invokerPackage) { + this.invokerPackage = invokerPackage; + } + public String getServerPort() { return this.serverPort; } @@ -225,13 +234,19 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen // used later in recursive import in postProcessingModels importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator"); - // TODO when adding invokerPackage - //importMapping.put("StringUtil", invokerPackage + ".StringUtil"); - if (!additionalProperties.containsKey(CodegenConstants.LIBRARY)) { additionalProperties.put(CodegenConstants.LIBRARY, library); } + // Set basePackage from invokerPackage + if (!additionalProperties.containsKey(BASE_PACKAGE) + && additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { + this.setBasePackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); + this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); + additionalProperties.put(BASE_PACKAGE, basePackage); + LOGGER.info("Set base package to invoker package (" + basePackage + ")"); + } + if (additionalProperties.containsKey(BASE_PACKAGE)) { this.setBasePackage((String) additionalProperties.get(BASE_PACKAGE)); } else { diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache index 0ab788eea19..d8e69eb72f6 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/api.mustache @@ -39,7 +39,7 @@ import kotlin.collections.Map @Api(value = "{{{baseName}}}", description = "The {{{baseName}}} API") {{/swaggerAnnotations}} {{=<% %>=}} -@RequestMapping("\${openapi.<%title%>.base-path:<%contextPath%>}") +@RequestMapping("\${api.base-path:<%contextPath%>}") <%={{ }}=%> {{#operations}} class {{classname}}Controller({{#serviceInterface}}@Autowired(required = true) val service: {{classname}}Service{{/serviceInterface}}) { diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache index b3245b77481..9bc4fb4c27c 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/application.mustache @@ -1,3 +1,10 @@ -spring.application.name={{title}} -server.port={{serverPort}} -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring: + application: + name: {{title}} + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: {{serverPort}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache index d8c488429f9..a36b054d633 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradleKts.mustache @@ -40,6 +40,7 @@ dependencies { {{/swaggerAnnotations}} compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + compile("com.fasterxml.jackson.module:jackson-module-kotlin") testCompile("org.springframework.boot:spring-boot-starter-test") { exclude(module = "junit") diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache index fe2c87baaef..bc74aa267d9 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom.mustache @@ -98,6 +98,10 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.fasterxml.jackson.module + jackson-module-kotlin + {{#useBeanValidation}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 17ec8e74c20..87847e16cf7 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -29,6 +29,7 @@ public class KotlinSpringServerCodegenTest { Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.API_PACKAGE), "org.openapitools.api"); Assert.assertEquals(codegen.getBasePackage(), "org.openapitools"); Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.BASE_PACKAGE), "org.openapitools"); + Assert.assertEquals(codegen.getInvokerPackage(), "org.openapitools"); Assert.assertEquals(codegen.getServerPort(), "8080"); Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVER_PORT), "8080"); } @@ -112,4 +113,14 @@ public class KotlinSpringServerCodegenTest { Assert.assertFalse(codegen.getUseBeanValidation()); Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.USE_BEANVALIDATION), false); } + + @Test + public void testSettingInvokerPackageToBasePackage() throws Exception { + final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); + codegen.additionalProperties().put(CodegenConstants.INVOKER_PACKAGE, "xyz.yyyyy.bbbb.invoker"); + codegen.processOpts(); + + Assert.assertEquals(codegen.getInvokerPackage(), "xyz.yyyyy.bbbb.invoker"); + Assert.assertEquals(codegen.getBasePackage(), "xyz.yyyyy.bbbb.invoker"); + } } diff --git a/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION +++ b/samples/server/openapi3/petstore/kotlin-springboot/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts b/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts index b5a8fef7453..f7a2deac996 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts +++ b/samples/server/openapi3/petstore/kotlin-springboot/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { compile("io.swagger:swagger-annotations:1.5.21") compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + compile("com.fasterxml.jackson.module:jackson-module-kotlin") testCompile("org.springframework.boot:spring-boot-starter-test") { exclude(module = "junit") diff --git a/samples/server/openapi3/petstore/kotlin-springboot/pom.xml b/samples/server/openapi3/petstore/kotlin-springboot/pom.xml index fb79c82ccae..96ed05a21d5 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/pom.xml +++ b/samples/server/openapi3/petstore/kotlin-springboot/pom.xml @@ -96,6 +96,10 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.fasterxml.jackson.module + jackson-module-kotlin + javax.validation diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt index 05aee6becb9..d33c5efd3e9 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -28,7 +28,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "Pet", description = "The Pet API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class PetApiController(@Autowired(required = true) val service: PetApiService) { @ApiOperation( diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt index fb6c7cb9a32..686c54b18bb 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -27,7 +27,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "Store", description = "The Store API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class StoreApiController(@Autowired(required = true) val service: StoreApiService) { @ApiOperation( diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt index 4b88b867b13..a6f25a4fd38 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -27,7 +27,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "User", description = "The User API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class UserApiController(@Autowired(required = true) val service: UserApiService) { @ApiOperation( diff --git a/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml b/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml index 366e320d52c..8e2ebcde976 100644 --- a/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml +++ b/samples/server/openapi3/petstore/kotlin-springboot/src/main/resources/application.yaml @@ -1,3 +1,10 @@ -spring.application.name=openAPIPetstore -server.port=8080 -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 diff --git a/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION index c791c986fbb..6d94c9c2e12 100644 --- a/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION +++ b/samples/server/petstore/kotlin-springboot/.openapi-generator/VERSION @@ -1 +1 @@ -3.2.3-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/kotlin-springboot/build.gradle.kts b/samples/server/petstore/kotlin-springboot/build.gradle.kts index b5a8fef7453..f7a2deac996 100644 --- a/samples/server/petstore/kotlin-springboot/build.gradle.kts +++ b/samples/server/petstore/kotlin-springboot/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { compile("io.swagger:swagger-annotations:1.5.21") compile("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") compile("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + compile("com.fasterxml.jackson.module:jackson-module-kotlin") testCompile("org.springframework.boot:spring-boot-starter-test") { exclude(module = "junit") diff --git a/samples/server/petstore/kotlin-springboot/pom.xml b/samples/server/petstore/kotlin-springboot/pom.xml index fb79c82ccae..96ed05a21d5 100644 --- a/samples/server/petstore/kotlin-springboot/pom.xml +++ b/samples/server/petstore/kotlin-springboot/pom.xml @@ -96,6 +96,10 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.fasterxml.jackson.module + jackson-module-kotlin + javax.validation diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt index 05aee6becb9..d33c5efd3e9 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -28,7 +28,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "Pet", description = "The Pet API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class PetApiController(@Autowired(required = true) val service: PetApiService) { @ApiOperation( diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt index fd682adb7c2..4384a8def7a 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -27,7 +27,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "Store", description = "The Store API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class StoreApiController(@Autowired(required = true) val service: StoreApiService) { @ApiOperation( diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt index cc275f82f4c..8564f459f76 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -27,7 +27,7 @@ import kotlin.collections.Map @Controller @Validated @Api(value = "User", description = "The User API") -@RequestMapping("\${openapi.openAPIPetstore.base-path:/v2}") +@RequestMapping("\${api.base-path:/v2}") class UserApiController(@Autowired(required = true) val service: UserApiService) { @ApiOperation( diff --git a/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml index 366e320d52c..8e2ebcde976 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml +++ b/samples/server/petstore/kotlin-springboot/src/main/resources/application.yaml @@ -1,3 +1,10 @@ -spring.application.name=openAPIPetstore -server.port=8080 -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false \ No newline at end of file +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 From 3cfcf77c888e76889e0174b9921dfa383c897895 Mon Sep 17 00:00:00 2001 From: sunn <33183834+etherealjoy@users.noreply.github.com> Date: Wed, 12 Sep 2018 09:52:00 +0200 Subject: [PATCH 66/74] Improvements for qt5 server (#942) Remove beta tag Supported nested containers Move repetitive code to inline function Fix docker file Fix CMakeLists.txt when building external project --- .../CppQt5QHttpEngineServerCodegen.java | 6 +- .../CMakeLists.txt.mustache | 3 +- .../Dockerfile.mustache | 4 +- .../apirouter.cpp.mustache | 10 +--- .../apirouter.h.mustache | 9 +++ .../model-body.mustache | 10 ++-- .../server/CMakeLists.txt | 3 +- .../server/Dockerfile | 4 +- .../server/src/handlers/OAIApiRouter.cpp | 58 ++++--------------- .../server/src/handlers/OAIApiRouter.h | 9 +++ 10 files changed, 49 insertions(+), 67 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java index 776602bce72..f8e2f760999 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5QHttpEngineServerCodegen.java @@ -125,7 +125,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement // Write defaults namespace in properties so that it can be accessible in templates. // At this point command line has not been parsed so if value is given - // in command line it will superseed this content + // in command line it will supersede this content additionalProperties.put("cppNamespace", cppNamespace); /* @@ -180,7 +180,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement // mapped as "file" type for OAS 3.0 typeMapping.put("ByteArray", "QByteArray"); // UUID support - possible enhancement : use QUuid instead of QString. - // beware though that Serialisation/deserialisation of QUuid does not + // beware though that Serialization/deserialization of QUuid does not // come out of the box and will need to be sorted out (at least imply // modifications on multiple templates) typeMapping.put("UUID", "QString"); @@ -260,7 +260,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement */ @Override public String getHelp() { - return "Generates a Qt5 C++ Server (beta) using the QHTTPEngine HTTP Library."; + return "Generates a Qt5 C++ Server using the QHTTPEngine HTTP Library."; } @Override diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/CMakeLists.txt.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/CMakeLists.txt.mustache index 527b76ca9b4..54e6d36d73f 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/CMakeLists.txt.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/CMakeLists.txt.mustache @@ -7,7 +7,8 @@ set(EXTERNAL_INSTALL_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/external) ExternalProject_Add(QHTTPENGINE GIT_REPOSITORY https://github.com/etherealjoy/qhttpengine.git - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} ) include_directories(${EXTERNAL_INSTALL_LOCATION}/include) diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/Dockerfile.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/Dockerfile.mustache index 2cc6d3eba27..b0c591d10f6 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/Dockerfile.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/Dockerfile.mustache @@ -23,7 +23,7 @@ RUN apk add --update \ openssl WORKDIR /usr/server -COPY --from=build /usr/server/build/src/cpp-qt5-server ./build/src/ +COPY --from=build /usr/server/build/src/cpp-qt5-qhttpengine-server ./build/src/ COPY --from=build /usr/server/external/ ./external EXPOSE 8080/tcp -ENTRYPOINT ["/usr/server/build/src/cpp-qt5-server"] \ No newline at end of file +ENTRYPOINT ["/usr/server/build/src/cpp-qt5-qhttpengine-server"] \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.cpp.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.cpp.mustache index e3ade84f9ab..e6308bb957b 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.cpp.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.cpp.mustache @@ -3,7 +3,7 @@ #include #include #include -#include + #include "{{prefix}}ApiRouter.h" {{#apiInfo}}{{#apis}}{{#operations}}#include "{{classname}}Request.h" @@ -18,7 +18,7 @@ namespace {{this}} { } {{prefix}}ApiRouter::~{{prefix}}ApiRouter(){ - qDebug() << "~ApiRouter()";{{#apiInfo}}{{#apis}} + {{#apiInfo}}{{#apis}} delete {{classname}}ApiHandler;{{/apis}}{{/apiInfo}} } @@ -62,11 +62,7 @@ bool {{prefix}}ApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket * { auto completePath = QString("%1 %2").arg("{{httpMethod}}").arg("{{{basePathWithoutHost}}}{{{path}}}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ {{#pathParams}} QString {{baseName}} = match.captured(QString("{{baseName}}").toLower()); diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.h.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.h.mustache index 5634db060b2..47a787fc8fa 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.h.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirouter.h.mustache @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -76,6 +77,14 @@ private : } return QStringLiteral(""); } + + inline QRegularExpressionMatch getRequestMatch(QString serverTemplatePath, QString requestPath){ + QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); + serverTemplatePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); + serverTemplatePath.append("[\\/]?$"); + QRegularExpression pathExpr( serverTemplatePath ); + return pathExpr.match( requestPath ); + } }; diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/model-body.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/model-body.mustache index 1e298f57b07..9c0de18a32f 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/model-body.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/model-body.mustache @@ -48,17 +48,19 @@ void if(json["{{baseName}}"].isArray()){ auto arr = json["{{baseName}}"].toArray(); for (const QJsonValue & jval : arr) { - {{items.baseType}} item; - {{name}}.push_back(::{{cppNamespace}}::fromJsonValue(item, jval)); + {{^items.isContainer}}{{items.baseType}}{{/items.isContainer}}{{#items.isListContainer}}QList<{{items.items.baseType}}>{{/items.isListContainer}}{{#items.isMapContainer}}QMap{{/items.isMapContainer}} item; + ::{{cppNamespace}}::fromJsonValue(item, jval) + {{name}}.push_back(item); } }{{/isListContainer}}{{#isMapContainer}} if(json["{{baseName}}"].isObject()){ auto varmap = json["{{baseName}}"].toObject().toVariantMap(); if(varmap.count() > 0){ for(auto val : varmap.keys()){ - {{items.baseType}} item; + {{^items.isContainer}}{{items.baseType}}{{/items.isContainer}}{{#items.isListContainer}}QList<{{items.items.baseType}}>{{/items.isListContainer}}{{#items.isMapContainer}}QMap{{/items.isMapContainer}} item; auto jval = QJsonValue::fromVariant(varmap.value(val)); - {{name}}.insert({{name}}.end(), val, ::{{cppNamespace}}::fromJsonValue(item, jval)); + ::{{cppNamespace}}::fromJsonValue(item, jval); + {{name}}.insert({{name}}.end(), val, item); } } }{{/isMapContainer}}{{/items.isContainer}}{{/isContainer}} diff --git a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/CMakeLists.txt b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/CMakeLists.txt index 527b76ca9b4..54e6d36d73f 100644 --- a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/CMakeLists.txt +++ b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/CMakeLists.txt @@ -7,7 +7,8 @@ set(EXTERNAL_INSTALL_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/external) ExternalProject_Add(QHTTPENGINE GIT_REPOSITORY https://github.com/etherealjoy/qhttpengine.git - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} ) include_directories(${EXTERNAL_INSTALL_LOCATION}/include) diff --git a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/Dockerfile b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/Dockerfile index 2cc6d3eba27..b0c591d10f6 100644 --- a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/Dockerfile +++ b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/Dockerfile @@ -23,7 +23,7 @@ RUN apk add --update \ openssl WORKDIR /usr/server -COPY --from=build /usr/server/build/src/cpp-qt5-server ./build/src/ +COPY --from=build /usr/server/build/src/cpp-qt5-qhttpengine-server ./build/src/ COPY --from=build /usr/server/external/ ./external EXPOSE 8080/tcp -ENTRYPOINT ["/usr/server/build/src/cpp-qt5-server"] \ No newline at end of file +ENTRYPOINT ["/usr/server/build/src/cpp-qt5-qhttpengine-server"] \ No newline at end of file diff --git a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.cpp b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.cpp index 2f665944257..c662c60a0e1 100644 --- a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.cpp +++ b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.cpp @@ -14,7 +14,7 @@ #include #include #include -#include + #include "OAIApiRouter.h" #include "OAIPetApiRequest.h" @@ -29,7 +29,7 @@ OAIApiRouter::OAIApiRouter() { } OAIApiRouter::~OAIApiRouter(){ - qDebug() << "~ApiRouter()"; + delete OAIPetApiApiHandler; delete OAIStoreApiApiHandler; delete OAIUserApiApiHandler; @@ -117,11 +117,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/pet/{petId}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString petId = match.captured(QString("petId").toLower()); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); @@ -133,11 +129,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("GET").arg("/v2/pet/{petId}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString petId = match.captured(QString("petId").toLower()); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); @@ -149,11 +141,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("POST").arg("/v2/pet/{petId}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString petId = match.captured(QString("petId").toLower()); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); @@ -165,11 +153,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("POST").arg("/v2/pet/{petId}/uploadImage").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString petId = match.captured(QString("petId").toLower()); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); @@ -181,11 +165,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/store/order/{orderId}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString orderId = match.captured(QString("orderId").toLower()); auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler); @@ -197,11 +177,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("GET").arg("/v2/store/order/{orderId}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString orderId = match.captured(QString("orderId").toLower()); auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler); @@ -213,11 +189,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/user/{username}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString username = match.captured(QString("username").toLower()); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); @@ -229,11 +201,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("GET").arg("/v2/user/{username}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString username = match.captured(QString("username").toLower()); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); @@ -245,11 +213,7 @@ bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket) { auto completePath = QString("%1 %2").arg("PUT").arg("/v2/user/{username}").toLower(); if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) { - QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); - completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); - completePath.append("[\\/]?$"); - QRegularExpression pathExpr( completePath ); - QRegularExpressionMatch match = pathExpr.match( reqPath ); + QRegularExpressionMatch match = getRequestMatch( completePath, reqPath ); if ( match.hasMatch() ){ QString username = match.captured(QString("username").toLower()); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); diff --git a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.h b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.h index 35aedba6a84..573b5052ce6 100644 --- a/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.h +++ b/samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/handlers/OAIApiRouter.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -89,6 +90,14 @@ private : } return QStringLiteral(""); } + + inline QRegularExpressionMatch getRequestMatch(QString serverTemplatePath, QString requestPath){ + QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" ); + serverTemplatePath.replace( parExpr, R"((?<\1>[^\/\s]+))" ); + serverTemplatePath.append("[\\/]?$"); + QRegularExpression pathExpr( serverTemplatePath ); + return pathExpr.match( requestPath ); + } }; From 3d4c3c545bb662e8bc3b666c9e54590e5193460f Mon Sep 17 00:00:00 2001 From: sunn <33183834+etherealjoy@users.noreply.github.com> Date: Wed, 12 Sep 2018 09:53:01 +0200 Subject: [PATCH 67/74] [c++ pistache server] Support basic query handling (#943) Support basic query handling Add helpers for primitive de-serialization Remove warnings due to unneeded commas Deserialize basic types in queries Add dependencies chain for external libraries Fixes wrong parameter passed to API --- .../languages/CppPistacheServerCodegen.java | 20 +++- .../cpp-pistache-server/api-header.mustache | 2 +- .../api-impl-header.mustache | 2 +- .../cpp-pistache-server/api-source.mustache | 11 ++- .../cpp-pistache-server/cmake.mustache | 3 + .../helpers-header.mustache | 64 ++++++++++++ .../helpers-source.mustache | 86 ++++++++++++++++ .../cpp-pistache-server/model-source.mustache | 8 +- .../petstore/cpp-pistache/CMakeLists.txt | 3 + .../petstore/cpp-pistache/api/PetApi.cpp | 20 +++- .../server/petstore/cpp-pistache/api/PetApi.h | 6 +- .../petstore/cpp-pistache/api/StoreApi.cpp | 2 + .../petstore/cpp-pistache/api/StoreApi.h | 2 +- .../petstore/cpp-pistache/api/UserApi.cpp | 20 +++- .../petstore/cpp-pistache/api/UserApi.h | 2 +- .../petstore/cpp-pistache/impl/PetApiImpl.cpp | 4 +- .../petstore/cpp-pistache/impl/PetApiImpl.h | 6 +- .../petstore/cpp-pistache/impl/StoreApiImpl.h | 2 +- .../petstore/cpp-pistache/impl/UserApiImpl.h | 2 +- .../petstore/cpp-pistache/model/Helpers.cpp | 98 +++++++++++++++++++ .../petstore/cpp-pistache/model/Helpers.h | 76 ++++++++++++++ 21 files changed, 413 insertions(+), 26 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-header.mustache create mode 100644 modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-source.mustache create mode 100644 samples/server/petstore/cpp-pistache/model/Helpers.cpp create mode 100644 samples/server/petstore/cpp-pistache/model/Helpers.h diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java index 7f7a4e33b8b..ec069d483af 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java @@ -47,8 +47,10 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { protected boolean isAddExternalLibs = true; public static final String OPTIONAL_EXTERNAL_LIB = "addExternalLibs"; public static final String OPTIONAL_EXTERNAL_LIB_DESC = "Add the Possibility to fetch and compile external Libraries needed by this Framework."; + public static final String HELPERS_PACKAGE_NAME = "helpersPackage"; + public static final String HELPERS_PACKAGE_NAME_DESC = "Specify the package name to be used for the helpers (e.g. org.openapitools.server.helpers)."; protected final String PREFIX = ""; - + protected String helpersPackage = ""; @Override public CodegenType getTag() { return CodegenType.SERVER; @@ -70,6 +72,7 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { modelNamePrefix = PREFIX; } + helpersPackage = "org.openapitools.server.helpers"; apiPackage = "org.openapitools.server.api"; modelPackage = "org.openapitools.server.model"; @@ -86,11 +89,14 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { cliOptions.clear(); addSwitch(OPTIONAL_EXTERNAL_LIB, OPTIONAL_EXTERNAL_LIB_DESC, this.isAddExternalLibs); + addOption(HELPERS_PACKAGE_NAME, HELPERS_PACKAGE_NAME_DESC, this.helpersPackage); reservedWords = new HashSet<>(); supportingFiles.add(new SupportingFile("modelbase-header.mustache", "model", modelNamePrefix + "ModelBase.h")); supportingFiles.add(new SupportingFile("modelbase-source.mustache", "model", modelNamePrefix + "ModelBase.cpp")); + supportingFiles.add(new SupportingFile("helpers-header.mustache", "model", modelNamePrefix + "Helpers.h")); + supportingFiles.add(new SupportingFile("helpers-source.mustache", "model", modelNamePrefix + "Helpers.cpp")); supportingFiles.add(new SupportingFile("cmake.mustache", "", "CMakeLists.txt")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -123,18 +129,26 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { @Override public void processOpts() { super.processOpts(); + if (additionalProperties.containsKey(HELPERS_PACKAGE_NAME)) { + helpersPackage = (String) additionalProperties.get(HELPERS_PACKAGE_NAME); + } if (additionalProperties.containsKey("modelNamePrefix")) { additionalProperties().put("prefix", modelNamePrefix); supportingFiles.clear(); supportingFiles.add(new SupportingFile("modelbase-header.mustache", "model", modelNamePrefix + "ModelBase.h")); supportingFiles.add(new SupportingFile("modelbase-source.mustache", "model", modelNamePrefix + "ModelBase.cpp")); + supportingFiles.add(new SupportingFile("helpers-header.mustache", "model", modelNamePrefix + "Helpers.h")); + supportingFiles.add(new SupportingFile("helpers-source.mustache", "model", modelNamePrefix + "Helpers.cpp")); supportingFiles.add(new SupportingFile("cmake.mustache", "", "CMakeLists.txt")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); } additionalProperties.put("modelNamespaceDeclarations", modelPackage.split("\\.")); additionalProperties.put("modelNamespace", modelPackage.replaceAll("\\.", "::")); additionalProperties.put("apiNamespaceDeclarations", apiPackage.split("\\.")); - additionalProperties.put("apiNamespace", apiPackage.replaceAll("\\.", "::")); + additionalProperties.put("apiNamespace", apiPackage.replaceAll("\\.", "::")); + additionalProperties.put("helpersNamespaceDeclarations", helpersPackage.split("\\.")); + additionalProperties.put("helpersNamespace", helpersPackage.replaceAll("\\.", "::")); + if (additionalProperties.containsKey(OPTIONAL_EXTERNAL_LIB)) { setAddExternalLibs(convertPropertyToBooleanAndWriteBack(OPTIONAL_EXTERNAL_LIB)); } else { @@ -236,7 +250,7 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { if (param.isPrimitiveType) { param.dataType = "Pistache::Optional<" + param.dataType + ">"; } else { - param.dataType = "Pistache::Optional<" + param.baseType + ">"; + param.dataType = "Pistache::Optional<" + param.dataType + ">"; param.baseType = "Pistache::Optional<" + param.baseType + ">"; } } diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-header.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-header.mustache index 9db55ca4bac..7ecc6c48a38 100644 --- a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-header.mustache @@ -29,7 +29,7 @@ using namespace {{modelNamespace}};{{/hasModelImport}} class {{declspec}} {{classname}} { public: {{classname}}(Pistache::Address addr); - virtual ~{{classname}}() {}; + virtual ~{{classname}}() {} void init(size_t thr); void start(); void shutdown(); diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-impl-header.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-impl-header.mustache index 49c274d8fd7..357765cf57f 100644 --- a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-impl-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-impl-header.mustache @@ -32,7 +32,7 @@ using namespace {{modelNamespace}};{{/hasModelImport}} class {{classname}}Impl : public {{apiNamespace}}::{{classname}} { public: {{classname}}Impl(Pistache::Address addr); - ~{{classname}}Impl() { }; + ~{{classname}}Impl() {} {{#operation}} {{#vendorExtensions.x-codegen-pistache-isParsingSupported}} diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-source.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-source.mustache index c40c67eaa74..58104a36223 100644 --- a/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/api-source.mustache @@ -2,11 +2,13 @@ {{#operations}} #include "{{classname}}.h" +#include "{{prefix}}Helpers.h" {{#apiNamespaceDeclarations}} namespace {{this}} { {{/apiNamespaceDeclarations}} +using namespace {{helpersNamespace}}; {{#hasModelImport}} using namespace {{modelNamespace}};{{/hasModelImport}} @@ -62,7 +64,14 @@ void {{classname}}::{{operationIdSnakeCase}}_handler(const Pistache::Rest::Reque {{/hasBodyParam}}{{#hasQueryParams}} // Getting the query params {{#queryParams}} - auto {{paramName}} = request.query().get("{{baseName}}"); + auto {{paramName}}Query = request.query().get("{{baseName}}"); + Pistache::Optional<{{^isContainer}}{{dataType}}{{/isContainer}}{{#isListContainer}}std::vector<{{items.baseType}}>{{/isListContainer}}> {{paramName}}; + if(!{{paramName}}Query.isEmpty()){ + {{^isContainer}}{{dataType}}{{/isContainer}}{{#isListContainer}}std::vector<{{items.baseType}}>{{/isListContainer}} value; + if(fromStringValue({{paramName}}Query.get(), value)){ + {{paramName}} = Pistache::Some(value); + } + } {{/queryParams}} {{/hasQueryParams}}{{#hasHeaderParams}} // Getting the header params diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/cmake.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/cmake.mustache index bec55299241..11c7a5c3c52 100644 --- a/modules/openapi-generator/src/main/resources/cpp-pistache-server/cmake.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/cmake.mustache @@ -56,6 +56,9 @@ set(<%classnameSnakeUpperCase%>_SERVER_SOURCES <%#operations%> add_executable(<%classnameSnakeLowerCase%>_server ${<%classnameSnakeUpperCase%>_SERVER_SOURCES}) +<%#addExternalLibs%> +add_dependencies(<%classnameSnakeLowerCase%>_server PISTACHE NLOHMANN) +<%/addExternalLibs%> <%/operations%> <%/apiInfo.apis%> diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-header.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-header.mustache new file mode 100644 index 00000000000..c39cca04fe1 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-header.mustache @@ -0,0 +1,64 @@ +{{>licenseInfo}} +/* + * {{prefix}}Helpers.h + * + * This is the helper class for models and primitives + */ + +#ifndef {{prefix}}Helpers_H_ +#define {{prefix}}Helpers_H_ + +#include +#include +#include +#include +#include + +{{#helpersNamespaceDeclarations}} +namespace {{this}} { +{{/helpersNamespaceDeclarations}} + + std::string toStringValue(const std::string &value); + std::string toStringValue(const int32_t &value); + std::string toStringValue(const int64_t &value); + std::string toStringValue(const bool &value); + std::string toStringValue(const float &value); + std::string toStringValue(const double &value); + + bool fromStringValue(const std::string &inStr, std::string &value); + bool fromStringValue(const std::string &inStr, int32_t &value); + bool fromStringValue(const std::string &inStr, int64_t &value); + bool fromStringValue(const std::string &inStr, bool &value); + bool fromStringValue(const std::string &inStr, float &value); + bool fromStringValue(const std::string &inStr, double &value); + template + bool fromStringValue(const std::vector &inStr, std::vector &value){ + try{ + for(auto & item : inStr){ + T itemValue; + if(fromStringValue(item, itemValue)){ + value.push_back(itemValue); + } + } + } + catch(...){ + return false; + } + return value.size() > 0; + } + template + bool fromStringValue(const std::string &inStr, std::vector &value, char separator = ','){ + std::vector inStrings; + std::istringstream f(inStr); + std::string s; + while (std::getline(f, s, separator)) { + inStrings.push_back(s); + } + return fromStringValue(inStrings, value); + } + +{{#helpersNamespaceDeclarations}} +} +{{/helpersNamespaceDeclarations}} + +#endif // {{prefix}}Helpers_H_ \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-source.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-source.mustache new file mode 100644 index 00000000000..f08981eff5a --- /dev/null +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/helpers-source.mustache @@ -0,0 +1,86 @@ +{{>licenseInfo}} +#include "{{prefix}}Helpers.h" + +{{#helpersNamespaceDeclarations}} +namespace {{this}} { +{{/helpersNamespaceDeclarations}} + + +std::string toStringValue(const std::string &value){ + return std::string(value); +} + +std::string toStringValue(const int32_t &value){ + return std::to_string(value); +} + +std::string toStringValue(const int64_t &value){ + return std::to_string(value); +} + +std::string toStringValue(const bool &value){ + return value?std::string("true"):std::string("false"); +} + +std::string toStringValue(const float &value){ + return std::to_string(value); +} + +std::string toStringValue(const double &value){ + return std::to_string(value); +} + +bool fromStringValue(const std::string &inStr, std::string &value){ + value = std::string(inStr); + return true; +} + +bool fromStringValue(const std::string &inStr, int32_t &value){ + try { + value = std::stoi( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, int64_t &value){ + try { + value = std::stol( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, bool &value){ + bool result = true; + inStr == "true"?value = true: inStr == "false"?value = false: result = false; + return result; +} + +bool fromStringValue(const std::string &inStr, float &value){ + try { + value = std::stof( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, double &value){ + try { + value = std::stod( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +{{#helpersNamespaceDeclarations}} +} +{{/helpersNamespaceDeclarations}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/cpp-pistache-server/model-source.mustache b/modules/openapi-generator/src/main/resources/cpp-pistache-server/model-source.mustache index 9c60bbbaae0..41d64dcf75d 100644 --- a/modules/openapi-generator/src/main/resources/cpp-pistache-server/model-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-pistache-server/model-source.mustache @@ -95,15 +95,15 @@ void {{classname}}::fromJson(nlohmann::json& val) } {{/isListContainer}}{{^isListContainer}}{{^isPrimitiveType}}{{^required}}if(val.find("{{baseName}}") != val.end()) { - {{#isString}}{{setter}}(val.at("{{baseName}}"));{{/isString}}{{#isByteArray}}{{setter}}(val.at("{{baseName}}")); - {{/isByteArray}}{{^isString}}{{#isDateTime}}{{setter}}(val.at("{{baseName}}")); - {{/isDateTime}}{{^isDateTime}}{{^isByteArray}}if(!val["{{baseName}}"].is_null()) + {{#isString}}{{setter}}(val.at("{{baseName}}"));{{/isString}}{{#isByteArray}}{{setter}}(val.at("{{baseName}}"));{{/isByteArray}}{{#isBinary}}{{setter}}(val.at("{{baseName}}")); + {{/isBinary}}{{^isString}}{{#isDateTime}}{{setter}}(val.at("{{baseName}}")); + {{/isDateTime}}{{^isDateTime}}{{^isByteArray}}{{^isBinary}}if(!val["{{baseName}}"].is_null()) { {{{dataType}}} newItem; newItem.fromJson(val["{{baseName}}"]); {{setter}}( newItem ); } - {{/isByteArray}}{{/isDateTime}}{{/isString}} + {{/isBinary}}{{/isByteArray}}{{/isDateTime}}{{/isString}} } {{/required}}{{#required}}{{#isString}}{{setter}}(val.at("{{baseName}}")); {{/isString}}{{^isString}}{{#isDateTime}}{{setter}}(val.at("{{baseName}}")); diff --git a/samples/server/petstore/cpp-pistache/CMakeLists.txt b/samples/server/petstore/cpp-pistache/CMakeLists.txt index 0a0cf93a9f3..f355231cf2d 100644 --- a/samples/server/petstore/cpp-pistache/CMakeLists.txt +++ b/samples/server/petstore/cpp-pistache/CMakeLists.txt @@ -63,10 +63,13 @@ UserApiMainServer.cpp add_executable(pet_api_server ${PET_API_SERVER_SOURCES}) +add_dependencies(pet_api_server PISTACHE NLOHMANN) add_executable(store_api_server ${STORE_API_SERVER_SOURCES}) +add_dependencies(store_api_server PISTACHE NLOHMANN) add_executable(user_api_server ${USER_API_SERVER_SOURCES}) +add_dependencies(user_api_server PISTACHE NLOHMANN) target_link_libraries(pet_api_server pistache pthread) target_link_libraries(store_api_server pistache pthread) diff --git a/samples/server/petstore/cpp-pistache/api/PetApi.cpp b/samples/server/petstore/cpp-pistache/api/PetApi.cpp index 5aa08b532fc..df764048389 100644 --- a/samples/server/petstore/cpp-pistache/api/PetApi.cpp +++ b/samples/server/petstore/cpp-pistache/api/PetApi.cpp @@ -11,12 +11,14 @@ */ #include "PetApi.h" +#include "Helpers.h" namespace org { namespace openapitools { namespace server { namespace api { +using namespace org::openapitools::server::helpers; using namespace org::openapitools::server::model; PetApi::PetApi(Pistache::Address addr) @@ -94,7 +96,14 @@ void PetApi::delete_pet_handler(const Pistache::Rest::Request &request, Pistache void PetApi::find_pets_by_status_handler(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter response) { // Getting the query params - auto status = request.query().get("status"); + auto statusQuery = request.query().get("status"); + Pistache::Optional> status; + if(!statusQuery.isEmpty()){ + std::vector value; + if(fromStringValue(statusQuery.get(), value)){ + status = Pistache::Some(value); + } + } try { this->find_pets_by_status(status, response); @@ -108,7 +117,14 @@ void PetApi::find_pets_by_status_handler(const Pistache::Rest::Request &request, void PetApi::find_pets_by_tags_handler(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter response) { // Getting the query params - auto tags = request.query().get("tags"); + auto tagsQuery = request.query().get("tags"); + Pistache::Optional> tags; + if(!tagsQuery.isEmpty()){ + std::vector value; + if(fromStringValue(tagsQuery.get(), value)){ + tags = Pistache::Some(value); + } + } try { this->find_pets_by_tags(tags, response); diff --git a/samples/server/petstore/cpp-pistache/api/PetApi.h b/samples/server/petstore/cpp-pistache/api/PetApi.h index 1e688417ee9..db76fa2654e 100644 --- a/samples/server/petstore/cpp-pistache/api/PetApi.h +++ b/samples/server/petstore/cpp-pistache/api/PetApi.h @@ -40,7 +40,7 @@ using namespace org::openapitools::server::model; class PetApi { public: PetApi(Pistache::Address addr); - virtual ~PetApi() {}; + virtual ~PetApi() {} void init(size_t thr); void start(); void shutdown(); @@ -90,7 +90,7 @@ private: /// Multiple status values can be provided with comma separated strings /// /// Status values that need to be considered for filter - virtual void find_pets_by_status(const Pistache::Optional &status, Pistache::Http::ResponseWriter &response) = 0; + virtual void find_pets_by_status(const Pistache::Optional> &status, Pistache::Http::ResponseWriter &response) = 0; /// /// Finds Pets by tags @@ -99,7 +99,7 @@ private: /// Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - virtual void find_pets_by_tags(const Pistache::Optional &tags, Pistache::Http::ResponseWriter &response) = 0; + virtual void find_pets_by_tags(const Pistache::Optional> &tags, Pistache::Http::ResponseWriter &response) = 0; /// /// Find pet by ID diff --git a/samples/server/petstore/cpp-pistache/api/StoreApi.cpp b/samples/server/petstore/cpp-pistache/api/StoreApi.cpp index fb17690e38f..8097ca8f2f1 100644 --- a/samples/server/petstore/cpp-pistache/api/StoreApi.cpp +++ b/samples/server/petstore/cpp-pistache/api/StoreApi.cpp @@ -11,12 +11,14 @@ */ #include "StoreApi.h" +#include "Helpers.h" namespace org { namespace openapitools { namespace server { namespace api { +using namespace org::openapitools::server::helpers; using namespace org::openapitools::server::model; StoreApi::StoreApi(Pistache::Address addr) diff --git a/samples/server/petstore/cpp-pistache/api/StoreApi.h b/samples/server/petstore/cpp-pistache/api/StoreApi.h index e4491a771b4..b5625112db5 100644 --- a/samples/server/petstore/cpp-pistache/api/StoreApi.h +++ b/samples/server/petstore/cpp-pistache/api/StoreApi.h @@ -40,7 +40,7 @@ using namespace org::openapitools::server::model; class StoreApi { public: StoreApi(Pistache::Address addr); - virtual ~StoreApi() {}; + virtual ~StoreApi() {} void init(size_t thr); void start(); void shutdown(); diff --git a/samples/server/petstore/cpp-pistache/api/UserApi.cpp b/samples/server/petstore/cpp-pistache/api/UserApi.cpp index 45720407e08..13b70d9215a 100644 --- a/samples/server/petstore/cpp-pistache/api/UserApi.cpp +++ b/samples/server/petstore/cpp-pistache/api/UserApi.cpp @@ -11,12 +11,14 @@ */ #include "UserApi.h" +#include "Helpers.h" namespace org { namespace openapitools { namespace server { namespace api { +using namespace org::openapitools::server::helpers; using namespace org::openapitools::server::model; UserApi::UserApi(Pistache::Address addr) @@ -136,8 +138,22 @@ void UserApi::get_user_by_name_handler(const Pistache::Rest::Request &request, P void UserApi::login_user_handler(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter response) { // Getting the query params - auto username = request.query().get("username"); - auto password = request.query().get("password"); + auto usernameQuery = request.query().get("username"); + Pistache::Optional username; + if(!usernameQuery.isEmpty()){ + std::string value; + if(fromStringValue(usernameQuery.get(), value)){ + username = Pistache::Some(value); + } + } + auto passwordQuery = request.query().get("password"); + Pistache::Optional password; + if(!passwordQuery.isEmpty()){ + std::string value; + if(fromStringValue(passwordQuery.get(), value)){ + password = Pistache::Some(value); + } + } try { this->login_user(username, password, response); diff --git a/samples/server/petstore/cpp-pistache/api/UserApi.h b/samples/server/petstore/cpp-pistache/api/UserApi.h index 5cb7fb0a35a..aebd1a97ac7 100644 --- a/samples/server/petstore/cpp-pistache/api/UserApi.h +++ b/samples/server/petstore/cpp-pistache/api/UserApi.h @@ -40,7 +40,7 @@ using namespace org::openapitools::server::model; class UserApi { public: UserApi(Pistache::Address addr); - virtual ~UserApi() {}; + virtual ~UserApi() {} void init(size_t thr); void start(); void shutdown(); diff --git a/samples/server/petstore/cpp-pistache/impl/PetApiImpl.cpp b/samples/server/petstore/cpp-pistache/impl/PetApiImpl.cpp index a180ed772c5..111441543c1 100644 --- a/samples/server/petstore/cpp-pistache/impl/PetApiImpl.cpp +++ b/samples/server/petstore/cpp-pistache/impl/PetApiImpl.cpp @@ -29,10 +29,10 @@ void PetApiImpl::add_pet(const Pet &pet, Pistache::Http::ResponseWriter &respons void PetApiImpl::delete_pet(const int64_t &petId, const Pistache::Optional &apiKey, Pistache::Http::ResponseWriter &response) { response.send(Pistache::Http::Code::Ok, "Do some magic\n"); } -void PetApiImpl::find_pets_by_status(const Pistache::Optional &status, Pistache::Http::ResponseWriter &response) { +void PetApiImpl::find_pets_by_status(const Pistache::Optional> &status, Pistache::Http::ResponseWriter &response) { response.send(Pistache::Http::Code::Ok, "Do some magic\n"); } -void PetApiImpl::find_pets_by_tags(const Pistache::Optional &tags, Pistache::Http::ResponseWriter &response) { +void PetApiImpl::find_pets_by_tags(const Pistache::Optional> &tags, Pistache::Http::ResponseWriter &response) { response.send(Pistache::Http::Code::Ok, "Do some magic\n"); } void PetApiImpl::get_pet_by_id(const int64_t &petId, Pistache::Http::ResponseWriter &response) { diff --git a/samples/server/petstore/cpp-pistache/impl/PetApiImpl.h b/samples/server/petstore/cpp-pistache/impl/PetApiImpl.h index d903d0b6132..63f72a254ae 100644 --- a/samples/server/petstore/cpp-pistache/impl/PetApiImpl.h +++ b/samples/server/petstore/cpp-pistache/impl/PetApiImpl.h @@ -43,12 +43,12 @@ using namespace org::openapitools::server::model; class PetApiImpl : public org::openapitools::server::api::PetApi { public: PetApiImpl(Pistache::Address addr); - ~PetApiImpl() { }; + ~PetApiImpl() {} void add_pet(const Pet &pet, Pistache::Http::ResponseWriter &response); void delete_pet(const int64_t &petId, const Pistache::Optional &apiKey, Pistache::Http::ResponseWriter &response); - void find_pets_by_status(const Pistache::Optional &status, Pistache::Http::ResponseWriter &response); - void find_pets_by_tags(const Pistache::Optional &tags, Pistache::Http::ResponseWriter &response); + void find_pets_by_status(const Pistache::Optional> &status, Pistache::Http::ResponseWriter &response); + void find_pets_by_tags(const Pistache::Optional> &tags, Pistache::Http::ResponseWriter &response); void get_pet_by_id(const int64_t &petId, Pistache::Http::ResponseWriter &response); void update_pet(const Pet &pet, Pistache::Http::ResponseWriter &response); void update_pet_with_form(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter &response); diff --git a/samples/server/petstore/cpp-pistache/impl/StoreApiImpl.h b/samples/server/petstore/cpp-pistache/impl/StoreApiImpl.h index 8c18fff0027..8109a2c1392 100644 --- a/samples/server/petstore/cpp-pistache/impl/StoreApiImpl.h +++ b/samples/server/petstore/cpp-pistache/impl/StoreApiImpl.h @@ -43,7 +43,7 @@ using namespace org::openapitools::server::model; class StoreApiImpl : public org::openapitools::server::api::StoreApi { public: StoreApiImpl(Pistache::Address addr); - ~StoreApiImpl() { }; + ~StoreApiImpl() {} void delete_order(const std::string &orderId, Pistache::Http::ResponseWriter &response); void get_inventory(Pistache::Http::ResponseWriter &response); diff --git a/samples/server/petstore/cpp-pistache/impl/UserApiImpl.h b/samples/server/petstore/cpp-pistache/impl/UserApiImpl.h index 8da0e1277af..98cb593e694 100644 --- a/samples/server/petstore/cpp-pistache/impl/UserApiImpl.h +++ b/samples/server/petstore/cpp-pistache/impl/UserApiImpl.h @@ -43,7 +43,7 @@ using namespace org::openapitools::server::model; class UserApiImpl : public org::openapitools::server::api::UserApi { public: UserApiImpl(Pistache::Address addr); - ~UserApiImpl() { }; + ~UserApiImpl() {} void create_user(const User &user, Pistache::Http::ResponseWriter &response); void create_users_with_array_input(const std::vector &user, Pistache::Http::ResponseWriter &response); diff --git a/samples/server/petstore/cpp-pistache/model/Helpers.cpp b/samples/server/petstore/cpp-pistache/model/Helpers.cpp new file mode 100644 index 00000000000..8c0e859b642 --- /dev/null +++ b/samples/server/petstore/cpp-pistache/model/Helpers.cpp @@ -0,0 +1,98 @@ +/** +* OpenAPI Petstore +* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. +* +* OpenAPI spec version: 1.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +#include "Helpers.h" + +namespace org { +namespace openapitools { +namespace server { +namespace helpers { + + +std::string toStringValue(const std::string &value){ + return std::string(value); +} + +std::string toStringValue(const int32_t &value){ + return std::to_string(value); +} + +std::string toStringValue(const int64_t &value){ + return std::to_string(value); +} + +std::string toStringValue(const bool &value){ + return value?std::string("true"):std::string("false"); +} + +std::string toStringValue(const float &value){ + return std::to_string(value); +} + +std::string toStringValue(const double &value){ + return std::to_string(value); +} + +bool fromStringValue(const std::string &inStr, std::string &value){ + value = std::string(inStr); + return true; +} + +bool fromStringValue(const std::string &inStr, int32_t &value){ + try { + value = std::stoi( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, int64_t &value){ + try { + value = std::stol( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, bool &value){ + bool result = true; + inStr == "true"?value = true: inStr == "false"?value = false: result = false; + return result; +} + +bool fromStringValue(const std::string &inStr, float &value){ + try { + value = std::stof( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +bool fromStringValue(const std::string &inStr, double &value){ + try { + value = std::stod( inStr ); + } + catch (const std::invalid_argument) { + return false; + } + return true; +} + +} +} +} +} diff --git a/samples/server/petstore/cpp-pistache/model/Helpers.h b/samples/server/petstore/cpp-pistache/model/Helpers.h new file mode 100644 index 00000000000..8c62ecda5a0 --- /dev/null +++ b/samples/server/petstore/cpp-pistache/model/Helpers.h @@ -0,0 +1,76 @@ +/** +* OpenAPI Petstore +* This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. +* +* OpenAPI spec version: 1.0.0 +* +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +/* + * Helpers.h + * + * This is the helper class for models and primitives + */ + +#ifndef Helpers_H_ +#define Helpers_H_ + +#include +#include +#include +#include +#include + +namespace org { +namespace openapitools { +namespace server { +namespace helpers { + + std::string toStringValue(const std::string &value); + std::string toStringValue(const int32_t &value); + std::string toStringValue(const int64_t &value); + std::string toStringValue(const bool &value); + std::string toStringValue(const float &value); + std::string toStringValue(const double &value); + + bool fromStringValue(const std::string &inStr, std::string &value); + bool fromStringValue(const std::string &inStr, int32_t &value); + bool fromStringValue(const std::string &inStr, int64_t &value); + bool fromStringValue(const std::string &inStr, bool &value); + bool fromStringValue(const std::string &inStr, float &value); + bool fromStringValue(const std::string &inStr, double &value); + template + bool fromStringValue(const std::vector &inStr, std::vector &value){ + try{ + for(auto & item : inStr){ + T itemValue; + if(fromStringValue(item, itemValue)){ + value.push_back(itemValue); + } + } + } + catch(...){ + return false; + } + return value.size() > 0; + } + template + bool fromStringValue(const std::string &inStr, std::vector &value, char separator = ','){ + std::vector inStrings; + std::istringstream f(inStr); + std::string s; + while (std::getline(f, s, separator)) { + inStrings.push_back(s); + } + return fromStringValue(inStrings, value); + } + +} +} +} +} + +#endif // Helpers_H_ \ No newline at end of file From 59ad12183fb1f760987bbac97b9fe476d58ec617 Mon Sep 17 00:00:00 2001 From: Sean Farrow Date: Wed, 12 Sep 2018 11:42:16 +0100 Subject: [PATCH 68/74] Update the Asp.Net core server generator to support Asp.net Core 2.1 (#1008) * Update the .net core sdk to v2.1 and update the asp.net packages used. * Upgrade the SwashBuckle Asp.Net Core package to v3.0.0. * Update the AppSettings json file and add a file used in development. Also, remove the web.config file. * Update the program template to use the web host builder class. * Update the startup class to use the Asp.Net 2.1 paradigms. * Update the launch settings json file. * Update the controller template to derive from the ControllerBase class as aposed to Controller. * Add the SwashBuckle annotations package. * Add the SwashBuckle.AspNetCore.Annotations namespace to the controller template. * Update the Startup template to add comments to the Configuration property and an env parameter to the Configure method. * Update the startup class so we don't need to inject the hosting environment. * Update the program class to have hte recommended CreateWebHostBuilder method from asp.net core 2.1. * Update the asp.net core pet store sample server. * add back aspnetcore 2.0 template via option * remove web.config for aspnet core 2.1 --- .../languages/AspNetCoreServerCodegen.java | 46 +++- .../aspnetcore/{ => 2.0}/Dockerfile.mustache | 0 .../{ => 2.0}/Filters/BasePathFilter.mustache | 0 ...eneratePathParamsValidationFilter.mustache | 0 .../aspnetcore/{ => 2.0}/Program.mustache | 0 .../{ => 2.0}/Project.csproj.mustache | 0 .../{ => 2.0}/Properties/launchSettings.json | 0 .../aspnetcore/{ => 2.0}/README.mustache | 0 .../aspnetcore/{ => 2.0}/Solution.mustache | 0 .../aspnetcore/{ => 2.0}/Startup.mustache | 0 .../aspnetcore/{ => 2.0}/appsettings.json | 0 .../aspnetcore/{ => 2.0}/bodyParam.mustache | 0 .../aspnetcore/{ => 2.0}/build.bat.mustache | 0 .../aspnetcore/{ => 2.0}/build.sh.mustache | 0 .../aspnetcore/{ => 2.0}/controller.mustache | 0 .../aspnetcore/{ => 2.0}/enumClass.mustache | 0 .../aspnetcore/{ => 2.0}/formParam.mustache | 0 .../resources/aspnetcore/{ => 2.0}/gitignore | 0 .../aspnetcore/{ => 2.0}/headerParam.mustache | 0 .../aspnetcore/{ => 2.0}/listReturn.mustache | 0 .../aspnetcore/{ => 2.0}/mapReturn.mustache | 0 .../aspnetcore/{ => 2.0}/model.mustache | 0 .../{ => 2.0}/objectReturn.mustache | 0 .../{ => 2.0}/partial_header.mustache | 0 .../aspnetcore/{ => 2.0}/pathParam.mustache | 0 .../aspnetcore/{ => 2.0}/queryParam.mustache | 0 .../aspnetcore/{ => 2.0}/tags.mustache | 0 .../{ => 2.0}/validateModel.mustache | 0 .../resources/aspnetcore/{ => 2.0}/web.config | 0 .../aspnetcore/{ => 2.0}/wwwroot/README.md | 0 .../aspnetcore/{ => 2.0}/wwwroot/index.html | 0 .../wwwroot/openapi-original.mustache | 0 .../aspnetcore/{ => 2.0}/wwwroot/web.config | 0 .../aspnetcore/2.1/Dockerfile.mustache | 18 ++ .../2.1/Filters/BasePathFilter.mustache | 50 +++++ ...eneratePathParamsValidationFilter.mustache | 97 ++++++++ .../resources/aspnetcore/2.1/Program.mustache | 30 +++ .../aspnetcore/2.1/Project.csproj.mustache | 21 ++ .../2.1/Properties/launchSettings.json | 30 +++ .../resources/aspnetcore/2.1/README.mustache | 27 +++ .../aspnetcore/2.1/Solution.mustache | 22 ++ .../resources/aspnetcore/2.1/Startup.mustache | 120 ++++++++++ .../2.1/appsettings.Development.json | 9 + .../resources/aspnetcore/2.1/appsettings.json | 8 + .../aspnetcore/2.1/bodyParam.mustache | 1 + .../aspnetcore/2.1/build.bat.mustache | 9 + .../aspnetcore/2.1/build.sh.mustache | 8 + .../aspnetcore/2.1/controller.mustache | 55 +++++ .../aspnetcore/2.1/enumClass.mustache | 18 ++ .../aspnetcore/2.1/formParam.mustache | 1 + .../main/resources/aspnetcore/2.1/gitignore | 208 ++++++++++++++++++ .../aspnetcore/2.1/headerParam.mustache | 1 + .../aspnetcore/2.1/listReturn.mustache | 4 + .../aspnetcore/2.1/mapReturn.mustache | 4 + .../resources/aspnetcore/2.1/model.mustache | 136 ++++++++++++ .../aspnetcore/2.1/objectReturn.mustache | 4 + .../aspnetcore/2.1/partial_header.mustache | 13 ++ .../aspnetcore/2.1/pathParam.mustache | 1 + .../aspnetcore/2.1/queryParam.mustache | 1 + .../resources/aspnetcore/2.1/tags.mustache | 1 + .../aspnetcore/2.1/validateModel.mustache | 61 +++++ .../aspnetcore/2.1/wwwroot/README.md | 42 ++++ .../aspnetcore/2.1/wwwroot/index.html | 1 + .../2.1/wwwroot/openapi-original.mustache | 1 + .../aspnetcore/2.1/wwwroot/web.config | 9 + .../aspnetcore/.openapi-generator/VERSION | 2 +- .../Org.OpenAPITools/Controllers/PetApi.cs | 3 +- .../Org.OpenAPITools/Controllers/StoreApi.cs | 3 +- .../Org.OpenAPITools/Controllers/UserApi.cs | 3 +- .../Org.OpenAPITools/Org.OpenAPITools.csproj | 9 +- .../src/Org.OpenAPITools/Program.cs | 15 +- .../Properties/launchSettings.json | 18 +- .../src/Org.OpenAPITools/Startup.cs | 27 ++- .../src/Org.OpenAPITools/appsettings.json | 8 +- .../wwwroot/openapi-original.json | 2 + 75 files changed, 1098 insertions(+), 49 deletions(-) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Dockerfile.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Filters/BasePathFilter.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Filters/GeneratePathParamsValidationFilter.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Program.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Project.csproj.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Properties/launchSettings.json (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/README.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Solution.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/Startup.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/appsettings.json (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/bodyParam.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/build.bat.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/build.sh.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/controller.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/enumClass.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/formParam.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/gitignore (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/headerParam.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/listReturn.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/mapReturn.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/model.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/objectReturn.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/partial_header.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/pathParam.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/queryParam.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/tags.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/validateModel.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/web.config (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/wwwroot/README.md (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/wwwroot/index.html (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/wwwroot/openapi-original.mustache (100%) rename modules/openapi-generator/src/main/resources/aspnetcore/{ => 2.0}/wwwroot/web.config (100%) create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Dockerfile.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/BasePathFilter.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/GeneratePathParamsValidationFilter.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Program.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Project.csproj.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Properties/launchSettings.json create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/README.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Solution.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/Startup.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.Development.json create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.json create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/bodyParam.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.bat.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.sh.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/controller.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/formParam.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/gitignore create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/headerParam.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/listReturn.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/mapReturn.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/objectReturn.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/partial_header.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/pathParam.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/queryParam.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/tags.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/validateModel.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/README.md create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/index.html create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/openapi-original.mustache create mode 100644 modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/web.config diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java index 2ae16f32581..fe873112901 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AspNetCoreServerCodegen.java @@ -28,6 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.lang.IllegalArgumentException; import java.net.URL; import java.util.Arrays; import java.util.Locale; @@ -38,6 +39,7 @@ import static java.util.UUID.randomUUID; public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { public static final String USE_SWASHBUCKLE = "useSwashbuckle"; + public static final String ASPNET_CORE_VERSION = "aspnetCoreVersion"; private String packageGuid = "{" + randomUUID().toString().toUpperCase(Locale.ROOT) + "}"; @@ -47,7 +49,7 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { private boolean useSwashbuckle = true; protected int serverPort = 8080; protected String serverHost = "0.0.0.0"; - + protected String aspnetCoreVersion= "2.1"; // default to 2.1 public AspNetCoreServerCodegen() { super(); @@ -57,6 +59,8 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { modelTemplateFiles.put("model.mustache", ".cs"); apiTemplateFiles.put("controller.mustache", ".cs"); + embeddedTemplateDir = templateDir = "aspnetcore/2.1"; + // contextually reserved words // NOTE: C# uses camel cased reserved words, while models are title cased. We don't want lowercase comparisons. reservedWords.addAll( @@ -82,6 +86,10 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { CodegenConstants.SOURCE_FOLDER_DESC, sourceFolder); + addOption(ASPNET_CORE_VERSION, + "ASP.NET Core version: 2.1 (default), 2.0 (deprecated)", + aspnetCoreVersion); + // CLI Switches addSwitch(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, @@ -102,6 +110,7 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { addSwitch(USE_SWASHBUCKLE, "Uses the Swashbuckle.AspNetCore NuGet package for documentation.", useSwashbuckle); + } @Override @@ -118,6 +127,7 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { public String getHelp() { return "Generates an ASP.NET Core Web API server."; } + @Override public void preprocessOpenAPI(OpenAPI openAPI) { super.preprocessOpenAPI(openAPI); @@ -141,6 +151,11 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { additionalProperties.put(USE_SWASHBUCKLE, useSwashbuckle); } + // determine the ASP.NET core version setting + if (additionalProperties.containsKey(ASPNET_CORE_VERSION)) { + setAspnetCoreVersion((String) additionalProperties.get(ASPNET_CORE_VERSION)); + } + additionalProperties.put("dockerTag", packageName.toLowerCase(Locale.ROOT)); apiPackage = packageName + ".Controllers"; @@ -148,6 +163,17 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { String packageFolder = sourceFolder + File.separator + packageName; + if ("2.0".equals(aspnetCoreVersion)) { + embeddedTemplateDir = templateDir = "aspnetcore/2.0"; + supportingFiles.add(new SupportingFile("web.config", packageFolder, "web.config")); + LOGGER.info("ASP.NET core version: 2.0"); + } else if ("2.1".equals(aspnetCoreVersion)) { + // default, do nothing + LOGGER.info("ASP.NET core version: 2.1"); + } else { + throw new IllegalArgumentException("aspnetCoreVersion must be '2.1', '2.0' but found " + aspnetCoreVersion); + } + supportingFiles.add(new SupportingFile("build.sh.mustache", "", "build.sh")); supportingFiles.add(new SupportingFile("build.bat.mustache", "", "build.bat")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -159,28 +185,34 @@ public class AspNetCoreServerCodegen extends AbstractCSharpCodegen { supportingFiles.add(new SupportingFile("Startup.mustache", packageFolder, "Startup.cs")); supportingFiles.add(new SupportingFile("Program.mustache", packageFolder, "Program.cs")); supportingFiles.add(new SupportingFile("validateModel.mustache", packageFolder + File.separator + "Attributes", "ValidateModelStateAttribute.cs")); - supportingFiles.add(new SupportingFile("web.config", packageFolder, "web.config")); - supportingFiles.add(new SupportingFile("Project.csproj.mustache", packageFolder, packageName + ".csproj")); - supportingFiles.add(new SupportingFile("Properties" + File.separator + "launchSettings.json", packageFolder + File.separator + "Properties", "launchSettings.json")); + supportingFiles.add(new SupportingFile("Properties" + File.separator + "launchSettings.json", + packageFolder + File.separator + "Properties", "launchSettings.json")); if (useSwashbuckle) { - supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache", packageFolder + File.separator + "Filters", "BasePathFilter.cs")); - supportingFiles.add(new SupportingFile("Filters" + File.separator + "GeneratePathParamsValidationFilter.mustache", packageFolder + File.separator + "Filters", "GeneratePathParamsValidationFilter.cs")); + supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache", + packageFolder + File.separator + "Filters", "BasePathFilter.cs")); + supportingFiles.add(new SupportingFile("Filters" + File.separator + "GeneratePathParamsValidationFilter.mustache", + packageFolder + File.separator + "Filters", "GeneratePathParamsValidationFilter.cs")); } supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "README.md", packageFolder + File.separator + "wwwroot", "README.md")); supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "index.html", packageFolder + File.separator + "wwwroot", "index.html")); supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "web.config", packageFolder + File.separator + "wwwroot", "web.config")); - supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "openapi-original.mustache", packageFolder + File.separator + "wwwroot", "openapi-original.json")); + supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "openapi-original.mustache", + packageFolder + File.separator + "wwwroot", "openapi-original.json")); } public void setPackageGuid(String packageGuid) { this.packageGuid = packageGuid; } + public void setAspnetCoreVersion(String aspnetCoreVersion) { + this.aspnetCoreVersion= aspnetCoreVersion; + } + @Override public String apiFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + packageName + File.separator + "Controllers"; diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Dockerfile.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Dockerfile.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Dockerfile.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Dockerfile.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Filters/BasePathFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Filters/BasePathFilter.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Filters/BasePathFilter.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Filters/BasePathFilter.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Filters/GeneratePathParamsValidationFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Filters/GeneratePathParamsValidationFilter.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Filters/GeneratePathParamsValidationFilter.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Filters/GeneratePathParamsValidationFilter.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Program.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Program.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Program.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Program.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Project.csproj.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Project.csproj.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Project.csproj.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Project.csproj.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Properties/launchSettings.json b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Properties/launchSettings.json similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Properties/launchSettings.json rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Properties/launchSettings.json diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/README.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/README.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/README.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/README.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Solution.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Solution.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Solution.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Solution.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/Startup.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/Startup.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/Startup.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/Startup.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/appsettings.json b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/appsettings.json similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/appsettings.json rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/appsettings.json diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/bodyParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/bodyParam.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/bodyParam.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/bodyParam.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/build.bat.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/build.bat.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/build.bat.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/build.bat.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/build.sh.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/build.sh.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/build.sh.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/build.sh.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/controller.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/controller.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/controller.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/controller.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/enumClass.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/enumClass.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/formParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/formParam.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/formParam.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/formParam.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/gitignore b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/gitignore similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/gitignore rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/gitignore diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/headerParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/headerParam.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/headerParam.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/headerParam.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/listReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/listReturn.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/listReturn.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/listReturn.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/mapReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/mapReturn.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/mapReturn.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/mapReturn.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/model.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/model.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/model.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/model.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/objectReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/objectReturn.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/objectReturn.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/objectReturn.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/partial_header.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/partial_header.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/partial_header.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/partial_header.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/pathParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/pathParam.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/pathParam.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/pathParam.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/queryParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/queryParam.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/queryParam.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/queryParam.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/tags.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/tags.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/tags.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/tags.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/validateModel.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/validateModel.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/validateModel.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/validateModel.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/web.config b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/web.config similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/web.config rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/web.config diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/README.md b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/README.md similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/README.md rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/README.md diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/index.html b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/index.html similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/index.html rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/index.html diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/openapi-original.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/openapi-original.mustache similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/openapi-original.mustache rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/openapi-original.mustache diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/web.config b/modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/web.config similarity index 100% rename from modules/openapi-generator/src/main/resources/aspnetcore/wwwroot/web.config rename to modules/openapi-generator/src/main/resources/aspnetcore/2.0/wwwroot/web.config diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Dockerfile.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Dockerfile.mustache new file mode 100644 index 00000000000..e9d80c52833 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Dockerfile.mustache @@ -0,0 +1,18 @@ +FROM microsoft/aspnetcore-build:2.0 AS build-env +WORKDIR /app + +ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 + +# copy csproj and restore as distinct layers +COPY *.csproj ./ +RUN dotnet restore + +# copy everything else and build +COPY . ./ +RUN dotnet publish -c Release -o out + +# build runtime image +FROM microsoft/aspnetcore:2.0 +WORKDIR /app +COPY --from=build-env /app/out . +ENTRYPOINT ["dotnet", "{{packageName}}.dll"] diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/BasePathFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/BasePathFilter.mustache new file mode 100644 index 00000000000..a3e1b9ce080 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/BasePathFilter.mustache @@ -0,0 +1,50 @@ +using System.Linq; +using System.Text.RegularExpressions; +using Swashbuckle.AspNetCore.Swagger; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace {{packageName}}.Filters +{ + /// + /// BasePath Document Filter sets BasePath property of Swagger and removes it from the individual URL paths + /// + public class BasePathFilter : IDocumentFilter + { + /// + /// Constructor + /// + /// BasePath to remove from Operations + public BasePathFilter(string basePath) + { + BasePath = basePath; + } + + /// + /// Gets the BasePath of the Swagger Doc + /// + /// The BasePath of the Swagger Doc + public string BasePath { get; } + + /// + /// Apply the filter + /// + /// SwaggerDocument + /// FilterContext + public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context) + { + swaggerDoc.BasePath = BasePath; + + var pathsToModify = swaggerDoc.Paths.Where(p => p.Key.StartsWith(BasePath)).ToList(); + + foreach (var path in pathsToModify) + { + if (path.Key.StartsWith(BasePath)) + { + string newKey = Regex.Replace(path.Key, $"^{BasePath}", string.Empty); + swaggerDoc.Paths.Remove(path.Key); + swaggerDoc.Paths.Add(newKey, path.Value); + } + } + } + } +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/GeneratePathParamsValidationFilter.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/GeneratePathParamsValidationFilter.mustache new file mode 100644 index 00000000000..d857a4a0f96 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Filters/GeneratePathParamsValidationFilter.mustache @@ -0,0 +1,97 @@ +using System.ComponentModel.DataAnnotations; +using System.Linq; +using Microsoft.AspNetCore.Mvc.Controllers; +using Swashbuckle.AspNetCore.Swagger; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace {{packageName}}.Filters +{ + /// + /// Path Parameter Validation Rules Filter + /// + public class GeneratePathParamsValidationFilter : IOperationFilter + { + /// + /// Constructor + /// + /// Operation + /// OperationFilterContext + public void Apply(Operation operation, OperationFilterContext context) + { + var pars = context.ApiDescription.ParameterDescriptions; + + foreach (var par in pars) + { + var swaggerParam = operation.Parameters.SingleOrDefault(p => p.Name == par.Name); + + var attributes = ((ControllerParameterDescriptor)par.ParameterDescriptor).ParameterInfo.CustomAttributes; + + if (attributes != null && attributes.Count() > 0 && swaggerParam != null) + { + // Required - [Required] + var requiredAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RequiredAttribute)); + if (requiredAttr != null) + { + swaggerParam.Required = true; + } + + // Regex Pattern [RegularExpression] + var regexAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RegularExpressionAttribute)); + if (regexAttr != null) + { + string regex = (string)regexAttr.ConstructorArguments[0].Value; + if (swaggerParam is NonBodyParameter) + { + ((NonBodyParameter)swaggerParam).Pattern = regex; + } + } + + // String Length [StringLength] + int? minLenght = null, maxLength = null; + var stringLengthAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(StringLengthAttribute)); + if (stringLengthAttr != null) + { + if (stringLengthAttr.NamedArguments.Count == 1) + { + minLenght = (int)stringLengthAttr.NamedArguments.Single(p => p.MemberName == "MinimumLength").TypedValue.Value; + } + maxLength = (int)stringLengthAttr.ConstructorArguments[0].Value; + } + + var minLengthAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(MinLengthAttribute)); + if (minLengthAttr != null) + { + minLenght = (int)minLengthAttr.ConstructorArguments[0].Value; + } + + var maxLengthAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(MaxLengthAttribute)); + if (maxLengthAttr != null) + { + maxLength = (int)maxLengthAttr.ConstructorArguments[0].Value; + } + + if (swaggerParam is NonBodyParameter) + { + ((NonBodyParameter)swaggerParam).MinLength = minLenght; + ((NonBodyParameter)swaggerParam).MaxLength = maxLength; + } + + // Range [Range] + var rangeAttr = attributes.FirstOrDefault(p => p.AttributeType == typeof(RangeAttribute)); + if (rangeAttr != null) + { + int rangeMin = (int)rangeAttr.ConstructorArguments[0].Value; + int rangeMax = (int)rangeAttr.ConstructorArguments[1].Value; + + if (swaggerParam is NonBodyParameter) + { + ((NonBodyParameter)swaggerParam).Minimum = rangeMin; + ((NonBodyParameter)swaggerParam).Maximum = rangeMax; + } + } + } + } + } + } +} + diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Program.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Program.mustache new file mode 100644 index 00000000000..73cb81a3e41 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Program.mustache @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore; + +namespace {{packageName}} +{ + /// + /// Program + /// + public class Program + { + /// + /// Main + /// + /// + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + /// + /// Create the web host builder. + /// + /// + /// IWebHostBuilder + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .UseUrls("http://0.0.0.0:{{#serverPort}}{{serverPort}}{{/serverPort}}{{^serverPort}}8080{{/serverPort}}/"); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Project.csproj.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Project.csproj.mustache new file mode 100644 index 00000000000..faa7dbd53b5 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Project.csproj.mustache @@ -0,0 +1,21 @@ + + + {{packageName}} + {{packageName}} + netcoreapp2.1 + true + true + {{packageName}} + {{packageName}} + + + +{{#useSwashbuckle}} + + +{{/useSwashbuckle}} + + + + + diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Properties/launchSettings.json b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Properties/launchSettings.json new file mode 100644 index 00000000000..1b527df2c2b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61788", + "sslPort": 44301 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "WebApplication1": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "api/values", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/README.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/README.mustache new file mode 100644 index 00000000000..71c4cfebb8b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/README.mustache @@ -0,0 +1,27 @@ +# {{packageName}} - ASP.NET Core 2.0 Server + +{{#appDescription}} +{{{appDescription}}} +{{/appDescription}} + +## Run + +Linux/OS X: + +``` +sh build.sh +``` + +Windows: + +``` +build.bat +``` + +## Run in Docker + +``` +cd {{sourceFolder}}/{{packageName}} +docker build -t {{dockerTag}} . +docker run -p 5000:5000 {{dockerTag}} +``` diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Solution.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Solution.mustache new file mode 100644 index 00000000000..8c6d69ea93d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Solution.mustache @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2043 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{packageName}}", "{{sourceFolder}}\{{packageName}}\{{packageName}}.csproj", "{{packageGuid}}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {{packageGuid}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {{packageGuid}}.Debug|Any CPU.Build.0 = Debug|Any CPU + {{packageGuid}}.Release|Any CPU.ActiveCfg = Release|Any CPU + {{packageGuid}}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Startup.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Startup.mustache new file mode 100644 index 00000000000..7a488bfcf17 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/Startup.mustache @@ -0,0 +1,120 @@ +{{>partial_header}} +using System; +using System.IO; +using System.Reflection; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization;{{#useSwashbuckle}} +using Swashbuckle.AspNetCore.Swagger; +using Swashbuckle.AspNetCore.SwaggerGen; +using {{packageName}}.Filters;{{/useSwashbuckle}} + +namespace {{packageName}} +{ + /// + /// Startup + /// + public class Startup + { + /// + /// Constructor + /// + /// + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + /// + /// The application configuration. + /// + public IConfiguration Configuration { get; } + + /// + /// This method gets called by the runtime. Use this method to add services to the container. + /// + /// + public void ConfigureServices(IServiceCollection services) + { + // Add framework services. + services + .AddMvc() + .SetCompatibilityVersion (CompatibilityVersion.Version_2_1) + .AddJsonOptions(opts => + { + opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); + opts.SerializerSettings.Converters.Add(new StringEnumConverter + { + CamelCaseText = true + }); + });{{#useSwashbuckle}} + + services + .AddSwaggerGen(c => + { + c.SwaggerDoc("{{#version}}{{{version}}}{{/version}}{{^version}}v1{{/version}}", new Info + { + Version = "{{#version}}{{{version}}}{{/version}}{{^version}}v1{{/version}}", + Title = "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}}", + Description = "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}} (ASP.NET Core 2.0)", + Contact = new Contact() + { + Name = "{{#infoName}}{{{infoName}}}{{/infoName}}{{^infoName}}OpenAPI-Generator Contributors{{/infoName}}", + Url = "{{#infoUrl}}{{{infoUrl}}}{{/infoUrl}}{{^infoUrl}}https://github.com/openapitools/openapi-generator{{/infoUrl}}", + Email = "{{#infoEmail}}{{{infoEmail}}}{{/infoEmail}}" + }, + TermsOfService = "{{#termsOfService}}{{{termsOfService}}}{{/termsOfService}}" + }); + c.CustomSchemaIds(type => type.FriendlyId(true)); + c.DescribeAllEnumsAsStrings(); + c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{Assembly.GetEntryAssembly().GetName().Name}.xml"); + {{#basePathWithoutHost}} + // Sets the basePath property in the Swagger document generated + c.DocumentFilter("{{{basePathWithoutHost}}}"); + {{/basePathWithoutHost}} + + // Include DataAnnotation attributes on Controller Action parameters as Swagger validation rules (e.g required, pattern, ..) + // Use [ValidateModelState] on Actions to actually validate it in C# as well! + c.OperationFilter(); + });{{/useSwashbuckle}} + } + + /// + /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + /// + /// + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + app.UseHttpsRedirection(); + app + .UseMvc() + .UseDefaultFiles() + .UseStaticFiles(){{#useSwashbuckle}} + .UseSwagger(c => + { + c.RouteTemplate = "swagger/{documentName}/openapi.json"; + }) + .UseSwaggerUI(c => + { + //TODO: Either use the SwaggerGen generated Swagger contract (generated from C# classes) + c.SwaggerEndpoint("/swagger/{{#version}}{{{version}}}{{/version}}{{^version}}v1{{/version}}/openapi.json", "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}}"); + + //TODO: Or alternatively use the original Swagger contract that's included in the static files + // c.SwaggerEndpoint("/openapi-original.json", "{{#appName}}{{{appName}}}{{/appName}}{{^appName}}{{packageName}}{{/appName}} Original"); + }){{/useSwashbuckle}}; + +if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseHsts(); + } + } + } +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.Development.json b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.Development.json new file mode 100644 index 00000000000..e203e9407e7 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.json b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.json new file mode 100644 index 00000000000..def9159a7d9 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/bodyParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/bodyParam.mustache new file mode 100644 index 00000000000..02b0fa1d2de --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/bodyParam.mustache @@ -0,0 +1 @@ +{{#isBodyParam}}[FromBody]{{&dataType}} {{paramName}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.bat.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.bat.mustache new file mode 100644 index 00000000000..e437bccf7d6 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.bat.mustache @@ -0,0 +1,9 @@ +:: Generated by: https://openapi-generator.tech +:: + +@echo off + +dotnet restore {{sourceFolder}}\{{packageName}} +dotnet build {{sourceFolder}}\{{packageName}} +echo Now, run the following to start the project: dotnet run -p {{sourceFolder}}\{{packageName}}\{{packageName}}.csproj --launch-profile web. +echo. diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.sh.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.sh.mustache new file mode 100644 index 00000000000..3804359d7e2 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/build.sh.mustache @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# +# Generated by: https://openapi-generator.tech +# + +dotnet restore {{sourceFolder}}/{{packageName}}/ && \ + dotnet build {{sourceFolder}}/{{packageName}}/ && \ + echo "Now, run the following to start the project: dotnet run -p {{sourceFolder}}/{{packageName}}/{{packageName}}.csproj --launch-profile web" diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/controller.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/controller.mustache new file mode 100644 index 00000000000..1805b7d2cc6 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/controller.mustache @@ -0,0 +1,55 @@ +{{>partial_header}} +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc;{{#useSwashbuckle}} +using Swashbuckle.AspNetCore.Annotations; +using Swashbuckle.AspNetCore.SwaggerGen;{{/useSwashbuckle}} +using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using {{packageName}}.Attributes; +using {{packageName}}.Models; + +namespace {{packageName}}.Controllers +{ {{#operations}} + /// + /// {{description}} + /// {{#description}} + [Description("{{description}}")]{{/description}} + public class {{classname}}Controller : ControllerBase + { {{#operation}} + /// + /// {{#summary}}{{summary}}{{/summary}} + /// {{#notes}} + /// {{notes}}{{/notes}}{{#allParams}} + /// {{description}}{{/allParams}}{{#responses}} + /// {{message}}{{/responses}} + [{{httpMethod}}] + [Route("{{{basePathWithoutHost}}}{{{path}}}")] + [ValidateModelState]{{#useSwashbuckle}} + [SwaggerOperation("{{operationId}}")]{{#responses}}{{#dataType}} + [SwaggerResponse(statusCode: {{code}}, type: typeof({{&dataType}}), description: "{{message}}")]{{/dataType}}{{^dataType}}{{/dataType}}{{/responses}}{{/useSwashbuckle}} + public virtual IActionResult {{operationId}}({{#allParams}}{{>pathParam}}{{>queryParam}}{{>bodyParam}}{{>formParam}}{{>headerParam}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + { {{#responses}} +{{#dataType}} + //TODO: Uncomment the next line to return response {{code}} or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode({{code}}, default({{&dataType}})); +{{/dataType}} +{{^dataType}} + //TODO: Uncomment the next line to return response {{code}} or use other options such as return this.NotFound(), return this.BadRequest(..), ... + // return StatusCode({{code}}); +{{/dataType}}{{/responses}} +{{#returnType}} + string exampleJson = null; + {{#examples}} + exampleJson = "{{{example}}}"; + {{/examples}} + {{#isListCollection}}{{>listReturn}}{{/isListCollection}}{{^isListCollection}}{{#isMapContainer}}{{>mapReturn}}{{/isMapContainer}}{{^isMapContainer}}{{>objectReturn}}{{/isMapContainer}}{{/isListCollection}} + {{!TODO: defaultResponse, examples, auth, consumes, produces, nickname, externalDocs, imports, security}} + //TODO: Change the data returned + return new ObjectResult(example);{{/returnType}}{{^returnType}} + throw new NotImplementedException();{{/returnType}} + } + {{/operation}} + } +{{/operations}} +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache new file mode 100644 index 00000000000..a8a68b99844 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/enumClass.mustache @@ -0,0 +1,18 @@ + + /// + /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} + /// + {{#description}} + /// {{{description}}} + {{/description}} + {{#allowableValues}}{{#enumVars}}{{#-first}}{{#isString}}[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]{{/isString}}{{/-first}}{{/enumVars}}{{/allowableValues}} + public enum {{#datatypeWithEnum}}{{.}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} + { + {{#allowableValues}}{{#enumVars}} + /// + /// Enum {{name}} for {{{value}}} + /// + {{#isString}}[EnumMember(Value = "{{{value}}}")]{{/isString}} + {{name}}{{^isString}} = {{{value}}}{{/isString}}{{#isString}} = {{-index}}{{/isString}}{{^-last}}, + {{/-last}}{{/enumVars}}{{/allowableValues}} + } diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/formParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/formParam.mustache new file mode 100644 index 00000000000..2d42dc2916b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/formParam.mustache @@ -0,0 +1 @@ +{{#isFormParam}}[FromForm]{{#required}}[Required()]{{/required}}{{#pattern}}[RegularExpression("{{{pattern}}}")]{{/pattern}}{{#minLength}}{{#maxLength}}[StringLength({{maxLength}}, MinimumLength={{minLength}}){{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}} [MinLength({{minLength}})]{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}} [MaxLength({{maxLength}})]{{/maxLength}}{{/minLength}}{{#minimum}}{{#maximum}}[Range({{minimum}}, {{maximum}})]{{/maximum}}{{/minimum}}{{&dataType}} {{paramName}}{{/isFormParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/gitignore b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/gitignore new file mode 100644 index 00000000000..cd9b840e549 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/gitignore @@ -0,0 +1,208 @@ +PID + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +bower_components/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/headerParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/headerParam.mustache new file mode 100644 index 00000000000..45a5be9d7b5 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/headerParam.mustache @@ -0,0 +1 @@ +{{#isHeaderParam}}[FromHeader]{{#required}}[Required()]{{/required}}{{#pattern}}[RegularExpression("{{{pattern}}}")]{{/pattern}}{{#minLength}}{{#maxLength}}[StringLength({{maxLength}}, MinimumLength={{minLength}}){{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}} [MinLength({{minLength}})]{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}} [MaxLength({{maxLength}})]{{/maxLength}}{{/minLength}}{{#minimum}}{{#maximum}}[Range({{minimum}}, {{maximum}})]{{/maximum}}{{/minimum}}{{&dataType}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/listReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/listReturn.mustache new file mode 100644 index 00000000000..d609e67148c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/listReturn.mustache @@ -0,0 +1,4 @@ + + var example = exampleJson != null + ? JsonConvert.DeserializeObject<{{returnContainer}}<{{#returnType}}{{{returnType}}}{{/returnType}}>>(exampleJson) + : Enumerable.Empty<{{#returnType}}{{{returnType}}}{{/returnType}}>(); \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/mapReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/mapReturn.mustache new file mode 100644 index 00000000000..856fb1b3507 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/mapReturn.mustache @@ -0,0 +1,4 @@ + + var example = exampleJson != null + ? JsonConvert.DeserializeObject>(exampleJson) + : new Dictionary<{{#returnType}}{{{returnType}}}{{/returnType}}>(); \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/model.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/model.mustache new file mode 100644 index 00000000000..7b06958ef67 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/model.mustache @@ -0,0 +1,136 @@ +{{>partial_header}} +using System; +using System.Linq; +using System.Text; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; +using Newtonsoft.Json; + +{{#models}} +{{#model}} +namespace {{packageName}}.Models +{ {{#isEnum}}{{>enumClass}}{{/isEnum}}{{^isEnum}} + /// + /// {{description}} + /// + [DataContract] + public partial class {{classname}} : {{#parent}}{{{parent}}}, {{/parent}}IEquatable<{{classname}}> + { {{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}}{{>enumClass}}{{/items}}{{/items.isEnum}} + /// + /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} + /// + {{#description}} + /// {{description}} + {{/description}} + {{#required}} + [Required] + {{/required}} + [DataMember(Name="{{baseName}}")] + {{#isEnum}} + public {{{datatypeWithEnum}}}{{#isEnum}}{{^isContainer}}?{{/isContainer}}{{/isEnum}} {{name}} { get; set; } + {{/isEnum}} + {{^isEnum}} + public {{{dataType}}} {{name}} { get; {{#isReadOnly}}private {{/isReadOnly}}set; } + {{/isEnum}} + {{#hasMore}} + {{/hasMore}} + {{/vars}} + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class {{classname}} {\n"); + {{#vars}} + sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); + {{/vars}} + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public {{#parent}}{{^isMapModel}}{{^isArrayModel}}new {{/isArrayModel}}{{/isMapModel}}{{/parent}}string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + return obj.GetType() == GetType() && Equals(({{classname}})obj); + } + + /// + /// Returns true if {{classname}} instances are equal + /// + /// Instance of {{classname}} to be compared + /// Boolean + public bool Equals({{classname}} other) + { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + + return {{#vars}}{{#isNotContainer}} + ( + {{name}} == other.{{name}} || + {{name}} != null && + {{name}}.Equals(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{^isNotContainer}} + ( + {{name}} == other.{{name}} || + {{name}} != null && + {{name}}.SequenceEqual(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}{{^vars}}false{{/vars}}; + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + unchecked // Overflow is fine, just wrap + { + var hashCode = 41; + // Suitable nullity checks etc, of course :) + {{#vars}} + if ({{name}} != null) + hashCode = hashCode * 59 + {{name}}.GetHashCode(); + {{/vars}} + return hashCode; + } + } + + #region Operators + #pragma warning disable 1591 + + public static bool operator ==({{classname}} left, {{classname}} right) + { + return Equals(left, right); + } + + public static bool operator !=({{classname}} left, {{classname}} right) + { + return !Equals(left, right); + } + + #pragma warning restore 1591 + #endregion Operators + } +{{/isEnum}} +{{/model}} +{{/models}} +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/objectReturn.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/objectReturn.mustache new file mode 100644 index 00000000000..4059a61ac0b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/objectReturn.mustache @@ -0,0 +1,4 @@ + + var example = exampleJson != null + ? JsonConvert.DeserializeObject<{{#returnType}}{{{returnType}}}{{/returnType}}>(exampleJson) + : default({{#returnType}}{{{returnType}}}{{/returnType}}); \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/partial_header.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/partial_header.mustache new file mode 100644 index 00000000000..4a682818a37 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/partial_header.mustache @@ -0,0 +1,13 @@ +/* + {{#appName}} + * {{{appName}}} + * + {{/appName}} + {{#appDescription}} + * {{{appDescription}}} + * + {{/appDescription}} + * {{#version}}OpenAPI spec version: {{{version}}}{{/version}} + * {{#infoEmail}}Contact: {{{infoEmail}}}{{/infoEmail}} + * Generated by: https://openapi-generator.tech + */ diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/pathParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/pathParam.mustache new file mode 100644 index 00000000000..70303432d48 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/pathParam.mustache @@ -0,0 +1 @@ +{{#isPathParam}}[FromRoute]{{#required}}[Required]{{/required}}{{#pattern}}[RegularExpression("{{{pattern}}}")]{{/pattern}}{{#minLength}}{{#maxLength}}[StringLength({{maxLength}}, MinimumLength={{minLength}}){{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}} [MinLength({{minLength}})]{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}} [MaxLength({{maxLength}})]{{/maxLength}}{{/minLength}}{{#minimum}}{{#maximum}}[Range({{minimum}}, {{maximum}})]{{/maximum}}{{/minimum}}{{&dataType}} {{paramName}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/queryParam.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/queryParam.mustache new file mode 100644 index 00000000000..e9fa09b005d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/queryParam.mustache @@ -0,0 +1 @@ +{{#isQueryParam}}[FromQuery]{{#required}}[Required()]{{/required}}{{#pattern}}[RegularExpression("{{{pattern}}}")]{{/pattern}}{{#minLength}}{{#maxLength}}[StringLength({{maxLength}}, MinimumLength={{minLength}}){{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}} [MinLength({{minLength}})]{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}} [MaxLength({{maxLength}})]{{/maxLength}}{{/minLength}}{{#minimum}}{{#maximum}}[Range({{minimum}}, {{maximum}})]{{/maximum}}{{/minimum}}{{&dataType}} {{paramName}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/tags.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/tags.mustache new file mode 100644 index 00000000000..c97df19949e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/tags.mustache @@ -0,0 +1 @@ +{{!TODO: Need iterable tags object...}}{{#tags}}, Tags = new[] { {{/tags}}"{{#tags}}{{tag}} {{/tags}}"{{#tags}} }{{/tags}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/validateModel.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/validateModel.mustache new file mode 100644 index 00000000000..e11aaa5d270 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/validateModel.mustache @@ -0,0 +1,61 @@ +using System.ComponentModel.DataAnnotations; +using System.Reflection; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace {{packageName}}.Attributes +{ + /// + /// Model state validation attribute + /// + public class ValidateModelStateAttribute : ActionFilterAttribute + { + /// + /// Called before the action method is invoked + /// + /// + public override void OnActionExecuting(ActionExecutingContext context) + { + // Per https://blog.markvincze.com/how-to-validate-action-parameters-with-dataannotation-attributes/ + var descriptor = context.ActionDescriptor as ControllerActionDescriptor; + if (descriptor != null) + { + foreach (var parameter in descriptor.MethodInfo.GetParameters()) + { + object args = null; + if (context.ActionArguments.ContainsKey(parameter.Name)) + { + args = context.ActionArguments[parameter.Name]; + } + + ValidateAttributes(parameter, args, context.ModelState); + } + } + + if (!context.ModelState.IsValid) + { + context.Result = new BadRequestObjectResult(context.ModelState); + } + } + + private void ValidateAttributes(ParameterInfo parameter, object args, ModelStateDictionary modelState) + { + foreach (var attributeData in parameter.CustomAttributes) + { + var attributeInstance = parameter.GetCustomAttribute(attributeData.AttributeType); + + var validationAttribute = attributeInstance as ValidationAttribute; + if (validationAttribute != null) + { + var isValid = validationAttribute.IsValid(args); + if (!isValid) + { + modelState.AddModelError(parameter.Name, validationAttribute.FormatErrorMessage(parameter.Name)); + } + } + } + } + } +} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/README.md b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/README.md new file mode 100644 index 00000000000..6a0b78471a3 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/README.md @@ -0,0 +1,42 @@ +# Welcome to ASP.NET 5 Preview + +We've made some big updates in this release, so it’s **important** that you spend a few minutes to learn what’s new. + +ASP.NET 5 has been rearchitected to make it **lean** and **composable**. It's fully **open source** and available on [GitHub](http://go.microsoft.com/fwlink/?LinkID=517854). +Your new project automatically takes advantage of modern client-side utilities like [Bower](http://go.microsoft.com/fwlink/?LinkId=518004) and [npm](http://go.microsoft.com/fwlink/?LinkId=518005) (to add client-side libraries) and [Gulp](http://go.microsoft.com/fwlink/?LinkId=518007) (for client-side build and automation tasks). + +We hope you enjoy the new capabilities in ASP.NET 5 and Visual Studio 2015. +The ASP.NET Team + +### You've created a new ASP.NET 5 project. [Learn what's new](http://go.microsoft.com/fwlink/?LinkId=518016) + +### This application consists of: +* Sample pages using ASP.NET MVC 6 +* [Gulp](http://go.microsoft.com/fwlink/?LinkId=518007) and [Bower](http://go.microsoft.com/fwlink/?LinkId=518004) for managing client-side resources +* Theming using [Bootstrap](http://go.microsoft.com/fwlink/?LinkID=398939) + +#### NEW CONCEPTS +* [The 'wwwroot' explained](http://go.microsoft.com/fwlink/?LinkId=518008) +* [Configuration in ASP.NET 5](http://go.microsoft.com/fwlink/?LinkId=518012) +* [Dependency Injection](http://go.microsoft.com/fwlink/?LinkId=518013) +* [Razor TagHelpers](http://go.microsoft.com/fwlink/?LinkId=518014) +* [Manage client packages using Gulp](http://go.microsoft.com/fwlink/?LinkID=517849) +* [Develop on different platforms](http://go.microsoft.com/fwlink/?LinkID=517850) + +#### CUSTOMIZE APP +* [Add Controllers and Views](http://go.microsoft.com/fwlink/?LinkID=398600) +* [Add Data using EntityFramework](http://go.microsoft.com/fwlink/?LinkID=398602) +* [Add Authentication using Identity](http://go.microsoft.com/fwlink/?LinkID=398603) +* [Add real time support using SignalR](http://go.microsoft.com/fwlink/?LinkID=398606) +* [Add Class library](http://go.microsoft.com/fwlink/?LinkID=398604) +* [Add Web APIs with MVC 6](http://go.microsoft.com/fwlink/?LinkId=518009) +* [Add client packages using Bower](http://go.microsoft.com/fwlink/?LinkID=517848) + +#### DEPLOY +* [Run your app locally](http://go.microsoft.com/fwlink/?LinkID=517851) +* [Run your app on ASP.NET Core 5](http://go.microsoft.com/fwlink/?LinkID=517852) +* [Run commands in your 'project.json'](http://go.microsoft.com/fwlink/?LinkID=517853) +* [Publish to Microsoft Azure Web Sites](http://go.microsoft.com/fwlink/?LinkID=398609) +* [Publish to the file system](http://go.microsoft.com/fwlink/?LinkId=518019) + +We would love to hear your [feedback](http://go.microsoft.com/fwlink/?LinkId=518015) diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/index.html b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/index.html new file mode 100644 index 00000000000..cde1f2f90b9 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/openapi-original.mustache b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/openapi-original.mustache new file mode 100644 index 00000000000..2c1b461cf00 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/openapi-original.mustache @@ -0,0 +1 @@ +{{{openapi-json}}} diff --git a/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/web.config b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/web.config new file mode 100644 index 00000000000..e70a7778d60 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/aspnetcore/2.1/wwwroot/web.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/samples/server/petstore/aspnetcore/.openapi-generator/VERSION b/samples/server/petstore/aspnetcore/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/server/petstore/aspnetcore/.openapi-generator/VERSION +++ b/samples/server/petstore/aspnetcore/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/PetApi.cs b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/PetApi.cs index 0be78aacc4f..9ea99af7cdf 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/PetApi.cs +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/PetApi.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.SwaggerGen; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; @@ -22,7 +23,7 @@ namespace Org.OpenAPITools.Controllers /// /// /// - public class PetApiController : Controller + public class PetApiController : ControllerBase { /// /// Add a new pet to the store diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/StoreApi.cs b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/StoreApi.cs index ed5f6e327ee..2b46191a792 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/StoreApi.cs +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/StoreApi.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.SwaggerGen; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; @@ -22,7 +23,7 @@ namespace Org.OpenAPITools.Controllers /// /// /// - public class StoreApiController : Controller + public class StoreApiController : ControllerBase { /// /// Delete purchase order by ID diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/UserApi.cs b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/UserApi.cs index 463f0d8ecfd..99fc6e4ea24 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/UserApi.cs +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Controllers/UserApi.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; +using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.SwaggerGen; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; @@ -22,7 +23,7 @@ namespace Org.OpenAPITools.Controllers /// /// /// - public class UserApiController : Controller + public class UserApiController : ControllerBase { /// /// Create user diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Org.OpenAPITools.csproj b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Org.OpenAPITools.csproj index 48868bd103b..05d9192229f 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Org.OpenAPITools.csproj +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Org.OpenAPITools.csproj @@ -2,17 +2,16 @@ Org.OpenAPITools Org.OpenAPITools - netcoreapp2.0 + netcoreapp2.1 true true Org.OpenAPITools Org.OpenAPITools - - - - + + + diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Program.cs b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Program.cs index 3da6fd0a6d0..fc39443af25 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Program.cs +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Program.cs @@ -14,18 +14,17 @@ namespace Org.OpenAPITools /// public static void Main(string[] args) { - BuildWebHost(args).Run(); + CreateWebHostBuilder(args).Build().Run(); } /// - /// Build Web Host + /// Create the web host builder. /// /// - /// Webhost - public static IWebHost BuildWebHost(string[] args) => + /// IWebHostBuilder + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) - .UseStartup() - .UseUrls("http://0.0.0.0:8080/") - .Build(); + .UseStartup() + .UseUrls("http://0.0.0.0:8080/"); } -} +} \ No newline at end of file diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Properties/launchSettings.json b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Properties/launchSettings.json index 21acfed207b..1b527df2c2b 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Properties/launchSettings.json +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Properties/launchSettings.json @@ -1,25 +1,27 @@ -{ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, + "windowsAuthentication": false, + "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:50352/", - "sslPort": 0 + "applicationUrl": "http://localhost:61788", + "sslPort": 44301 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "swagger/", + "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, - "web": { + "WebApplication1": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:5000/swagger/", + "launchUrl": "api/values", + "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Startup.cs b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Startup.cs index 4f76c4ed6d1..0df10a0b0cb 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Startup.cs +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/Startup.cs @@ -10,8 +10,10 @@ using System; using System.IO; +using System.Reflection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json.Converters; @@ -27,20 +29,20 @@ namespace Org.OpenAPITools /// public class Startup { - private readonly IHostingEnvironment _hostingEnv; - private readonly IConfiguration _configuration; - /// /// Constructor /// - /// /// - public Startup(IHostingEnvironment env, IConfiguration configuration) + public Startup(IConfiguration configuration) { - _hostingEnv = env; - _configuration = configuration; + Configuration = configuration; } + /// + /// The application configuration. + /// + public IConfiguration Configuration { get; } + /// /// This method gets called by the runtime. Use this method to add services to the container. /// @@ -50,6 +52,7 @@ namespace Org.OpenAPITools // Add framework services. services .AddMvc() + .SetCompatibilityVersion (CompatibilityVersion.Version_2_1) .AddJsonOptions(opts => { opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); @@ -77,7 +80,7 @@ namespace Org.OpenAPITools }); c.CustomSchemaIds(type => type.FriendlyId(true)); c.DescribeAllEnumsAsStrings(); - c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{_hostingEnv.ApplicationName}.xml"); + c.IncludeXmlComments($"{AppContext.BaseDirectory}{Path.DirectorySeparatorChar}{Assembly.GetEntryAssembly().GetName().Name}.xml"); // Sets the basePath property in the Swagger document generated c.DocumentFilter("/v2"); @@ -91,8 +94,9 @@ namespace Org.OpenAPITools /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. /// /// - public void Configure(IApplicationBuilder app) + public void Configure(IApplicationBuilder app, IHostingEnvironment env) { + app.UseHttpsRedirection(); app .UseMvc() .UseDefaultFiles() @@ -110,14 +114,13 @@ namespace Org.OpenAPITools // c.SwaggerEndpoint("/openapi-original.json", "OpenAPI Petstore Original"); }); - if (_hostingEnv.IsDevelopment()) +if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { - //TODO: Enable production exception handling (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling) - // app.UseExceptionHandler("/Home/Error"); + app.UseHsts(); } } } diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/appsettings.json b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/appsettings.json index c6af7d9b069..def9159a7d9 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/appsettings.json +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/appsettings.json @@ -1,10 +1,8 @@ { "Logging": { - "IncludeScopes": false, "LogLevel": { - "Default": "Information", - "System": "Information", - "Microsoft": "Information" + "Default": "Warning" } - } + }, + "AllowedHosts": "*" } diff --git a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/wwwroot/openapi-original.json b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/wwwroot/openapi-original.json index 34eb757240d..82d674b5575 100644 --- a/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/wwwroot/openapi-original.json +++ b/samples/server/petstore/aspnetcore/src/Org.OpenAPITools/wwwroot/openapi-original.json @@ -104,6 +104,7 @@ "in" : "query", "description" : "Status values that need to be considered for filter", "required" : true, + "style" : "form", "explode" : false, "schema" : { "type" : "array", @@ -157,6 +158,7 @@ "in" : "query", "description" : "Tags to filter by", "required" : true, + "style" : "form", "explode" : false, "schema" : { "type" : "array", From f29ba97e8bb13598708db7ea2ee7a5288ad1bd0c Mon Sep 17 00:00:00 2001 From: stkrwork Date: Thu, 13 Sep 2018 01:13:02 +0200 Subject: [PATCH 69/74] [C++][Restbed] Fix default values for Restbed Server generator (#761) * Start working on fixing default value in Restbed Server Api Template * fix default value in DefaultCodegen --- .../openapitools/codegen/DefaultCodegen.java | 5 +- .../languages/CppRestbedServerCodegen.java | 65 +++++++++++++++---- .../cpp-restbed-server/api-source.mustache | 14 ++-- .../petstore/cpp-restbed/api/PetApi.cpp | 6 +- .../petstore/cpp-restbed/api/StoreApi.cpp | 2 +- .../petstore/cpp-restbed/api/UserApi.cpp | 4 +- 6 files changed, 69 insertions(+), 27 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index d7115b9c8db..2ec323a37c0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2742,9 +2742,8 @@ public class DefaultCodegen implements CodegenConfig { } // set default value - if (parameterSchema.getDefault() != null) { - codegenParameter.defaultValue = toDefaultValue(parameterSchema); - } + codegenParameter.defaultValue = toDefaultValue(parameterSchema); + // TDOO revise collectionFormat String collectionFormat = null; if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java index 028eee1467f..31c9a6a3c1a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java @@ -25,15 +25,19 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.*; import org.openapitools.codegen.utils.ModelUtils; import io.swagger.v3.oas.models.media.*; +import org.slf4j.LoggerFactory; public class CppRestbedServerCodegen extends AbstractCppCodegen { + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(CppRestbedServerCodegen.class); + public static final String DECLSPEC = "declspec"; public static final String DEFAULT_INCLUDE = "defaultInclude"; @@ -287,25 +291,63 @@ public class CppRestbedServerCodegen extends AbstractCppCodegen { @Override public String toDefaultValue(Schema p) { if (ModelUtils.isStringSchema(p)) { - return "\"\""; + if (p.getDefault() != null) { + return "\"" + p.getDefault().toString() + "\""; + } else { + return "\"\""; + } } else if (ModelUtils.isBooleanSchema(p)) { - return "false"; + if (p.getDefault() != null) { + return p.getDefault().toString(); + } else { + return "false"; + } } else if (ModelUtils.isDateSchema(p)) { - return "\"\""; + if (p.getDefault() != null) { + return "\"" + p.getDefault().toString() + "\""; + } else { + return "\"\""; + } } else if (ModelUtils.isDateTimeSchema(p)) { - return "\"\""; + if (p.getDefault() != null) { + return "\"" + p.getDefault().toString() + "\""; + } else { + return "\"\""; + } } else if (ModelUtils.isNumberSchema(p)) { - if (ModelUtils.isFloatSchema(p)) { - return "0.0f"; + if (ModelUtils.isFloatSchema(p)) { // float + if (p.getDefault() != null) { + return p.getDefault().toString() + "f"; + } else { + return "0.0f"; + } + } else { // double + if (p.getDefault() != null) { + return p.getDefault().toString(); + } else { + return "0.0"; + } } - return "0.0"; } else if (ModelUtils.isIntegerSchema(p)) { - if (ModelUtils.isLongSchema(p)) { - return "0L"; + if (ModelUtils.isLongSchema(p)) { // long + if (p.getDefault() != null) { + return p.getDefault().toString() + "L"; + } else { + return "0L"; + } + } else { // integer + if (p.getDefault() != null) { + return p.getDefault().toString(); + } else { + return "0"; + } } - return "0"; } else if (ModelUtils.isByteArraySchema(p)) { - return "\"\""; + if (p.getDefault() != null) { + return "\"" + p.getDefault().toString() + "\""; + } else { + return "\"\""; + } } else if (ModelUtils.isMapSchema(p)) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; @@ -319,6 +361,7 @@ public class CppRestbedServerCodegen extends AbstractCppCodegen { } else if (!StringUtils.isEmpty(p.get$ref())) { return "new " + toModelName(ModelUtils.getSimpleRef(p.get$ref())) + "()"; } + return "nullptr"; } diff --git a/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache b/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache index 35196da731d..ccd81ee02ef 100644 --- a/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache @@ -75,7 +75,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the path params {{#pathParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/pathParams}} {{/hasPathParams}} @@ -84,7 +84,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the query params {{#queryParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/queryParams}} {{/hasQueryParams}} @@ -93,7 +93,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the headers {{#headerParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/headerParams}} {{/hasHeaderParams}} @@ -140,7 +140,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the path params {{#pathParams}} {{#isPrimitiveType}} - const {{dataType}} {{paramName}} = request->get_path_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/pathParams}} {{/hasPathParams}} @@ -149,16 +149,16 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the query params {{#queryParams}} {{#isPrimitiveType}} - const {{dataType}} {{paramName}} = request->get_query_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/queryParams}} {{/hasQueryParams}} - + {{#hasHeaderParams}} // Getting the headers {{#headerParams}} {{#isPrimitiveType}} - const {{dataType}} {{paramName}} = request->get_header("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); + const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{{defaultValue}}}); {{/isPrimitiveType}} {{/headerParams}} {{/hasHeaderParams}} diff --git a/samples/server/petstore/cpp-restbed/api/PetApi.cpp b/samples/server/petstore/cpp-restbed/api/PetApi.cpp index 2d25c503385..7057a0f3e37 100644 --- a/samples/server/petstore/cpp-restbed/api/PetApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/PetApi.cpp @@ -118,7 +118,7 @@ void PetApiPetResource::PUT_method_handler(const std::shared_ptrget_path_parameter("petId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; @@ -225,7 +225,7 @@ void PetApiPetPetIdResource::POST_method_handler(const std::shared_ptrget_path_parameter("petId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; diff --git a/samples/server/petstore/cpp-restbed/api/StoreApi.cpp b/samples/server/petstore/cpp-restbed/api/StoreApi.cpp index b3e0a63e85c..7a7b189c311 100644 --- a/samples/server/petstore/cpp-restbed/api/StoreApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/StoreApi.cpp @@ -100,7 +100,7 @@ void StoreApiStoreOrderOrderIdResource::GET_method_handler(const std::shared_ptr // Getting the path params const int64_t orderId = request->get_path_parameter("orderId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; diff --git a/samples/server/petstore/cpp-restbed/api/UserApi.cpp b/samples/server/petstore/cpp-restbed/api/UserApi.cpp index 74dadb906bd..08c9acbc391 100644 --- a/samples/server/petstore/cpp-restbed/api/UserApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/UserApi.cpp @@ -253,7 +253,7 @@ void UserApiUserUsernameResource::GET_method_handler(const std::shared_ptrget_path_parameter("username", ""); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; @@ -292,7 +292,7 @@ void UserApiUserUsernameResource::PUT_method_handler(const std::shared_ptrget_path_parameter("username", ""); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; From 131cf94fe4a03e79abc992e2cf3560a9174c5d2e Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Wed, 12 Sep 2018 19:19:45 -0400 Subject: [PATCH 70/74] [gradle plugin] Support Gradle 4.10 (#1011) * Support Gradle 4.10 Gradle 4.10 is bundled with Kotlin 1.60 and Kotlin DSL 1.0-rc1. The new Kotlin DSL isn't binary compatible with the `tasks` registration used in this plugin. Updating to Kotlin DSL 1.0-rc1 with no other changes would require users to update to Gradle 4.10. As a workaround, I've modified the tasks registration being done in OpenApiGeneratorPlugin.kt, so rather than using the Kotlin DSL's invoke, it creates tasks manually against the TasksContainer. This works locally with Gradle 4.7+ for all scenarios in the sample (samples/local-spec). There may be edge cases that I'm unaware of, and we may want to consider defining the minimum supported Gradle version of 4.10 in the next major version of openapi-generator-gradle-plugin if we experience those cases. * Uncomment snapshots repo (commented it during local testing) * update pom.xml for exec gradle plugin --- .../openapi-generator-gradle-plugin/build.gradle | 4 ++-- .../gradle/wrapper/gradle-wrapper.properties | 2 +- modules/openapi-generator-gradle-plugin/pom.xml | 2 +- .../samples/local-spec/README.md | 2 +- .../gradle/plugin/OpenApiGeneratorPlugin.kt | 14 ++++++++------ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/openapi-generator-gradle-plugin/build.gradle b/modules/openapi-generator-gradle-plugin/build.gradle index c639b67a162..5f09ef12209 100644 --- a/modules/openapi-generator-gradle-plugin/build.gradle +++ b/modules/openapi-generator-gradle-plugin/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.2.41' + ext.kotlin_version = '1.2.60' repositories { mavenCentral() maven { @@ -14,7 +14,7 @@ buildscript { } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "gradle.plugin.org.gradle.kotlin:gradle-kotlin-dsl-plugins:0.17.5" + classpath "gradle.plugin.org.gradle.kotlin:gradle-kotlin-dsl-plugins:1.0-rc-3" } } diff --git a/modules/openapi-generator-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/modules/openapi-generator-gradle-plugin/gradle/wrapper/gradle-wrapper.properties index 16d28051c9c..1a26d006851 100644 --- a/modules/openapi-generator-gradle-plugin/gradle/wrapper/gradle-wrapper.properties +++ b/modules/openapi-generator-gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-rc-1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/modules/openapi-generator-gradle-plugin/pom.xml b/modules/openapi-generator-gradle-plugin/pom.xml index f455a6bfe6e..f9676bc74ea 100644 --- a/modules/openapi-generator-gradle-plugin/pom.xml +++ b/modules/openapi-generator-gradle-plugin/pom.xml @@ -54,7 +54,7 @@ gradle-maven-plugin 1.0.8 - 4.7 + 4.10-rc-1 -P openApiGeneratorVersion=${project.version} diff --git a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md index c55e8814d87..92605e6d186 100644 --- a/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md +++ b/modules/openapi-generator-gradle-plugin/samples/local-spec/README.md @@ -17,5 +17,5 @@ gradle generateGoWithInvalidSpec The samples can be tested against other versions of the plugin using the `openApiGeneratorVersion` property. For example: ```bash -gradle -PopenApiGeneratorVersion=3.2.3 openApiValidate +gradle -PopenApiGeneratorVersion=3.3.0 openApiValidate ``` diff --git a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt index b4a2089c11b..fc40080f515 100644 --- a/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt +++ b/modules/openapi-generator-gradle-plugin/src/main/kotlin/org/openapitools/generator/gradle/plugin/OpenApiGeneratorPlugin.kt @@ -18,7 +18,6 @@ package org.openapitools.generator.gradle.plugin import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.kotlin.dsl.invoke import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorGenerateExtension import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorMetaExtension import org.openapitools.generator.gradle.plugin.extensions.OpenApiGeneratorValidateExtension @@ -56,12 +55,13 @@ class OpenApiGeneratorPlugin : Plugin { generate.outputDir.set("$buildDir/generate-resources/main") - tasks { - "openApiGenerators"(GeneratorsTask::class) { + tasks.apply { + create("openApiGenerators", GeneratorsTask::class.java) { group = pluginGroup description = "Lists generators available via Open API Generators." } - "openApiMeta"(MetaTask::class) { + + create("openApiMeta", MetaTask::class.java) { group = pluginGroup description = "Generates a new generator to be consumed via Open API Generator." @@ -69,13 +69,15 @@ class OpenApiGeneratorPlugin : Plugin { packageName.set(meta.packageName) outputFolder.set(meta.outputFolder) } - "openApiValidate"(ValidateTask::class) { + + create("openApiValidate", ValidateTask::class.java) { group = pluginGroup description = "Validates an Open API 2.0 or 3.x specification document." inputSpec.set(validate.inputSpec) } - "openApiGenerate"(GenerateTask::class) { + + create("openApiGenerate", GenerateTask::class.java) { group = pluginGroup description = "Generate code via Open API Tools Generator for Open API 2.0 or 3.x specification documents." From 096ac567ce69b3d0225356b983d7435634cb477e Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 13 Sep 2018 09:21:39 +0800 Subject: [PATCH 71/74] Revert "[C++][Restbed] Fix default values for Restbed Server generator" (#1027) * Revert "[gradle plugin] Support Gradle 4.10 (#1011)" This reverts commit 131cf94fe4a03e79abc992e2cf3560a9174c5d2e. * Revert "[C++][Restbed] Fix default values for Restbed Server generator (#761)" This reverts commit f29ba97e8bb13598708db7ea2ee7a5288ad1bd0c. --- .../openapitools/codegen/DefaultCodegen.java | 5 +- .../languages/CppRestbedServerCodegen.java | 65 ++++--------------- .../cpp-restbed-server/api-source.mustache | 14 ++-- .../petstore/cpp-restbed/api/PetApi.cpp | 6 +- .../petstore/cpp-restbed/api/StoreApi.cpp | 2 +- .../petstore/cpp-restbed/api/UserApi.cpp | 4 +- 6 files changed, 27 insertions(+), 69 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 2ec323a37c0..d7115b9c8db 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2742,8 +2742,9 @@ public class DefaultCodegen implements CodegenConfig { } // set default value - codegenParameter.defaultValue = toDefaultValue(parameterSchema); - + if (parameterSchema.getDefault() != null) { + codegenParameter.defaultValue = toDefaultValue(parameterSchema); + } // TDOO revise collectionFormat String collectionFormat = null; if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java index 31c9a6a3c1a..028eee1467f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java @@ -25,19 +25,15 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.*; import org.openapitools.codegen.utils.ModelUtils; import io.swagger.v3.oas.models.media.*; -import org.slf4j.LoggerFactory; public class CppRestbedServerCodegen extends AbstractCppCodegen { - private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(CppRestbedServerCodegen.class); - public static final String DECLSPEC = "declspec"; public static final String DEFAULT_INCLUDE = "defaultInclude"; @@ -291,63 +287,25 @@ public class CppRestbedServerCodegen extends AbstractCppCodegen { @Override public String toDefaultValue(Schema p) { if (ModelUtils.isStringSchema(p)) { - if (p.getDefault() != null) { - return "\"" + p.getDefault().toString() + "\""; - } else { - return "\"\""; - } + return "\"\""; } else if (ModelUtils.isBooleanSchema(p)) { - if (p.getDefault() != null) { - return p.getDefault().toString(); - } else { - return "false"; - } + return "false"; } else if (ModelUtils.isDateSchema(p)) { - if (p.getDefault() != null) { - return "\"" + p.getDefault().toString() + "\""; - } else { - return "\"\""; - } + return "\"\""; } else if (ModelUtils.isDateTimeSchema(p)) { - if (p.getDefault() != null) { - return "\"" + p.getDefault().toString() + "\""; - } else { - return "\"\""; - } + return "\"\""; } else if (ModelUtils.isNumberSchema(p)) { - if (ModelUtils.isFloatSchema(p)) { // float - if (p.getDefault() != null) { - return p.getDefault().toString() + "f"; - } else { - return "0.0f"; - } - } else { // double - if (p.getDefault() != null) { - return p.getDefault().toString(); - } else { - return "0.0"; - } + if (ModelUtils.isFloatSchema(p)) { + return "0.0f"; } + return "0.0"; } else if (ModelUtils.isIntegerSchema(p)) { - if (ModelUtils.isLongSchema(p)) { // long - if (p.getDefault() != null) { - return p.getDefault().toString() + "L"; - } else { - return "0L"; - } - } else { // integer - if (p.getDefault() != null) { - return p.getDefault().toString(); - } else { - return "0"; - } + if (ModelUtils.isLongSchema(p)) { + return "0L"; } + return "0"; } else if (ModelUtils.isByteArraySchema(p)) { - if (p.getDefault() != null) { - return "\"" + p.getDefault().toString() + "\""; - } else { - return "\"\""; - } + return "\"\""; } else if (ModelUtils.isMapSchema(p)) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; @@ -361,7 +319,6 @@ public class CppRestbedServerCodegen extends AbstractCppCodegen { } else if (!StringUtils.isEmpty(p.get$ref())) { return "new " + toModelName(ModelUtils.getSimpleRef(p.get$ref())) + "()"; } - return "nullptr"; } diff --git a/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache b/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache index ccd81ee02ef..35196da731d 100644 --- a/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-restbed-server/api-source.mustache @@ -75,7 +75,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the path params {{#pathParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{{defaultValue}}}); + const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/pathParams}} {{/hasPathParams}} @@ -84,7 +84,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the query params {{#queryParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{{defaultValue}}}); + const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/queryParams}} {{/hasQueryParams}} @@ -93,7 +93,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the headers {{#headerParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{{defaultValue}}}); + const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/headerParams}} {{/hasHeaderParams}} @@ -140,7 +140,7 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the path params {{#pathParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_path_parameter("{{paramName}}", {{{defaultValue}}}); + const {{dataType}} {{paramName}} = request->get_path_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/pathParams}} {{/hasPathParams}} @@ -149,16 +149,16 @@ void {{classname}}{{vendorExtensions.x-codegen-resourceName}}Resource::{{httpMet // Getting the query params {{#queryParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_query_parameter("{{paramName}}", {{{defaultValue}}}); + const {{dataType}} {{paramName}} = request->get_query_parameter("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/queryParams}} {{/hasQueryParams}} - + {{#hasHeaderParams}} // Getting the headers {{#headerParams}} {{#isPrimitiveType}} - const {{{dataType}}} {{{paramName}}} = request->get_header("{{paramName}}", {{{defaultValue}}}); + const {{dataType}} {{paramName}} = request->get_header("{{paramName}}", {{#isString}}""{{/isString}}{{#isInteger}}0{{/isInteger}}{{#isLong}}0L{{/isLong}}{{#isFloat}}0.0f{{/isFloat}}{{#isDouble}}0.0{{/isDouble}}); {{/isPrimitiveType}} {{/headerParams}} {{/hasHeaderParams}} diff --git a/samples/server/petstore/cpp-restbed/api/PetApi.cpp b/samples/server/petstore/cpp-restbed/api/PetApi.cpp index 7057a0f3e37..2d25c503385 100644 --- a/samples/server/petstore/cpp-restbed/api/PetApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/PetApi.cpp @@ -118,7 +118,7 @@ void PetApiPetResource::PUT_method_handler(const std::shared_ptrget_path_parameter("petId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; @@ -225,7 +225,7 @@ void PetApiPetPetIdResource::POST_method_handler(const std::shared_ptrget_path_parameter("petId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; diff --git a/samples/server/petstore/cpp-restbed/api/StoreApi.cpp b/samples/server/petstore/cpp-restbed/api/StoreApi.cpp index 7a7b189c311..b3e0a63e85c 100644 --- a/samples/server/petstore/cpp-restbed/api/StoreApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/StoreApi.cpp @@ -100,7 +100,7 @@ void StoreApiStoreOrderOrderIdResource::GET_method_handler(const std::shared_ptr // Getting the path params const int64_t orderId = request->get_path_parameter("orderId", 0L); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; diff --git a/samples/server/petstore/cpp-restbed/api/UserApi.cpp b/samples/server/petstore/cpp-restbed/api/UserApi.cpp index 08c9acbc391..74dadb906bd 100644 --- a/samples/server/petstore/cpp-restbed/api/UserApi.cpp +++ b/samples/server/petstore/cpp-restbed/api/UserApi.cpp @@ -253,7 +253,7 @@ void UserApiUserUsernameResource::GET_method_handler(const std::shared_ptrget_path_parameter("username", ""); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; @@ -292,7 +292,7 @@ void UserApiUserUsernameResource::PUT_method_handler(const std::shared_ptrget_path_parameter("username", ""); - + // Change the value of this variable to the appropriate response before sending the response int status_code = 200; From 95302efdfc9b90d37894a1ca4e231bd02bd893d0 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 13 Sep 2018 10:32:09 +0800 Subject: [PATCH 72/74] Add option to set Feign version (#1005) * Add option to set Feign version * add java feign 9x to CI * update usage for Play * fix duplicated artifactId --- CI/pom.xml.circleci | 1 + bin/java-petstore-all.sh | 1 + bin/java-petstore-feign-10x.json | 5 + bin/java-petstore-feign-10x.sh | 40 ++ bin/java-petstore-feign-9x.json | 5 + bin/java-petstore-feign.json | 4 +- bin/java-petstore-feign.sh | 4 +- .../codegen/languages/JavaClientCodegen.java | 33 +- .../client/petstore/java/feign/build.gradle | 2 +- samples/client/petstore/java/feign/build.sbt | 6 +- samples/client/petstore/java/feign/pom.xml | 2 +- .../org/openapitools/client/auth/OAuth.java | 3 +- .../client/petstore/java/feign10x/.gitignore | 21 + .../java/feign10x/.openapi-generator-ignore | 23 ++ .../java/feign10x/.openapi-generator/VERSION | 1 + .../client/petstore/java/feign10x/.travis.yml | 17 + .../client/petstore/java/feign10x/README.md | 43 ++ .../petstore/java/feign10x/build.gradle | 119 ++++++ .../client/petstore/java/feign10x/build.sbt | 26 ++ .../client/petstore/java/feign10x/git_push.sh | 52 +++ .../petstore/java/feign10x/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53639 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + samples/client/petstore/java/feign10x/gradlew | 160 ++++++++ .../client/petstore/java/feign10x/gradlew.bat | 90 +++++ samples/client/petstore/java/feign10x/pom.xml | 278 +++++++++++++ .../petstore/java/feign10x/settings.gradle | 1 + .../feign10x/src/main/AndroidManifest.xml | 3 + .../org/openapitools/client/ApiClient.java | 336 +++++++++++++++ .../client/CustomInstantDeserializer.java | 232 +++++++++++ .../openapitools/client/EncodingUtils.java | 86 ++++ .../openapitools/client/ParamExpander.java | 22 + .../client/RFC3339DateFormat.java | 32 ++ .../org/openapitools/client/StringUtil.java | 61 +++ .../client/api/AnotherFakeApi.java | 30 ++ .../org/openapitools/client/api/FakeApi.java | 273 +++++++++++++ .../client/api/FakeClassnameTags123Api.java | 30 ++ .../org/openapitools/client/api/PetApi.java | 200 +++++++++ .../org/openapitools/client/api/StoreApi.java | 64 +++ .../org/openapitools/client/api/UserApi.java | 149 +++++++ .../openapitools/client/auth/ApiKeyAuth.java | 41 ++ .../client/auth/HttpBasicAuth.java | 41 ++ .../org/openapitools/client/auth/OAuth.java | 198 +++++++++ .../openapitools/client/auth/OAuthFlow.java | 18 + .../model/AdditionalPropertiesClass.java | 133 ++++++ .../org/openapitools/client/model/Animal.java | 122 ++++++ .../openapitools/client/model/AnimalFarm.java | 66 +++ .../model/ArrayOfArrayOfNumberOnly.java | 102 +++++ .../client/model/ArrayOfNumberOnly.java | 102 +++++ .../openapitools/client/model/ArrayTest.java | 164 ++++++++ .../client/model/Capitalization.java | 206 ++++++++++ .../org/openapitools/client/model/Cat.java | 93 +++++ .../openapitools/client/model/Category.java | 114 ++++++ .../openapitools/client/model/ClassModel.java | 92 +++++ .../org/openapitools/client/model/Client.java | 91 +++++ .../org/openapitools/client/model/Dog.java | 93 +++++ .../openapitools/client/model/EnumArrays.java | 194 +++++++++ .../openapitools/client/model/EnumClass.java | 59 +++ .../openapitools/client/model/EnumTest.java | 328 +++++++++++++++ .../client/model/FileSchemaTestClass.java | 124 ++++++ .../openapitools/client/model/FormatTest.java | 382 ++++++++++++++++++ .../client/model/HasOnlyReadOnly.java | 96 +++++ .../openapitools/client/model/MapTest.java | 223 ++++++++++ ...ropertiesAndAdditionalPropertiesClass.java | 151 +++++++ .../client/model/Model200Response.java | 115 ++++++ .../client/model/ModelApiResponse.java | 137 +++++++ .../client/model/ModelReturn.java | 92 +++++ .../org/openapitools/client/model/Name.java | 143 +++++++ .../openapitools/client/model/NumberOnly.java | 92 +++++ .../org/openapitools/client/model/Order.java | 244 +++++++++++ .../client/model/OuterComposite.java | 138 +++++++ .../openapitools/client/model/OuterEnum.java | 59 +++ .../org/openapitools/client/model/Pet.java | 260 ++++++++++++ .../client/model/ReadOnlyFirst.java | 105 +++++ .../client/model/SpecialModelName.java | 91 +++++ .../client/model/StringBooleanMap.java | 65 +++ .../org/openapitools/client/model/Tag.java | 114 ++++++ .../org/openapitools/client/model/User.java | 252 ++++++++++++ .../openapitools/client/StringUtilTest.java | 33 ++ .../client/api/AnotherFakeApiTest.java | 40 ++ .../openapitools/client/api/FakeApiTest.java | 249 ++++++++++++ .../api/FakeClassnameTags123ApiTest.java | 40 ++ .../openapitools/client/api/PetApiTest.java | 193 +++++++++ .../openapitools/client/api/StoreApiTest.java | 81 ++++ .../openapitools/client/api/UserApiTest.java | 156 +++++++ 85 files changed, 8380 insertions(+), 15 deletions(-) create mode 100644 bin/java-petstore-feign-10x.json create mode 100755 bin/java-petstore-feign-10x.sh create mode 100644 bin/java-petstore-feign-9x.json create mode 100644 samples/client/petstore/java/feign10x/.gitignore create mode 100644 samples/client/petstore/java/feign10x/.openapi-generator-ignore create mode 100644 samples/client/petstore/java/feign10x/.openapi-generator/VERSION create mode 100644 samples/client/petstore/java/feign10x/.travis.yml create mode 100644 samples/client/petstore/java/feign10x/README.md create mode 100644 samples/client/petstore/java/feign10x/build.gradle create mode 100644 samples/client/petstore/java/feign10x/build.sbt create mode 100644 samples/client/petstore/java/feign10x/git_push.sh create mode 100644 samples/client/petstore/java/feign10x/gradle.properties create mode 100644 samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.properties create mode 100644 samples/client/petstore/java/feign10x/gradlew create mode 100644 samples/client/petstore/java/feign10x/gradlew.bat create mode 100644 samples/client/petstore/java/feign10x/pom.xml create mode 100644 samples/client/petstore/java/feign10x/settings.gradle create mode 100644 samples/client/petstore/java/feign10x/src/main/AndroidManifest.xml create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ApiClient.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/CustomInstantDeserializer.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/EncodingUtils.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ParamExpander.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/RFC3339DateFormat.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/StringUtil.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/AnotherFakeApi.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeApi.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/PetApi.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/StoreApi.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/UserApi.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/HttpBasicAuth.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuth.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuthFlow.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Animal.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AnimalFarm.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayTest.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Capitalization.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Cat.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Category.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ClassModel.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Client.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Dog.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumArrays.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumClass.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumTest.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FormatTest.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MapTest.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Model200Response.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelApiResponse.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelReturn.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Name.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/NumberOnly.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Order.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterComposite.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterEnum.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Pet.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/SpecialModelName.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/StringBooleanMap.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Tag.java create mode 100644 samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/User.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/StringUtilTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeApiTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/PetApiTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/StoreApiTest.java create mode 100644 samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/UserApiTest.java diff --git a/CI/pom.xml.circleci b/CI/pom.xml.circleci index 55c91d839bd..00192038cb4 100644 --- a/CI/pom.xml.circleci +++ b/CI/pom.xml.circleci @@ -891,6 +891,7 @@ samples/client/petstore/scalaz samples/client/petstore/clojure samples/client/petstore/java/feign + samples/client/petstore/java/feign10x samples/client/petstore/java/jersey1 samples/client/petstore/java/jersey2 samples/client/petstore/java/jersey2-java8 diff --git a/bin/java-petstore-all.sh b/bin/java-petstore-all.sh index 190bf33fa5b..b51ecebf178 100755 --- a/bin/java-petstore-all.sh +++ b/bin/java-petstore-all.sh @@ -4,6 +4,7 @@ ./bin/java-petstore-jersey1.sh ./bin/java-petstore-jersey2.sh ./bin/java-petstore-feign.sh +./bin/java-petstore-feign-10x.sh ./bin/java-petstore-okhttp-gson.sh ./bin/java-petstore-okhttp-gson-parcelable.sh ./bin/java-petstore-retrofit.sh diff --git a/bin/java-petstore-feign-10x.json b/bin/java-petstore-feign-10x.json new file mode 100644 index 00000000000..d8f09eb65a4 --- /dev/null +++ b/bin/java-petstore-feign-10x.json @@ -0,0 +1,5 @@ +{ + "library": "feign", + "artifactId": "petstore-feign-10x", + "feignVersion": "10.x" +} diff --git a/bin/java-petstore-feign-10x.sh b/bin/java-petstore-feign-10x.sh new file mode 100755 index 00000000000..43e0db98caf --- /dev/null +++ b/bin/java-petstore-feign-10x.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +SCRIPT="$0" +echo "# START SCRIPT: $SCRIPT" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn -B clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="generate -t modules/openapi-generator/src/main/resources/Java/libraries/feign -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g java -c bin/java-petstore-feign-10x.json -o samples/client/petstore/java/feign10x -DhideGenerationTimestamp=true -DbooleanGetterPrefix=is $@" + +echo "Removing files and folders under samples/client/petstore/java/feign10x/src/main" +rm -rf samples/client/petstore/java/feign10x/src/main +find samples/client/petstore/java/feign10x -maxdepth 1 -type f ! -name "README.md" -exec rm {} + +java $JAVA_OPTS -jar $executable $ags + +# copy additional manually written unit-tests +mkdir samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client + +cp CI/samples.ci/client/petstore/java/test-manual/common/StringUtilTest.java samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/StringUtilTest.java diff --git a/bin/java-petstore-feign-9x.json b/bin/java-petstore-feign-9x.json new file mode 100644 index 00000000000..3508a4521ce --- /dev/null +++ b/bin/java-petstore-feign-9x.json @@ -0,0 +1,5 @@ +{ + "library": "feign", + "artifactId": "petstore-feign", + "feignVersion": "9.x" +} diff --git a/bin/java-petstore-feign.json b/bin/java-petstore-feign.json index f294b7bb682..187612c699c 100644 --- a/bin/java-petstore-feign.json +++ b/bin/java-petstore-feign.json @@ -1,7 +1,5 @@ { "library": "feign", "artifactId": "petstore-feign", - "additionalProperties": { - "useFeign10": true - } + "feignVersion": "10.x" } diff --git a/bin/java-petstore-feign.sh b/bin/java-petstore-feign.sh index dc4eac30983..2d8dc143244 100755 --- a/bin/java-petstore-feign.sh +++ b/bin/java-petstore-feign.sh @@ -27,7 +27,7 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="generate -t modules/openapi-generator/src/main/resources/Java/libraries/feign -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g java -c bin/java-petstore-feign.json -o samples/client/petstore/java/feign -DhideGenerationTimestamp=true -DbooleanGetterPrefix=is $@" +ags="generate -t modules/openapi-generator/src/main/resources/Java/libraries/feign -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g java -c bin/java-petstore-feign-9x.json -o samples/client/petstore/java/feign -DhideGenerationTimestamp=true -DbooleanGetterPrefix=is $@" echo "Removing files and folders under samples/client/petstore/java/feign/src/main" rm -rf samples/client/petstore/java/feign/src/main @@ -37,4 +37,4 @@ java $JAVA_OPTS -jar $executable $ags # copy additional manually written unit-tests mkdir samples/client/petstore/java/feign/src/test/java/org/openapitools/client -cp CI/samples.ci/client/petstore/java/test-manual/common/StringUtilTest.java samples/client/petstore/java/feign/src/test/java/org/openapitools/client/StringUtilTest.java \ No newline at end of file +cp CI/samples.ci/client/petstore/java/test-manual/common/StringUtilTest.java samples/client/petstore/java/feign/src/test/java/org/openapitools/client/StringUtilTest.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index fa943553e5f..302e4cc4be2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -60,6 +60,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen public static final String DO_NOT_USE_RX = "doNotUseRx"; public static final String USE_PLAY_WS = "usePlayWS"; public static final String PLAY_VERSION = "playVersion"; + public static final String FEIGN_VERSION = "feignVersion"; public static final String PARCELABLE_MODEL = "parcelableModel"; public static final String USE_RUNTIME_EXCEPTION = "useRuntimeException"; @@ -67,6 +68,9 @@ public class JavaClientCodegen extends AbstractJavaCodegen public static final String PLAY_25 = "play25"; public static final String PLAY_26 = "play26"; + public static final String FEIGN_9 = "9.x"; + public static final String FEIGN_10 = "10.x"; + public static final String FEIGN = "feign"; public static final String GOOGLE_API_CLIENT = "google-api-client"; public static final String JERSEY1 = "jersey1"; @@ -86,6 +90,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen protected boolean doNotUseRx = true; // backwards compatibility for swagger configs that specify neither rx1 nor rx2 (mustache does not allow for boolean operators so we need this extra field) protected boolean usePlayWS = false; protected String playVersion = PLAY_25; + protected String feignVersion = FEIGN_9; protected boolean parcelableModel = false; protected boolean useBeanValidation = false; protected boolean performBeanValidation = false; @@ -106,15 +111,16 @@ public class JavaClientCodegen extends AbstractJavaCodegen cliOptions.add(CliOption.newBoolean(USE_RX_JAVA2, "Whether to use the RxJava2 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\")")); + cliOptions.add(CliOption.newString(PLAY_VERSION, "Version of Play! Framework (possible values \"play24\", \"play25\" (default), \"play26\")")); cliOptions.add(CliOption.newBoolean(SUPPORT_JAVA6, "Whether to support Java6 with the Jersey1 library.")); cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations")); cliOptions.add(CliOption.newBoolean(PERFORM_BEANVALIDATION, "Perform BeanValidation")); cliOptions.add(CliOption.newBoolean(USE_GZIP_FEATURE, "Send gzip-encoded requests")); cliOptions.add(CliOption.newBoolean(USE_RUNTIME_EXCEPTION, "Use RuntimeException instead of Exception")); + cliOptions.add(CliOption.newBoolean(FEIGN_VERSION, "Version of OpenFeign: '10.x', '9.x' (default)")); supportedLibraries.put(JERSEY1, "HTTP client: Jersey client 1.19.4. JSON processing: Jackson 2.8.9. Enable Java6 support using '-DsupportJava6=true'. Enable gzip request encoding using '-DuseGzipFeature=true'."); - supportedLibraries.put(FEIGN, "HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.8.9"); + supportedLibraries.put(FEIGN, "HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.8.9. To enable OpenFeign 10.x, set the 'feignVersion' option to '10.x'"); supportedLibraries.put(JERSEY2, "HTTP client: Jersey client 2.25.1. JSON processing: Jackson 2.8.9"); supportedLibraries.put(OKHTTP_GSON, "HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.8.1. Enable Parcelable models on Android using '-DparcelableModel=true'. Enable gzip request encoding using '-DuseGzipFeature=true'."); supportedLibraries.put(RETROFIT_1, "HTTP client: OkHttp 2.7.5. JSON processing: Gson 2.3.1 (Retrofit 1.9.0). IMPORTANT NOTE: retrofit1.x is no longer actively maintained so please upgrade to 'retrofit2' instead."); @@ -147,7 +153,7 @@ public class JavaClientCodegen extends AbstractJavaCodegen @Override public String getHelp() { - return "Generates a Java client library."; + return "Generates a Java client library (HTTP lib: Jersey (1.x, 2.x), Retrofit (1.x, 2.x), OpenFeign (9.x, 10.x) and more."; } @Override @@ -158,6 +164,7 @@ 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)) { @@ -169,6 +176,8 @@ public class JavaClientCodegen extends AbstractJavaCodegen if (!useRxJava && !useRxJava2) { additionalProperties.put(DO_NOT_USE_RX, true); } + + // Java Play if (additionalProperties.containsKey(USE_PLAY_WS)) { this.setUsePlayWS(Boolean.valueOf(additionalProperties.get(USE_PLAY_WS).toString())); } @@ -179,6 +188,20 @@ public class JavaClientCodegen extends AbstractJavaCodegen } additionalProperties.put(PLAY_VERSION, playVersion); + // OpenFeign + if (additionalProperties.containsKey(FEIGN_VERSION)) { + this.setFeignVersion(additionalProperties.get(FEIGN_VERSION).toString()); + + if ("10.x".equals(feignVersion)) { + additionalProperties.put("useFeign10", true); + } else if ("9.x".equals(feignVersion)) { + // do nothing as 9.x is the default + } else { + throw new RuntimeException("Ivalid feignOoption '{}'. Must be '10.x' or '9.x'."); + } + } + additionalProperties.put(FEIGN_VERSION, feignVersion); + if (additionalProperties.containsKey(PARCELABLE_MODEL)) { this.setParcelableModel(Boolean.valueOf(additionalProperties.get(PARCELABLE_MODEL).toString())); } @@ -579,6 +602,10 @@ public class JavaClientCodegen extends AbstractJavaCodegen this.playVersion = playVersion; } + public void setFeignVersion(String feignVersion) { + this.feignVersion = feignVersion; + } + public void setParcelableModel(boolean parcelableModel) { this.parcelableModel = parcelableModel; } diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle index 885747dfe2e..e2126b12432 100644 --- a/samples/client/petstore/java/feign/build.gradle +++ b/samples/client/petstore/java/feign/build.gradle @@ -97,7 +97,7 @@ ext { swagger_annotations_version = "1.5.21" jackson_version = "2.8.7" threepane_version = "2.6.4" - feign_version = "10.0.1" + feign_version = "9.4.0" feign_form_version = "2.1.0" junit_version = "4.12" oltu_version = "1.0.1" diff --git a/samples/client/petstore/java/feign/build.sbt b/samples/client/petstore/java/feign/build.sbt index b60ee6257cd..b387ad56e61 100644 --- a/samples/client/petstore/java/feign/build.sbt +++ b/samples/client/petstore/java/feign/build.sbt @@ -10,9 +10,9 @@ lazy val root = (project in file(".")). resolvers += Resolver.mavenLocal, libraryDependencies ++= Seq( "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", - "io.github.openfeign" % "feign-core" % "10.0.1" % "compile", - "io.github.openfeign" % "feign-jackson" % "10.0.1" % "compile", - "io.github.openfeign" % "feign-slf4j" % "10.0.1" % "compile", + "io.github.openfeign" % "feign-core" % "9.4.0" % "compile", + "io.github.openfeign" % "feign-jackson" % "9.4.0" % "compile", + "io.github.openfeign" % "feign-slf4j" % "9.4.0" % "compile", "io.github.openfeign.form" % "feign-form" % "2.1.0" % "compile", "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7" % "compile", "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.7" % "compile", diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml index 86f20428528..58b7d4d7e0e 100644 --- a/samples/client/petstore/java/feign/pom.xml +++ b/samples/client/petstore/java/feign/pom.xml @@ -267,7 +267,7 @@ ${java.version} ${java.version} 1.5.21 - 10.0.1 + 9.4.0 2.1.0 2.8.9 2.6.4 diff --git a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java index 75c86a7d61b..25593a0784a 100644 --- a/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java +++ b/samples/client/petstore/java/feign/src/main/java/org/openapitools/client/auth/OAuth.java @@ -19,7 +19,6 @@ import org.apache.oltu.oauth2.common.message.types.GrantType; import org.apache.oltu.oauth2.common.token.BasicOAuthToken; import feign.Client; -import feign.Request.HttpMethod; import feign.Request.Options; import feign.RequestInterceptor; import feign.RequestTemplate; @@ -93,7 +92,7 @@ public class OAuth implements RequestInterceptor { try { accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); } catch (Exception e) { - throw new RetryableException(e.getMessage(), HttpMethod.POST, e, null); + throw new RetryableException(e.getMessage(), e,null); } if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); diff --git a/samples/client/petstore/java/feign10x/.gitignore b/samples/client/petstore/java/feign10x/.gitignore new file mode 100644 index 00000000000..a530464afa1 --- /dev/null +++ b/samples/client/petstore/java/feign10x/.gitignore @@ -0,0 +1,21 @@ +*.class + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# exclude jar for gradle wrapper +!gradle/wrapper/*.jar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# build files +**/target +target +.gradle +build diff --git a/samples/client/petstore/java/feign10x/.openapi-generator-ignore b/samples/client/petstore/java/feign10x/.openapi-generator-ignore new file mode 100644 index 00000000000..7484ee590a3 --- /dev/null +++ b/samples/client/petstore/java/feign10x/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/java/feign10x/.openapi-generator/VERSION b/samples/client/petstore/java/feign10x/.openapi-generator/VERSION new file mode 100644 index 00000000000..6d94c9c2e12 --- /dev/null +++ b/samples/client/petstore/java/feign10x/.openapi-generator/VERSION @@ -0,0 +1 @@ +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/java/feign10x/.travis.yml b/samples/client/petstore/java/feign10x/.travis.yml new file mode 100644 index 00000000000..80a7f2fc66c --- /dev/null +++ b/samples/client/petstore/java/feign10x/.travis.yml @@ -0,0 +1,17 @@ +# +# Generated by: https://openapi-generator.tech +# +language: java +jdk: + - oraclejdk8 + - oraclejdk7 +before_install: + # ensure gradlew has proper permission + - chmod a+x ./gradlew +script: + # test using maven + - mvn test + # uncomment below to test using gradle + # - gradle test + # uncomment below to test using sbt + # - sbt test diff --git a/samples/client/petstore/java/feign10x/README.md b/samples/client/petstore/java/feign10x/README.md new file mode 100644 index 00000000000..646dfdc4e2b --- /dev/null +++ b/samples/client/petstore/java/feign10x/README.md @@ -0,0 +1,43 @@ +# petstore-feign + +## Requirements + +Building the API client library requires [Maven](https://maven.apache.org/) to be installed. + +## Installation & Usage + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn deploy +``` + +Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. + +After the client library is installed/deployed, you can use it in your Maven project by adding the following to your *pom.xml*: + +```xml + + org.openapitools + petstore-feign + 1.0.0 + compile + + +``` + +## Recommendation + +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issues. + +## Author + + + + diff --git a/samples/client/petstore/java/feign10x/build.gradle b/samples/client/petstore/java/feign10x/build.gradle new file mode 100644 index 00000000000..fb153ad6e2b --- /dev/null +++ b/samples/client/petstore/java/feign10x/build.gradle @@ -0,0 +1,119 @@ +apply plugin: 'idea' +apply plugin: 'eclipse' + +group = 'org.openapitools' +version = '1.0.0' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.+' + classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 25 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = 'petstore-feign-10x' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.21" + jackson_version = "2.8.7" + threepane_version = "2.6.4" + feign_version = "10.0.1" + feign_form_version = "2.1.0" + junit_version = "4.12" + oltu_version = "1.0.1" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "io.github.openfeign:feign-core:$feign_version" + compile "io.github.openfeign:feign-jackson:$feign_version" + compile "io.github.openfeign:feign-slf4j:$feign_version" + compile "io.github.openfeign.form:feign-form:$feign_form_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.github.joschi.jackson:jackson-datatype-threetenbp:$threepane_version" + compile "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version" + compile "com.brsanthu:migbase64:2.2" + testCompile "junit:junit:$junit_version" +} diff --git a/samples/client/petstore/java/feign10x/build.sbt b/samples/client/petstore/java/feign10x/build.sbt new file mode 100644 index 00000000000..89fecfb0655 --- /dev/null +++ b/samples/client/petstore/java/feign10x/build.sbt @@ -0,0 +1,26 @@ +lazy val root = (project in file(".")). + settings( + organization := "org.openapitools", + name := "petstore-feign-10x", + version := "1.0.0", + scalaVersion := "2.11.4", + scalacOptions ++= Seq("-feature"), + javacOptions in compile ++= Seq("-Xlint:deprecation"), + publishArtifact in (Compile, packageDoc) := false, + resolvers += Resolver.mavenLocal, + libraryDependencies ++= Seq( + "io.swagger" % "swagger-annotations" % "1.5.21" % "compile", + "io.github.openfeign" % "feign-core" % "10.0.1" % "compile", + "io.github.openfeign" % "feign-jackson" % "10.0.1" % "compile", + "io.github.openfeign" % "feign-slf4j" % "10.0.1" % "compile", + "io.github.openfeign.form" % "feign-form" % "2.1.0" % "compile", + "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7" % "compile", + "com.fasterxml.jackson.core" % "jackson-annotations" % "2.8.7" % "compile", + "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.7" % "compile", + "com.fasterxml.jackson.datatype" % "jackson-datatype-joda" % "2.8.7" % "compile", + "org.apache.oltu.oauth2" % "org.apache.oltu.oauth2.client" % "1.0.1" % "compile", + "com.brsanthu" % "migbase64" % "2.2" % "compile", + "junit" % "junit" % "4.12" % "test", + "com.novocode" % "junit-interface" % "0.10" % "test" + ) + ) diff --git a/samples/client/petstore/java/feign10x/git_push.sh b/samples/client/petstore/java/feign10x/git_push.sh new file mode 100644 index 00000000000..8442b80bb44 --- /dev/null +++ b/samples/client/petstore/java/feign10x/git_push.sh @@ -0,0 +1,52 @@ +#!/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-pestore-perl "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + 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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/samples/client/petstore/java/feign10x/gradle.properties b/samples/client/petstore/java/feign10x/gradle.properties new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/samples/client/petstore/java/feign10x/gradle.properties @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.jar b/samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2c6137b87896c8f70315ae454e00a969ef5f6019 GIT binary patch literal 53639 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 F{{tUq7iIte literal 0 HcmV?d00001 diff --git a/samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.properties b/samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..b7a36473955 --- /dev/null +++ b/samples/client/petstore/java/feign10x/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 17 23:08:05 CST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-bin.zip diff --git a/samples/client/petstore/java/feign10x/gradlew b/samples/client/petstore/java/feign10x/gradlew new file mode 100644 index 00000000000..9d82f789151 --- /dev/null +++ b/samples/client/petstore/java/feign10x/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/client/petstore/java/feign10x/gradlew.bat b/samples/client/petstore/java/feign10x/gradlew.bat new file mode 100644 index 00000000000..5f192121eb4 --- /dev/null +++ b/samples/client/petstore/java/feign10x/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/client/petstore/java/feign10x/pom.xml b/samples/client/petstore/java/feign10x/pom.xml new file mode 100644 index 00000000000..6ff244e2384 --- /dev/null +++ b/samples/client/petstore/java/feign10x/pom.xml @@ -0,0 +1,278 @@ + + 4.0.0 + org.openapitools + petstore-feign-10x + jar + petstore-feign-10x + 1.0.0 + https://github.com/openapitools/openapi-generator + OpenAPI Java + + scm:git:git@github.com:openapitools/openapi-generator.git + scm:git:git@github.com:openapitools/openapi-generator.git + https://github.com/openapitools/openapi-generator + + + + + Unlicense + http://www.apache.org/licenses/LICENSE-2.0.html + repo + + + + + + OpenAPI + team@openapitools.org + OpenAPI + http://openapitools.org + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M1 + + + enforce-maven + + enforce + + + + + 2.2.0 + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + + + sign-artifacts + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + io.github.openfeign + feign-core + ${feign-version} + + + io.github.openfeign + feign-jackson + ${feign-version} + + + io.github.openfeign + feign-slf4j + ${feign-version} + + + io.github.openfeign.form + feign-form + ${feign-form-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.github.joschi.jackson + jackson-datatype-threetenbp + ${jackson-threetenbp-version} + + + org.apache.oltu.oauth2 + org.apache.oltu.oauth2.client + ${oltu-version} + + + + + junit + junit + ${junit-version} + test + + + com.squareup.okhttp3 + mockwebserver + 3.6.0 + test + + + org.assertj + assertj-core + 1.7.1 + test + + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + 1.5.21 + 10.0.1 + 2.1.0 + 2.8.9 + 2.6.4 + 4.12 + 1.0.0 + 1.0.1 + + diff --git a/samples/client/petstore/java/feign10x/settings.gradle b/samples/client/petstore/java/feign10x/settings.gradle new file mode 100644 index 00000000000..659467b7f43 --- /dev/null +++ b/samples/client/petstore/java/feign10x/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "petstore-feign-10x" \ No newline at end of file diff --git a/samples/client/petstore/java/feign10x/src/main/AndroidManifest.xml b/samples/client/petstore/java/feign10x/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..54fbcb3da1e --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ApiClient.java new file mode 100644 index 00000000000..1ba11f9c0a9 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ApiClient.java @@ -0,0 +1,336 @@ +package org.openapitools.client; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.oltu.oauth2.client.request.OAuthClientRequest.AuthenticationRequestBuilder; +import org.apache.oltu.oauth2.client.request.OAuthClientRequest.TokenRequestBuilder; +import org.threeten.bp.*; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; + +import feign.Feign; +import feign.RequestInterceptor; +import feign.form.FormEncoder; +import feign.jackson.JacksonDecoder; +import feign.jackson.JacksonEncoder; +import feign.slf4j.Slf4jLogger; +import org.openapitools.client.auth.*; +import org.openapitools.client.auth.OAuth.AccessTokenListener; + + +public class ApiClient { + public interface Api {} + + protected ObjectMapper objectMapper; + private String basePath = "http://petstore.swagger.io:80/v2"; + private Map apiAuthorizations; + private Feign.Builder feignBuilder; + + public ApiClient() { + objectMapper = createObjectMapper(); + apiAuthorizations = new LinkedHashMap(); + feignBuilder = Feign.builder() + .encoder(new FormEncoder(new JacksonEncoder(objectMapper))) + .decoder(new JacksonDecoder(objectMapper)) + .logger(new Slf4jLogger()); + } + + public ApiClient(String[] authNames) { + this(); + for(String authName : authNames) { + RequestInterceptor auth; + if ("api_key".equals(authName)) { + auth = new ApiKeyAuth("header", "api_key"); + } else if ("api_key_query".equals(authName)) { + auth = new ApiKeyAuth("query", "api_key_query"); + } else if ("http_basic_test".equals(authName)) { + auth = new HttpBasicAuth(); + } else if ("petstore_auth".equals(authName)) { + auth = new OAuth(OAuthFlow.implicit, "http://petstore.swagger.io/api/oauth/dialog", "", "write:pets, read:pets"); + } else { + throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names"); + } + addAuthorization(authName, auth); + } + } + + /** + * Basic constructor for single auth name + * @param authName + */ + public ApiClient(String authName) { + this(new String[]{authName}); + } + + /** + * Helper constructor for single api key + * @param authName + * @param apiKey + */ + public ApiClient(String authName, String apiKey) { + this(authName); + this.setApiKey(apiKey); + } + + /** + * Helper constructor for single basic auth or password oauth2 + * @param authName + * @param username + * @param password + */ + public ApiClient(String authName, String username, String password) { + this(authName); + this.setCredentials(username, password); + } + + /** + * Helper constructor for single password oauth2 + * @param authName + * @param clientId + * @param secret + * @param username + * @param password + */ + public ApiClient(String authName, String clientId, String secret, String username, String password) { + this(authName); + this.getTokenEndPoint() + .setClientId(clientId) + .setClientSecret(secret) + .setUsername(username) + .setPassword(password); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + public Map getApiAuthorizations() { + return apiAuthorizations; + } + + public void setApiAuthorizations(Map apiAuthorizations) { + this.apiAuthorizations = apiAuthorizations; + } + + public Feign.Builder getFeignBuilder() { + return feignBuilder; + } + + public ApiClient setFeignBuilder(Feign.Builder feignBuilder) { + this.feignBuilder = feignBuilder; + return this; + } + + private ObjectMapper createObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + objectMapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setDateFormat(new RFC3339DateFormat()); + ThreeTenModule module = new ThreeTenModule(); + module.addDeserializer(Instant.class, CustomInstantDeserializer.INSTANT); + module.addDeserializer(OffsetDateTime.class, CustomInstantDeserializer.OFFSET_DATE_TIME); + module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME); + objectMapper.registerModule(module); + return objectMapper; + } + + public ObjectMapper getObjectMapper(){ + return objectMapper; + } + + /** + * Creates a feign client for given API interface. + * + * Usage: + * ApiClient apiClient = new ApiClient(); + * apiClient.setBasePath("http://localhost:8080"); + * XYZApi api = apiClient.buildClient(XYZApi.class); + * XYZResponse response = api.someMethod(...); + * @param Type + * @param clientClass Client class + * @return The Client + */ + public T buildClient(Class clientClass) { + return feignBuilder.target(clientClass, basePath); + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } + + /** + * Helper method to configure the first api key found + * @param apiKey API key + */ + public void setApiKey(String apiKey) { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof ApiKeyAuth) { + ApiKeyAuth keyAuth = (ApiKeyAuth) apiAuthorization; + keyAuth.setApiKey(apiKey); + return ; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to configure the username/password for basic auth or password OAuth + * @param username Username + * @param password Password + */ + public void setCredentials(String username, String password) { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof HttpBasicAuth) { + HttpBasicAuth basicAuth = (HttpBasicAuth) apiAuthorization; + basicAuth.setCredentials(username, password); + return; + } + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + oauth.getTokenRequestBuilder().setUsername(username).setPassword(password); + return; + } + } + throw new RuntimeException("No Basic authentication or OAuth configured!"); + } + + /** + * Helper method to configure the token endpoint of the first oauth found in the apiAuthorizations (there should be only one) + * @return Token request builder + */ + public TokenRequestBuilder getTokenEndPoint() { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + return oauth.getTokenRequestBuilder(); + } + } + return null; + } + + /** + * Helper method to configure authorization endpoint of the first oauth found in the apiAuthorizations (there should be only one) + * @return Authentication request builder + */ + public AuthenticationRequestBuilder getAuthorizationEndPoint() { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + return oauth.getAuthenticationRequestBuilder(); + } + } + return null; + } + + /** + * Helper method to pre-set the oauth access token of the first oauth found in the apiAuthorizations (there should be only one) + * @param accessToken Access Token + * @param expiresIn Validity period in seconds + */ + public void setAccessToken(String accessToken, Long expiresIn) { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + oauth.setAccessToken(accessToken, expiresIn); + return; + } + } + } + + /** + * Helper method to configure the oauth accessCode/implicit flow parameters + * @param clientId Client ID + * @param clientSecret Client secret + * @param redirectURI Redirect URI + */ + public void configureAuthorizationFlow(String clientId, String clientSecret, String redirectURI) { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + oauth.getTokenRequestBuilder() + .setClientId(clientId) + .setClientSecret(clientSecret) + .setRedirectURI(redirectURI); + oauth.getAuthenticationRequestBuilder() + .setClientId(clientId) + .setRedirectURI(redirectURI); + return; + } + } + } + + /** + * Configures a listener which is notified when a new access token is received. + * @param accessTokenListener Acesss token listener + */ + public void registerAccessTokenListener(AccessTokenListener accessTokenListener) { + for(RequestInterceptor apiAuthorization : apiAuthorizations.values()) { + if (apiAuthorization instanceof OAuth) { + OAuth oauth = (OAuth) apiAuthorization; + oauth.registerAccessTokenListener(accessTokenListener); + return; + } + } + } + + /** + * Gets request interceptor based on authentication name + * @param authName Authentiation name + * @return Request Interceptor + */ + public RequestInterceptor getAuthorization(String authName) { + return apiAuthorizations.get(authName); + } + + /** + * Adds an authorization to be used by the client + * @param authName Authentication name + * @param authorization Request interceptor + */ + public void addAuthorization(String authName, RequestInterceptor authorization) { + if (apiAuthorizations.containsKey(authName)) { + throw new RuntimeException("auth name \"" + authName + "\" already in api authorizations"); + } + apiAuthorizations.put(authName, authorization); + feignBuilder.requestInterceptor(authorization); + } + +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/CustomInstantDeserializer.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/CustomInstantDeserializer.java new file mode 100644 index 00000000000..7e115295be6 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/CustomInstantDeserializer.java @@ -0,0 +1,232 @@ +package org.openapitools.client; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonTokenId; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.datatype.threetenbp.DateTimeUtils; +import com.fasterxml.jackson.datatype.threetenbp.DecimalUtils; +import com.fasterxml.jackson.datatype.threetenbp.deser.ThreeTenDateTimeDeserializerBase; +import com.fasterxml.jackson.datatype.threetenbp.function.BiFunction; +import com.fasterxml.jackson.datatype.threetenbp.function.Function; +import org.threeten.bp.DateTimeException; +import org.threeten.bp.Instant; +import org.threeten.bp.OffsetDateTime; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.format.DateTimeFormatter; +import org.threeten.bp.temporal.Temporal; +import org.threeten.bp.temporal.TemporalAccessor; + +import java.io.IOException; +import java.math.BigDecimal; + +/** + * Deserializer for ThreeTen temporal {@link Instant}s, {@link OffsetDateTime}, and {@link ZonedDateTime}s. + * Adapted from the jackson threetenbp InstantDeserializer to add support for deserializing rfc822 format. + * + * @author Nick Williams + */ +public class CustomInstantDeserializer + extends ThreeTenDateTimeDeserializerBase { + private static final long serialVersionUID = 1L; + + public static final CustomInstantDeserializer INSTANT = new CustomInstantDeserializer( + Instant.class, DateTimeFormatter.ISO_INSTANT, + new Function() { + @Override + public Instant apply(TemporalAccessor temporalAccessor) { + return Instant.from(temporalAccessor); + } + }, + new Function() { + @Override + public Instant apply(FromIntegerArguments a) { + return Instant.ofEpochMilli(a.value); + } + }, + new Function() { + @Override + public Instant apply(FromDecimalArguments a) { + return Instant.ofEpochSecond(a.integer, a.fraction); + } + }, + null + ); + + public static final CustomInstantDeserializer OFFSET_DATE_TIME = new CustomInstantDeserializer( + OffsetDateTime.class, DateTimeFormatter.ISO_OFFSET_DATE_TIME, + new Function() { + @Override + public OffsetDateTime apply(TemporalAccessor temporalAccessor) { + return OffsetDateTime.from(temporalAccessor); + } + }, + new Function() { + @Override + public OffsetDateTime apply(FromIntegerArguments a) { + return OffsetDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId); + } + }, + new Function() { + @Override + public OffsetDateTime apply(FromDecimalArguments a) { + return OffsetDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId); + } + }, + new BiFunction() { + @Override + public OffsetDateTime apply(OffsetDateTime d, ZoneId z) { + return d.withOffsetSameInstant(z.getRules().getOffset(d.toLocalDateTime())); + } + } + ); + + public static final CustomInstantDeserializer ZONED_DATE_TIME = new CustomInstantDeserializer( + ZonedDateTime.class, DateTimeFormatter.ISO_ZONED_DATE_TIME, + new Function() { + @Override + public ZonedDateTime apply(TemporalAccessor temporalAccessor) { + return ZonedDateTime.from(temporalAccessor); + } + }, + new Function() { + @Override + public ZonedDateTime apply(FromIntegerArguments a) { + return ZonedDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId); + } + }, + new Function() { + @Override + public ZonedDateTime apply(FromDecimalArguments a) { + return ZonedDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId); + } + }, + new BiFunction() { + @Override + public ZonedDateTime apply(ZonedDateTime zonedDateTime, ZoneId zoneId) { + return zonedDateTime.withZoneSameInstant(zoneId); + } + } + ); + + protected final Function fromMilliseconds; + + protected final Function fromNanoseconds; + + protected final Function parsedToValue; + + protected final BiFunction adjust; + + protected CustomInstantDeserializer(Class supportedType, + DateTimeFormatter parser, + Function parsedToValue, + Function fromMilliseconds, + Function fromNanoseconds, + BiFunction adjust) { + super(supportedType, parser); + this.parsedToValue = parsedToValue; + this.fromMilliseconds = fromMilliseconds; + this.fromNanoseconds = fromNanoseconds; + this.adjust = adjust == null ? new BiFunction() { + @Override + public T apply(T t, ZoneId zoneId) { + return t; + } + } : adjust; + } + + @SuppressWarnings("unchecked") + protected CustomInstantDeserializer(CustomInstantDeserializer base, DateTimeFormatter f) { + super((Class) base.handledType(), f); + parsedToValue = base.parsedToValue; + fromMilliseconds = base.fromMilliseconds; + fromNanoseconds = base.fromNanoseconds; + adjust = base.adjust; + } + + @Override + protected JsonDeserializer withDateFormat(DateTimeFormatter dtf) { + if (dtf == _formatter) { + return this; + } + return new CustomInstantDeserializer(this, dtf); + } + + @Override + public T deserialize(JsonParser parser, DeserializationContext context) throws IOException { + //NOTE: Timestamps contain no timezone info, and are always in configured TZ. Only + //string values have to be adjusted to the configured TZ. + switch (parser.getCurrentTokenId()) { + case JsonTokenId.ID_NUMBER_FLOAT: { + BigDecimal value = parser.getDecimalValue(); + long seconds = value.longValue(); + int nanoseconds = DecimalUtils.extractNanosecondDecimal(value, seconds); + return fromNanoseconds.apply(new FromDecimalArguments( + seconds, nanoseconds, getZone(context))); + } + + case JsonTokenId.ID_NUMBER_INT: { + long timestamp = parser.getLongValue(); + if (context.isEnabled(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)) { + return this.fromNanoseconds.apply(new FromDecimalArguments( + timestamp, 0, this.getZone(context) + )); + } + return this.fromMilliseconds.apply(new FromIntegerArguments( + timestamp, this.getZone(context) + )); + } + + case JsonTokenId.ID_STRING: { + String string = parser.getText().trim(); + if (string.length() == 0) { + return null; + } + if (string.endsWith("+0000")) { + string = string.substring(0, string.length() - 5) + "Z"; + } + T value; + try { + TemporalAccessor acc = _formatter.parse(string); + value = parsedToValue.apply(acc); + if (context.isEnabled(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)) { + return adjust.apply(value, this.getZone(context)); + } + } catch (DateTimeException e) { + throw _peelDTE(e); + } + return value; + } + } + throw context.mappingException("Expected type float, integer, or string."); + } + + private ZoneId getZone(DeserializationContext context) { + // Instants are always in UTC, so don't waste compute cycles + return (_valueClass == Instant.class) ? null : DateTimeUtils.timeZoneToZoneId(context.getTimeZone()); + } + + private static class FromIntegerArguments { + public final long value; + public final ZoneId zoneId; + + private FromIntegerArguments(long value, ZoneId zoneId) { + this.value = value; + this.zoneId = zoneId; + } + } + + private static class FromDecimalArguments { + public final long integer; + public final int fraction; + public final ZoneId zoneId; + + private FromDecimalArguments(long integer, int fraction, ZoneId zoneId) { + this.integer = integer; + this.fraction = fraction; + this.zoneId = zoneId; + } + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/EncodingUtils.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/EncodingUtils.java new file mode 100644 index 00000000000..1b061a1972f --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/EncodingUtils.java @@ -0,0 +1,86 @@ +package org.openapitools.client; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** +* Utilities to support Swagger encoding formats in Feign. +*/ +public final class EncodingUtils { + + /** + * Private constructor. Do not construct this class. + */ + private EncodingUtils() {} + + /** + *

Encodes a collection of query parameters according to the Swagger + * collection format.

+ * + *

Of the various collection formats defined by Swagger ("csv", "tsv", + * etc), Feign only natively supports "multi". This utility generates the + * other format types so it will be properly processed by Feign.

+ * + *

Note, as part of reformatting, it URL encodes the parameters as + * well.

+ * @param parameters The collection object to be formatted. This object will + * not be changed. + * @param collectionFormat The Swagger collection format (eg, "csv", "tsv", + * "pipes"). See the + *
+ * OpenAPI Spec for more details. + * @return An object that will be correctly formatted by Feign. + */ + public static Object encodeCollection(Collection parameters, + String collectionFormat) { + if (parameters == null) { + return parameters; + } + List stringValues = new ArrayList<>(parameters.size()); + for (Object parameter : parameters) { + // ignore null values (same behavior as Feign) + if (parameter != null) { + stringValues.add(encode(parameter)); + } + } + // Feign natively handles single-element lists and the "multi" format. + if (stringValues.size() < 2 || "multi".equals(collectionFormat)) { + return stringValues; + } + // Otherwise return a formatted String + String[] stringArray = stringValues.toArray(new String[0]); + switch (collectionFormat) { + case "csv": + default: + return StringUtil.join(stringArray, ","); + case "ssv": + return StringUtil.join(stringArray, " "); + case "tsv": + return StringUtil.join(stringArray, "\t"); + case "pipes": + return StringUtil.join(stringArray, "|"); + } + } + + /** + * URL encode a single query parameter. + * @param parameter The query parameter to encode. This object will not be + * changed. + * @return The URL encoded string representation of the parameter. If the + * parameter is null, returns null. + */ + public static String encode(Object parameter) { + if (parameter == null) { + return null; + } + try { + return URLEncoder.encode(parameter.toString(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + // Should never happen, UTF-8 is always supported + throw new RuntimeException(e); + } + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ParamExpander.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ParamExpander.java new file mode 100644 index 00000000000..2331d87fdbd --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/ParamExpander.java @@ -0,0 +1,22 @@ +package org.openapitools.client; + +import feign.Param; + +import java.text.DateFormat; +import java.util.Date; + +/** + * Param Expander to convert {@link Date} to RFC3339 + */ +public class ParamExpander implements Param.Expander { + + private static final DateFormat dateformat = new RFC3339DateFormat(); + + @Override + public String expand(Object value) { + if (value instanceof Date) { + return dateformat.format(value); + } + return value.toString(); + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/RFC3339DateFormat.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/RFC3339DateFormat.java new file mode 100644 index 00000000000..4ed672bced9 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/RFC3339DateFormat.java @@ -0,0 +1,32 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +package org.openapitools.client; + +import com.fasterxml.jackson.databind.util.ISO8601DateFormat; +import com.fasterxml.jackson.databind.util.ISO8601Utils; + +import java.text.FieldPosition; +import java.util.Date; + + +public class RFC3339DateFormat extends ISO8601DateFormat { + + // Same as ISO8601DateFormat but serializing milliseconds. + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + String value = ISO8601Utils.format(date, true); + toAppendTo.append(value); + return toAppendTo; + } + +} \ No newline at end of file diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/StringUtil.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/StringUtil.java new file mode 100644 index 00000000000..c51b3bcf661 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/StringUtil.java @@ -0,0 +1,61 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client; + + +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) { + return true; + } + if (value != null && value.equalsIgnoreCase(str)) { + return true; + } + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) { + return ""; + } + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/AnotherFakeApi.java new file mode 100644 index 00000000000..f41fb1dec4f --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/AnotherFakeApi.java @@ -0,0 +1,30 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import org.openapitools.client.model.Client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface AnotherFakeApi extends ApiClient.Api { + + + /** + * To test special tags + * To test special tags and operation ID starting with number + * @param client client model (required) + * @return Client + */ + @RequestLine("PATCH /another-fake/dummy") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + Client call123testSpecialTags(Client client); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeApi.java new file mode 100644 index 00000000000..4f644cb493c --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeApi.java @@ -0,0 +1,273 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import java.math.BigDecimal; +import org.openapitools.client.model.Client; +import java.io.File; +import org.openapitools.client.model.FileSchemaTestClass; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; +import org.openapitools.client.model.OuterComposite; +import org.openapitools.client.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface FakeApi extends ApiClient.Api { + + + /** + * + * Test serialization of outer boolean types + * @param body Input boolean as post body (optional) + * @return Boolean + */ + @RequestLine("POST /fake/outer/boolean") + @Headers({ + "Content-Type: */*", + "Accept: */*", + }) + Boolean fakeOuterBooleanSerialize(Boolean body); + + /** + * + * Test serialization of object with outer number type + * @param outerComposite Input composite as post body (optional) + * @return OuterComposite + */ + @RequestLine("POST /fake/outer/composite") + @Headers({ + "Content-Type: */*", + "Accept: */*", + }) + OuterComposite fakeOuterCompositeSerialize(OuterComposite outerComposite); + + /** + * + * Test serialization of outer number types + * @param body Input number as post body (optional) + * @return BigDecimal + */ + @RequestLine("POST /fake/outer/number") + @Headers({ + "Content-Type: */*", + "Accept: */*", + }) + BigDecimal fakeOuterNumberSerialize(BigDecimal body); + + /** + * + * Test serialization of outer string types + * @param body Input string as post body (optional) + * @return String + */ + @RequestLine("POST /fake/outer/string") + @Headers({ + "Content-Type: */*", + "Accept: */*", + }) + String fakeOuterStringSerialize(String body); + + /** + * + * For this test, the body for this request much reference a schema named `File`. + * @param fileSchemaTestClass (required) + */ + @RequestLine("PUT /fake/body-with-file-schema") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass); + + /** + * + * + * @param query (required) + * @param user (required) + */ + @RequestLine("PUT /fake/body-with-query-params?query={query}") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void testBodyWithQueryParams(@Param("query") String query, User user); + + /** + * + * + * Note, this is equivalent to the other testBodyWithQueryParams method, + * but with the query parameters collected into a single Map parameter. This + * is convenient for services with optional query parameters, especially when + * used with the {@link TestBodyWithQueryParamsQueryParams} class that allows for + * building up this map in a fluent style. + * @param user (required) + * @param queryParams Map of query parameters as name-value pairs + *

The following elements may be specified in the query map:

+ *
    + *
  • query - (required)
  • + *
+ */ + @RequestLine("PUT /fake/body-with-query-params?query={query}") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void testBodyWithQueryParams(User user, @QueryMap(encoded=true) Map queryParams); + + /** + * A convenience class for generating query parameters for the + * testBodyWithQueryParams method in a fluent style. + */ + public static class TestBodyWithQueryParamsQueryParams extends HashMap { + public TestBodyWithQueryParamsQueryParams query(final String value) { + put("query", EncodingUtils.encode(value)); + return this; + } + } + + /** + * To test \"client\" model + * To test \"client\" model + * @param client client model (required) + * @return Client + */ + @RequestLine("PATCH /fake") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + Client testClientModel(Client client); + + /** + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * @param number None (required) + * @param _double None (required) + * @param patternWithoutDelimiter None (required) + * @param _byte None (required) + * @param integer None (optional, default to null) + * @param int32 None (optional, default to null) + * @param int64 None (optional, default to null) + * @param _float None (optional, default to null) + * @param string None (optional, default to null) + * @param binary None (optional, default to null) + * @param date None (optional, default to null) + * @param dateTime None (optional, default to null) + * @param password None (optional, default to null) + * @param paramCallback None (optional, default to null) + */ + @RequestLine("POST /fake") + @Headers({ + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json", + }) + void testEndpointParameters(@Param("number") BigDecimal number, @Param("_double") Double _double, @Param("patternWithoutDelimiter") String patternWithoutDelimiter, @Param("_byte") byte[] _byte, @Param("integer") Integer integer, @Param("int32") Integer int32, @Param("int64") Long int64, @Param("_float") Float _float, @Param("string") String string, @Param("binary") File binary, @Param("date") LocalDate date, @Param("dateTime") OffsetDateTime dateTime, @Param("password") String password, @Param("paramCallback") String paramCallback); + + /** + * To test enum parameters + * To test enum parameters + * @param enumHeaderStringArray Header parameter enum test (string array) (optional) + * @param enumHeaderString Header parameter enum test (string) (optional, default to -efg) + * @param enumQueryStringArray Query parameter enum test (string array) (optional) + * @param enumQueryString Query parameter enum test (string) (optional, default to -efg) + * @param enumQueryInteger Query parameter enum test (double) (optional) + * @param enumQueryDouble Query parameter enum test (double) (optional) + * @param enumFormStringArray Form parameter enum test (string array) (optional, default to $) + * @param enumFormString Form parameter enum test (string) (optional, default to -efg) + */ + @RequestLine("GET /fake?enum_query_string_array={enumQueryStringArray}&enum_query_string={enumQueryString}&enum_query_integer={enumQueryInteger}&enum_query_double={enumQueryDouble}") + @Headers({ + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json", + "enum_header_string_array: {enumHeaderStringArray}", + + "enum_header_string: {enumHeaderString}" + }) + void testEnumParameters(@Param("enumHeaderStringArray") List enumHeaderStringArray, @Param("enumHeaderString") String enumHeaderString, @Param("enumQueryStringArray") List enumQueryStringArray, @Param("enumQueryString") String enumQueryString, @Param("enumQueryInteger") Integer enumQueryInteger, @Param("enumQueryDouble") Double enumQueryDouble, @Param("enumFormStringArray") List enumFormStringArray, @Param("enumFormString") String enumFormString); + + /** + * To test enum parameters + * To test enum parameters + * Note, this is equivalent to the other testEnumParameters method, + * but with the query parameters collected into a single Map parameter. This + * is convenient for services with optional query parameters, especially when + * used with the {@link TestEnumParametersQueryParams} class that allows for + * building up this map in a fluent style. + * @param enumHeaderStringArray Header parameter enum test (string array) (optional) + * @param enumHeaderString Header parameter enum test (string) (optional, default to -efg) + * @param enumFormStringArray Form parameter enum test (string array) (optional, default to $) + * @param enumFormString Form parameter enum test (string) (optional, default to -efg) + * @param queryParams Map of query parameters as name-value pairs + *

The following elements may be specified in the query map:

+ *
    + *
  • enumQueryStringArray - Query parameter enum test (string array) (optional)
  • + *
  • enumQueryString - Query parameter enum test (string) (optional, default to -efg)
  • + *
  • enumQueryInteger - Query parameter enum test (double) (optional)
  • + *
  • enumQueryDouble - Query parameter enum test (double) (optional)
  • + *
+ */ + @RequestLine("GET /fake?enum_query_string_array={enumQueryStringArray}&enum_query_string={enumQueryString}&enum_query_integer={enumQueryInteger}&enum_query_double={enumQueryDouble}") + @Headers({ + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json", + "enum_header_string_array: {enumHeaderStringArray}", + + "enum_header_string: {enumHeaderString}" + }) + void testEnumParameters(@Param("enumHeaderStringArray") List enumHeaderStringArray, @Param("enumHeaderString") String enumHeaderString, @Param("enumFormStringArray") List enumFormStringArray, @Param("enumFormString") String enumFormString, @QueryMap(encoded=true) Map queryParams); + + /** + * A convenience class for generating query parameters for the + * testEnumParameters method in a fluent style. + */ + public static class TestEnumParametersQueryParams extends HashMap { + public TestEnumParametersQueryParams enumQueryStringArray(final List value) { + put("enum_query_string_array", EncodingUtils.encodeCollection(value, "csv")); + return this; + } + public TestEnumParametersQueryParams enumQueryString(final String value) { + put("enum_query_string", EncodingUtils.encode(value)); + return this; + } + public TestEnumParametersQueryParams enumQueryInteger(final Integer value) { + put("enum_query_integer", EncodingUtils.encode(value)); + return this; + } + public TestEnumParametersQueryParams enumQueryDouble(final Double value) { + put("enum_query_double", EncodingUtils.encode(value)); + return this; + } + } + + /** + * test inline additionalProperties + * + * @param requestBody request body (required) + */ + @RequestLine("POST /fake/inline-additionalProperties") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void testInlineAdditionalProperties(Map requestBody); + + /** + * test json serialization of form data + * + * @param param field1 (required) + * @param param2 field2 (required) + */ + @RequestLine("GET /fake/jsonFormData") + @Headers({ + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json", + }) + void testJsonFormData(@Param("param") String param, @Param("param2") String param2); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java new file mode 100644 index 00000000000..5819866038b --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java @@ -0,0 +1,30 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import org.openapitools.client.model.Client; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface FakeClassnameTags123Api extends ApiClient.Api { + + + /** + * To test class name in snake case + * To test class name in snake case + * @param client client model (required) + * @return Client + */ + @RequestLine("PATCH /fake_classname_test") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + Client testClassname(Client client); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/PetApi.java new file mode 100644 index 00000000000..e7c2ded72fb --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/PetApi.java @@ -0,0 +1,200 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import java.io.File; +import org.openapitools.client.model.ModelApiResponse; +import org.openapitools.client.model.Pet; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface PetApi extends ApiClient.Api { + + + /** + * Add a new pet to the store + * + * @param pet Pet object that needs to be added to the store (required) + */ + @RequestLine("POST /pet") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void addPet(Pet pet); + + /** + * Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + */ + @RequestLine("DELETE /pet/{petId}") + @Headers({ + "Accept: application/json", + "api_key: {apiKey}" + }) + void deletePet(@Param("petId") Long petId, @Param("apiKey") String apiKey); + + /** + * Finds Pets by status + * Multiple status values can be provided with comma separated strings + * @param status Status values that need to be considered for filter (required) + * @return List<Pet> + */ + @RequestLine("GET /pet/findByStatus?status={status}") + @Headers({ + "Accept: application/json", + }) + List findPetsByStatus(@Param("status") List status); + + /** + * Finds Pets by status + * Multiple status values can be provided with comma separated strings + * Note, this is equivalent to the other findPetsByStatus method, + * but with the query parameters collected into a single Map parameter. This + * is convenient for services with optional query parameters, especially when + * used with the {@link FindPetsByStatusQueryParams} class that allows for + * building up this map in a fluent style. + * @param queryParams Map of query parameters as name-value pairs + *

The following elements may be specified in the query map:

+ *
    + *
  • status - Status values that need to be considered for filter (required)
  • + *
+ * @return List<Pet> + */ + @RequestLine("GET /pet/findByStatus?status={status}") + @Headers({ + "Accept: application/json", + }) + List findPetsByStatus(@QueryMap(encoded=true) Map queryParams); + + /** + * A convenience class for generating query parameters for the + * findPetsByStatus method in a fluent style. + */ + public static class FindPetsByStatusQueryParams extends HashMap { + public FindPetsByStatusQueryParams status(final List value) { + put("status", EncodingUtils.encodeCollection(value, "csv")); + return this; + } + } + + /** + * Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * @param tags Tags to filter by (required) + * @return List<Pet> + */ + @RequestLine("GET /pet/findByTags?tags={tags}") + @Headers({ + "Accept: application/json", + }) + List findPetsByTags(@Param("tags") List tags); + + /** + * Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * Note, this is equivalent to the other findPetsByTags method, + * but with the query parameters collected into a single Map parameter. This + * is convenient for services with optional query parameters, especially when + * used with the {@link FindPetsByTagsQueryParams} class that allows for + * building up this map in a fluent style. + * @param queryParams Map of query parameters as name-value pairs + *

The following elements may be specified in the query map:

+ *
    + *
  • tags - Tags to filter by (required)
  • + *
+ * @return List<Pet> + */ + @RequestLine("GET /pet/findByTags?tags={tags}") + @Headers({ + "Accept: application/json", + }) + List findPetsByTags(@QueryMap(encoded=true) Map queryParams); + + /** + * A convenience class for generating query parameters for the + * findPetsByTags method in a fluent style. + */ + public static class FindPetsByTagsQueryParams extends HashMap { + public FindPetsByTagsQueryParams tags(final List value) { + put("tags", EncodingUtils.encodeCollection(value, "csv")); + return this; + } + } + + /** + * Find pet by ID + * Returns a single pet + * @param petId ID of pet to return (required) + * @return Pet + */ + @RequestLine("GET /pet/{petId}") + @Headers({ + "Accept: application/json", + }) + Pet getPetById(@Param("petId") Long petId); + + /** + * Update an existing pet + * + * @param pet Pet object that needs to be added to the store (required) + */ + @RequestLine("PUT /pet") + @Headers({ + "Content-Type: application/json", + "Accept: application/json", + }) + void updatePet(Pet pet); + + /** + * Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional, default to null) + * @param status Updated status of the pet (optional, default to null) + */ + @RequestLine("POST /pet/{petId}") + @Headers({ + "Content-Type: application/x-www-form-urlencoded", + "Accept: application/json", + }) + void updatePetWithForm(@Param("petId") Long petId, @Param("name") String name, @Param("status") String status); + + /** + * uploads an image + * + * @param petId ID of pet to update (required) + * @param additionalMetadata Additional data to pass to server (optional, default to null) + * @param file file to upload (optional, default to null) + * @return ModelApiResponse + */ + @RequestLine("POST /pet/{petId}/uploadImage") + @Headers({ + "Content-Type: multipart/form-data", + "Accept: application/json", + }) + ModelApiResponse uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file); + + /** + * uploads an image (required) + * + * @param petId ID of pet to update (required) + * @param requiredFile file to upload (required) + * @param additionalMetadata Additional data to pass to server (optional, default to null) + * @return ModelApiResponse + */ + @RequestLine("POST /fake/{petId}/uploadImageWithRequiredFile") + @Headers({ + "Content-Type: multipart/form-data", + "Accept: application/json", + }) + ModelApiResponse uploadFileWithRequiredFile(@Param("petId") Long petId, @Param("requiredFile") File requiredFile, @Param("additionalMetadata") String additionalMetadata); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/StoreApi.java new file mode 100644 index 00000000000..164df7fcc30 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/StoreApi.java @@ -0,0 +1,64 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import org.openapitools.client.model.Order; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface StoreApi extends ApiClient.Api { + + + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param orderId ID of the order that needs to be deleted (required) + */ + @RequestLine("DELETE /store/order/{orderId}") + @Headers({ + "Accept: application/json", + }) + void deleteOrder(@Param("orderId") String orderId); + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @return Map<String, Integer> + */ + @RequestLine("GET /store/inventory") + @Headers({ + "Accept: application/json", + }) + Map getInventory(); + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param orderId ID of pet that needs to be fetched (required) + * @return Order + */ + @RequestLine("GET /store/order/{orderId}") + @Headers({ + "Accept: application/json", + }) + Order getOrderById(@Param("orderId") Long orderId); + + /** + * Place an order for a pet + * + * @param order order placed for purchasing the pet (required) + * @return Order + */ + @RequestLine("POST /store/order") + @Headers({ + "Content-Type: */*", + "Accept: application/json", + }) + Order placeOrder(Order order); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/UserApi.java new file mode 100644 index 00000000000..cb4a80decb6 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/api/UserApi.java @@ -0,0 +1,149 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.EncodingUtils; + +import org.openapitools.client.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.*; + + +public interface UserApi extends ApiClient.Api { + + + /** + * Create user + * This can only be done by the logged in user. + * @param user Created user object (required) + */ + @RequestLine("POST /user") + @Headers({ + "Content-Type: */*", + "Accept: application/json", + }) + void createUser(User user); + + /** + * Creates list of users with given input array + * + * @param user List of user object (required) + */ + @RequestLine("POST /user/createWithArray") + @Headers({ + "Content-Type: */*", + "Accept: application/json", + }) + void createUsersWithArrayInput(List user); + + /** + * Creates list of users with given input array + * + * @param user List of user object (required) + */ + @RequestLine("POST /user/createWithList") + @Headers({ + "Content-Type: */*", + "Accept: application/json", + }) + void createUsersWithListInput(List user); + + /** + * Delete user + * This can only be done by the logged in user. + * @param username The name that needs to be deleted (required) + */ + @RequestLine("DELETE /user/{username}") + @Headers({ + "Accept: application/json", + }) + void deleteUser(@Param("username") String username); + + /** + * Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return User + */ + @RequestLine("GET /user/{username}") + @Headers({ + "Accept: application/json", + }) + User getUserByName(@Param("username") String username); + + /** + * Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return String + */ + @RequestLine("GET /user/login?username={username}&password={password}") + @Headers({ + "Accept: application/json", + }) + String loginUser(@Param("username") String username, @Param("password") String password); + + /** + * Logs user into the system + * + * Note, this is equivalent to the other loginUser method, + * but with the query parameters collected into a single Map parameter. This + * is convenient for services with optional query parameters, especially when + * used with the {@link LoginUserQueryParams} class that allows for + * building up this map in a fluent style. + * @param queryParams Map of query parameters as name-value pairs + *

The following elements may be specified in the query map:

+ *
    + *
  • username - The user name for login (required)
  • + *
  • password - The password for login in clear text (required)
  • + *
+ * @return String + */ + @RequestLine("GET /user/login?username={username}&password={password}") + @Headers({ + "Accept: application/json", + }) + String loginUser(@QueryMap(encoded=true) Map queryParams); + + /** + * A convenience class for generating query parameters for the + * loginUser method in a fluent style. + */ + public static class LoginUserQueryParams extends HashMap { + public LoginUserQueryParams username(final String value) { + put("username", EncodingUtils.encode(value)); + return this; + } + public LoginUserQueryParams password(final String value) { + put("password", EncodingUtils.encode(value)); + return this; + } + } + + /** + * Logs out current logged in user session + * + */ + @RequestLine("GET /user/logout") + @Headers({ + "Accept: application/json", + }) + void logoutUser(); + + /** + * Updated user + * This can only be done by the logged in user. + * @param username name that need to be deleted (required) + * @param user Updated user object (required) + */ + @RequestLine("PUT /user/{username}") + @Headers({ + "Content-Type: */*", + "Accept: application/json", + }) + void updateUser(@Param("username") String username, User user); +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java new file mode 100644 index 00000000000..1ff60b8b7a4 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/ApiKeyAuth.java @@ -0,0 +1,41 @@ +package org.openapitools.client.auth; + +import feign.RequestInterceptor; +import feign.RequestTemplate; + +public class ApiKeyAuth implements RequestInterceptor { + private final String location; + private final String paramName; + + private String apiKey; + + public ApiKeyAuth(String location, String paramName) { + this.location = location; + this.paramName = paramName; + } + + public String getLocation() { + return location; + } + + public String getParamName() { + return paramName; + } + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + @Override + public void apply(RequestTemplate template) { + if ("query".equals(location)) { + template.query(paramName, apiKey); + } else if ("header".equals(location)) { + template.header(paramName, apiKey); + } + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/HttpBasicAuth.java new file mode 100644 index 00000000000..b275826472a --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/HttpBasicAuth.java @@ -0,0 +1,41 @@ +package org.openapitools.client.auth; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import feign.auth.BasicAuthRequestInterceptor; + +/** + * An interceptor that adds the request header needed to use HTTP basic authentication. + */ +public class HttpBasicAuth implements RequestInterceptor { + + private String username; + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setCredentials(String username, String password) { + this.username = username; + this.password = password; + } + + @Override + public void apply(RequestTemplate template) { + RequestInterceptor requestInterceptor = new BasicAuthRequestInterceptor(username, password); + requestInterceptor.apply(template); + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuth.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuth.java new file mode 100644 index 00000000000..75c86a7d61b --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuth.java @@ -0,0 +1,198 @@ +package org.openapitools.client.auth; + +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.oltu.oauth2.client.HttpClient; +import org.apache.oltu.oauth2.client.OAuthClient; +import org.apache.oltu.oauth2.client.request.OAuthClientRequest; +import org.apache.oltu.oauth2.client.request.OAuthClientRequest.AuthenticationRequestBuilder; +import org.apache.oltu.oauth2.client.request.OAuthClientRequest.TokenRequestBuilder; +import org.apache.oltu.oauth2.client.response.OAuthClientResponse; +import org.apache.oltu.oauth2.client.response.OAuthClientResponseFactory; +import org.apache.oltu.oauth2.client.response.OAuthJSONAccessTokenResponse; +import org.apache.oltu.oauth2.common.exception.OAuthProblemException; +import org.apache.oltu.oauth2.common.exception.OAuthSystemException; +import org.apache.oltu.oauth2.common.message.types.GrantType; +import org.apache.oltu.oauth2.common.token.BasicOAuthToken; + +import feign.Client; +import feign.Request.HttpMethod; +import feign.Request.Options; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import feign.Response; +import feign.RetryableException; +import feign.Util; +import org.openapitools.client.StringUtil; + + +public class OAuth implements RequestInterceptor { + + static final int MILLIS_PER_SECOND = 1000; + + public interface AccessTokenListener { + void notify(BasicOAuthToken token); + } + + private volatile String accessToken; + private Long expirationTimeMillis; + private OAuthClient oauthClient; + private TokenRequestBuilder tokenRequestBuilder; + private AuthenticationRequestBuilder authenticationRequestBuilder; + private AccessTokenListener accessTokenListener; + + public OAuth(Client client, TokenRequestBuilder requestBuilder) { + this.oauthClient = new OAuthClient(new OAuthFeignClient(client)); + this.tokenRequestBuilder = requestBuilder; + } + + public OAuth(Client client, OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) { + this(client, OAuthClientRequest.tokenLocation(tokenUrl).setScope(scopes)); + + switch(flow) { + case accessCode: + case implicit: + tokenRequestBuilder.setGrantType(GrantType.AUTHORIZATION_CODE); + break; + case password: + tokenRequestBuilder.setGrantType(GrantType.PASSWORD); + break; + case application: + tokenRequestBuilder.setGrantType(GrantType.CLIENT_CREDENTIALS); + break; + default: + break; + } + authenticationRequestBuilder = OAuthClientRequest.authorizationLocation(authorizationUrl); + } + + public OAuth(OAuthFlow flow, String authorizationUrl, String tokenUrl, String scopes) { + this(new Client.Default(null, null), flow, authorizationUrl, tokenUrl, scopes); + } + + @Override + public void apply(RequestTemplate template) { + // If the request already have an authorization (eg. Basic auth), do nothing + if (template.headers().containsKey("Authorization")) { + return; + } + // If first time, get the token + if (expirationTimeMillis == null || System.currentTimeMillis() >= expirationTimeMillis) { + updateAccessToken(); + } + if (getAccessToken() != null) { + template.header("Authorization", "Bearer " + getAccessToken()); + } + } + + public synchronized void updateAccessToken() { + OAuthJSONAccessTokenResponse accessTokenResponse; + try { + accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); + } catch (Exception e) { + throw new RetryableException(e.getMessage(), HttpMethod.POST, e, null); + } + if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { + setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); + if (accessTokenListener != null) { + accessTokenListener.notify((BasicOAuthToken) accessTokenResponse.getOAuthToken()); + } + } + } + + public synchronized void registerAccessTokenListener(AccessTokenListener accessTokenListener) { + this.accessTokenListener = accessTokenListener; + } + + public synchronized String getAccessToken() { + return accessToken; + } + + public synchronized void setAccessToken(String accessToken, Long expiresIn) { + this.accessToken = accessToken; + this.expirationTimeMillis = System.currentTimeMillis() + expiresIn * MILLIS_PER_SECOND; + } + + public TokenRequestBuilder getTokenRequestBuilder() { + return tokenRequestBuilder; + } + + public void setTokenRequestBuilder(TokenRequestBuilder tokenRequestBuilder) { + this.tokenRequestBuilder = tokenRequestBuilder; + } + + public AuthenticationRequestBuilder getAuthenticationRequestBuilder() { + return authenticationRequestBuilder; + } + + public void setAuthenticationRequestBuilder(AuthenticationRequestBuilder authenticationRequestBuilder) { + this.authenticationRequestBuilder = authenticationRequestBuilder; + } + + public OAuthClient getOauthClient() { + return oauthClient; + } + + public void setOauthClient(OAuthClient oauthClient) { + this.oauthClient = oauthClient; + } + + public void setOauthClient(Client client) { + this.oauthClient = new OAuthClient( new OAuthFeignClient(client)); + } + + public static class OAuthFeignClient implements HttpClient { + + private Client client; + + public OAuthFeignClient() { + this.client = new Client.Default(null, null); + } + + public OAuthFeignClient(Client client) { + this.client = client; + } + + public T execute(OAuthClientRequest request, Map headers, + String requestMethod, Class responseClass) + throws OAuthSystemException, OAuthProblemException { + + RequestTemplate req = new RequestTemplate() + .append(request.getLocationUri()) + .method(requestMethod) + .body(request.getBody()); + + for (Entry entry : headers.entrySet()) { + req.header(entry.getKey(), entry.getValue()); + } + Response feignResponse; + String body = ""; + try { + feignResponse = client.execute(req.request(), new Options()); + body = Util.toString(feignResponse.body().asReader()); + } catch (IOException e) { + throw new OAuthSystemException(e); + } + + String contentType = null; + Collection contentTypeHeader = feignResponse.headers().get("Content-Type"); + if(contentTypeHeader != null) { + contentType = StringUtil.join(contentTypeHeader.toArray(new String[0]), ";"); + } + + return OAuthClientResponseFactory.createCustomResponse( + body, + contentType, + feignResponse.status(), + responseClass + ); + } + + public void shutdown() { + // Nothing to do here + } + } +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuthFlow.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuthFlow.java new file mode 100644 index 00000000000..9bf8f9605c7 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/auth/OAuthFlow.java @@ -0,0 +1,18 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.auth; + +public enum OAuthFlow { + accessCode, implicit, password, application +} diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java new file mode 100644 index 00000000000..e1ada4c7d42 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java @@ -0,0 +1,133 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * AdditionalPropertiesClass + */ + +public class AdditionalPropertiesClass { + @JsonProperty("map_property") + private Map mapProperty = null; + + @JsonProperty("map_of_map_property") + private Map> mapOfMapProperty = null; + + public AdditionalPropertiesClass mapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + return this; + } + + public AdditionalPropertiesClass putMapPropertyItem(String key, String mapPropertyItem) { + if (this.mapProperty == null) { + this.mapProperty = new HashMap(); + } + this.mapProperty.put(key, mapPropertyItem); + return this; + } + + /** + * Get mapProperty + * @return mapProperty + **/ + @ApiModelProperty(value = "") + public Map getMapProperty() { + return mapProperty; + } + + public void setMapProperty(Map mapProperty) { + this.mapProperty = mapProperty; + } + + public AdditionalPropertiesClass mapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + return this; + } + + public AdditionalPropertiesClass putMapOfMapPropertyItem(String key, Map mapOfMapPropertyItem) { + if (this.mapOfMapProperty == null) { + this.mapOfMapProperty = new HashMap>(); + } + this.mapOfMapProperty.put(key, mapOfMapPropertyItem); + return this; + } + + /** + * Get mapOfMapProperty + * @return mapOfMapProperty + **/ + @ApiModelProperty(value = "") + public Map> getMapOfMapProperty() { + return mapOfMapProperty; + } + + public void setMapOfMapProperty(Map> mapOfMapProperty) { + this.mapOfMapProperty = mapOfMapProperty; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AdditionalPropertiesClass additionalPropertiesClass = (AdditionalPropertiesClass) o; + return Objects.equals(this.mapProperty, additionalPropertiesClass.mapProperty) && + Objects.equals(this.mapOfMapProperty, additionalPropertiesClass.mapOfMapProperty); + } + + @Override + public int hashCode() { + return Objects.hash(mapProperty, mapOfMapProperty); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AdditionalPropertiesClass {\n"); + + sb.append(" mapProperty: ").append(toIndentedString(mapProperty)).append("\n"); + sb.append(" mapOfMapProperty: ").append(toIndentedString(mapOfMapProperty)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Animal.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Animal.java new file mode 100644 index 00000000000..6819bd7fe7d --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Animal.java @@ -0,0 +1,122 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Animal + */ + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "className", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Dog.class, name = "Dog"), + @JsonSubTypes.Type(value = Cat.class, name = "Cat"), +}) + +public class Animal { + @JsonProperty("className") + private String className = null; + + @JsonProperty("color") + private String color = "red"; + + public Animal className(String className) { + this.className = className; + return this; + } + + /** + * Get className + * @return className + **/ + @ApiModelProperty(required = true, value = "") + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public Animal color(String color) { + this.color = color; + return this; + } + + /** + * Get color + * @return color + **/ + @ApiModelProperty(value = "") + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Animal animal = (Animal) o; + return Objects.equals(this.className, animal.className) && + Objects.equals(this.color, animal.color); + } + + @Override + public int hashCode() { + return Objects.hash(className, color); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Animal {\n"); + + sb.append(" className: ").append(toIndentedString(className)).append("\n"); + sb.append(" color: ").append(toIndentedString(color)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AnimalFarm.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AnimalFarm.java new file mode 100644 index 00000000000..2f43f1b1a96 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/AnimalFarm.java @@ -0,0 +1,66 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.Animal; + +/** + * AnimalFarm + */ + +public class AnimalFarm extends ArrayList { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class AnimalFarm {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java new file mode 100644 index 00000000000..f3663caed16 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java @@ -0,0 +1,102 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * ArrayOfArrayOfNumberOnly + */ + +public class ArrayOfArrayOfNumberOnly { + @JsonProperty("ArrayArrayNumber") + private List> arrayArrayNumber = null; + + public ArrayOfArrayOfNumberOnly arrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + return this; + } + + public ArrayOfArrayOfNumberOnly addArrayArrayNumberItem(List arrayArrayNumberItem) { + if (this.arrayArrayNumber == null) { + this.arrayArrayNumber = new ArrayList>(); + } + this.arrayArrayNumber.add(arrayArrayNumberItem); + return this; + } + + /** + * Get arrayArrayNumber + * @return arrayArrayNumber + **/ + @ApiModelProperty(value = "") + public List> getArrayArrayNumber() { + return arrayArrayNumber; + } + + public void setArrayArrayNumber(List> arrayArrayNumber) { + this.arrayArrayNumber = arrayArrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfArrayOfNumberOnly arrayOfArrayOfNumberOnly = (ArrayOfArrayOfNumberOnly) o; + return Objects.equals(this.arrayArrayNumber, arrayOfArrayOfNumberOnly.arrayArrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayArrayNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfArrayOfNumberOnly {\n"); + + sb.append(" arrayArrayNumber: ").append(toIndentedString(arrayArrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java new file mode 100644 index 00000000000..21938baa130 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java @@ -0,0 +1,102 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * ArrayOfNumberOnly + */ + +public class ArrayOfNumberOnly { + @JsonProperty("ArrayNumber") + private List arrayNumber = null; + + public ArrayOfNumberOnly arrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + return this; + } + + public ArrayOfNumberOnly addArrayNumberItem(BigDecimal arrayNumberItem) { + if (this.arrayNumber == null) { + this.arrayNumber = new ArrayList(); + } + this.arrayNumber.add(arrayNumberItem); + return this; + } + + /** + * Get arrayNumber + * @return arrayNumber + **/ + @ApiModelProperty(value = "") + public List getArrayNumber() { + return arrayNumber; + } + + public void setArrayNumber(List arrayNumber) { + this.arrayNumber = arrayNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayOfNumberOnly arrayOfNumberOnly = (ArrayOfNumberOnly) o; + return Objects.equals(this.arrayNumber, arrayOfNumberOnly.arrayNumber); + } + + @Override + public int hashCode() { + return Objects.hash(arrayNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayOfNumberOnly {\n"); + + sb.append(" arrayNumber: ").append(toIndentedString(arrayNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayTest.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayTest.java new file mode 100644 index 00000000000..5e7b32643f6 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ArrayTest.java @@ -0,0 +1,164 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.ReadOnlyFirst; + +/** + * ArrayTest + */ + +public class ArrayTest { + @JsonProperty("array_of_string") + private List arrayOfString = null; + + @JsonProperty("array_array_of_integer") + private List> arrayArrayOfInteger = null; + + @JsonProperty("array_array_of_model") + private List> arrayArrayOfModel = null; + + public ArrayTest arrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + return this; + } + + public ArrayTest addArrayOfStringItem(String arrayOfStringItem) { + if (this.arrayOfString == null) { + this.arrayOfString = new ArrayList(); + } + this.arrayOfString.add(arrayOfStringItem); + return this; + } + + /** + * Get arrayOfString + * @return arrayOfString + **/ + @ApiModelProperty(value = "") + public List getArrayOfString() { + return arrayOfString; + } + + public void setArrayOfString(List arrayOfString) { + this.arrayOfString = arrayOfString; + } + + public ArrayTest arrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + return this; + } + + public ArrayTest addArrayArrayOfIntegerItem(List arrayArrayOfIntegerItem) { + if (this.arrayArrayOfInteger == null) { + this.arrayArrayOfInteger = new ArrayList>(); + } + this.arrayArrayOfInteger.add(arrayArrayOfIntegerItem); + return this; + } + + /** + * Get arrayArrayOfInteger + * @return arrayArrayOfInteger + **/ + @ApiModelProperty(value = "") + public List> getArrayArrayOfInteger() { + return arrayArrayOfInteger; + } + + public void setArrayArrayOfInteger(List> arrayArrayOfInteger) { + this.arrayArrayOfInteger = arrayArrayOfInteger; + } + + public ArrayTest arrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + return this; + } + + public ArrayTest addArrayArrayOfModelItem(List arrayArrayOfModelItem) { + if (this.arrayArrayOfModel == null) { + this.arrayArrayOfModel = new ArrayList>(); + } + this.arrayArrayOfModel.add(arrayArrayOfModelItem); + return this; + } + + /** + * Get arrayArrayOfModel + * @return arrayArrayOfModel + **/ + @ApiModelProperty(value = "") + public List> getArrayArrayOfModel() { + return arrayArrayOfModel; + } + + public void setArrayArrayOfModel(List> arrayArrayOfModel) { + this.arrayArrayOfModel = arrayArrayOfModel; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayTest arrayTest = (ArrayTest) o; + return Objects.equals(this.arrayOfString, arrayTest.arrayOfString) && + Objects.equals(this.arrayArrayOfInteger, arrayTest.arrayArrayOfInteger) && + Objects.equals(this.arrayArrayOfModel, arrayTest.arrayArrayOfModel); + } + + @Override + public int hashCode() { + return Objects.hash(arrayOfString, arrayArrayOfInteger, arrayArrayOfModel); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ArrayTest {\n"); + + sb.append(" arrayOfString: ").append(toIndentedString(arrayOfString)).append("\n"); + sb.append(" arrayArrayOfInteger: ").append(toIndentedString(arrayArrayOfInteger)).append("\n"); + sb.append(" arrayArrayOfModel: ").append(toIndentedString(arrayArrayOfModel)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Capitalization.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Capitalization.java new file mode 100644 index 00000000000..f0b2d5cd99f --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Capitalization.java @@ -0,0 +1,206 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Capitalization + */ + +public class Capitalization { + @JsonProperty("smallCamel") + private String smallCamel = null; + + @JsonProperty("CapitalCamel") + private String capitalCamel = null; + + @JsonProperty("small_Snake") + private String smallSnake = null; + + @JsonProperty("Capital_Snake") + private String capitalSnake = null; + + @JsonProperty("SCA_ETH_Flow_Points") + private String scAETHFlowPoints = null; + + @JsonProperty("ATT_NAME") + private String ATT_NAME = null; + + public Capitalization smallCamel(String smallCamel) { + this.smallCamel = smallCamel; + return this; + } + + /** + * Get smallCamel + * @return smallCamel + **/ + @ApiModelProperty(value = "") + public String getSmallCamel() { + return smallCamel; + } + + public void setSmallCamel(String smallCamel) { + this.smallCamel = smallCamel; + } + + public Capitalization capitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + return this; + } + + /** + * Get capitalCamel + * @return capitalCamel + **/ + @ApiModelProperty(value = "") + public String getCapitalCamel() { + return capitalCamel; + } + + public void setCapitalCamel(String capitalCamel) { + this.capitalCamel = capitalCamel; + } + + public Capitalization smallSnake(String smallSnake) { + this.smallSnake = smallSnake; + return this; + } + + /** + * Get smallSnake + * @return smallSnake + **/ + @ApiModelProperty(value = "") + public String getSmallSnake() { + return smallSnake; + } + + public void setSmallSnake(String smallSnake) { + this.smallSnake = smallSnake; + } + + public Capitalization capitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + return this; + } + + /** + * Get capitalSnake + * @return capitalSnake + **/ + @ApiModelProperty(value = "") + public String getCapitalSnake() { + return capitalSnake; + } + + public void setCapitalSnake(String capitalSnake) { + this.capitalSnake = capitalSnake; + } + + public Capitalization scAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + return this; + } + + /** + * Get scAETHFlowPoints + * @return scAETHFlowPoints + **/ + @ApiModelProperty(value = "") + public String getScAETHFlowPoints() { + return scAETHFlowPoints; + } + + public void setScAETHFlowPoints(String scAETHFlowPoints) { + this.scAETHFlowPoints = scAETHFlowPoints; + } + + public Capitalization ATT_NAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + return this; + } + + /** + * Name of the pet + * @return ATT_NAME + **/ + @ApiModelProperty(value = "Name of the pet ") + public String getATTNAME() { + return ATT_NAME; + } + + public void setATTNAME(String ATT_NAME) { + this.ATT_NAME = ATT_NAME; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Capitalization capitalization = (Capitalization) o; + return Objects.equals(this.smallCamel, capitalization.smallCamel) && + Objects.equals(this.capitalCamel, capitalization.capitalCamel) && + Objects.equals(this.smallSnake, capitalization.smallSnake) && + Objects.equals(this.capitalSnake, capitalization.capitalSnake) && + Objects.equals(this.scAETHFlowPoints, capitalization.scAETHFlowPoints) && + Objects.equals(this.ATT_NAME, capitalization.ATT_NAME); + } + + @Override + public int hashCode() { + return Objects.hash(smallCamel, capitalCamel, smallSnake, capitalSnake, scAETHFlowPoints, ATT_NAME); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Capitalization {\n"); + + sb.append(" smallCamel: ").append(toIndentedString(smallCamel)).append("\n"); + sb.append(" capitalCamel: ").append(toIndentedString(capitalCamel)).append("\n"); + sb.append(" smallSnake: ").append(toIndentedString(smallSnake)).append("\n"); + sb.append(" capitalSnake: ").append(toIndentedString(capitalSnake)).append("\n"); + sb.append(" scAETHFlowPoints: ").append(toIndentedString(scAETHFlowPoints)).append("\n"); + sb.append(" ATT_NAME: ").append(toIndentedString(ATT_NAME)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Cat.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Cat.java new file mode 100644 index 00000000000..2121c5c2793 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Cat.java @@ -0,0 +1,93 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.Animal; + +/** + * Cat + */ + +public class Cat extends Animal { + @JsonProperty("declawed") + private Boolean declawed = null; + + public Cat declawed(Boolean declawed) { + this.declawed = declawed; + return this; + } + + /** + * Get declawed + * @return declawed + **/ + @ApiModelProperty(value = "") + public Boolean isDeclawed() { + return declawed; + } + + public void setDeclawed(Boolean declawed) { + this.declawed = declawed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Cat cat = (Cat) o; + return Objects.equals(this.declawed, cat.declawed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(declawed, super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Cat {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" declawed: ").append(toIndentedString(declawed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Category.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Category.java new file mode 100644 index 00000000000..60f4d2b07b2 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Category.java @@ -0,0 +1,114 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Category + */ + +public class Category { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Category id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Category name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(this.id, category.id) && + Objects.equals(this.name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ClassModel.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ClassModel.java new file mode 100644 index 00000000000..d16a676db3d --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ClassModel.java @@ -0,0 +1,92 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Model for testing model with \"_class\" property + */ +@ApiModel(description = "Model for testing model with \"_class\" property") + +public class ClassModel { + @JsonProperty("_class") + private String propertyClass = null; + + public ClassModel propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ClassModel classModel = (ClassModel) o; + return Objects.equals(this.propertyClass, classModel.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(propertyClass); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ClassModel {\n"); + + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Client.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Client.java new file mode 100644 index 00000000000..290c475cb54 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Client.java @@ -0,0 +1,91 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Client + */ + +public class Client { + @JsonProperty("client") + private String client = null; + + public Client client(String client) { + this.client = client; + return this; + } + + /** + * Get client + * @return client + **/ + @ApiModelProperty(value = "") + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Client client = (Client) o; + return Objects.equals(this.client, client.client); + } + + @Override + public int hashCode() { + return Objects.hash(client); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Client {\n"); + + sb.append(" client: ").append(toIndentedString(client)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Dog.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Dog.java new file mode 100644 index 00000000000..b7beed2df53 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Dog.java @@ -0,0 +1,93 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.Animal; + +/** + * Dog + */ + +public class Dog extends Animal { + @JsonProperty("breed") + private String breed = null; + + public Dog breed(String breed) { + this.breed = breed; + return this; + } + + /** + * Get breed + * @return breed + **/ + @ApiModelProperty(value = "") + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Dog dog = (Dog) o; + return Objects.equals(this.breed, dog.breed) && + super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(breed, super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Dog {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append(" breed: ").append(toIndentedString(breed)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumArrays.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumArrays.java new file mode 100644 index 00000000000..3b1b51c26a3 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumArrays.java @@ -0,0 +1,194 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; + +/** + * EnumArrays + */ + +public class EnumArrays { + /** + * Gets or Sets justSymbol + */ + public enum JustSymbolEnum { + GREATER_THAN_OR_EQUAL_TO(">="), + + DOLLAR("$"); + + private String value; + + JustSymbolEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static JustSymbolEnum fromValue(String text) { + for (JustSymbolEnum b : JustSymbolEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("just_symbol") + private JustSymbolEnum justSymbol = null; + + /** + * Gets or Sets arrayEnum + */ + public enum ArrayEnumEnum { + FISH("fish"), + + CRAB("crab"); + + private String value; + + ArrayEnumEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ArrayEnumEnum fromValue(String text) { + for (ArrayEnumEnum b : ArrayEnumEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("array_enum") + private List arrayEnum = null; + + public EnumArrays justSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + return this; + } + + /** + * Get justSymbol + * @return justSymbol + **/ + @ApiModelProperty(value = "") + public JustSymbolEnum getJustSymbol() { + return justSymbol; + } + + public void setJustSymbol(JustSymbolEnum justSymbol) { + this.justSymbol = justSymbol; + } + + public EnumArrays arrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + return this; + } + + public EnumArrays addArrayEnumItem(ArrayEnumEnum arrayEnumItem) { + if (this.arrayEnum == null) { + this.arrayEnum = new ArrayList(); + } + this.arrayEnum.add(arrayEnumItem); + return this; + } + + /** + * Get arrayEnum + * @return arrayEnum + **/ + @ApiModelProperty(value = "") + public List getArrayEnum() { + return arrayEnum; + } + + public void setArrayEnum(List arrayEnum) { + this.arrayEnum = arrayEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumArrays enumArrays = (EnumArrays) o; + return Objects.equals(this.justSymbol, enumArrays.justSymbol) && + Objects.equals(this.arrayEnum, enumArrays.arrayEnum); + } + + @Override + public int hashCode() { + return Objects.hash(justSymbol, arrayEnum); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumArrays {\n"); + + sb.append(" justSymbol: ").append(toIndentedString(justSymbol)).append("\n"); + sb.append(" arrayEnum: ").append(toIndentedString(arrayEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumClass.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumClass.java new file mode 100644 index 00000000000..444bb0f3c48 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumClass.java @@ -0,0 +1,59 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Gets or Sets EnumClass + */ +public enum EnumClass { + + _ABC("_abc"), + + _EFG("-efg"), + + _XYZ_("(xyz)"); + + private String value; + + EnumClass(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumClass fromValue(String text) { + for (EnumClass b : EnumClass.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumTest.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumTest.java new file mode 100644 index 00000000000..122f370cef9 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/EnumTest.java @@ -0,0 +1,328 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.openapitools.client.model.OuterEnum; + +/** + * EnumTest + */ + +public class EnumTest { + /** + * Gets or Sets enumString + */ + public enum EnumStringEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringEnum fromValue(String text) { + for (EnumStringEnum b : EnumStringEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string") + private EnumStringEnum enumString = null; + + /** + * Gets or Sets enumStringRequired + */ + public enum EnumStringRequiredEnum { + UPPER("UPPER"), + + LOWER("lower"), + + EMPTY(""); + + private String value; + + EnumStringRequiredEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumStringRequiredEnum fromValue(String text) { + for (EnumStringRequiredEnum b : EnumStringRequiredEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_string_required") + private EnumStringRequiredEnum enumStringRequired = null; + + /** + * Gets or Sets enumInteger + */ + public enum EnumIntegerEnum { + NUMBER_1(1), + + NUMBER_MINUS_1(-1); + + private Integer value; + + EnumIntegerEnum(Integer value) { + this.value = value; + } + + @JsonValue + public Integer getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumIntegerEnum fromValue(String text) { + for (EnumIntegerEnum b : EnumIntegerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_integer") + private EnumIntegerEnum enumInteger = null; + + /** + * Gets or Sets enumNumber + */ + public enum EnumNumberEnum { + NUMBER_1_DOT_1(1.1), + + NUMBER_MINUS_1_DOT_2(-1.2); + + private Double value; + + EnumNumberEnum(Double value) { + this.value = value; + } + + @JsonValue + public Double getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static EnumNumberEnum fromValue(String text) { + for (EnumNumberEnum b : EnumNumberEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("enum_number") + private EnumNumberEnum enumNumber = null; + + @JsonProperty("outerEnum") + private OuterEnum outerEnum = null; + + public EnumTest enumString(EnumStringEnum enumString) { + this.enumString = enumString; + return this; + } + + /** + * Get enumString + * @return enumString + **/ + @ApiModelProperty(value = "") + public EnumStringEnum getEnumString() { + return enumString; + } + + public void setEnumString(EnumStringEnum enumString) { + this.enumString = enumString; + } + + public EnumTest enumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + return this; + } + + /** + * Get enumStringRequired + * @return enumStringRequired + **/ + @ApiModelProperty(required = true, value = "") + public EnumStringRequiredEnum getEnumStringRequired() { + return enumStringRequired; + } + + public void setEnumStringRequired(EnumStringRequiredEnum enumStringRequired) { + this.enumStringRequired = enumStringRequired; + } + + public EnumTest enumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + return this; + } + + /** + * Get enumInteger + * @return enumInteger + **/ + @ApiModelProperty(value = "") + public EnumIntegerEnum getEnumInteger() { + return enumInteger; + } + + public void setEnumInteger(EnumIntegerEnum enumInteger) { + this.enumInteger = enumInteger; + } + + public EnumTest enumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + return this; + } + + /** + * Get enumNumber + * @return enumNumber + **/ + @ApiModelProperty(value = "") + public EnumNumberEnum getEnumNumber() { + return enumNumber; + } + + public void setEnumNumber(EnumNumberEnum enumNumber) { + this.enumNumber = enumNumber; + } + + public EnumTest outerEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + return this; + } + + /** + * Get outerEnum + * @return outerEnum + **/ + @ApiModelProperty(value = "") + public OuterEnum getOuterEnum() { + return outerEnum; + } + + public void setOuterEnum(OuterEnum outerEnum) { + this.outerEnum = outerEnum; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + EnumTest enumTest = (EnumTest) o; + return Objects.equals(this.enumString, enumTest.enumString) && + Objects.equals(this.enumStringRequired, enumTest.enumStringRequired) && + Objects.equals(this.enumInteger, enumTest.enumInteger) && + Objects.equals(this.enumNumber, enumTest.enumNumber) && + Objects.equals(this.outerEnum, enumTest.outerEnum); + } + + @Override + public int hashCode() { + return Objects.hash(enumString, enumStringRequired, enumInteger, enumNumber, outerEnum); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class EnumTest {\n"); + + sb.append(" enumString: ").append(toIndentedString(enumString)).append("\n"); + sb.append(" enumStringRequired: ").append(toIndentedString(enumStringRequired)).append("\n"); + sb.append(" enumInteger: ").append(toIndentedString(enumInteger)).append("\n"); + sb.append(" enumNumber: ").append(toIndentedString(enumNumber)).append("\n"); + sb.append(" outerEnum: ").append(toIndentedString(outerEnum)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java new file mode 100644 index 00000000000..2a8385412f0 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java @@ -0,0 +1,124 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; + +/** + * FileSchemaTestClass + */ + +public class FileSchemaTestClass { + @JsonProperty("file") + private java.io.File file = null; + + @JsonProperty("files") + private List files = null; + + public FileSchemaTestClass file(java.io.File file) { + this.file = file; + return this; + } + + /** + * Get file + * @return file + **/ + @ApiModelProperty(value = "") + public java.io.File getFile() { + return file; + } + + public void setFile(java.io.File file) { + this.file = file; + } + + public FileSchemaTestClass files(List files) { + this.files = files; + return this; + } + + public FileSchemaTestClass addFilesItem(java.io.File filesItem) { + if (this.files == null) { + this.files = new ArrayList(); + } + this.files.add(filesItem); + return this; + } + + /** + * Get files + * @return files + **/ + @ApiModelProperty(value = "") + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FileSchemaTestClass fileSchemaTestClass = (FileSchemaTestClass) o; + return Objects.equals(this.file, fileSchemaTestClass.file) && + Objects.equals(this.files, fileSchemaTestClass.files); + } + + @Override + public int hashCode() { + return Objects.hash(file, files); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FileSchemaTestClass {\n"); + + sb.append(" file: ").append(toIndentedString(file)).append("\n"); + sb.append(" files: ").append(toIndentedString(files)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FormatTest.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FormatTest.java new file mode 100644 index 00000000000..de08419d1db --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/FormatTest.java @@ -0,0 +1,382 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.File; +import java.math.BigDecimal; +import java.util.UUID; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; + +/** + * FormatTest + */ + +public class FormatTest { + @JsonProperty("integer") + private Integer integer = null; + + @JsonProperty("int32") + private Integer int32 = null; + + @JsonProperty("int64") + private Long int64 = null; + + @JsonProperty("number") + private BigDecimal number = null; + + @JsonProperty("float") + private Float _float = null; + + @JsonProperty("double") + private Double _double = null; + + @JsonProperty("string") + private String string = null; + + @JsonProperty("byte") + private byte[] _byte = null; + + @JsonProperty("binary") + private File binary = null; + + @JsonProperty("date") + private LocalDate date = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("password") + private String password = null; + + public FormatTest integer(Integer integer) { + this.integer = integer; + return this; + } + + /** + * Get integer + * minimum: 10 + * maximum: 100 + * @return integer + **/ + @ApiModelProperty(value = "") + public Integer getInteger() { + return integer; + } + + public void setInteger(Integer integer) { + this.integer = integer; + } + + public FormatTest int32(Integer int32) { + this.int32 = int32; + return this; + } + + /** + * Get int32 + * minimum: 20 + * maximum: 200 + * @return int32 + **/ + @ApiModelProperty(value = "") + public Integer getInt32() { + return int32; + } + + public void setInt32(Integer int32) { + this.int32 = int32; + } + + public FormatTest int64(Long int64) { + this.int64 = int64; + return this; + } + + /** + * Get int64 + * @return int64 + **/ + @ApiModelProperty(value = "") + public Long getInt64() { + return int64; + } + + public void setInt64(Long int64) { + this.int64 = int64; + } + + public FormatTest number(BigDecimal number) { + this.number = number; + return this; + } + + /** + * Get number + * minimum: 32.1 + * maximum: 543.2 + * @return number + **/ + @ApiModelProperty(required = true, value = "") + public BigDecimal getNumber() { + return number; + } + + public void setNumber(BigDecimal number) { + this.number = number; + } + + public FormatTest _float(Float _float) { + this._float = _float; + return this; + } + + /** + * Get _float + * minimum: 54.3 + * maximum: 987.6 + * @return _float + **/ + @ApiModelProperty(value = "") + public Float getFloat() { + return _float; + } + + public void setFloat(Float _float) { + this._float = _float; + } + + public FormatTest _double(Double _double) { + this._double = _double; + return this; + } + + /** + * Get _double + * minimum: 67.8 + * maximum: 123.4 + * @return _double + **/ + @ApiModelProperty(value = "") + public Double getDouble() { + return _double; + } + + public void setDouble(Double _double) { + this._double = _double; + } + + public FormatTest string(String string) { + this.string = string; + return this; + } + + /** + * Get string + * @return string + **/ + @ApiModelProperty(value = "") + public String getString() { + return string; + } + + public void setString(String string) { + this.string = string; + } + + public FormatTest _byte(byte[] _byte) { + this._byte = _byte; + return this; + } + + /** + * Get _byte + * @return _byte + **/ + @ApiModelProperty(required = true, value = "") + public byte[] getByte() { + return _byte; + } + + public void setByte(byte[] _byte) { + this._byte = _byte; + } + + public FormatTest binary(File binary) { + this.binary = binary; + return this; + } + + /** + * Get binary + * @return binary + **/ + @ApiModelProperty(value = "") + public File getBinary() { + return binary; + } + + public void setBinary(File binary) { + this.binary = binary; + } + + public FormatTest date(LocalDate date) { + this.date = date; + return this; + } + + /** + * Get date + * @return date + **/ + @ApiModelProperty(required = true, value = "") + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public FormatTest dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @ApiModelProperty(value = "") + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public FormatTest uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @ApiModelProperty(value = "") + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public FormatTest password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(required = true, value = "") + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + FormatTest formatTest = (FormatTest) o; + return Objects.equals(this.integer, formatTest.integer) && + Objects.equals(this.int32, formatTest.int32) && + Objects.equals(this.int64, formatTest.int64) && + Objects.equals(this.number, formatTest.number) && + Objects.equals(this._float, formatTest._float) && + Objects.equals(this._double, formatTest._double) && + Objects.equals(this.string, formatTest.string) && + Arrays.equals(this._byte, formatTest._byte) && + Objects.equals(this.binary, formatTest.binary) && + Objects.equals(this.date, formatTest.date) && + Objects.equals(this.dateTime, formatTest.dateTime) && + Objects.equals(this.uuid, formatTest.uuid) && + Objects.equals(this.password, formatTest.password); + } + + @Override + public int hashCode() { + return Objects.hash(integer, int32, int64, number, _float, _double, string, Arrays.hashCode(_byte), binary, date, dateTime, uuid, password); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class FormatTest {\n"); + + sb.append(" integer: ").append(toIndentedString(integer)).append("\n"); + sb.append(" int32: ").append(toIndentedString(int32)).append("\n"); + sb.append(" int64: ").append(toIndentedString(int64)).append("\n"); + sb.append(" number: ").append(toIndentedString(number)).append("\n"); + sb.append(" _float: ").append(toIndentedString(_float)).append("\n"); + sb.append(" _double: ").append(toIndentedString(_double)).append("\n"); + sb.append(" string: ").append(toIndentedString(string)).append("\n"); + sb.append(" _byte: ").append(toIndentedString(_byte)).append("\n"); + sb.append(" binary: ").append(toIndentedString(binary)).append("\n"); + sb.append(" date: ").append(toIndentedString(date)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java new file mode 100644 index 00000000000..ddd9bfbf678 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java @@ -0,0 +1,96 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * HasOnlyReadOnly + */ + +public class HasOnlyReadOnly { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("foo") + private String foo = null; + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(value = "") + public String getBar() { + return bar; + } + + /** + * Get foo + * @return foo + **/ + @ApiModelProperty(value = "") + public String getFoo() { + return foo; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + HasOnlyReadOnly hasOnlyReadOnly = (HasOnlyReadOnly) o; + return Objects.equals(this.bar, hasOnlyReadOnly.bar) && + Objects.equals(this.foo, hasOnlyReadOnly.foo); + } + + @Override + public int hashCode() { + return Objects.hash(bar, foo); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class HasOnlyReadOnly {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" foo: ").append(toIndentedString(foo)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MapTest.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MapTest.java new file mode 100644 index 00000000000..f67fb22c45c --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MapTest.java @@ -0,0 +1,223 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.openapitools.client.model.StringBooleanMap; + +/** + * MapTest + */ + +public class MapTest { + @JsonProperty("map_map_of_string") + private Map> mapMapOfString = null; + + /** + * Gets or Sets inner + */ + public enum InnerEnum { + UPPER("UPPER"), + + LOWER("lower"); + + private String value; + + InnerEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static InnerEnum fromValue(String text) { + for (InnerEnum b : InnerEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("map_of_enum_string") + private Map mapOfEnumString = null; + + @JsonProperty("direct_map") + private Map directMap = null; + + @JsonProperty("indirect_map") + private StringBooleanMap indirectMap = null; + + public MapTest mapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + return this; + } + + public MapTest putMapMapOfStringItem(String key, Map mapMapOfStringItem) { + if (this.mapMapOfString == null) { + this.mapMapOfString = new HashMap>(); + } + this.mapMapOfString.put(key, mapMapOfStringItem); + return this; + } + + /** + * Get mapMapOfString + * @return mapMapOfString + **/ + @ApiModelProperty(value = "") + public Map> getMapMapOfString() { + return mapMapOfString; + } + + public void setMapMapOfString(Map> mapMapOfString) { + this.mapMapOfString = mapMapOfString; + } + + public MapTest mapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + return this; + } + + public MapTest putMapOfEnumStringItem(String key, InnerEnum mapOfEnumStringItem) { + if (this.mapOfEnumString == null) { + this.mapOfEnumString = new HashMap(); + } + this.mapOfEnumString.put(key, mapOfEnumStringItem); + return this; + } + + /** + * Get mapOfEnumString + * @return mapOfEnumString + **/ + @ApiModelProperty(value = "") + public Map getMapOfEnumString() { + return mapOfEnumString; + } + + public void setMapOfEnumString(Map mapOfEnumString) { + this.mapOfEnumString = mapOfEnumString; + } + + public MapTest directMap(Map directMap) { + this.directMap = directMap; + return this; + } + + public MapTest putDirectMapItem(String key, Boolean directMapItem) { + if (this.directMap == null) { + this.directMap = new HashMap(); + } + this.directMap.put(key, directMapItem); + return this; + } + + /** + * Get directMap + * @return directMap + **/ + @ApiModelProperty(value = "") + public Map getDirectMap() { + return directMap; + } + + public void setDirectMap(Map directMap) { + this.directMap = directMap; + } + + public MapTest indirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + return this; + } + + /** + * Get indirectMap + * @return indirectMap + **/ + @ApiModelProperty(value = "") + public StringBooleanMap getIndirectMap() { + return indirectMap; + } + + public void setIndirectMap(StringBooleanMap indirectMap) { + this.indirectMap = indirectMap; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MapTest mapTest = (MapTest) o; + return Objects.equals(this.mapMapOfString, mapTest.mapMapOfString) && + Objects.equals(this.mapOfEnumString, mapTest.mapOfEnumString) && + Objects.equals(this.directMap, mapTest.directMap) && + Objects.equals(this.indirectMap, mapTest.indirectMap); + } + + @Override + public int hashCode() { + return Objects.hash(mapMapOfString, mapOfEnumString, directMap, indirectMap); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MapTest {\n"); + + sb.append(" mapMapOfString: ").append(toIndentedString(mapMapOfString)).append("\n"); + sb.append(" mapOfEnumString: ").append(toIndentedString(mapOfEnumString)).append("\n"); + sb.append(" directMap: ").append(toIndentedString(directMap)).append("\n"); + sb.append(" indirectMap: ").append(toIndentedString(indirectMap)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java new file mode 100644 index 00000000000..a12b7048008 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java @@ -0,0 +1,151 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.openapitools.client.model.Animal; +import org.threeten.bp.OffsetDateTime; + +/** + * MixedPropertiesAndAdditionalPropertiesClass + */ + +public class MixedPropertiesAndAdditionalPropertiesClass { + @JsonProperty("uuid") + private UUID uuid = null; + + @JsonProperty("dateTime") + private OffsetDateTime dateTime = null; + + @JsonProperty("map") + private Map map = null; + + public MixedPropertiesAndAdditionalPropertiesClass uuid(UUID uuid) { + this.uuid = uuid; + return this; + } + + /** + * Get uuid + * @return uuid + **/ + @ApiModelProperty(value = "") + public UUID getUuid() { + return uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public MixedPropertiesAndAdditionalPropertiesClass dateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + return this; + } + + /** + * Get dateTime + * @return dateTime + **/ + @ApiModelProperty(value = "") + public OffsetDateTime getDateTime() { + return dateTime; + } + + public void setDateTime(OffsetDateTime dateTime) { + this.dateTime = dateTime; + } + + public MixedPropertiesAndAdditionalPropertiesClass map(Map map) { + this.map = map; + return this; + } + + public MixedPropertiesAndAdditionalPropertiesClass putMapItem(String key, Animal mapItem) { + if (this.map == null) { + this.map = new HashMap(); + } + this.map.put(key, mapItem); + return this; + } + + /** + * Get map + * @return map + **/ + @ApiModelProperty(value = "") + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MixedPropertiesAndAdditionalPropertiesClass mixedPropertiesAndAdditionalPropertiesClass = (MixedPropertiesAndAdditionalPropertiesClass) o; + return Objects.equals(this.uuid, mixedPropertiesAndAdditionalPropertiesClass.uuid) && + Objects.equals(this.dateTime, mixedPropertiesAndAdditionalPropertiesClass.dateTime) && + Objects.equals(this.map, mixedPropertiesAndAdditionalPropertiesClass.map); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, dateTime, map); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class MixedPropertiesAndAdditionalPropertiesClass {\n"); + + sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n"); + sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n"); + sb.append(" map: ").append(toIndentedString(map)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Model200Response.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Model200Response.java new file mode 100644 index 00000000000..edef1b3e626 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Model200Response.java @@ -0,0 +1,115 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Model for testing model name starting with number + */ +@ApiModel(description = "Model for testing model name starting with number") + +public class Model200Response { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("class") + private String propertyClass = null; + + public Model200Response name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + public Model200Response propertyClass(String propertyClass) { + this.propertyClass = propertyClass; + return this; + } + + /** + * Get propertyClass + * @return propertyClass + **/ + @ApiModelProperty(value = "") + public String getPropertyClass() { + return propertyClass; + } + + public void setPropertyClass(String propertyClass) { + this.propertyClass = propertyClass; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Model200Response _200response = (Model200Response) o; + return Objects.equals(this.name, _200response.name) && + Objects.equals(this.propertyClass, _200response.propertyClass); + } + + @Override + public int hashCode() { + return Objects.hash(name, propertyClass); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Model200Response {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelApiResponse.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelApiResponse.java new file mode 100644 index 00000000000..2f89b60db0b --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelApiResponse.java @@ -0,0 +1,137 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * ModelApiResponse + */ + +public class ModelApiResponse { + @JsonProperty("code") + private Integer code = null; + + @JsonProperty("type") + private String type = null; + + @JsonProperty("message") + private String message = null; + + public ModelApiResponse code(Integer code) { + this.code = code; + return this; + } + + /** + * Get code + * @return code + **/ + @ApiModelProperty(value = "") + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public ModelApiResponse type(String type) { + this.type = type; + return this; + } + + /** + * Get type + * @return type + **/ + @ApiModelProperty(value = "") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public ModelApiResponse message(String message) { + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @ApiModelProperty(value = "") + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelApiResponse _apiResponse = (ModelApiResponse) o; + return Objects.equals(this.code, _apiResponse.code) && + Objects.equals(this.type, _apiResponse.type) && + Objects.equals(this.message, _apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelApiResponse {\n"); + + sb.append(" code: ").append(toIndentedString(code)).append("\n"); + sb.append(" type: ").append(toIndentedString(type)).append("\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelReturn.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelReturn.java new file mode 100644 index 00000000000..4adcfed3c3d --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ModelReturn.java @@ -0,0 +1,92 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Model for testing reserved words + */ +@ApiModel(description = "Model for testing reserved words") + +public class ModelReturn { + @JsonProperty("return") + private Integer _return = null; + + public ModelReturn _return(Integer _return) { + this._return = _return; + return this; + } + + /** + * Get _return + * @return _return + **/ + @ApiModelProperty(value = "") + public Integer getReturn() { + return _return; + } + + public void setReturn(Integer _return) { + this._return = _return; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ModelReturn _return = (ModelReturn) o; + return Objects.equals(this._return, _return._return); + } + + @Override + public int hashCode() { + return Objects.hash(_return); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ModelReturn {\n"); + + sb.append(" _return: ").append(toIndentedString(_return)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Name.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Name.java new file mode 100644 index 00000000000..1f55823fcf4 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Name.java @@ -0,0 +1,143 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Model for testing model name same as property name + */ +@ApiModel(description = "Model for testing model name same as property name") + +public class Name { + @JsonProperty("name") + private Integer name = null; + + @JsonProperty("snake_case") + private Integer snakeCase = null; + + @JsonProperty("property") + private String property = null; + + @JsonProperty("123Number") + private Integer _123number = null; + + public Name name(Integer name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(required = true, value = "") + public Integer getName() { + return name; + } + + public void setName(Integer name) { + this.name = name; + } + + /** + * Get snakeCase + * @return snakeCase + **/ + @ApiModelProperty(value = "") + public Integer getSnakeCase() { + return snakeCase; + } + + public Name property(String property) { + this.property = property; + return this; + } + + /** + * Get property + * @return property + **/ + @ApiModelProperty(value = "") + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + /** + * Get _123number + * @return _123number + **/ + @ApiModelProperty(value = "") + public Integer get123number() { + return _123number; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Name name = (Name) o; + return Objects.equals(this.name, name.name) && + Objects.equals(this.snakeCase, name.snakeCase) && + Objects.equals(this.property, name.property) && + Objects.equals(this._123number, name._123number); + } + + @Override + public int hashCode() { + return Objects.hash(name, snakeCase, property, _123number); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Name {\n"); + + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" snakeCase: ").append(toIndentedString(snakeCase)).append("\n"); + sb.append(" property: ").append(toIndentedString(property)).append("\n"); + sb.append(" _123number: ").append(toIndentedString(_123number)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/NumberOnly.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/NumberOnly.java new file mode 100644 index 00000000000..7372bf2d2fd --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/NumberOnly.java @@ -0,0 +1,92 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; + +/** + * NumberOnly + */ + +public class NumberOnly { + @JsonProperty("JustNumber") + private BigDecimal justNumber = null; + + public NumberOnly justNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + return this; + } + + /** + * Get justNumber + * @return justNumber + **/ + @ApiModelProperty(value = "") + public BigDecimal getJustNumber() { + return justNumber; + } + + public void setJustNumber(BigDecimal justNumber) { + this.justNumber = justNumber; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NumberOnly numberOnly = (NumberOnly) o; + return Objects.equals(this.justNumber, numberOnly.justNumber); + } + + @Override + public int hashCode() { + return Objects.hash(justNumber); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class NumberOnly {\n"); + + sb.append(" justNumber: ").append(toIndentedString(justNumber)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Order.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Order.java new file mode 100644 index 00000000000..cff13953de0 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Order.java @@ -0,0 +1,244 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.threeten.bp.OffsetDateTime; + +/** + * Order + */ + +public class Order { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("petId") + private Long petId = null; + + @JsonProperty("quantity") + private Integer quantity = null; + + @JsonProperty("shipDate") + private OffsetDateTime shipDate = null; + + /** + * Order Status + */ + public enum StatusEnum { + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + @JsonProperty("complete") + private Boolean complete = false; + + public Order id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Order petId(Long petId) { + this.petId = petId; + return this; + } + + /** + * Get petId + * @return petId + **/ + @ApiModelProperty(value = "") + public Long getPetId() { + return petId; + } + + public void setPetId(Long petId) { + this.petId = petId; + } + + public Order quantity(Integer quantity) { + this.quantity = quantity; + return this; + } + + /** + * Get quantity + * @return quantity + **/ + @ApiModelProperty(value = "") + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Order shipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + return this; + } + + /** + * Get shipDate + * @return shipDate + **/ + @ApiModelProperty(value = "") + public OffsetDateTime getShipDate() { + return shipDate; + } + + public void setShipDate(OffsetDateTime shipDate) { + this.shipDate = shipDate; + } + + public Order status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * Order Status + * @return status + **/ + @ApiModelProperty(value = "Order Status") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + public Order complete(Boolean complete) { + this.complete = complete; + return this; + } + + /** + * Get complete + * @return complete + **/ + @ApiModelProperty(value = "") + public Boolean isComplete() { + return complete; + } + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(this.id, order.id) && + Objects.equals(this.petId, order.petId) && + Objects.equals(this.quantity, order.quantity) && + Objects.equals(this.shipDate, order.shipDate) && + Objects.equals(this.status, order.status) && + Objects.equals(this.complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterComposite.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterComposite.java new file mode 100644 index 00000000000..0abe10bcfc2 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterComposite.java @@ -0,0 +1,138 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; + +/** + * OuterComposite + */ + +public class OuterComposite { + @JsonProperty("my_number") + private BigDecimal myNumber = null; + + @JsonProperty("my_string") + private String myString = null; + + @JsonProperty("my_boolean") + private Boolean myBoolean = null; + + public OuterComposite myNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + return this; + } + + /** + * Get myNumber + * @return myNumber + **/ + @ApiModelProperty(value = "") + public BigDecimal getMyNumber() { + return myNumber; + } + + public void setMyNumber(BigDecimal myNumber) { + this.myNumber = myNumber; + } + + public OuterComposite myString(String myString) { + this.myString = myString; + return this; + } + + /** + * Get myString + * @return myString + **/ + @ApiModelProperty(value = "") + public String getMyString() { + return myString; + } + + public void setMyString(String myString) { + this.myString = myString; + } + + public OuterComposite myBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + return this; + } + + /** + * Get myBoolean + * @return myBoolean + **/ + @ApiModelProperty(value = "") + public Boolean isMyBoolean() { + return myBoolean; + } + + public void setMyBoolean(Boolean myBoolean) { + this.myBoolean = myBoolean; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OuterComposite outerComposite = (OuterComposite) o; + return Objects.equals(this.myNumber, outerComposite.myNumber) && + Objects.equals(this.myString, outerComposite.myString) && + Objects.equals(this.myBoolean, outerComposite.myBoolean); + } + + @Override + public int hashCode() { + return Objects.hash(myNumber, myString, myBoolean); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class OuterComposite {\n"); + + sb.append(" myNumber: ").append(toIndentedString(myNumber)).append("\n"); + sb.append(" myString: ").append(toIndentedString(myString)).append("\n"); + sb.append(" myBoolean: ").append(toIndentedString(myBoolean)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterEnum.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterEnum.java new file mode 100644 index 00000000000..f2906d1c36f --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/OuterEnum.java @@ -0,0 +1,59 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Gets or Sets OuterEnum + */ +public enum OuterEnum { + + PLACED("placed"), + + APPROVED("approved"), + + DELIVERED("delivered"); + + private String value; + + OuterEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static OuterEnum fromValue(String text) { + for (OuterEnum b : OuterEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Pet.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Pet.java new file mode 100644 index 00000000000..183260074e2 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Pet.java @@ -0,0 +1,260 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.client.model.Category; +import org.openapitools.client.model.Tag; + +/** + * Pet + */ + +public class Pet { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("category") + private Category category = null; + + @JsonProperty("name") + private String name = null; + + @JsonProperty("photoUrls") + private List photoUrls = new ArrayList(); + + @JsonProperty("tags") + private List tags = null; + + /** + * pet status in the store + */ + public enum StatusEnum { + AVAILABLE("available"), + + PENDING("pending"), + + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static StatusEnum fromValue(String text) { + for (StatusEnum b : StatusEnum.values()) { + if (String.valueOf(b.value).equals(text)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + text + "'"); + } + } + + @JsonProperty("status") + private StatusEnum status = null; + + public Pet id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Pet category(Category category) { + this.category = category; + return this; + } + + /** + * Get category + * @return category + **/ + @ApiModelProperty(value = "") + public Category getCategory() { + return category; + } + + public void setCategory(Category category) { + this.category = category; + } + + public Pet name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(example = "doggie", required = true, value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Pet photoUrls(List photoUrls) { + this.photoUrls = photoUrls; + return this; + } + + public Pet addPhotoUrlsItem(String photoUrlsItem) { + this.photoUrls.add(photoUrlsItem); + return this; + } + + /** + * Get photoUrls + * @return photoUrls + **/ + @ApiModelProperty(required = true, value = "") + public List getPhotoUrls() { + return photoUrls; + } + + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + public Pet tags(List tags) { + this.tags = tags; + return this; + } + + public Pet addTagsItem(Tag tagsItem) { + if (this.tags == null) { + this.tags = new ArrayList(); + } + this.tags.add(tagsItem); + return this; + } + + /** + * Get tags + * @return tags + **/ + @ApiModelProperty(value = "") + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public Pet status(StatusEnum status) { + this.status = status; + return this; + } + + /** + * pet status in the store + * @return status + **/ + @ApiModelProperty(value = "pet status in the store") + public StatusEnum getStatus() { + return status; + } + + public void setStatus(StatusEnum status) { + this.status = status; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(this.id, pet.id) && + Objects.equals(this.category, pet.category) && + Objects.equals(this.name, pet.name) && + Objects.equals(this.photoUrls, pet.photoUrls) && + Objects.equals(this.tags, pet.tags) && + Objects.equals(this.status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" category: ").append(toIndentedString(category)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java new file mode 100644 index 00000000000..17bd805fa5c --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/ReadOnlyFirst.java @@ -0,0 +1,105 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * ReadOnlyFirst + */ + +public class ReadOnlyFirst { + @JsonProperty("bar") + private String bar = null; + + @JsonProperty("baz") + private String baz = null; + + /** + * Get bar + * @return bar + **/ + @ApiModelProperty(value = "") + public String getBar() { + return bar; + } + + public ReadOnlyFirst baz(String baz) { + this.baz = baz; + return this; + } + + /** + * Get baz + * @return baz + **/ + @ApiModelProperty(value = "") + public String getBaz() { + return baz; + } + + public void setBaz(String baz) { + this.baz = baz; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReadOnlyFirst readOnlyFirst = (ReadOnlyFirst) o; + return Objects.equals(this.bar, readOnlyFirst.bar) && + Objects.equals(this.baz, readOnlyFirst.baz); + } + + @Override + public int hashCode() { + return Objects.hash(bar, baz); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ReadOnlyFirst {\n"); + + sb.append(" bar: ").append(toIndentedString(bar)).append("\n"); + sb.append(" baz: ").append(toIndentedString(baz)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/SpecialModelName.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/SpecialModelName.java new file mode 100644 index 00000000000..f0181742543 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/SpecialModelName.java @@ -0,0 +1,91 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * SpecialModelName + */ + +public class SpecialModelName { + @JsonProperty("$special[property.name]") + private Long $specialPropertyName = null; + + public SpecialModelName $specialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + return this; + } + + /** + * Get $specialPropertyName + * @return $specialPropertyName + **/ + @ApiModelProperty(value = "") + public Long get$SpecialPropertyName() { + return $specialPropertyName; + } + + public void set$SpecialPropertyName(Long $specialPropertyName) { + this.$specialPropertyName = $specialPropertyName; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SpecialModelName $specialModelName = (SpecialModelName) o; + return Objects.equals(this.$specialPropertyName, $specialModelName.$specialPropertyName); + } + + @Override + public int hashCode() { + return Objects.hash($specialPropertyName); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class SpecialModelName {\n"); + + sb.append(" $specialPropertyName: ").append(toIndentedString($specialPropertyName)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/StringBooleanMap.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/StringBooleanMap.java new file mode 100644 index 00000000000..8b18b0c9b51 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/StringBooleanMap.java @@ -0,0 +1,65 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * StringBooleanMap + */ + +public class StringBooleanMap extends HashMap { + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class StringBooleanMap {\n"); + sb.append(" ").append(toIndentedString(super.toString())).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Tag.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Tag.java new file mode 100644 index 00000000000..2607dc2a1a5 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/Tag.java @@ -0,0 +1,114 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Tag + */ + +public class Tag { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("name") + private String name = null; + + public Tag id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Tag name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + **/ + @ApiModelProperty(value = "") + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(this.id, tag.id) && + Objects.equals(this.name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/User.java b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/User.java new file mode 100644 index 00000000000..42d73dd62dc --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/main/java/org/openapitools/client/model/User.java @@ -0,0 +1,252 @@ +/* + * OpenAPI Petstore + * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package org.openapitools.client.model; + +import java.util.Objects; +import java.util.Arrays; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * User + */ + +public class User { + @JsonProperty("id") + private Long id = null; + + @JsonProperty("username") + private String username = null; + + @JsonProperty("firstName") + private String firstName = null; + + @JsonProperty("lastName") + private String lastName = null; + + @JsonProperty("email") + private String email = null; + + @JsonProperty("password") + private String password = null; + + @JsonProperty("phone") + private String phone = null; + + @JsonProperty("userStatus") + private Integer userStatus = null; + + public User id(Long id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + **/ + @ApiModelProperty(value = "") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public User username(String username) { + this.username = username; + return this; + } + + /** + * Get username + * @return username + **/ + @ApiModelProperty(value = "") + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public User firstName(String firstName) { + this.firstName = firstName; + return this; + } + + /** + * Get firstName + * @return firstName + **/ + @ApiModelProperty(value = "") + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public User lastName(String lastName) { + this.lastName = lastName; + return this; + } + + /** + * Get lastName + * @return lastName + **/ + @ApiModelProperty(value = "") + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public User email(String email) { + this.email = email; + return this; + } + + /** + * Get email + * @return email + **/ + @ApiModelProperty(value = "") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public User password(String password) { + this.password = password; + return this; + } + + /** + * Get password + * @return password + **/ + @ApiModelProperty(value = "") + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public User phone(String phone) { + this.phone = phone; + return this; + } + + /** + * Get phone + * @return phone + **/ + @ApiModelProperty(value = "") + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User userStatus(Integer userStatus) { + this.userStatus = userStatus; + return this; + } + + /** + * User Status + * @return userStatus + **/ + @ApiModelProperty(value = "User Status") + public Integer getUserStatus() { + return userStatus; + } + + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + @Override + public boolean equals(java.lang.Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(this.id, user.id) && + Objects.equals(this.username, user.username) && + Objects.equals(this.firstName, user.firstName) && + Objects.equals(this.lastName, user.lastName) && + Objects.equals(this.email, user.email) && + Objects.equals(this.password, user.password) && + Objects.equals(this.phone, user.phone) && + Objects.equals(this.userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" username: ").append(toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(toIndentedString(email)).append("\n"); + sb.append(" password: ").append(toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(java.lang.Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + +} + diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/StringUtilTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/StringUtilTest.java new file mode 100644 index 00000000000..aa7c81759ec --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/StringUtilTest.java @@ -0,0 +1,33 @@ +package org.openapitools.client; + +import org.junit.*; +import static org.junit.Assert.*; + + +public class StringUtilTest { + @Test + public void testContainsIgnoreCase() { + assertTrue(StringUtil.containsIgnoreCase(new String[]{"abc"}, "abc")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{"abc"}, "ABC")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{"ABC"}, "abc")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{null, "abc"}, "ABC")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{null, "abc"}, null)); + + assertFalse(StringUtil.containsIgnoreCase(new String[]{"abc"}, "def")); + assertFalse(StringUtil.containsIgnoreCase(new String[]{}, "ABC")); + assertFalse(StringUtil.containsIgnoreCase(new String[]{}, null)); + } + + @Test + public void testJoin() { + String[] array = {"aa", "bb", "cc"}; + assertEquals("aa,bb,cc", StringUtil.join(array, ",")); + assertEquals("aa, bb, cc", StringUtil.join(array, ", ")); + assertEquals("aabbcc", StringUtil.join(array, "")); + assertEquals("aa bb cc", StringUtil.join(array, " ")); + assertEquals("aa\nbb\ncc", StringUtil.join(array, "\n")); + + assertEquals("", StringUtil.join(new String[]{}, ",")); + assertEquals("abc", StringUtil.join(new String[]{"abc"}, ",")); + } +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java new file mode 100644 index 00000000000..f9319e14530 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/AnotherFakeApiTest.java @@ -0,0 +1,40 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Client; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for AnotherFakeApi + */ +public class AnotherFakeApiTest { + + private AnotherFakeApi api; + + @Before + public void setup() { + api = new ApiClient().buildClient(AnotherFakeApi.class); + } + + + /** + * To test special tags + * + * To test special tags and operation ID starting with number + */ + @Test + public void call123testSpecialTagsTest() { + Client client = null; + // Client response = api.call123testSpecialTags(client); + + // TODO: test validations + } + + +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeApiTest.java new file mode 100644 index 00000000000..c5153830112 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeApiTest.java @@ -0,0 +1,249 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import java.math.BigDecimal; +import org.openapitools.client.model.Client; +import java.io.File; +import org.openapitools.client.model.FileSchemaTestClass; +import org.threeten.bp.LocalDate; +import org.threeten.bp.OffsetDateTime; +import org.openapitools.client.model.OuterComposite; +import org.openapitools.client.model.User; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for FakeApi + */ +public class FakeApiTest { + + private FakeApi api; + + @Before + public void setup() { + api = new ApiClient().buildClient(FakeApi.class); + } + + + /** + * + * + * Test serialization of outer boolean types + */ + @Test + public void fakeOuterBooleanSerializeTest() { + Boolean body = null; + // Boolean response = api.fakeOuterBooleanSerialize(body); + + // TODO: test validations + } + + + /** + * + * + * Test serialization of object with outer number type + */ + @Test + public void fakeOuterCompositeSerializeTest() { + OuterComposite outerComposite = null; + // OuterComposite response = api.fakeOuterCompositeSerialize(outerComposite); + + // TODO: test validations + } + + + /** + * + * + * Test serialization of outer number types + */ + @Test + public void fakeOuterNumberSerializeTest() { + BigDecimal body = null; + // BigDecimal response = api.fakeOuterNumberSerialize(body); + + // TODO: test validations + } + + + /** + * + * + * Test serialization of outer string types + */ + @Test + public void fakeOuterStringSerializeTest() { + String body = null; + // String response = api.fakeOuterStringSerialize(body); + + // TODO: test validations + } + + + /** + * + * + * For this test, the body for this request much reference a schema named `File`. + */ + @Test + public void testBodyWithFileSchemaTest() { + FileSchemaTestClass fileSchemaTestClass = null; + // api.testBodyWithFileSchema(fileSchemaTestClass); + + // TODO: test validations + } + + + /** + * + * + * + */ + @Test + public void testBodyWithQueryParamsTest() { + String query = null; + User user = null; + // api.testBodyWithQueryParams(query, user); + + // TODO: test validations + } + + /** + * + * + * + * + * This tests the overload of the method that uses a Map for query parameters instead of + * listing them out individually. + */ + @Test + public void testBodyWithQueryParamsTestQueryMap() { + User user = null; + FakeApi.TestBodyWithQueryParamsQueryParams queryParams = new FakeApi.TestBodyWithQueryParamsQueryParams() + .query(null); + // api.testBodyWithQueryParams(user, queryParams); + + // TODO: test validations + } + + /** + * To test \"client\" model + * + * To test \"client\" model + */ + @Test + public void testClientModelTest() { + Client client = null; + // Client response = api.testClientModel(client); + + // TODO: test validations + } + + + /** + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * + * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + */ + @Test + public void testEndpointParametersTest() { + BigDecimal number = null; + Double _double = null; + String patternWithoutDelimiter = null; + byte[] _byte = null; + Integer integer = null; + Integer int32 = null; + Long int64 = null; + Float _float = null; + String string = null; + File binary = null; + LocalDate date = null; + OffsetDateTime dateTime = null; + String password = null; + String paramCallback = null; + // api.testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback); + + // TODO: test validations + } + + + /** + * To test enum parameters + * + * To test enum parameters + */ + @Test + public void testEnumParametersTest() { + List enumHeaderStringArray = null; + String enumHeaderString = null; + List enumQueryStringArray = null; + String enumQueryString = null; + Integer enumQueryInteger = null; + Double enumQueryDouble = null; + List enumFormStringArray = null; + String enumFormString = null; + // api.testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumFormStringArray, enumFormString); + + // TODO: test validations + } + + /** + * To test enum parameters + * + * To test enum parameters + * + * This tests the overload of the method that uses a Map for query parameters instead of + * listing them out individually. + */ + @Test + public void testEnumParametersTestQueryMap() { + List enumHeaderStringArray = null; + String enumHeaderString = null; + List enumFormStringArray = null; + String enumFormString = null; + FakeApi.TestEnumParametersQueryParams queryParams = new FakeApi.TestEnumParametersQueryParams() + .enumQueryStringArray(null) + .enumQueryString(null) + .enumQueryInteger(null) + .enumQueryDouble(null); + // api.testEnumParameters(enumHeaderStringArray, enumHeaderString, enumFormStringArray, enumFormString, queryParams); + + // TODO: test validations + } + + /** + * test inline additionalProperties + * + * + */ + @Test + public void testInlineAdditionalPropertiesTest() { + Map requestBody = null; + // api.testInlineAdditionalProperties(requestBody); + + // TODO: test validations + } + + + /** + * test json serialization of form data + * + * + */ + @Test + public void testJsonFormDataTest() { + String param = null; + String param2 = null; + // api.testJsonFormData(param, param2); + + // TODO: test validations + } + + +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java new file mode 100644 index 00000000000..192ca5e1e30 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/FakeClassnameTags123ApiTest.java @@ -0,0 +1,40 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Client; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for FakeClassnameTags123Api + */ +public class FakeClassnameTags123ApiTest { + + private FakeClassnameTags123Api api; + + @Before + public void setup() { + api = new ApiClient().buildClient(FakeClassnameTags123Api.class); + } + + + /** + * To test class name in snake case + * + * To test class name in snake case + */ + @Test + public void testClassnameTest() { + Client client = null; + // Client response = api.testClassname(client); + + // TODO: test validations + } + + +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/PetApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/PetApiTest.java new file mode 100644 index 00000000000..3914f4c01a5 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/PetApiTest.java @@ -0,0 +1,193 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import java.io.File; +import org.openapitools.client.model.ModelApiResponse; +import org.openapitools.client.model.Pet; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for PetApi + */ +public class PetApiTest { + + private PetApi api; + + @Before + public void setup() { + api = new ApiClient().buildClient(PetApi.class); + } + + + /** + * Add a new pet to the store + * + * + */ + @Test + public void addPetTest() { + Pet pet = null; + // api.addPet(pet); + + // TODO: test validations + } + + + /** + * Deletes a pet + * + * + */ + @Test + public void deletePetTest() { + Long petId = null; + String apiKey = null; + // api.deletePet(petId, apiKey); + + // TODO: test validations + } + + + /** + * Finds Pets by status + * + * Multiple status values can be provided with comma separated strings + */ + @Test + public void findPetsByStatusTest() { + List status = null; + // List response = api.findPetsByStatus(status); + + // TODO: test validations + } + + /** + * Finds Pets by status + * + * Multiple status values can be provided with comma separated strings + * + * This tests the overload of the method that uses a Map for query parameters instead of + * listing them out individually. + */ + @Test + public void findPetsByStatusTestQueryMap() { + PetApi.FindPetsByStatusQueryParams queryParams = new PetApi.FindPetsByStatusQueryParams() + .status(null); + // List response = api.findPetsByStatus(queryParams); + + // TODO: test validations + } + + /** + * Finds Pets by tags + * + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + */ + @Test + public void findPetsByTagsTest() { + List tags = null; + // List response = api.findPetsByTags(tags); + + // TODO: test validations + } + + /** + * Finds Pets by tags + * + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * This tests the overload of the method that uses a Map for query parameters instead of + * listing them out individually. + */ + @Test + public void findPetsByTagsTestQueryMap() { + PetApi.FindPetsByTagsQueryParams queryParams = new PetApi.FindPetsByTagsQueryParams() + .tags(null); + // List response = api.findPetsByTags(queryParams); + + // TODO: test validations + } + + /** + * Find pet by ID + * + * Returns a single pet + */ + @Test + public void getPetByIdTest() { + Long petId = null; + // Pet response = api.getPetById(petId); + + // TODO: test validations + } + + + /** + * Update an existing pet + * + * + */ + @Test + public void updatePetTest() { + Pet pet = null; + // api.updatePet(pet); + + // TODO: test validations + } + + + /** + * Updates a pet in the store with form data + * + * + */ + @Test + public void updatePetWithFormTest() { + Long petId = null; + String name = null; + String status = null; + // api.updatePetWithForm(petId, name, status); + + // TODO: test validations + } + + + /** + * uploads an image + * + * + */ + @Test + public void uploadFileTest() { + Long petId = null; + String additionalMetadata = null; + File file = null; + // ModelApiResponse response = api.uploadFile(petId, additionalMetadata, file); + + // TODO: test validations + } + + + /** + * uploads an image (required) + * + * + */ + @Test + public void uploadFileWithRequiredFileTest() { + Long petId = null; + File requiredFile = null; + String additionalMetadata = null; + // ModelApiResponse response = api.uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata); + + // TODO: test validations + } + + +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/StoreApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/StoreApiTest.java new file mode 100644 index 00000000000..bdb0b7a1e09 --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/StoreApiTest.java @@ -0,0 +1,81 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.Order; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for StoreApi + */ +public class StoreApiTest { + + private StoreApi api; + + @Before + public void setup() { + api = new ApiClient().buildClient(StoreApi.class); + } + + + /** + * Delete purchase order by ID + * + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + */ + @Test + public void deleteOrderTest() { + String orderId = null; + // api.deleteOrder(orderId); + + // TODO: test validations + } + + + /** + * Returns pet inventories by status + * + * Returns a map of status codes to quantities + */ + @Test + public void getInventoryTest() { + // Map response = api.getInventory(); + + // TODO: test validations + } + + + /** + * Find purchase order by ID + * + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + */ + @Test + public void getOrderByIdTest() { + Long orderId = null; + // Order response = api.getOrderById(orderId); + + // TODO: test validations + } + + + /** + * Place an order for a pet + * + * + */ + @Test + public void placeOrderTest() { + Order order = null; + // Order response = api.placeOrder(order); + + // TODO: test validations + } + + +} diff --git a/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/UserApiTest.java b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/UserApiTest.java new file mode 100644 index 00000000000..c1d841f1e8a --- /dev/null +++ b/samples/client/petstore/java/feign10x/src/test/java/org/openapitools/client/api/UserApiTest.java @@ -0,0 +1,156 @@ +package org.openapitools.client.api; + +import org.openapitools.client.ApiClient; +import org.openapitools.client.model.User; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for UserApi + */ +public class UserApiTest { + + private UserApi api; + + @Before + public void setup() { + api = new ApiClient().buildClient(UserApi.class); + } + + + /** + * Create user + * + * This can only be done by the logged in user. + */ + @Test + public void createUserTest() { + User user = null; + // api.createUser(user); + + // TODO: test validations + } + + + /** + * Creates list of users with given input array + * + * + */ + @Test + public void createUsersWithArrayInputTest() { + List user = null; + // api.createUsersWithArrayInput(user); + + // TODO: test validations + } + + + /** + * Creates list of users with given input array + * + * + */ + @Test + public void createUsersWithListInputTest() { + List user = null; + // api.createUsersWithListInput(user); + + // TODO: test validations + } + + + /** + * Delete user + * + * This can only be done by the logged in user. + */ + @Test + public void deleteUserTest() { + String username = null; + // api.deleteUser(username); + + // TODO: test validations + } + + + /** + * Get user by user name + * + * + */ + @Test + public void getUserByNameTest() { + String username = null; + // User response = api.getUserByName(username); + + // TODO: test validations + } + + + /** + * Logs user into the system + * + * + */ + @Test + public void loginUserTest() { + String username = null; + String password = null; + // String response = api.loginUser(username, password); + + // TODO: test validations + } + + /** + * Logs user into the system + * + * + * + * This tests the overload of the method that uses a Map for query parameters instead of + * listing them out individually. + */ + @Test + public void loginUserTestQueryMap() { + UserApi.LoginUserQueryParams queryParams = new UserApi.LoginUserQueryParams() + .username(null) + .password(null); + // String response = api.loginUser(queryParams); + + // TODO: test validations + } + + /** + * Logs out current logged in user session + * + * + */ + @Test + public void logoutUserTest() { + // api.logoutUser(); + + // TODO: test validations + } + + + /** + * Updated user + * + * This can only be done by the logged in user. + */ + @Test + public void updateUserTest() { + String username = null; + User user = null; + // api.updateUser(username, user); + + // TODO: test validations + } + + +} From 9a19a064af0b5849810e8017603426f3de94c9f9 Mon Sep 17 00:00:00 2001 From: Akihito Nakano Date: Thu, 13 Sep 2018 21:54:45 +0900 Subject: [PATCH 73/74] Add a CLI option to control logging level (#1000) * Add CLI option to control logging level * Update the property name --- modules/openapi-generator-cli/src/main/resources/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator-cli/src/main/resources/logback.xml b/modules/openapi-generator-cli/src/main/resources/logback.xml index 91effef2e98..62800526bdd 100644 --- a/modules/openapi-generator-cli/src/main/resources/logback.xml +++ b/modules/openapi-generator-cli/src/main/resources/logback.xml @@ -24,7 +24,7 @@ - + From 29322da2f6192006c1db7646c84ab528f1cd2efb Mon Sep 17 00:00:00 2001 From: William Cheng Date: Thu, 13 Sep 2018 21:39:57 +0800 Subject: [PATCH 74/74] Dart (Jaguar) client generator (#998) * generator for dart jaguar * migrate to openapi-generator * fix locale issue * add auth generation for dart jaguar * fix generation of jaguar api with auth (#1009) * update deps (#1016) * add CI tests for dart jaguar * update dart jaguar bin script * trigger build failure * Revert "trigger build failure" This reverts commit a7d8bfd47a93f0903932aeff4afefeb7aa4c5c4a. --- bin/dart-jaguar-petstore.sh | 42 + bin/windows/dart-client-petstore.bat | 12 + .../languages/DartJaguarClientCodegen.java | 217 + .../org.openapitools.codegen.CodegenConfig | 1 + .../resources/dart-jaguar/README.mustache | 142 + .../dart-jaguar/analysis_options.mustache | 2 + .../main/resources/dart-jaguar/api.mustache | 53 + .../resources/dart-jaguar/api_doc.mustache | 86 + .../resources/dart-jaguar/apilib.mustache | 75 + .../dart-jaguar/auth/api_key_auth.mustache | 33 + .../resources/dart-jaguar/auth/auth.mustache | 23 + .../dart-jaguar/auth/basic_auth.mustache | 34 + .../resources/dart-jaguar/auth/oauth.mustache | 25 + .../main/resources/dart-jaguar/class.mustache | 26 + .../main/resources/dart-jaguar/enum.mustache | 38 + .../dart-jaguar/git_push.sh.mustache | 52 + .../resources/dart-jaguar/gitignore.mustache | 27 + .../main/resources/dart-jaguar/model.mustache | 9 + .../resources/dart-jaguar/object_doc.mustache | 16 + .../resources/dart-jaguar/pubspec.mustache | 12 + pom.xml | 2 + .../dart-jaguar/flutter_petstore/.gitignore | 10 + .../dart-jaguar/flutter_petstore/.metadata | 8 + .../dart-jaguar/flutter_petstore/README.md | 8 + .../flutter_petstore/android/.gitignore | 9 + .../flutter_petstore/android/app/build.gradle | 52 + .../android/app/src/main/AndroidManifest.xml | 39 + .../flutterpetstore/MainActivity.java | 14 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../flutter_petstore/android/build.gradle | 31 + .../android/gradle.properties | 1 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../flutter_petstore/android/gradlew | 160 + .../flutter_petstore/android/gradlew.bat | 90 + .../flutter_petstore/android/settings.gradle | 15 + .../flutter_petstore/ios/.gitignore | 41 + .../ios/Flutter/AppFrameworkInfo.plist | 30 + .../ios/Flutter/Debug.xcconfig | 1 + .../ios/Flutter/Release.xcconfig | 1 + .../Flutter/flutter_assets/AssetManifest.json | 1 + .../Flutter/flutter_assets/FontManifest.json | 1 + .../ios/Flutter/flutter_assets/LICENSE | 12514 ++++++++++++++++ .../fonts/MaterialIcons-Regular.ttf | Bin 0 -> 134640 bytes .../flutter_assets/isolate_snapshot_data | Bin 0 -> 292555 bytes .../Flutter/flutter_assets/kernel_blob.bin | Bin 0 -> 15136809 bytes .../flutter_assets/platform_strong.dill | Bin 0 -> 6069673 bytes .../Flutter/flutter_assets/vm_snapshot_data | Bin 0 -> 1024862 bytes .../ios/Runner.xcodeproj/project.pbxproj | 436 + .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 + .../contents.xcworkspacedata | 7 + .../flutter_petstore/ios/Runner/AppDelegate.h | 6 + .../flutter_petstore/ios/Runner/AppDelegate.m | 12 + .../AppIcon.appiconset/Contents.json | 116 + .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../flutter_petstore/ios/Runner/Info.plist | 49 + .../flutter_petstore/ios/Runner/main.m | 9 + .../flutter_petstore/lib/main.dart | 172 + .../openapi/.analysis_options | 2 + .../flutter_petstore/openapi/.gitignore | 27 + .../openapi/.openapi-generator-ignore | 23 + .../openapi/.openapi-generator/VERSION | 1 + .../flutter_petstore/openapi/README.md | 131 + .../openapi/analysis_options.yaml | 2 + .../openapi/docs/ApiResponse.md | 17 + .../flutter_petstore/openapi/docs/Category.md | 16 + .../flutter_petstore/openapi/docs/Order.md | 20 + .../flutter_petstore/openapi/docs/Pet.md | 20 + .../flutter_petstore/openapi/docs/PetApi.md | 379 + .../flutter_petstore/openapi/docs/StoreApi.md | 186 + .../flutter_petstore/openapi/docs/Tag.md | 16 + .../flutter_petstore/openapi/docs/User.md | 22 + .../flutter_petstore/openapi/docs/UserApi.md | 349 + .../flutter_petstore/openapi/git_push.sh | 52 + .../flutter_petstore/openapi/lib/api.dart | 117 + .../openapi/lib/api/pet_api.dart | 99 + .../openapi/lib/api/pet_api.jretro.dart | 146 + .../openapi/lib/api/store_api.dart | 52 + .../openapi/lib/api/store_api.jretro.dart | 51 + .../openapi/lib/api/user_api.dart | 91 + .../openapi/lib/api/user_api.jretro.dart | 70 + .../openapi/lib/auth/api_key_auth.dart | 33 + .../openapi/lib/auth/auth.dart | 23 + .../openapi/lib/auth/basic_auth.dart | 34 + .../openapi/lib/auth/oauth.dart | 25 + .../openapi/lib/model/api_response.dart | 34 + .../openapi/lib/model/api_response.jser.dart | 29 + .../openapi/lib/model/category.dart | 31 + .../openapi/lib/model/category.jser.dart | 27 + .../openapi/lib/model/order.dart | 43 + .../openapi/lib/model/order.jser.dart | 37 + .../openapi/lib/model/pet.dart | 45 + .../openapi/lib/model/pet.jser.dart | 47 + .../openapi/lib/model/tag.dart | 31 + .../openapi/lib/model/tag.jser.dart | 27 + .../openapi/lib/model/user.dart | 49 + .../openapi/lib/model/user.jser.dart | 39 + .../flutter_petstore/openapi/pom.xml | 62 + .../flutter_petstore/openapi/pubspec.yaml | 12 + .../dart-jaguar/flutter_petstore/pubspec.yaml | 59 + .../flutter_petstore/test/widget_test.dart | 29 + .../dart-jaguar/openapi/.analysis_options | 2 + .../petstore/dart-jaguar/openapi/.gitignore | 27 + .../openapi/.openapi-generator-ignore | 23 + .../openapi/.openapi-generator/VERSION | 1 + .../petstore/dart-jaguar/openapi/README.md | 131 + .../dart-jaguar/openapi/analysis_options.yaml | 2 + .../dart-jaguar/openapi/docs/ApiResponse.md | 17 + .../dart-jaguar/openapi/docs/Category.md | 16 + .../dart-jaguar/openapi/docs/Order.md | 20 + .../petstore/dart-jaguar/openapi/docs/Pet.md | 20 + .../dart-jaguar/openapi/docs/PetApi.md | 379 + .../dart-jaguar/openapi/docs/StoreApi.md | 186 + .../petstore/dart-jaguar/openapi/docs/Tag.md | 16 + .../petstore/dart-jaguar/openapi/docs/User.md | 22 + .../dart-jaguar/openapi/docs/UserApi.md | 349 + .../petstore/dart-jaguar/openapi/git_push.sh | 52 + .../petstore/dart-jaguar/openapi/lib/api.dart | 117 + .../dart-jaguar/openapi/lib/api/pet_api.dart | 99 + .../openapi/lib/api/pet_api.jretro.dart | 146 + .../openapi/lib/api/store_api.dart | 52 + .../openapi/lib/api/store_api.jretro.dart | 51 + .../dart-jaguar/openapi/lib/api/user_api.dart | 91 + .../openapi/lib/api/user_api.jretro.dart | 70 + .../openapi/lib/auth/api_key_auth.dart | 33 + .../dart-jaguar/openapi/lib/auth/auth.dart | 23 + .../openapi/lib/auth/basic_auth.dart | 34 + .../dart-jaguar/openapi/lib/auth/oauth.dart | 25 + .../openapi/lib/model/api_response.dart | 34 + .../openapi/lib/model/api_response.jser.dart | 29 + .../openapi/lib/model/category.dart | 31 + .../openapi/lib/model/category.jser.dart | 27 + .../dart-jaguar/openapi/lib/model/order.dart | 43 + .../openapi/lib/model/order.jser.dart | 37 + .../dart-jaguar/openapi/lib/model/pet.dart | 45 + .../openapi/lib/model/pet.jser.dart | 47 + .../dart-jaguar/openapi/lib/model/tag.dart | 31 + .../openapi/lib/model/tag.jser.dart | 27 + .../dart-jaguar/openapi/lib/model/user.dart | 49 + .../openapi/lib/model/user.jser.dart | 39 + .../petstore/dart-jaguar/openapi/pom.xml | 62 + .../petstore/dart-jaguar/openapi/pubspec.yaml | 12 + .../ios/Runner.xcodeproj/project.pbxproj | 8 +- .../dart/flutter_petstore/pubspec.yaml | 1 + 171 files changed, 20104 insertions(+), 4 deletions(-) create mode 100755 bin/dart-jaguar-petstore.sh create mode 100755 bin/windows/dart-client-petstore.bat create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartJaguarClientCodegen.java create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/README.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/analysis_options.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/api.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/api_doc.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/apilib.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/auth/api_key_auth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/auth/auth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/auth/basic_auth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/auth/oauth.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/class.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/enum.mustache create mode 100755 modules/openapi-generator/src/main/resources/dart-jaguar/git_push.sh.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/gitignore.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/model.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/object_doc.mustache create mode 100644 modules/openapi-generator/src/main/resources/dart-jaguar/pubspec.mustache create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/.gitignore create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/.metadata create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/README.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/.gitignore create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/build.gradle create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/AndroidManifest.xml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/java/com/yourcompany/flutterpetstore/MainActivity.java create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/drawable/launch_background.xml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/values/styles.xml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/build.gradle create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle.properties create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew.bat create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/android/settings.gradle create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/.gitignore create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/AppFrameworkInfo.plist create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Debug.xcconfig create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Release.xcconfig create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/AssetManifest.json create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/FontManifest.json create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/LICENSE create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/fonts/MaterialIcons-Regular.ttf create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/isolate_snapshot_data create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/kernel_blob.bin create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/platform_strong.dill create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/vm_snapshot_data create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner.xcodeproj/project.pbxproj create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/AppDelegate.h create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/AppDelegate.m create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Base.lproj/Main.storyboard create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/Info.plist create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/ios/Runner/main.m create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/lib/main.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/.analysis_options create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/.gitignore create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/.openapi-generator-ignore create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/.openapi-generator/VERSION create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/README.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/analysis_options.yaml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/ApiResponse.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/Category.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/Order.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/Pet.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/PetApi.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/StoreApi.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/Tag.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/User.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/docs/UserApi.md create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/git_push.sh create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/pet_api.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/pet_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/store_api.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/store_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/user_api.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/api/user_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/auth/api_key_auth.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/auth/auth.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/auth/basic_auth.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/auth/oauth.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/api_response.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/api_response.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/category.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/category.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/order.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/order.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/pet.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/pet.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/tag.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/tag.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/user.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/lib/model/user.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/pom.xml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/openapi/pubspec.yaml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/pubspec.yaml create mode 100644 samples/client/petstore/dart-jaguar/flutter_petstore/test/widget_test.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/.analysis_options create mode 100644 samples/client/petstore/dart-jaguar/openapi/.gitignore create mode 100644 samples/client/petstore/dart-jaguar/openapi/.openapi-generator-ignore create mode 100644 samples/client/petstore/dart-jaguar/openapi/.openapi-generator/VERSION create mode 100644 samples/client/petstore/dart-jaguar/openapi/README.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/analysis_options.yaml create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/ApiResponse.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/Category.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/Order.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/Pet.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/PetApi.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/StoreApi.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/Tag.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/User.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/docs/UserApi.md create mode 100644 samples/client/petstore/dart-jaguar/openapi/git_push.sh create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/pet_api.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/pet_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/store_api.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/store_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/user_api.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/api/user_api.jretro.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/auth/api_key_auth.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/auth/auth.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/auth/basic_auth.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/auth/oauth.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/api_response.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/api_response.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/category.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/category.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/order.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/order.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/pet.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/pet.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/tag.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/tag.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/user.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/lib/model/user.jser.dart create mode 100644 samples/client/petstore/dart-jaguar/openapi/pom.xml create mode 100644 samples/client/petstore/dart-jaguar/openapi/pubspec.yaml diff --git a/bin/dart-jaguar-petstore.sh b/bin/dart-jaguar-petstore.sh new file mode 100755 index 00000000000..53840c2797f --- /dev/null +++ b/bin/dart-jaguar-petstore.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" + +# Generate client +ags="$@ generate -t modules/openapi-generator/src/main/resources/dart-jaguar -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -l dart-jaguar -o samples/client/petstore/dart-jaguar/openapi -DhideGenerationTimestamp=true -DpubName=openapi" +java $JAVA_OPTS -jar $executable $ags + +# Generate non-browserClient and put it to the flutter sample app +ags="$@ generate -t modules/openapi-generator/src/main/resources/dart-jaguar -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -l dart-jaguar -o samples/client/petstore/dart-jaguar/flutter_petstore/openapi -DhideGenerationTimestamp=true -DpubName=openapi" +java $JAVA_OPTS -jar $executable $ags + +# There is a proposal to allow importing different libraries depending on the environment: +# https://github.com/munificent/dep-interface-libraries +# When this is implemented there will only be one library. + +# The current petstore test will then work for both: the browser library and the vm library. diff --git a/bin/windows/dart-client-petstore.bat b/bin/windows/dart-client-petstore.bat new file mode 100755 index 00000000000..6c240658f9a --- /dev/null +++ b/bin/windows/dart-client-petstore.bat @@ -0,0 +1,12 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -i modules\swagger-codegen\src\test\resources\2_0\petstore.yaml -l dart-jaguar -o samples\client\petstore\dart-jaguar\swagger -DhideGenerationTimestamp=true -DbrowserClient=false +java %JAVA_OPTS% -jar %executable% %ags% + +set ags=generate -i modules\swagger-codegen\src\test\resources\2_0\petstore.yaml -l dart-jaguar -o samples\client\petstore\dart-jaguar\flutter_petstore\swagger -DhideGenerationTimestamp=true +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartJaguarClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartJaguarClientCodegen.java new file mode 100644 index 00000000000..f90ad474f45 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartJaguarClientCodegen.java @@ -0,0 +1,217 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * 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 + * + * http://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 com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import io.swagger.models.Model; +import org.openapitools.codegen.CliOption; +import org.openapitools.codegen.CodegenConfig; +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.CodegenModel; +import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenProperty; +import org.openapitools.codegen.CodegenType; +import org.openapitools.codegen.DefaultCodegen; +import org.openapitools.codegen.SupportingFile; +import org.openapitools.codegen.utils.ModelUtils; + +import io.swagger.v3.oas.models.media.*; + +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +public class DartJaguarClientCodegen extends DartClientCodegen { + private static Set modelToIgnore = new HashSet<>(); + static { + modelToIgnore.add("datetime"); + modelToIgnore.add("list"); + modelToIgnore.add("map"); + modelToIgnore.add("file"); + } + public DartJaguarClientCodegen() { + super(); + browserClient = false; + outputFolder = "generated-code/dart-jaguar"; + embeddedTemplateDir = templateDir = "dart-jaguar"; + } + + @Override + public String getName() { + return "dart-jaguar"; + } + + @Override + public String getHelp() { + return "Generates a Dart Jaguar client library."; + } + + @Override + public String toDefaultValue(Schema p) { + if (ModelUtils.isMapSchema(p)) { + return "const {}"; + } else if (ModelUtils.isArraySchema(p)) { + return "const []"; + } + return super.toDefaultValue(p); + } + + @Override + public void processOpts() { + if (additionalProperties.containsKey(PUB_NAME)) { + this.setPubName((String) additionalProperties.get(PUB_NAME)); + } else { + //not set, use to be passed to template + additionalProperties.put(PUB_NAME, pubName); + } + + if (additionalProperties.containsKey(PUB_VERSION)) { + this.setPubVersion((String) additionalProperties.get(PUB_VERSION)); + } else { + //not set, use to be passed to template + additionalProperties.put(PUB_VERSION, pubVersion); + } + + if (additionalProperties.containsKey(PUB_DESCRIPTION)) { + this.setPubDescription((String) additionalProperties.get(PUB_DESCRIPTION)); + } else { + //not set, use to be passed to template + additionalProperties.put(PUB_DESCRIPTION, pubDescription); + } + + if (additionalProperties.containsKey(USE_ENUM_EXTENSION)) { + this.setUseEnumExtension(convertPropertyToBooleanAndWriteBack(USE_ENUM_EXTENSION)); + } else { + // Not set, use to be passed to template. + additionalProperties.put(USE_ENUM_EXTENSION, useEnumExtension); + } + + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + + // make api and model doc path available in mustache template + additionalProperties.put("apiDocPath", apiDocPath); + additionalProperties.put("modelDocPath", modelDocPath); + + final String libFolder = sourceFolder + File.separator + "lib"; + supportingFiles.add(new SupportingFile("pubspec.mustache", "", "pubspec.yaml")); + supportingFiles.add(new SupportingFile("analysis_options.mustache", "", "analysis_options.yaml")); + supportingFiles.add(new SupportingFile("apilib.mustache", libFolder, "api.dart")); + + supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh")); + supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + + final String authFolder = sourceFolder + File.separator + "lib" + File.separator + "auth"; + supportingFiles.add(new SupportingFile("auth/api_key_auth.mustache", authFolder, "api_key_auth.dart")); + supportingFiles.add(new SupportingFile("auth/basic_auth.mustache", authFolder, "basic_auth.dart")); + supportingFiles.add(new SupportingFile("auth/oauth.mustache", authFolder, "oauth.dart")); + supportingFiles.add(new SupportingFile("auth/auth.mustache", authFolder, "auth.dart")); + } + + + @Override + public Map postProcessModels(Map objs) { + objs = super.postProcessModels(objs); + List models = (List) objs.get("models"); + for (Object _mo : models) { + Map mo = (Map) _mo; + Set modelImports = new HashSet<>(); + CodegenModel cm = (CodegenModel) mo.get("model"); + for (String modelImport : cm.imports) { + if(!modelToIgnore.contains(modelImport.toLowerCase(Locale.ROOT))) { + modelImports.add(underscore(modelImport)); + } + } + cm.imports = modelImports; + cm.vendorExtensions.put("hasVars", cm.vars.size() > 0); + } + //objs.put("modelImports", modelImports); + return objs; + } + + @Override + public Map postProcessOperations(Map objs) { + objs = super.postProcessOperations(objs); + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + + Set modelImports = new HashSet<>(); + + for (CodegenOperation op : operationList) { + op.httpMethod = StringUtils.capitalize(op.httpMethod.toLowerCase(Locale.ROOT)); + boolean isJson = true; //default to JSON + boolean isForm = false; + boolean isMultipart = false; + if(op.consumes != null) { + for (Map consume : op.consumes) { + if (consume.containsKey("mediaType")) { + String type = consume.get("mediaType"); + isJson = type.equalsIgnoreCase("application/json"); + isForm = type.equalsIgnoreCase("application/x-www-form-urlencoded"); + isMultipart = type.equalsIgnoreCase("multipart/form-data"); + break; + } + } + } + + op.vendorExtensions.put("isJson", isJson); + op.vendorExtensions.put("isForm", isForm); + op.vendorExtensions.put("isMultipart", isMultipart); + + Set imports = new HashSet<>(); + for (String item : op.imports) { + if(!modelToIgnore.contains(item.toLowerCase(Locale.ROOT))) { + imports.add(underscore(item)); + } + } + modelImports.addAll(imports); + op.imports = imports; + + String[] items = op.path.split("/", -1); + String jaguarPath = ""; + + for (int i = 0; i < items.length; ++i) { + if (items[i].matches("^\\{(.*)\\}$")) { // wrap in {} + jaguarPath = jaguarPath + ":" + items[i].replace("{", "").replace("}", ""); + } else { + jaguarPath = jaguarPath + items[i]; + } + + if (i != items.length -1) { + jaguarPath = jaguarPath + "/"; + } + } + + op.path = jaguarPath; + } + + objs.put("modelImports", modelImports); + + return objs; + } +} diff --git a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index b557cd203f2..b02bd50172e 100644 --- a/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -17,6 +17,7 @@ org.openapitools.codegen.languages.CSharpClientCodegen org.openapitools.codegen.languages.CSharpDotNet2ClientCodegen org.openapitools.codegen.languages.CSharpNancyFXServerCodegen org.openapitools.codegen.languages.DartClientCodegen +org.openapitools.codegen.languages.DartJaguarClientCodegen org.openapitools.codegen.languages.EiffelClientCodegen org.openapitools.codegen.languages.ElixirClientCodegen org.openapitools.codegen.languages.ElmClientCodegen diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/README.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/README.mustache new file mode 100644 index 00000000000..f3e63b485e1 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/README.mustache @@ -0,0 +1,142 @@ +# {{pubName}} +{{#appDescription}} +{{{appDescription}}} +{{/appDescription}} + +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}} +{{/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://github.com/{{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 = JaguarApiGen(); +var api_instance = jaguarApiGen.get{{classname}}(); +{{#allParams}} +var {{paramName}} = {{#isListContainer}}[{{/isListContainer}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isListContainer}}]{{/isListContainer}}; // {{{dataType}}} | {{{description}}} +{{/allParams}} + +try { + {{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/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}}{{summary}}{{/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}}{{^hasMore}}{{infoEmail}} +{{/hasMore}}{{/apis}}{{/apiInfo}} + diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/analysis_options.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/analysis_options.mustache new file mode 100644 index 00000000000..518eb901a6f --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/analysis_options.mustache @@ -0,0 +1,2 @@ +analyzer: + strong-mode: true \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/api.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/api.mustache new file mode 100644 index 00000000000..762cb6a0fb1 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/api.mustache @@ -0,0 +1,53 @@ +import 'package:jaguar_retrofit/annotations/annotations.dart'; +import 'package:jaguar_retrofit/jaguar_retrofit.dart'; +import 'package:jaguar_serializer/jaguar_serializer.dart'; +import 'package:jaguar_serializer/src/repo/repo.dart'; +import 'dart:async'; + +{{#operations}} +{{#modelImports}}import 'package:{{pubName}}/model/{{.}}.dart'; +{{/modelImports}} + + +part '{{classFilename}}.jretro.dart'; + +@GenApiClient() +class {{classname}} extends _${{classname}}Client implements ApiClient { + final Route base; + final SerializerRepo serializers; + + {{classname}}({this.base, this.serializers}); + + {{#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}} }{{#hasMore}}, {{/hasMore}}{{/authMethods}}]}{{/hasAuthMethods}}) + Future<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {{nickname}}( + {{#pathParams}} + @PathParam("{{baseName}}") {{dataType}} {{paramName}}{{#hasMore}}, {{/hasMore}} + {{/pathParams}} + {{#headerParams}} + {{#-first}}{{#hasPathParams}},{{/hasPathParams}}{{/-first}} + @Header("{{baseName}}") {{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}} + {{/headerParams}} + {{#queryParams}} + {{#-first}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/-first}} + @QueryParam("{{baseName}}") {{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}} + {{/queryParams}} + {{#vendorExtensions}} + {{#formParams}} + {{#-first}}{{#hasQueryParams}},{{/hasQueryParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/-first}} + {{#isJson}}@AsJson() {{/isJson}}{{#isForm}}@AsFormField() {{/isForm}}{{#isMultipart}}@AsMultipartField() {{/isMultipart}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}} + {{/formParams}} + {{#bodyParam}} + {{#hasFormParams}},{{/hasFormParams}}{{^hasFormParams}}{{#hasQueryParams}},{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{#hasHeaderParams}},{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}}{{^hasFormParams}}{{^hasQueryParams}}{{^hasHeaderParams}}{{#hasPathParams}},{{/hasPathParams}}{{/hasHeaderParams}}{{/hasQueryParams}}{{/hasFormParams}} + {{#isJson}}@AsJson() {{/isJson}}{{#isForm}}@AsForm() {{/isForm}}{{#isMultipart}}@AsMultipart() {{/isMultipart}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}} + {{/bodyParam}} + {{/vendorExtensions}} + ); + + {{/operation}} + +} +{{/operations}} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/api_doc.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/api_doc.mustache new file mode 100644 index 00000000000..e723114f18c --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/api_doc.mustache @@ -0,0 +1,86 @@ +# {{pubName}}.api.{{classname}}{{#description}} +{{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}}{{summary}}{{/summary}} +{{/operation}}{{/operations}} + +{{#operations}} +{{#operation}} +# **{{{operationId}}}** +> {{#returnType}}{{{returnType}}} {{/returnType}}{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + +{{{summary}}}{{#notes}} + +{{{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}} = {{#isListContainer}}[{{/isListContainer}}{{#isBodyParam}}new {{dataType}}(){{/isBodyParam}}{{^isBodyParam}}{{{example}}}{{/isBodyParam}}{{#isListContainer}}]{{/isListContainer}}; // {{{dataType}}} | {{{description}}} +{{/allParams}} + +try { + {{#returnType}}var result = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/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}}]{{/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}}}{{#hasMore}}, {{/hasMore}}{{/consumes}}{{^consumes}}Not defined{{/consumes}} + - **Accept**: {{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/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}} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/apilib.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/apilib.mustache new file mode 100644 index 00000000000..71cfe8618a2 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/apilib.mustache @@ -0,0 +1,75 @@ +library {{pubName}}.api; + +import 'package:http/http.dart'; +import 'package:jaguar_serializer/jaguar_serializer.dart'; +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'; + +{{#apiInfo}}{{#apis}}import 'package:{{pubName}}/api/{{classFilename}}.dart'; +{{/apis}}{{/apiInfo}} +{{#models}}{{#model}}import 'package:{{pubName}}/model/{{classFilename}}.dart'; +{{/model}}{{/models}} + +final jsonJaguarRepo = JsonRepo() +{{#models}}{{#model}}..add({{classname}}Serializer()) +{{/model}}{{/models}}; + +final _defaultInterceptors = [OAuthInterceptor(), BasicAuthInterceptor(), ApiKeyAuthInterceptor()]; + +class JaguarApiGen { + List interceptors; + String basePath = "{{basePath}}"; + Route _baseRoute; + + /** + * Add custom global interceptors, put overrideInterceptors to true to set your interceptors only (auth interceptors will not be added) + */ + JaguarApiGen({List interceptors, bool overrideInterceptors = false, String baseUrl}) { + _baseRoute = Route(baseUrl ?? basePath).withClient(globalClient ?? IOClient()); + 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, SerializerRepo serializers}) { + if(base == null) { + base = _baseRoute; + } + if(serializers == null) { + serializers = jsonJaguarRepo; + } + return {{classname}}(base: base, serializers: serializers); + } + + {{/apis}}{{/apiInfo}} +} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/auth/api_key_auth.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/api_key_auth.mustache new file mode 100644 index 00000000000..feb0ba65712 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/api_key_auth.mustache @@ -0,0 +1,33 @@ +import 'dart:async'; +import 'package:{{pubName}}/auth/auth.dart'; +import 'package:jaguar_retrofit/jaguar_retrofit.dart'; + +class ApiKeyAuthInterceptor extends AuthInterceptor { + Map apiKeys = {}; + + @override + FutureOr 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); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/auth/auth.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/auth.mustache new file mode 100644 index 00000000000..477fbbf8374 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/auth.mustache @@ -0,0 +1,23 @@ +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> getAuthInfo(RouteBase route, String type) { + if (route.metadataMap.containsKey("auth")) { + final auth = route.metadataMap["auth"]; + List> results = []; + for (var info in auth) { + if(info["type"] == type) { + results.add(info); + } + } + return results; + } + return []; + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/auth/basic_auth.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/basic_auth.mustache new file mode 100644 index 00000000000..962be36d664 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/basic_auth.mustache @@ -0,0 +1,34 @@ +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 authInfo = {}; + + @override + FutureOr 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); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/auth/oauth.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/oauth.mustache new file mode 100644 index 00000000000..f12a63c45b5 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/auth/oauth.mustache @@ -0,0 +1,25 @@ +import 'dart:async'; +import 'package:{{pubName}}/auth/auth.dart'; +import 'package:jaguar_retrofit/jaguar_retrofit.dart'; + +class OAuthInterceptor extends AuthInterceptor { + Map tokens = {}; + + @override + FutureOr 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); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/class.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/class.mustache new file mode 100644 index 00000000000..6507390a0f7 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/class.mustache @@ -0,0 +1,26 @@ +part '{{classFilename}}.jser.dart'; + +class {{classname}} { + {{#vars}}{{#description}} /* {{{description}}} */{{/description}} + 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}}{{#hasVars}}{ + {{#vars}}{{^required}} this.{{name}}{{#defaultValue}} = {{{defaultValue}}}{{#hasMore}}, {{/hasMore}} {{/defaultValue}}{{/required}} + {{#required}} {{#defaultValue}}this.{{name}} = {{{defaultValue}}}{{#hasMore}}, {{/hasMore}} {{/defaultValue}}{{/required}}{{/vars}} + }{{/hasVars}}{{/vendorExtensions}} + ); + + @override + String toString() { + return '{{classname}}[{{#vars}}{{name}}=${{name}}, {{/vars}}]'; + } +} + +@GenSerializer() +class {{classname}}Serializer extends Serializer<{{classname}}> with _${{classname}}Serializer { + +} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/enum.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/enum.mustache new file mode 100644 index 00000000000..db68c114211 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/enum.mustache @@ -0,0 +1,38 @@ +part '{{classFilename}}.jser.dart'; + +@Entity() +class {{classname}} { + /// The underlying value of this enum member. + final {{dataType}} value; + + const {{classname}}._internal(this.value); + + {{#allowableValues}} + {{#enumVars}} + {{#description}} + /// {{description}} + {{/description}} + static const {{classname}} {{name}} = const {{classname}}._internal({{value}}); + {{/enumVars}} + {{/allowableValues}} +} + +class {{classname}}TypeTransformer extends TypeTransformer<{{classname}}> { + + @override + dynamic encode({{classname}} data) { + return data.value; + } + + @override + {{classname}} decode(dynamic data) { + switch (data) { + {{#allowableValues}} + {{#enumVars}} + case {{value}}: return {{classname}}.{{name}}; + {{/enumVars}} + {{/allowableValues}} + default: throw('Unknown enum value to decode: $data'); + } + } +} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/git_push.sh.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/git_push.sh.mustache new file mode 100755 index 00000000000..92d71b84970 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/git_push.sh.mustache @@ -0,0 +1,52 @@ +#!/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 swagger-petstore "minor update" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 + +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://github.com/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${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://github.com/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' + diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/gitignore.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/gitignore.mustache new file mode 100644 index 00000000000..7c280441649 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/gitignore.mustache @@ -0,0 +1,27 @@ +# 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 diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/model.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/model.mustache new file mode 100644 index 00000000000..d8e5f09b73d --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/model.mustache @@ -0,0 +1,9 @@ +import 'package:jaguar_serializer/jaguar_serializer.dart'; + +{{#models}} +{{#model}} +{{#imports}}import 'package:{{pubName}}/model/{{.}}.dart'; +{{/imports}} +{{#isEnum}}{{>enum}}{{/isEnum}}{{^isEnum}}{{>class}}{{/isEnum}} +{{/model}} +{{/models}} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/object_doc.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/object_doc.mustache new file mode 100644 index 00000000000..9ad4463997b --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/object_doc.mustache @@ -0,0 +1,16 @@ +{{#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}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{defaultValue}}]{{/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}} diff --git a/modules/openapi-generator/src/main/resources/dart-jaguar/pubspec.mustache b/modules/openapi-generator/src/main/resources/dart-jaguar/pubspec.mustache new file mode 100644 index 00000000000..30bdbdc28e5 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart-jaguar/pubspec.mustache @@ -0,0 +1,12 @@ +name: {{pubName}} +version: {{pubVersion}} +description: {{pubDescription}} +environment: + sdk: ">=2.0.0 <3.0.0" +dependencies: + jaguar_retrofit: '^2.5.4' + jaguar_serializer: '^2.2.2' +dev_dependencies: + jaguar_retrofit_gen: '^2.5.2' + jaguar_serializer_cli: '^2.2.1' + build_runner: '^0.10.0' \ No newline at end of file diff --git a/pom.xml b/pom.xml index 52b9d917058..98c8dc2d853 100644 --- a/pom.xml +++ b/pom.xml @@ -1017,6 +1017,8 @@ + samples/client/petstore/dart-jaguar/openapi + samples/client/petstore/dart-jaguar/flutter_petstore/openapi samples/client/petstore/dart2/petstore samples/client/petstore/haskell-http-client samples/client/petstore/elm-0.18 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/.gitignore b/samples/client/petstore/dart-jaguar/flutter_petstore/.gitignore new file mode 100644 index 00000000000..eb15c3d27ca --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +.atom/ +.idea +.packages +.pub/ +build/ +ios/.generated/ +packages +pubspec.lock +.flutter-plugins diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/.metadata b/samples/client/petstore/dart-jaguar/flutter_petstore/.metadata new file mode 100644 index 00000000000..a700013d0b7 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/.metadata @@ -0,0 +1,8 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 8f65fec5f5f7d7afbb0965f4a44bdb330a28fb19 + channel: alpha diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/README.md b/samples/client/petstore/dart-jaguar/flutter_petstore/README.md new file mode 100644 index 00000000000..608ce5afa7a --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/README.md @@ -0,0 +1,8 @@ +# flutter_petstore + +OpenApi petstore sample flutter + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](http://flutter.io/). diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/.gitignore b/samples/client/petstore/dart-jaguar/flutter_petstore/android/.gitignore new file mode 100644 index 00000000000..1658458c924 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +GeneratedPluginRegistrant.java diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/build.gradle b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/build.gradle new file mode 100644 index 00000000000..535c29bb389 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/build.gradle @@ -0,0 +1,52 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withInputStream { stream -> + localProperties.load(stream) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 25 + buildToolsVersion '25.0.3' + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.yourcompany.flutterpetstore" + minSdkVersion 16 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + androidTestCompile 'com.android.support:support-annotations:25.4.0' + androidTestCompile 'com.android.support.test:runner:0.5' + androidTestCompile 'com.android.support.test:rules:0.5' +} diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/AndroidManifest.xml b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..4532f539988 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/java/com/yourcompany/flutterpetstore/MainActivity.java b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/java/com/yourcompany/flutterpetstore/MainActivity.java new file mode 100644 index 00000000000..5c99c848d53 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/java/com/yourcompany/flutterpetstore/MainActivity.java @@ -0,0 +1,14 @@ +package com.yourcompany.flutterpetstore; + +import android.os.Bundle; + +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/drawable/launch_background.xml b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000000..304732f8842 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/values/styles.xml b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000000..00fa4417cfb --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/build.gradle b/samples/client/petstore/dart-jaguar/flutter_petstore/android/build.gradle new file mode 100644 index 00000000000..77cbd091409 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + jcenter() + maven { + url "https://maven.google.com" + } + } + + dependencies { + classpath 'com.android.tools.build:gradle:2.3.3' + } +} + +allprojects { + repositories { + jcenter() + maven { + url "https://maven.google.com" + } + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle.properties b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle.properties new file mode 100644 index 00000000000..8bd86f68051 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.jar b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.properties b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..45e7f14e952 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew new file mode 100755 index 00000000000..9d82f789151 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew.bat b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew.bat new file mode 100644 index 00000000000..8a0b282aa68 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/android/settings.gradle b/samples/client/petstore/dart-jaguar/flutter_petstore/android/settings.gradle new file mode 100644 index 00000000000..115da6cb4f4 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withInputStream { stream -> plugins.load(stream) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/.gitignore b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/.gitignore new file mode 100644 index 00000000000..38864eed23e --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/.gitignore @@ -0,0 +1,41 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/app.flx +/Flutter/app.zip +/Flutter/App.framework +/Flutter/Flutter.framework +/Flutter/Generated.xcconfig +/ServiceDefinitions.json + +Pods/ diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/AppFrameworkInfo.plist b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000000..6c2de8086bc --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + arm64 + + MinimumOSVersion + 8.0 + + diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Debug.xcconfig b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Release.xcconfig b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000000..592ceee85b8 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/AssetManifest.json b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/AssetManifest.json new file mode 100644 index 00000000000..03eaddffb9c --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/AssetManifest.json @@ -0,0 +1 @@ +{"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"]} \ No newline at end of file diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/FontManifest.json b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/FontManifest.json new file mode 100644 index 00000000000..34bacb770fc --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/FontManifest.json @@ -0,0 +1 @@ +[{"fonts":[{"asset":"fonts/MaterialIcons-Regular.ttf"}],"family":"MaterialIcons"},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}] \ No newline at end of file diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/LICENSE b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/LICENSE new file mode 100644 index 00000000000..6c576faae65 --- /dev/null +++ b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/LICENSE @@ -0,0 +1,12514 @@ +analyzer +args +csslib +logging + +Copyright 2013, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +async +collection +convert +crypto +mime +package_config +package_resolver +plugin +shelf_static +source_map_stack_trace +stream_channel +typed_data +utf +vm_service_client + +Copyright 2015, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +auth_header + +Copyright (c) 2016, Ravi Teja Gudapati. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +boolean_selector +front_end +kernel +meta +shelf_packages_handler +web_socket_channel + +Copyright 2016, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +boringssl + +Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +All rights reserved. + +This package is an SSL implementation written +by Eric Young (eay@cryptsoft.com). +The implementation was written so as to conform with Netscapes SSL. + +This library is free for commercial and non-commercial use as long as +the following conditions are aheared to. The following conditions +apply to all code found in this distribution, be it the RC4, RSA, +lhash, DES, etc., code; not just the SSL code. The SSL documentation +included with this distribution is covered by the same copyright terms +except that the holder is Tim Hudson (tjh@cryptsoft.com). + +Copyright remains Eric Young's, and as such any Copyright notices in +the code are not to be removed. +If this package is used in a product, Eric Young should be given attribution +as the author of the parts of the library used. +This can be in the form of a textual message at program startup or +in documentation (online or textual) provided with the package. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + "This product includes cryptographic software written by + Eric Young (eay@cryptsoft.com)" + The word 'cryptographic' can be left out if the rouines from the library + being used are not cryptographic related :-). +4. If you include any Windows specific code (or a derivative thereof) from + the apps directory (application code) you must include an acknowledgement: + "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +The licence and distribution terms for any publically available version or +derivative of this code cannot be changed. i.e. this code cannot simply be +copied and put under another distribution licence +[including the GNU Public Licence.] +-------------------------------------------------------------------------------- +boringssl + +Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +All rights reserved. + +This package is an SSL implementation written +by Eric Young (eay@cryptsoft.com). +The implementation was written so as to conform with Netscapes SSL. + +This library is free for commercial and non-commercial use as long as +the following conditions are aheared to. The following conditions +apply to all code found in this distribution, be it the RC4, RSA, +lhash, DES, etc., code; not just the SSL code. The SSL documentation +included with this distribution is covered by the same copyright terms +except that the holder is Tim Hudson (tjh@cryptsoft.com). + +Copyright remains Eric Young's, and as such any Copyright notices in +the code are not to be removed. +If this package is used in a product, Eric Young should be given attribution +as the author of the parts of the library used. +This can be in the form of a textual message at program startup or +in documentation (online or textual) provided with the package. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + "This product includes cryptographic software written by + Eric Young (eay@cryptsoft.com)" + The word 'cryptographic' can be left out if the rouines from the library + being used are not cryptographic related :-). +4. If you include any Windows specific code (or a derivative thereof) from + the apps directory (application code) you must include an acknowledgement: + "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +The licence and distribution terms for any publically available version or +derivative of this code cannot be changed. i.e. this code cannot simply be +copied and put under another distribution licence +[including the GNU Public Licence.] +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2002 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2003 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2000 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2000-2003 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2001 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2003 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2004 Kungliga Tekniska Högskolan +(Royal Institute of Technology, Stockholm, Sweden). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the Institute nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2004 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2005 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2006 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2006,2007 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2008 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2010 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2011 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2011 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2012 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2013 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2014 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + "This product includes cryptographic software written by + Eric Young (eay@cryptsoft.com)" + The word 'cryptographic' can be left out if the rouines from the library + being used are not cryptographic related :-). +4. If you include any Windows specific code (or a derivative thereof) from + the apps directory (application code) you must include an acknowledgement: + "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +The licence and distribution terms for any publically available version or +derivative of this code cannot be changed. i.e. this code cannot simply be +copied and put under another distribution licence +[including the GNU Public Licence.] +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2014, Google Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2015 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2015, Google Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2015, Intel Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2015-2016 the fiat-crypto authors (see the AUTHORS file). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2016, Google Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2017, Google Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright (c) 2018, Google Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + licensing@OpenSSL.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2003 Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2005 Nokia. All rights reserved. + +The portions of the attached software ("Contribution") is developed by +Nokia Corporation and is licensed pursuant to the OpenSSL open source +license. + +The Contribution, originally written by Mika Kousa and Pasi Eronen of +Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites +support (see RFC 4279) to OpenSSL. + +No patent licenses or other rights except those expressly stated in +the OpenSSL open source license shall be deemed granted or received +expressly, by implication, estoppel, or otherwise. + +No assurances are provided by Nokia that the Contribution does not +infringe the patent or other intellectual property rights of any third +party or that the license provides you with all the necessary rights +to make use of the Contribution. + +THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN +ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA +SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY +OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR +OTHERWISE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2005, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2006, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2006-2017 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2007, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2008 Google Inc. +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2009 Google Inc. +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2009 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2009, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2013-2016 The OpenSSL Project Authors. All Rights Reserved. +Copyright (c) 2012, Intel Corporation. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. +Copyright (c) 2014, Intel Corporation. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2015, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl + +Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. + +Licensed under the OpenSSL license (the "License"). You may not use +this file except in compliance with the License. You can obtain a copy +in the file LICENSE in the source distribution or at +https://www.openssl.org/source/license.html +-------------------------------------------------------------------------------- +boringssl + +Copyright 2016 Brian Smith. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +boringssl + +The MIT License (MIT) + +Copyright (c) 2015-2016 the fiat-crypto authors (see +https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +-------------------------------------------------------------------------------- +boringssl +dart + +OpenSSL License + + ==================================================================== + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + + 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + + 5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + + THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + ==================================================================== + + This product includes cryptographic software written by Eric Young + (eay@cryptsoft.com). This product includes software written by Tim + Hudson (tjh@cryptsoft.com). + +Original SSLeay License + +* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +* All rights reserved. + +* This package is an SSL implementation written +* by Eric Young (eay@cryptsoft.com). +* The implementation was written so as to conform with Netscapes SSL. + +* This library is free for commercial and non-commercial use as long as +* the following conditions are aheared to. The following conditions +* apply to all code found in this distribution, be it the RC4, RSA, +* lhash, DES, etc., code; not just the SSL code. The SSL documentation +* included with this distribution is covered by the same copyright terms +* except that the holder is Tim Hudson (tjh@cryptsoft.com). + +* Copyright remains Eric Young's, and as such any Copyright notices in +* the code are not to be removed. +* If this package is used in a product, Eric Young should be given attribution +* as the author of the parts of the library used. +* This can be in the form of a textual message at program startup or +* in documentation (online or textual) provided with the package. + +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. All advertising materials mentioning features or use of this software +* must display the following acknowledgement: +* "This product includes cryptographic software written by +* Eric Young (eay@cryptsoft.com)" +* The word 'cryptographic' can be left out if the rouines from the library +* being used are not cryptographic related :-). +* 4. If you include any Windows specific code (or a derivative thereof) from +* the apps directory (application code) you must include an acknowledgement: +* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +* SUCH DAMAGE. + +* The licence and distribution terms for any publically available version or +* derivative of this code cannot be changed. i.e. this code cannot simply be +* copied and put under another distribution licence +* [including the GNU Public Licence.] + +ISC license used for completely new code in BoringSSL: + +/* Copyright (c) 2015, Google Inc. + + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +The code in third_party/fiat carries the MIT license: + +Copyright (c) 2015-2016 the fiat-crypto authors (see +https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Licenses for support code + +Parts of the TLS test suite are under the Go license. This code is not included +in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so +distributing code linked against BoringSSL does not trigger this license: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +boringssl +observatory_pub_packages +skia +txt +vulkan + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +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 + + http://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. +-------------------------------------------------------------------------------- +charcode +glob +http +http_multi_server +http_parser +json_rpc_2 +matcher +path +pool +pub_semver +shelf +shelf_web_socket +source_maps +source_span +stack_trace +string_scanner +test +watcher +yaml + +Copyright 2014, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +client_cookie + +Copyright (c) 2017, teja. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +colorama + +Copyright (c) 2010 Jonathan Hartley +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holders, nor those of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +cupertino_icons + + +The MIT License (MIT) + +Copyright (c) 2016 Drifty (http://drifty.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2003-2005 Tom Wu +Copyright (c) 2012 Adam Singer (adam@solvr.io) +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF +THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +In addition, the following condition applies: + +All redistributions must retain an intact copy of this copyright notice +and disclaimer. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +dart + +Copyright 2009 The Go Authors. All rights reserved. +Use of this source code is governed by a BSD-style +license that can be found in the LICENSE file +-------------------------------------------------------------------------------- +dart + +Copyright 2012, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +double-conversion +icu + +Copyright 2006-2008 the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +double-conversion +icu + +Copyright 2010 the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +double-conversion +icu + +Copyright 2012 the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine + +Copyright (c) 2013 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine + +Copyright 2017 The Flutter Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine + +Copyright 2018 The Flutter Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet + +Copyright 2013 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet +icu +skia +topaz + +Copyright 2015 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet +icu +topaz + +Copyright 2014 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet +tonic +topaz + +Copyright 2016 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet +tonic +topaz + +Copyright 2017 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +garnet +topaz +txt + +Copyright 2017 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +icu +skia +topaz + +Copyright 2016 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +engine +skia +topaz + +Copyright 2018 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +files + +Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +files + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +files + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +files + +Copyright 2000, Clark Cooper +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 1995-2002 Jean-loup Gailly. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 1995-2002 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 2000, 2001, 2002, 2003, 2006, 2010 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 2000-2004, 2006-2011, 2013, 2014 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 2001, 2002 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 2001, 2002, 2003, 2004 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright (C) 2001-2008, 2011, 2013, 2014 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 1990, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2004, 2011 Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2014 + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2015 + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000, 2001, 2004 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000-2001, 2002 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000-2001, 2003 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2000-2010, 2012-2014 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2001, 2002, 2012 Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +Copyright 2003 by +Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +freetype2 + +The FreeType Project LICENSE + + 2006-Jan-27 + +Copyright 1996-2002, 2006 by +David Turner, Robert Wilhelm, and Werner Lemberg + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + + Please replace with the value from the FreeType version you + actually use. + +Legal Terms +=========== + +0. Definitions + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + +--- end of FTL.TXT --- +-------------------------------------------------------------------------------- +garnet + +Copyright 2013 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +garnet + +Copyright 2014 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +garnet + +Copyright 2017 The Fuchsia Authors.All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +garnet +tonic +topaz + +Copyright 2015 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +garnet +tonic +topaz + +Copyright 2018 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +gif + +GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! +-------------------------------------------------------------------------------- +gif + +The Graphics Interchange Format(c) is the copyright property of CompuServe +Incorporated. Only CompuServe Incorporated is authorized to define, redefine, +enhance, alter, modify or change in any way the definition of the format. + +CompuServe Incorporated hereby grants a limited, non-exclusive, royalty-free +license for the use of the Graphics Interchange Format(sm) in computer +software; computer software utilizing GIF(sm) must acknowledge ownership of the +Graphics Interchange Format and its Service Mark by CompuServe Incorporated, in +User and Technical Documentation. Computer software utilizing GIF, which is +distributed or may be distributed without User or Technical Documentation must +display to the screen or printer a message acknowledging ownership of the +Graphics Interchange Format and the Service Mark by CompuServe Incorporated; in +this case, the acknowledgement may be displayed in an opening screen or leading +banner, or a closing screen or trailing banner. A message such as the following +may be used: + + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." +-------------------------------------------------------------------------------- +harfbuzz + +Copyright (C) 2012 Grigori Goronzy + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 1998-2004 David Turner and Werner Lemberg +Copyright © 2004,2007,2009 Red Hat, Inc. +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 1998-2004 David Turner and Werner Lemberg +Copyright © 2004,2007,2009,2010 Red Hat, Inc. +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 1998-2004 David Turner and Werner Lemberg +Copyright © 2006 Behdad Esfahbod +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007 Chris Wilson +Copyright © 2009,2010 Red Hat, Inc. +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2010,2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2010,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009 Red Hat, Inc. +Copyright © 2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009,2010 Red Hat, Inc. +Copyright © 2010,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009,2010 Red Hat, Inc. +Copyright © 2010,2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009,2010 Red Hat, Inc. +Copyright © 2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2007,2008,2009,2010 Red Hat, Inc. +Copyright © 2012,2018 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2009 Keith Stribley +Copyright © 2011 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2009 Keith Stribley +Copyright © 2015 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2011 Codethink Limited +Copyright © 2010,2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2011 Codethink Limited +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2011 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2015 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2018 Ebrahim Byagowi + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009 Red Hat, Inc. +Copyright © 2018 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009,2010 Red Hat, Inc. +Copyright © 2010,2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009,2010 Red Hat, Inc. +Copyright © 2010,2011,2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009,2010 Red Hat, Inc. +Copyright © 2010,2011,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2009,2010 Red Hat, Inc. +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010 Red Hat, Inc. +Copyright © 2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010,2011 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010,2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010,2011,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2010,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011 Martin Hosken +Copyright © 2011 SIL International + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011 Martin Hosken +Copyright © 2011 SIL International +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011,2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011,2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011,2012,2014 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2011,2014 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2012 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2012 Mozilla Foundation. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2012,2013 Mozilla Foundation. +Copyright © 2012,2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2012,2017 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2013 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2013 Red Hat, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2014 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2015 Ebrahim Byagowi + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2015 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2015 Mozilla Foundation. +Copyright © 2015 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2015-2018 Ebrahim Byagowi + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2016 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2016 Google, Inc. +Copyright © 2018 Ebrahim Byagowi + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2016 Igalia S.L. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2016 Elie Roux +Copyright © 2018 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2017 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2018 Ebrahim Byagowi + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2018 Ebrahim Byagowi +Copyright © 2018 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +Copyright © 2018 Google, Inc. + + This is part of HarfBuzz, a text shaping library. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. + +Copyright © 2010,2011,2012 Google, Inc. +Copyright © 2012 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2009 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2006 Behdad Esfahbod +Copyright © 2005 David Turner +Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc. +Copyright © 1998-2004 David Turner and Werner Lemberg + +For full copyright notices consult the individual files in the package. + +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +-------------------------------------------------------------------------------- +harfbuzz + +The contents of this directory are licensed under the following terms: + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-------------------------------------------------------------------------------- +html + +Copyright (c) 2006-2012 The Authors + +Contributors: +James Graham - jg307@cam.ac.uk +Anne van Kesteren - annevankesteren@gmail.com +Lachlan Hunt - lachlan.hunt@lachy.id.au +Matt McDonald - kanashii@kanashii.ca +Sam Ruby - rubys@intertwingly.net +Ian Hickson (Google) - ian@hixie.ch +Thomas Broyer - t.broyer@ltgt.net +Jacques Distler - distler@golem.ph.utexas.edu +Henri Sivonen - hsivonen@iki.fi +Adam Barth - abarth@webkit.org +Eric Seidel - eric@webkit.org +The Mozilla Foundation (contributions from Henri Sivonen since 2008) +David Flanagan (Mozilla) - dflanagan@mozilla.com +Google Inc. (contributed the Dart port) - misc@dartlang.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- +icu + +Copyright (c) 1995-2016 International Business Machines Corporation and others +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies of +the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY +SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in this Software without prior written authorization +of the copyright holder. + +All trademarks and registered trademarks mentioned herein are the +property of their respective owners. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 1998 - 1999 Unicode, Inc. All Rights reserved. + Copyright (C) 2002-2005, International Business Machines + Corporation and others. All Rights Reserved. + +This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +No claims are made as to fitness for any particular purpose. No +warranties of any kind are expressed or implied. The recipient +agrees to determine applicability of information provided. If this +file has been provided on optical media by Unicode, Inc., the sole +remedy for any claim will be exchange of defective media within 90 +days of receipt. + +Unicode, Inc. hereby grants the right to freely use the information +supplied in this file in the creation of products supporting the +Unicode Standard, and to make copies of this file in any form for +internal or external distribution as long as this notice remains +attached. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 1999 Computer Systems and Communication Lab, + Institute of Information Science, Academia + * Sinica. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +. Neither the name of the Computer Systems and Communication Lab + nor the names of its contributors may be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 1999 TaBE Project. +Copyright (c) 1999 Pai-Hsiang Hsiao. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +. Neither the name of the TaBE Project nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 1999 Unicode, Inc. All Rights reserved. + Copyright (C) 2002-2005, International Business Machines + Corporation and others. All Rights Reserved. + +This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +No claims are made as to fitness for any particular purpose. No +warranties of any kind are expressed or implied. The recipient +agrees to determine applicability of information provided. If this +file has been provided on optical media by Unicode, Inc., the sole +remedy for any claim will be exchange of defective media within 90 +days of receipt. + +Unicode, Inc. hereby grants the right to freely use the information +supplied in this file in the creation of products supporting the +Unicode Standard, and to make copies of this file in any form for +internal or external distribution as long as this notice remains +attached. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 2002 Unicode, Inc. All Rights reserved. + Copyright (C) 2002-2005, International Business Machines + Corporation and others. All Rights Reserved. + +This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +No claims are made as to fitness for any particular purpose. No +warranties of any kind are expressed or implied. The recipient +agrees to determine applicability of information provided. If this +file has been provided on optical media by Unicode, Inc., the sole +remedy for any claim will be exchange of defective media within 90 +days of receipt. + +Unicode, Inc. hereby grants the right to freely use the information +supplied in this file in the creation of products supporting the +Unicode Standard, and to make copies of this file in any form for +internal or external distribution as long as this notice remains +attached. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 2013 International Business Machines Corporation +and others. All Rights Reserved. + +Project: http://code.google.com/p/lao-dictionary +Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt +License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt + (copied below) + + This file is derived from the above dictionary, with slight + modifications. + + Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, + are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. Redistributions in + binary form must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) 2014 International Business Machines Corporation +and others. All Rights Reserved. + +This list is part of a project hosted at: + github.com/kanyawtech/myanmar-karen-word-lists + +Copyright (c) 2013, LeRoy Benjamin Sharon +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: Redistributions of source code must retain the above +copyright notice, this list of conditions and the following +disclaimer. Redistributions in binary form must reproduce the +above copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided +with the distribution. + + Neither the name Myanmar Karen Word Lists, nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) IBM Corporation, 2000-2010. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) IBM Corporation, 2000-2011. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) IBM Corporation, 2000-2012. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) IBM Corporation, 2000-2014. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright (c) IBM Corporation, 2000-2016. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright 1996 Chih-Hao Tsai @ Beckman Institute, + University of Illinois +c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4 +-------------------------------------------------------------------------------- +icu + +Copyright 2000, 2001, 2002, 2003 Nara Institute of Science +and Technology. All Rights Reserved. + +Use, reproduction, and distribution of this software is permitted. +Any copy of this software, whether in its original form or modified, +must include both the above copyright notice and the following +paragraphs. + +Nara Institute of Science and Technology (NAIST), +the copyright holders, disclaims all warranties with regard to this +software, including all implied warranties of merchantability and +fitness, in no event shall NAIST be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether in an +action of contract, negligence or other tortuous action, arising out +of or in connection with the use or performance of this software. + +A large portion of the dictionary entries +originate from ICOT Free Software. The following conditions for ICOT +Free Software applies to the current dictionary as well. + +Each User may also freely distribute the Program, whether in its +original form or modified, to any third party or parties, PROVIDED +that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear +on, or be attached to, the Program, which is distributed substantially +in the same form as set out herein and that such intended +distribution, if actually made, will neither violate or otherwise +contravene any of the laws and regulations of the countries having +jurisdiction over the User or the intended distribution itself. + +NO WARRANTY + +The program was produced on an experimental basis in the course of the +research and development conducted during the project and is provided +to users as so produced on an experimental basis. Accordingly, the +program is provided without any warranty whatsoever, whether express, +implied, statutory or otherwise. The term "warranty" used herein +includes, but is not limited to, any warranty of the quality, +performance, merchantability and fitness for a particular purpose of +the program and the nonexistence of any infringement or violation of +any right of any third party. + +Each user of the program will agree and understand, and be deemed to +have agreed and understood, that there is no warranty whatsoever for +the program and, accordingly, the entire risk arising from or +otherwise connected with the program is assumed by the user. + +Therefore, neither ICOT, the copyright holder, or any other +organization that participated in or was otherwise related to the +development of the program and their respective officials, directors, +officers and other employees shall be held liable for any and all +damages, including, without limitation, general, special, incidental +and consequential damages, arising out of or otherwise in connection +with the use or inability to use the program or any product, material +or result produced or otherwise obtained by using the program, +regardless of whether they have been advised of, or otherwise had +knowledge of, the possibility of such damages at any time during the +project or thereafter. Each user will be deemed to have agreed to the +foregoing by his or her commencement of use of the program. The term +"use" as used herein includes, but is not limited to, the use, +modification, copying and distribution of the program and the +production of secondary products from the program. + +In the case where the program, whether in its original form or +modified, was distributed or delivered to or received by a user from +any person, organization or entity other than ICOT, unless it makes or +grants independently of ICOT any specific warranty to the user in +writing, such person, organization or entity, will also be exempted +from and not be held liable to the user for any such damages as noted +above as far as the program is concerned. +-------------------------------------------------------------------------------- +icu + +Copyright 2006-2011, the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Copyright © 1991-2018 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +-------------------------------------------------------------------------------- +icu + +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2009 International Business Machines Corporation and others + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies of +the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY +SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in this Software without prior written authorization +of the copyright holder. +-------------------------------------------------------------------------------- +icu + +The BSD License +http://opensource.org/licenses/bsd-license.php +Copyright (C) 2006-2008, Google Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following +disclaimer in the documentation and/or other materials provided with +the distribution. + Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +icu + +Unicode® Terms of Use +For the general privacy policy governing access to this site, see the Unicode Privacy Policy. For trademark usage, see the Unicode® Consortium Name and Trademark Usage Policy. + +A. Unicode Copyright. +1. Copyright © 1991-2017 Unicode, Inc. All rights reserved. +2. Certain documents and files on this website contain a legend indicating that "Modification is permitted." Any person is hereby authorized, without fee, to modify such documents and files to create derivative works conforming to the Unicode® Standard, subject to Terms and Conditions herein. +3. Any person is hereby authorized, without fee, to view, use, reproduce, and distribute all documents and files solely for informational purposes and in the creation of products supporting the Unicode Standard, subject to the Terms and Conditions herein. +4. Further specifications of rights and restrictions pertaining to the use of the particular set of data files known as the "Unicode Character Database" can be found in the License. +5. Each version of the Unicode Standard has further specifications of rights and restrictions of use. For the book editions (Unicode 5.0 and earlier), these are found on the back of the title page. The online code charts carry specific restrictions. All other files, including online documentation of the core specification for Unicode 6.0 and later, are covered under these general Terms of Use. +6. No license is granted to "mirror" the Unicode website where a fee is charged for access to the "mirror" site. +7. Modification is not permitted with respect to this document. All copies of this document must be verbatim. +B. Restricted Rights Legend. Any technical data or software which is licensed to the United States of America, its agencies and/or instrumentalities under this Agreement is commercial technical data or commercial computer software developed exclusively at private expense as defined in FAR 2.101, or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use, duplication, or disclosure by the Government is subject to restrictions as set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov 1995) and this Agreement. For Software, in accordance with FAR 12-212 or DFARS 227-7202, as applicable, use, duplication or disclosure by the Government is subject to the restrictions set forth in this Agreement. +C. Warranties and Disclaimers. +1. This publication and/or website may include technical or typographical errors or other inaccuracies . Changes are periodically added to the information herein; these changes will be incorporated in new editions of the publication and/or website. Unicode may make improvements and/or changes in the product(s) and/or program(s) described in this publication and/or website at any time. +2. If this file has been purchased on magnetic or optical media from Unicode, Inc. the sole and exclusive remedy for any claim will be exchange of the defective media within ninety (90) days of original purchase. +3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE. +D. Waiver of Damages. In no event shall Unicode or its licensors be liable for any special, incidental, indirect or consequential damages of any kind, or any damages whatsoever, whether or not Unicode was advised of the possibility of the damage, including, without limitation, those resulting from the following: loss of use, data or profits, in connection with the use, modification or distribution of this information or its derivatives. +E. Trademarks & Logos. +1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode, Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of Unicode, Inc. Use of the information and materials found on this website indicates your acknowledgement of Unicode, Inc.’s exclusive worldwide rights in the Unicode Word Mark, the Unicode Logo, and the Unicode trade names. +2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark Policy”) are incorporated herein by reference and you agree to abide by the provisions of the Trademark Policy, which may be changed from time to time in the sole discretion of Unicode, Inc. +3. All third party trademarks referenced herein are the property of their respective owners. +F. Miscellaneous. +1. Jurisdiction and Venue. This server is operated from a location in the State of California, United States of America. Unicode makes no representation that the materials are appropriate for use in other locations. If you access this server from other locations, you are responsible for compliance with local laws. This Agreement, all use of this site and any claims and damages resulting from use of this site are governed solely by the laws of the State of California without regard to any principles which would apply the laws of a different jurisdiction. The user agrees that any disputes regarding this site shall be resolved solely in the courts located in Santa Clara County, California. The user agrees said courts have personal jurisdiction and agree to waive any right to transfer the dispute to any other forum. +2. Modification by Unicode Unicode shall have the right to modify this Agreement at any time by posting it to this site. The user may not assign any part of this Agreement without Unicode’s prior written consent. +3. Taxes. The user agrees to pay any taxes arising from access to this website or use of the information herein, except for those based on Unicode’s net income. +4. Severability. If any provision of this Agreement is declared invalid or unenforceable, the remaining provisions of this Agreement shall remain in effect. +5. Entire Agreement. This Agreement constitutes the entire agreement between the parties. + +EXHIBIT 1 +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and +http://www.unicode.org/utility/trac/browser/. + +Unicode Data Files do not include PDF online code charts under the +directory http://www.unicode.org/Public/. + +Software includes any source code published in the Unicode Standard +or under the directories +http://www.unicode.org/Public/, http://www.unicode.org/reports/, +http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and +http://www.unicode.org/utility/trac/browser/. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2017 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +-------------------------------------------------------------------------------- +io +multi_server_socket +term_glyph + +Copyright 2017, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +jaguar_resty + +BSD 3-Clause License + +Copyright (c) 2017, Ravi Teja Gudapati +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +jaguar_retrofit + +Copyright (c) 2016, Jaguar Authors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Jaguar Authors nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Jaguar Authors BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +js + +Copyright 2012, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2009, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2009-2011, 2014-2016, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2009-2011, Nokia Corporation and/or its subsidiary(-ies). +All Rights Reserved. +Author: Siarhei Siamashka +Copyright (C) 2013-2014, Linaro Limited. All Rights Reserved. +Author: Ragesh Radhakrishnan +Copyright (C) 2014-2016, D. R. Commander. All Rights Reserved. +Copyright (C) 2015-2016, Matthieu Darbois. All Rights Reserved. +Copyright (C) 2016, Siarhei Siamashka. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2009-2011, Nokia Corporation and/or its subsidiary(-ies). +All Rights Reserved. +Author: Siarhei Siamashka +Copyright (C) 2014, Siarhei Siamashka. All Rights Reserved. +Copyright (C) 2014, Linaro Limited. All Rights Reserved. +Copyright (C) 2015, D. R. Commander. All Rights Reserved. +Copyright (C) 2015-2016, Matthieu Darbois. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2011, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2013, MIPS Technologies, Inc., California. +All Rights Reserved. +Authors: Teodora Novkovic (teodora.novkovic@imgtec.com) + Darko Laus (darko.laus@imgtec.com) +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2013-2014, MIPS Technologies, Inc., California. +All Rights Reserved. +Authors: Teodora Novkovic (teodora.novkovic@imgtec.com) + Darko Laus (darko.laus@imgtec.com) +Copyright (C) 2015, D. R. Commander. All Rights Reserved. +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2014, D. R. Commander. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2014-2015, D. R. Commander. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2014-2015, D. R. Commander. All Rights Reserved. +Copyright (C) 2014, Jay Foad. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C) 2015, D. R. Commander. All Rights Reserved. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2009-2014 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2009-2015 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2009-2016 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2011 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2011, 2015 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright (C)2011-2016 D. R. Commander. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +- Neither the name of the libjpeg-turbo Project nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2013-2014, 2016, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2013-2014, 2016, D. R. Commander. +Copyright (C) 2015-2016, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2014, 2016, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2014, D. R. Commander. +Copyright (C) 2013-2014, MIPS Technologies, Inc., California. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2014, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2009-2011, 2014-2015, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2010, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library - version 1.02 + +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2011, 2014, D. R. Commander. +Copyright (C) 2015, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2011, 2014-2016, D. R. Commander. +Copyright (C) 2013-2014, MIPS Technologies, Inc., California. +Copyright (C) 2014, Linaro Limited. +Copyright (C) 2015-2016, Matthieu Darbois. + +Based on the x86 SIMD extension for IJG JPEG library, +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009 Pierre Ossman for Cendio AB +Copyright (C) 2011, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009, 2012 Pierre Ossman for Cendio AB +Copyright (C) 2009, 2012, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +Copyright 2009, 2012 Pierre Ossman for Cendio AB +Copyright (C) 2012, D. R. Commander. + +Based on the x86 SIMD extension for IJG JPEG library +Copyright (C) 1999-2006, MIYASAKA Masaru. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +libjpeg-turbo + +libjpeg-turbo note: This file has been modified by The libjpeg-turbo Project +to include only information relevant to libjpeg-turbo, to wordsmith certain +sections, and to remove impolitic language that existed in the libjpeg v8 +README. It is included only for reference. Please see README.md for +information specific to libjpeg-turbo. + +The Independent JPEG Group's JPEG software +========================================== + +This distribution contains a release of the Independent JPEG Group's free JPEG +software. You are welcome to redistribute this software and to use it for any +purpose, subject to the conditions under LEGAL ISSUES, below. + +This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, +Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, +Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, +and other members of the Independent JPEG Group. + +IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee +(also known as JPEG, together with ITU-T SG16). + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + usage.txt Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.txt). + wizard.txt Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.txt How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.txt Overview of the JPEG library's internal structure. + coderules.txt Coding style rules --- please read if you contribute code. + +Please read at least usage.txt. Some information can also be found in the JPEG +FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find +out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + +OVERVIEW +======== + +This package contains C software to implement JPEG image encoding, decoding, +and transcoding. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and grayscale images. JPEG's strong suit is compressing +photographic images or other types of images that have smooth color and +brightness transitions between neighboring pixels. Images with sharp lines or +other abrupt features may not compress well with JPEG, and a higher JPEG +quality may have to be used to avoid visible compression artifacts with such +images. + +JPEG is lossy, meaning that the output pixels are not necessarily identical to +the input pixels. However, on photographic content and other "smooth" images, +very good compression ratios can be obtained with no visible compression +artifacts, and extremely high compression ratios are possible if you are +willing to sacrifice image quality (by reducing the "quality" setting in the +compressor.) + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +We have made no provision for supporting the hierarchical or lossless +processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. + +We have also included "jpegtran", a utility for lossless transcoding between +different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple +applications for inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent (now expired), GIF reading +support has been removed altogether, and the GIF writer has been simplified +to produce "uncompressed GIFs". This technique does not use the LZW +algorithm; the resulting GIF files are larger than usual, but are readable +by all standard GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + +REFERENCES +========== + +We recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PDF file containing a revised version of Wallace's article is +available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best currently available description of JPEG is the textbook "JPEG Still +Image Data Compression Standard" by William B. Pennebaker and Joan L. +Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG +standards (DIS 10918-1 and draft DIS 10918-2). + +The original JPEG standard is divided into two parts, Part 1 being the actual +specification, while Part 2 covers compliance testing methods. Part 1 is +titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report +and thus received a formal publication status. It is available as a free +download in PDF format from +http://www.ecma-international.org/publications/techreports/E-TR-098.htm. +A PostScript version of the JFIF document is available at +http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at +http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from +http://www.ijg.org/files/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is www.ijg.org. +The most recent released version can always be found there in +directory "files". + +The JPEG FAQ (Frequently Asked Questions) article is a source of some +general information about JPEG. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + +FILE FORMAT WARS +================ + +The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together +with ITU-T SG16) currently promotes different formats containing the name +"JPEG" which are incompatible with original DCT-based JPEG. IJG therefore does +not support these formats (see REFERENCES). Indeed, one of the original +reasons for developing this free software was to help force convergence on +common, interoperable format standards for JPEG files. +Don't use an incompatible file format! +(In any case, our decoder will remain capable of reading existing JPEG +image files indefinitely.) + +TO DO +===== + +Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org. +-------------------------------------------------------------------------------- +libsdl +skia + +Copyright 2016 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright (c) 2010, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2010 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2011 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2012 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2013 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2014 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2015 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2016 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +libwebp + +Copyright 2017 Google Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +node_preamble + +The MIT License (MIT) + +Copyright (c) 2015 Michael Bullington + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +=== + +Copyright 2012, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2013, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2014, Michael Bostock and Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2014, the Dart project authors. +Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2017, the Dart project authors. +Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright 2013, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright 2014, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright 2015, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages + +Copyright 2016, the Dart project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +observatory_pub_packages +pkg + +Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +quiver + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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 + + http://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. +-------------------------------------------------------------------------------- +rapidjson + +Copyright (c) 2006-2013 Alexander Chemeris + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the product nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +rapidjson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +root_certificates + +Mozilla Public License +Version 2.0 + +1. Definitions + +1.1. “Contributor” + +means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + +1.2. “Contributor Version” + +means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + +means Covered Software of a particular Contributor. + +1.4. “Covered Software” + +means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + +1.5. “Incompatible With Secondary Licenses” + +means + + a. that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + +1.6. “Executable Form” + +means any form of the work other than Source Code Form. + +1.7. “Larger Work” + +means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + +1.8. “License” + +means this document. + +1.9. “Licensable” + +means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + +1.10. “Modifications” + +means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + +means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + +1.12. “Secondary License” + +means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + +means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + +means an individual or a legal entity exercising rights under this License. For legal entities, “You” includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants and Conditions + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its Contributions. + +This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + +3. Responsibilities + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients’ rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + +Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + +This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + +10. Versions of the License + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + +If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0. +-------------------------------------------------------------------------------- +root_certificates + +Mozilla Public License Version 2.0 +================================== + +1. Definitions + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +* 6. Disclaimer of Warranty + +* Covered Software is provided under this License on an "as is" +* basis, without warranty of any kind, either expressed, implied, or +* statutory, including, without limitation, warranties that the +* Covered Software is free of defects, merchantable, fit for a +* particular purpose or non-infringing. The entire risk as to the +* quality and performance of the Covered Software is with You. +* Should any Covered Software prove defective in any respect, You +* (not any Contributor) assume the cost of any necessary servicing, +* repair, or correction. This disclaimer of warranty constitutes an +* essential part of this License. No use of any Covered Software is +* authorized under this License except under this disclaimer. + +* 7. Limitation of Liability + +* Under no circumstances and under no legal theory, whether tort +* (including negligence), contract, or otherwise, shall any +* Contributor, or anyone who distributes Covered Software as +* permitted above, be liable to You for any direct, indirect, +* special, incidental, or consequential damages of any character +* including, without limitation, damages for lost profits, loss of +* goodwill, work stoppage, computer failure or malfunction, or any +* and all other commercial damages or losses, even if such party +* shall have been informed of the possibility of such damages. This +* limitation of liability shall not apply to liability for death or +* personal injury resulting from such party's negligence to the +* extent applicable law prohibits such limitation. Some +* jurisdictions do not allow the exclusion or limitation of +* incidental or consequential damages, so this exclusion and +* limitation may not apply to You. + +8. Litigation + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. +-------------------------------------------------------------------------------- +skcms + +Copyright (c) 2018 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skcms +skia +vulkan +vulkanmemoryallocator + +Copyright 2018 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright (C) 2014 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright (c) 2011 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright (c) 2014 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright (c) 2014-2016 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and/or associated documentation files (the "Materials"), +to deal in the Materials without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Materials, and to permit persons to whom the +Materials are furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Materials. +-------------------------------------------------------------------------------- +skia + +Copyright (c) 2015 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2005 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2006 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2006-2012 The Android Open Source Project +Copyright 2012 Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2007 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2008 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2008 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2009 Motorola + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2009 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2009-2015 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2010 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2010 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2011 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2011 Google Inc. +Copyright 2012 Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2011 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2012 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2012 Intel Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2012 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2013 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2013 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2014 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2014 Google Inc. +Copyright 2017 ARM Ltd. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2014 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2015 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2015 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2016 Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2016 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2017 ARM Ltd. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2017 Google Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2018 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2018 Google LLC. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2018 Google, LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +Copyright 2018 The Android Open Source Project + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +skia + +NEON optimized code (C) COPYRIGHT 2009 Motorola + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +tcmalloc + +Copyright (c) 2003, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +tcmalloc + +Copyright (c) 2005, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +topaz + +Copyright 2016 The Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +topaz + +Copyright 2017 Th%e Fuchsia Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +topaz + +Copyright 2017, the Flutter project authors. Please see the AUTHORS file +for details. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +vector_math + +Copyright 2015, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +vulkanmemoryallocator + +Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2003, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2005 Jean-loup Gailly. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2005, 2010 Jean-loup Gailly. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2005, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2006, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2007 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2008, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2009 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2010 Jean-loup Gailly + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2010 Jean-loup Gailly +detect_data_type() function provided freely by Cosmin Truta, 2006 + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2010 Jean-loup Gailly. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1995-2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + +Modifications for Zip64 support +Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + +For more info read MiniZip_info.txt + +Condition of use and distribution are the same than zlib : + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + +Modifications of Unzip for Zip64 +Copyright (C) 2007-2008 Even Rouault + +Modifications for Zip64 support on both zip and unzip +Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + +For more info read MiniZip_info.txt + +Condition of use and distribution are the same than zlib : + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2004, 2005, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2004, 2010 Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2013 Intel Corporation +Authors: + Arjan van de Ven + Jim Kukunas + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2013 Intel Corporation Jim Kukunas + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2013 Intel Corporation. All rights reserved. +Author: + Jim Kukunas + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2013 Intel Corporation. All rights reserved. +Authors: + Wajdi Feghali + Jim Guilford + Vinodh Gopal + Erdinc Ozturk + Jim Kukunas + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (C) 2014 Intel Corporation + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +-------------------------------------------------------------------------------- +zlib + +Copyright (c) 2011 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +zlib + +Copyright (c) 2012 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +zlib + +zlib.h -- interface of the 'zlib' general purpose compression library +version 1.2.4, March 14th, 2010 + +Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Jean-loup Gailly +Mark Adler diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/fonts/MaterialIcons-Regular.ttf b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/fonts/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9519e1d75e8e60fc461d42dceff7162076484747 GIT binary patch literal 134640 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 literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/isolate_snapshot_data b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/isolate_snapshot_data new file mode 100644 index 0000000000000000000000000000000000000000..bd2b61b191f3fbe07dc5e371a1ed441695573e9d GIT binary patch literal 292555 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 literal 0 HcmV?d00001 diff --git a/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/kernel_blob.bin b/samples/client/petstore/dart-jaguar/flutter_petstore/ios/Flutter/flutter_assets/kernel_blob.bin new file mode 100644 index 0000000000000000000000000000000000000000..01682c7b42392eeb67d648e423fec37785c88ff7 GIT binary patch literal 15136809 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

4ll{KxZqOMjv9AAc3; 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�#xyUvcvo`)LvTN>+XxB}0(P21d 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�B~ejeB@e2~hIoRx3mMJ)G0 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

4Y-YFjhd<;~#Z`!l{&)KuGIcFtSbk;XI= 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%0DTO8L2|vAZm#pHSd~ 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�qpPqx; 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

h+gGM=8T^jAV^Li`YerPa*`ma$CBy-jpSBA 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 z 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

`1gZTNiyG@^2tb5+NKy15H57g5 za|o>!{geM8^g+0(=pzOr3w%)VwBQX!qCe(E25fX2yP!nf%>97Eh+iVK|2R8#;qGg}(*{@;S(o$Sib3QDU1L@oBeDlc17`>zRzp#O0K zK#YH&$DXtQDOW}D3n#Gud5jDZ?=jB{T3Ff`kP89x#6lzb-wMzgkY569TD-VP9ZTQ5@knPdjfS>(_ z9@RJke&@($2y+yDRBaRso$_UJJunXf+=r=S+{SLF>d+})BXC$gTyXardL-wIimn_! zmq>+N2O{WA7v;RcjPRCA(LOcGv;be#5dB#=p1x+0?I^&eBP(xs_hKyI} zZeIf{12=)xK&+^ZGV-y~G7izr8o1kOp#$Lpp`olkxm!he|N(A^CRzt!BJsM0JubiD*!G-#Sfok>7Nzpf}(uy>Li=qa37l9@Qwba#|Aqb*9WM> zkJ-g=+RzcrII0<0nsH1tnGq3zCL?lgEH8{#M||KE$o`U)I^rT&9I*r}j#z?l@d*~` zNR8l}^q-vwOSbqkMZ+E07dehBgB(Ye zLEtcye~#P197nQ|jdU6rXSa~!$hR|2iyTJ=K2s-2^i!xUBS!^1dXIUV+A>%Do(|I0sKL`uDHd-Zt z(fODwsAXKSb#!zEr%G)d9o-LTll(e5`YY<_=ow5r#U?pn7iiIt#&OL!p&2I~ZT)mwK!ZfiskXL$y4ookwUt`+>1}^c>oM=Jia*PZ0PPqH$6p?L z`YcbNia#qSA)+WSH*VJIXVv{DvB2Hfm;B?yu^3^DeMPA6*tdgr6x?M-V+SCNL-@@( z88dcZAfvJ9p$Ty^5_WBDGU+GUrH^Mbs;KP({*bul&`dm#+>W+ z@aMEQRO>h{*pH(T9#@4w6>TbPc>aEC+`AcPM8AbLKd!gDOHUogUESki{B<72f(!u{@I=JaEl3%?Rh+AfP%Ita<8uN&L{7NIL23iIL2cbIT?QfR!}`t#S(b%P9$% z1QT0-rj!a))|6KzLuJn;L+O@a~*S?S{gMswGdi`UvwB zJ*FCX%B%WR7G~-?gg-4c{(8=ImoqZJpw5?v&^Xko2yKxBdK(9!#_?H<0OIQ630Ib* zi*p8baZMbTG46Fsk6EsSd3<4l(mO~A4=QewJ*bO&Hz2dPQ3QY(|3HsUUficHbUpY* zM;7-5dmaf+*qXr)Pjq$S-?Y#@Tz;=bq4m)<(QuzIG)% ztw!7*mO2e%G&!D&3mR?WLvaFPm-ndbr)7a7bD^7^=0eCTx>>Ld`qOahmoH3A&rH+! zUWV^-U;rj>GX}vc51LKm8p*VV4hpJ&+G~~`J6BjcLJ-;t7h_sy#~+y1Q(&0OXa-vI{Xgk#4)k)qToh3J_Xxiu zTvb#MK+B5%Auy>DkE30H*a{JU8UljHAq0d-J?1Y(k9`3FiyRXtA#6o#nCi<*%F{87 zp5E9}7ant`V^4;nyxq+#fmsCvA1C#ogvA8j9^fG)VCs@eI6d2b7D_mstKD_Fn7MI+ z7k`c-CWQHLOo#*Nggll$DMHEN@#QBq4zv^MBeb&>F#(4QjkWK(Q3GGM+e>P1j zV?r|*lo7vB#)LOfp*GCpdrr{AtW831OHImp1a|S|Wo^K`Gtoe} zUO0!QPcBW{1R>7&v?zXt5)%eW;@0uW&nclRn~_9nDWo=+IM}o*)^KNRBsC76XKaPq z=1;?2*n-?ek~=BM0lAJ3PG!C(mYV1ick-x-FN1@`!a*D)Rz{LUOz@HeI|)ScO%y)I zsV25yJhDmb1RfIG^G)tE19OSP#KzOa@dS+|$dQD?6v@mf4$-A2tiw(_E}MV&l~xjOADR?18htjzo_n3c3uU}Gjm-jhq46zlYceiw$i0dI=_TvC2#ogxWm zyC!kVPZI9XnRHe$k9d5AsGdoc5uhTo3`I%Lfr%ce>`72|MoHtA)Im|o1h=C|wJnl; zgzzy?(mma|l*3D{)ui!AIKrQB3ZDGed~hZ-DH&CtlnUL`mCFVM!Yq z#}h^6({nmAKS_rWIb88ogQrv$sb}Rv>RBo=ZPgO5>a6O*n9XWJa6^K{g#;+{EG*hh zoz7dsAkA60DYO{`%y`T}Gya6fSD3)eIPqg+_{!&qnWtM)-J zu{xN;S5DAL109A#APzlSgl!<=S=7p+O^AiJQ8-}a7ya!R`9&BM#uufxQA$uchAb3> z=WQdu=y*UJi*phHV*CR=8u-O|TrlwXg@IpO5C$Ic9^Xr%038w4*HV`p#=H*>PO%GI z{9X{bPbEx{gF6|sx%0s=7phnk>GGwExPqR8{u(OP&*_xKIa6G}x34 zF8^^XD%O%#Orgko1eOf+qfP|sZ;BrkdL74hwuD=!CoUTU3PU4Ou#B40UI6`lqDpzE zRO1hBp%m96NUO~VggP8Cq`Vp!=nEq62;-U3J?(E&Gr#lr%8%7vL^E4^)F4)3WJy0p%9RG!CzqaTRUZmzJ7_4nh2N1HTG0h74wzNOE|Ejz=eh3+!@<%Mt3nd+Gt0A1H$t8p z;i3KacFuH+%xQuYY>@F)ByiI9g6RB=#^D-lRPaR!O3;jr z2%B<%JjA~7p#3Zi)W*w*g@Gy&Fi;!sI2#oBxn)D_ZIA8RIm^=0c~MR z2f_E2-pFZ77fVm-9K!dOPZorD7XIv(g(%OKm5j%fW>RN6FUWYyL03`y9%roL zc*s#K?3QbcLt(e(V7do<^A~n&2^>83{f}ka3de10BTLPMZzjhTTdM@rWNQ-%k>iT3 zEm2fwT(PwiUYv1-IB>9ah~p-1g}*zi23pb9&++gowzIHX*cvZX0j+i`C(*Vpg7vC| zZA`)tl=4;NU~}sODCX8oDE`(=zDeOaV-qp&xb-h@dO=YMimxhUu=R4l?utZ@M4Qhn zj65>)1zjl%ellSr!4C>}n?QupqRD5LcW&NNGqKtQ6klDkoY~CTW#RGFpt$g15H)jv zrEcqs!i%-p%+3LEWe$@NX}mKN?XkRQt&w6{GjoMA#?Hiw^z0t?oO|YSl_(s`Qx#K=m?zYnb-UXd|=;UjXm+fH)#Sn%n_HLu? zIUud2(jVPkUP2s}gyw9of&8{t4k_{WR>39S{$ZfRwV2D_eGy_T_1t}wxG)Xh-ya92 zCjOo&Ay@=g0YTnMx>)4GkQqGyqE<7iDEv}6idI~R+sn9Oh_ijw2pbIFEV8&51nh7_ z1OC2k>2vMxgdqKG5u@(NBd2wCl!rR+z^Wc~^1?#xn25f0$8cmZCXfY}TXrlXAdvvkhsNS< zm8B==K*O3gJ%X<=uE{wl1X%HZTO(lSW_odSfcVVbEXI9|FdA_sg5oA3E*Wtz$T;Nm z?<&;TzXpo>?|c?jp0k^<5Gpd8ne`+o46OdeT0wfrK(Z_*+YcfB`zMmMe`d0Wmbx!D zj;PfRh@bB8zL$`8UvZ?}mp71>0$_Y)u(A(R7Y-|A;$`ACA}&1MeQi<3RW24?BWk%tOAD@dj&I0&8gcyu#w5Jm!CR8Rh|B}Z`^zCjD6ZHy$qCZzZvi#lUj>|;;@%*}ybZ?pV-9t0 z`*Mguru#9Io(#QJ;;?a%M8+V*fXG{%0b-IFD9(OdZ9KOZlYoo;P=n-tA_>38q3+Kp ziXYgvd0BZBsWxVkNO}zN+y4ilze{MyzW)9H`M0(swYvX4_w^qLBgq52tmQziCrFls zun$zQFTqw1)FF;n;=py`Ta=~GuK;hX37+3pqEMa#gAhi6Z~Hc1^}raplZ@yn6?x|4 z44IOT3lKXoH{5q#YO5aDi$WZ*2*?1=&3sBoAr74P7Xongz*W(?91J7=T@b>@2swa( z*be5P*bsjZ=U+*OHFv)e?Abw0<*`PP05U{JdbE~hjPt|J%~6wt1N7TyBdb?`K^*vAYV?K*f4Z?<-MAjm^S5K0GW z*P*)5u0t;cY1g4<(5^%E9PNSIh1bc3mb)M*CFngIrKZBJ_!w}m_vbs6G*Kdx=!snbf5A#oQsLz?T3)0 zb{#I|XxCvca1OsBain$~hMTZ3T58wfH!*#PKJaiy7LYVQMsej^kgaNzfXERn5K$(h zc=9a>1)@EC2;lm@-zGz+^ZXAVv9qEL(Kl7q@I5HMFNK|OYkx9tu$Rgx)WO{H;N8obWIf%IkbVOM&e>9qjpgzGQ#W9|v$pZczDYHj8Y7ldw#6*4K zENGyI=@ktCBNq*+DxKNkaA>?!Pg|2io)WFt7FRq!S4uK zE)x3nK~&zcEoh6!b~H0=7jW5TqgjgcWIXbp{?L#X@4sKTs>J1AH$+C zJJ|p!PX143K$Yez6pjQiHR2-5+l+fNfWp}p7pvgpSmb%K55Zj}IHcvBoaxUKIjAR- zg{GfeMf{~9o!iN;sb`E|Z)fdvZYTeCI=7QYC5WBd$;-qi2M?k2@-5IL*zcZt18wD0 zeV~b1amI9oi9OW{G1~&DtXvEtfT*78E{02|J_p59gGry_V8U52yr-a&$w^Nq91PH0 znQ$v{d73%g7C?I7Vzm^P3!3}Y9RKK z!j9q8O>%@hv$-!gy9n~khRYL@r*wJQ(_~{sO7t|@ZxXvHa?GytM2-?0_9XjLsz&xq zu#g>1796iKdp4<%7vWWAuSTJ=>B##{PBy(zyWh_Tz0N*^a8(I-mDvxO^>t=#`;gg> zm<5QU%cfSHZp@$B=p#;-2AXg_p&F;bZdxsvOn+k+2 zucaHcpJ>=;0yhf-uAWJ?8}^yiO!0%vz;4)QP&p)EH|#UJh_Wq!;&0ez?laHR1Rs&$ z5MiDz=ocn(P|rRu8ur<6;Gcatq+y?pp!gWy$j%zNBfQqLt(}H_wu=O@VV@mHeANHh zu~04f7HD+r4bM)Ywh$v3>M7p>80a0&UMk1@(2cR1;tchuJc~32g7sGYw0UiEX9}5nZd<3>yz@mKqsaK!mt;F!tmx-N2S+{Jw%G|&+QXpqs$+4% z6bqnBUU|gH*TCbe%K~0%h|t}uy{vM<+=dek0 zTIF*230P(P@;#Z2xLw|fihWxa^l}4HPzdlcoUoNw6<>WPZNsD4QoTz0!o4Ug^n%uRS40x%vOfOu{~~VX^N@O}+A^ z)Kp(XPP1N-;*9WV;x2_NxFWR?FItcF`0A6dYmmXUZV2CC>Ok;y4UeHjX5CJfrZ2eaQwt>KxF{2iQO0# zOzei3&UT13B(a+){Y@`IPY`>T#BRPAAa=94fPhV&YrBc5Mu#)OP9s49o!m{#GX3|K zv(XVBrtzD^o9IIbu_=6sr>8bL-rV49bi9dS*{UDyjgB|3L62@?ifq-7_D08>cjZP$ zAslRToPnD8FG5sA@HWT9!-_srM;NB)Nfi}+ma6Ept1J4Pst9WoeQsGrUp@#SThUjH zLpZAFD}Ph;uks_LBV1SXRZ$2N6#eVs;JAqDdzD4~4-<~J@>%NLl{wSPp-5;YELjd; zb3$(ov;$_|6j;Gq=rC{bSqSgeJUoT2``t?Q@eDUgd25BGe+}L6_?nQ?ofHHE;UFf) zXORNP-T6*NNOE`9AUd{xH?zA?Wf!&ZPNw+qE9l+X33?CA$sS)*K`#qYSmeFC9BIVP zvpdHERdnY+36bh|=Me}yD@1qUn)nSWKl7*F?F907-?8*>-gTO%cvtWC5Ki~q(P)}? zhXCF~!jaEy5u@H6FU;)ScxR32E{2ic@Q%v6n4(H0xq36TPLP$WQ^Ziis> z0j%$X${^Q@xUN*u37G|qVDtxj>=%WQF{U( zR|vgfz}JV^h!XF9&K>+=n9{?Bl$yisH8fehZQ#jKkfAtv{J2^W zG58LINFE<^G3fs|dHi?)d%DM?AkW7`#Hn6i@F(om$J5cWA5XIM9}4%7eca;&8x6bc zJ-&{D8R*ty7^26p60(6jP6=XWwS?HrYy>m@1|s(8JU+ra_8|{({WDoP=Hx-Y1t9e? zJgMUNcS)W+_O}fsR(guOOXF#P92-85$I&*Ye4fmoFQAq0)H5~sTn5>E zU$D6dkZ&xv>s@5Z{0om<3h;T;1XDPbiGXf3RvaxffA_4F$ z-LA``+YW-UlxjXyg__gSe~J(4Js9Iwi?Dxjt6nlu78r|DxrPWqsEzT)>5BK73XofE zAq1h~&ILEVqXJZnG~8-Wq5-Rwpo3jUZgm8K%n2N+anhrc0tLve&V?Q8M7gL-5q_}T zZfX(@u3JqF$VJ^EAyO_XI3CH6Ir2UqbBApTEaA2fF0JRP?VOptznCzWqPezB@jO;{AU%7Y;%PaZx-8 zMM*;N5CkzIgwPWpASk_rPH56BAM0L8?g&XpLJCPBg=FcF3dwB>haiFtq#1&MD8*ht zMT+`+KeKx!%Iov_{_zX!?acE$^UO2P^Gw~D-HjCMUx|%qI{gY<+v!C_I(>=OJLvQk zM8N#?j`=+ALqPuQ)HT+ty@O7F*kf`%)ZSQ+?CB2@pm)&e?+Ba&cF)3 zu$ll@ihn}ySi}wVn^Whfcj}tXa?D2M_!afMJFZ58%<@$b` z0p96y{fV^gbkb>RP{w!~8^6s|3;aslwcy`m)EfBV1I#)uH2xu zXtX=m4WiEWD=~T2H(WK9&^KhZ1YUXscOHJo{ z^w~5{#i;shy3t#oO}BAxi& z2jV%>Z8M2<>(Jh*z;){aS=KXQ8utn4b_waW**3}oa}CEBO}EX8ymbqdu2~gyyO?y_ z>^)p(ox0}O!KSv%&5n3<+w2Dwqt=gRcRjjwDYW@4P%QoL3T-}%6xw|C|4?Z2OrpXI zEp*M}oqr=v+9&A%dwvqYik zqxpB<`T$DT{1)`Fg!Iuuz||I4G4w&>P+bcjk3L%Xs~A-uEqbCV+;1E@98?2wK{qW% zfrhs!C|rvdv_^~uvDq+E+G2hgsYZ(OcmZG=N5U^!$7kL6A58~n<-_*4nPt>6rHLY?G@kAGK zyxy^liqH~GP|H`Gx>guWs6*eD3p_<=`G$&7t9eT+ilEKkbuCj7aW9C{(6{9d*U+~m zT%+beD6A!Vr(6{A#yrk&uTAo1`?rl)ImN!Y%Z|UbN3?1jAyHlTyF~=N?Ls~UK zPU<$OVTe5fXKD2qu5J*fOB6U^)0hBtw!#Oib*+MtV=jN!I{3B1A!c2xo|=X=rqJv= z!aBe)xU0#fghMDHk9nRh&=zA|D>zfDMV<#bx>k#gh4k@fN<{kzwK_;C z363?F+QxdvaU6Eq&GK0QA8qg#0O?xyam@l+ z_XpeewOK&xDUhu7cq$3iSU5}T=^PE-w+Mr4J|C{N#>534i_)}y%_z6k(K@uQwM{D% zg{e(xouVm4kRPPze$5jdeI0X16Rp1_=y46|`GzP4boI#NJBL+m_aNqwhL z@Fs$;SIwamZ6829@1X0&obd*@-RSS83&BV``bWM~UDp;3X4~iC(_>X28sfH-fWF%Z ziy=vUO^CkX40OJqJPdx`HW|T_Ng)CGnL2n++xHN4wo+?ZcULA$w!GOnnfzxC=aAad7RtT43b?_>t6Axk9fYrhSfIAbQD6ASf z*R#NbZy+o%$7@WgV|ob#odTTGkv?T??^C$nMjSQG1h*+R;{FWYLm}ZlULd?6w3mbA z?sBl)Lw-Uw%01;LW#F;$#Z#WPVx#vHHHa2fYEK=rL0_HQaw6(VuGfx`v%ClJaj`sV?S;n5SaKfJPTHDrO92j6c4pD#SeH zs&6{I<86?>67yP24D%_N4iZ5ZV?jjyqwMvLcci-5PO*>2K8N$-LpVw7lZb#;5Mp7b zPMVzb)WZbYu-M_TSJA@^g;|MV>>bba^FGDK{)oRtnu_mlG#l9iMzTyl#+=N=n zCn#4)cq{gm*ms1-VvjcpkcSa4Kprl|RuNf%JR&0YEZ!^00uN>4s>by-3p_j-DRn*$ zt5jz%wO6k5*U2OQsb(D8cvC%Cj!CLbs*A&1PY#Eq-d6H;*n!yyOa#YxTc(jCL8@E3 zVQpqyAZd4POlzzLPY_sI*UlOE-iOR#hh^SdjB6{d8%T+#1Bp^y(wd~#YhTdG z7*67p`$@(g@pU9gb=f)0FND!)cV9=cRJZ9jymq*k`xVElM?wv&hfW7FMXJl`!Tgd> zd5|G72SD2r4LNg`c!wH@$)#U+h?d^e&Ab1+!cbH%7Ru7!hr%QGD8Gvtd z!&eR@`V6UVOIx_aXuzR}C^Q=MVV4!t9OR6gz1>|H8@&u48*AOxr$a>^C21xp&#);sYq&hhYo$xtNB9APafxHS?j2@&% zmK>>WD@tcO>p^;C$(8E1Z3FT%57Hw`o>aH}Ss?3y^p+(b@O_Xm(v!#|%ND6_M;GRo z`o0J0k);60JRpyHkRDkIrMjJ{fvLwlNRKSCRJW@Y@*E4Kw=7!$-wpUUccRsF(0&`bry8OmdfJKvWn-(LZM=LMlP|hDUwLf9e955lI2WYh){}!LPmr(SSd6D zq0|@(O+zRxmO?Kfly0Mt1)&Vc5_l}52}5`z4;TAUIFpBuHKlMC4}aN=!r45GN3IBO zqVNZ;T2Od14+plSa1IZLwW4q?4^M4P;XEE*-G;*XJZx)A;VnFz_W*?pc-Ya7!i7A1 z@<9sAJp7$V;jKK3=XD5gqwt3hJw)N{JlyMH3h&_Ihz=Cq$;0^4C+}U;Qre}xg*1qJ z`q#9#(lQBc$QJvg?bN01%oeG=!Jn%1f%?d_Luscmfta8Iy5KNZ+PCe}uvBvl8uM_% z3T%4Qc4@x>4(&CB2eeCn5O8SH1CLA}nm!49U-0lvf2m#i6lfOO^w1IC`^fTc5q8HyU+ogX7I%wKMM|^L$OaB3IXuSbEqeZ(6>WjqZ!Sj0mIz8TZoW#Cy4S*IaptNsk9^D}kGG%V(*0E>GS}3M!T%nT+x{fn-jAI*O5y2&O>WSO z&cLI8V$Qo;sw-+-)S(u&8Si5%YT_Do75Nj01{*~*9nh(t7eL=J&@ZxRLD5T0h{yg< z_Xl`sWQ&qv+R?ix8G(dqH-v>3WpyFfEZQy>ix+}mF{wqKW$aU&p)1ZPp(YeXFW!TDULhw|Yh3|0 z9SrDOjNvv`@QJZtF2-u`>gF?O3Hyau>=v|VPq5fqqo39M@ z=~FgWS2nkdwmr}vO0qIkh$xE|{L7XhJknK?vI1RML3wMCpd@7naOWjiiT)00;#8ZL zozY4H9_F$$&cKsTx=T{_y`>D#fliK$-6odZ;gW)X7?tGYNLNY9yP+1K8k7$Z%ex!p z(T)sHY2eu9^ThIT#w|S^8ykY-#qw8;mPwAxhTsyhJlANM?8s^eJ|~tRHp*ih*&Z;} zj`AC(atP?D9V-j`_dTT9d}V=8pMCRn`{wV{}xE?|TX1y)I4d+pgQU zeLs%ilBV{(kGra=0&h+2yWrAPfneTu!5MgJs#{b0ezoko0mv#jO5FD+*8=#*xbgct zTK2>HPpwM+MBE?9)d7602OnYCKa%5*i~C>XdI8?%!M|qNkJ&uZpAh#;TtUFwJ@`D! z{v3|~RNRjjRzOq0uO&;JTII6T{x4KZ?Y}MVzhbnVb8PZx6PBvzB33jvZZSIemH>64 zOyJRCMPH-stb;!#@qky06|;=C&m4R!iwC?}tcW$*>K%C=-ejqY{ice&4J=jUUvbf8 zsUn{~l~3p@pQv0!X2Ks?sz`{ad`j@I?1!-8vQ*_NUF9lA9!OxRN(??VOBH!rs&a?R zQbmHfa)&eUjIUc$l}<}#Eg%M1s`41u0{D9@Rr$T85-xSd083T=&eZ|D$5M_C7RN&z ze_V7t&h-Mk$5M_6ivyNK`V*pKJXa9#9!ojaSRAW3{!`KM4%Za$+)`)IIjZfPW4~%C z$6?W-80APuzDJudiQ`Mr@tHC8eaDstU_}rezZp}HItm(s9~G5$#?)gD?e!vBkE1*% zDo+~au@2coO_ow#G%45?EBV1F!b4#5);<8lL4Ql(Ubz;@;MtPiLt4EixQ?)^?ZfTUCcWi42?k!da z80GPf?H({`zIv3YdWg5?S9kTVUaV<;byuH0)y2B%;_5F+?f8S{S9cX6s`m^2)e6F4 zF3neeudDvP2GdH?e2p*eT=T2DdTYL>gQj`#FxPZ&2G#|-HDA-qQqvQVLC|bXe_k%| zf82wgXsN*-Sm2L~HM4mEf$!$Qzh$YxqC4;>#F`jhQs4tDXpQOyX_||uDHi-|svPth zOyBsgO*J@DaD0O4j#zWsXu9LrVXG5s{f)Ld$IcM3cCazTk%aZHs{4c0ohdW(=L9|Brk6=p#T`Lrb!q2re3PiB}jw0W8 znAsobe*X{+pv6exo}wcD7UJHM)W(>4mCz*h+-`(QX_9)*flwLg{M>g4mD42k943== zri~3RG2>@DQF(ljL)h?2b?%1PMJs-eQL+X^#{k7*7{l$SiVNg*%_M~HfN(R0-ut=E z219QPaHTTV98a6rs3B-~@<0ncjasQ9pdz@W!+~c_Y}BjxvKJfmhT{Z>vcUR{xGo|B zTRS+*1HixMWXq1|KS1${ z+jxS=Mz1%@^Y}Whh)6E|Y&7<(xEcSoqm(%g>m3JpCMAHsi&;kpFxs-b4@~MiU z+6=m@s0XG~QB-humiPD@<6(p`n0=l99dC@M%*PnKG9S|enU8tALFP`%eC&s~PB__w zPq9KhACi-W#(tv$)I7(LGvD7~xe&BdfQ?_>$H~S$j>O|0rx+;#e^5BRXbtD2*|;Y= zLxyn^>1P~Lj2l3qzD8Zeua?n7TRG9X1iLf3%L}lV=^&cKCxKrDw;1;(WT*XEk1;&C zSQsEL3Xr1%V~! z9OeXy=aXguFcHA_5q<1O>PC^$&LSQxb^^tL9)p~ z&cI78<&_eG;~?Zf7~TL)zDt^%ycySCtWXcdQ?}7mH7DnIs^;Wn(rlcU;{4y|7yi%#*QT>pXqo6Nilpt;(IZOm-SL!36) zQB7^ilzu9<;xE19Fo`tb`UogAGUlj; zYNmF@H5Atq5X|+=5)7segchdubq0RX**XHMxi(PGd#R~&prWZba>J%hASCTwLA97V z9TA0r(8pU`(6Fh|v`v~#wbPG@68^_Kq1l~~o}_Br@;J}|PXIBSDyu!@)I%f~c7&)F zE7gdPyErTa7S^A7nzuAlzaeUzCFIn!Rzq@P9`S{uj*6nVvLMwoMj2tQ_{9>fIMW0d zPao{*W78T_pM6<7{>KRNF#WVeX{I#=sY?yh@Z3^UL&0rUgq#v$~Y50aa zn>Lbogi)xkCZ#L;!EQF{n@CBgkbc@E4UVlfNQ7&e@EEGbFnV@Oc!}@<@@nE)OWd)o znoYyxlk336z49O21LQU2_|s?5&qS072P8dZn(oSU9iEFr4kCIPY^O&zWIG)#qgHn2 zcn7XE-HxjWS4uTDH z^fpo6ATC#ki&n1bH(gXdo{Eb`<2|aK^vTf~;639QYUj)D+BqXo1*x@j#5W^an|&+~kLo*o@l( zx$4Xo$Z}?5`eD=fK( zNoU}dZ#?302%C9@dX<^qkvq(y9)9K>qWy_zt-Zj3A2(4~H^>`ibp(1ADjuQXpXk44 z^#B=fyBX1kg5RtmoF8_`vsvRQ0XF?!`6l@k@Y=CKw4%2-zcqx8R?!+iKvqA`%TM&2 zUmEAPllT==ab4**0h3^+6t~2R0(S%<)ykifZ6&)WGY5WMUNKAtjs5K1b+J zRJ7^?v#&r_SP6ebPd+e*5x+U@!Ea70B$$JzMb|Mw2R^nTzd6|S#^!Wa(JH?=Vc_?k zi(f3~H0HX{~9ve`JVeVo?^#Op8-!vP^1 z{Bx!KAH2RMG}cZDt;q)WTfraS$ZrI45w&95X=FdQGYjR`nmZGbXqUCBgl>q=6rhs1 z*q+GnEniQ!!>v^X=~Qb~L3?v~4Vqhs+~=b5eEp+GEN-p2yhE7#F|j&AMA#Gc^^f z;Q19~;Q1#Y>3l5zyT=vWzy)pt7r?;tZ&9HZ;LQkZ{#|F_x5xis-~|tJd{3}i5D20L zj}p=S47^|rp)n{Tv}%wAlmBJl1$Yt#vUSAILJ3}@1ot!W0vdrV$WhT6KMWlIQ5_eY z1>{D7)sbTO_&PPX`O{uCUM63^T< z`lyOfD`oUqu<&{sPJ@8x?{VG4lGIh&T!o=d^zG8wSRK>lje)R>F+;`J*72U{PG6+u ztN0in5@rbf;Db#SH?fjiMkB?=qiJ#S#{|{RG$UR-)<^?Q$0sU69UI~(1Y1nw{l&|* z@g%DD;@Hjvp`pU!b*?%8fVGJ21aSltJrNWu?}oc=V2&bo9&1Z`d$-Hf9D6h_kL*g850Xbq`Ykmf9u!yyYqYG`}=-Uo`Zb^HWC=dQPqJe*`V=9TXJLcv5?bD-<>oIqs2RX*aJ`E573Nvqg~DJ+ zl?p*x7V$hYSUvzzbzdWJW3b|HT|$fH!C0uK;~uBXs8YZDK9|AQ&#b^gYfbC6MDUmpzWZ{0kMMI{xw>Nho!13?{zK)mh*2 zKdBLTsRCO<{DWc;=Uh%zFWYBe@hVI5)y`zo_zY=b+66Rl-gW@HUHCDFuSYstB zFk$$aHnwswLfjgFM&q3JpE|5Z;SLVq*)FD8rF*GjJ+VJko3GyIib!*DCl)6W^Bb&2DYItb%yC7!wVLf}`m zrJv?15$5xbBf-LKHeK)doMc!9qpd;}UUeEWz(J55$*>A0Ty>h~eIFTCE#NY&l87@c zGp$;7KN-}?Czqj^h<2((nBY3z*JQZBWx&*T6(*sp>mdW&Qj>uguda8?fTel}g^415 z_G`*mZ4kP4ftpu8O|&$qU)}Y-lJF_wLTag3n}})+{VcyPDIXA#(5q=Nd$p_*VG8Rw z3ZYdQpuLME`RYr!{zN-NlA{V~lCOc+toiSfuj!;pzUEnEvW8mMH39b(hmWSYFs`dC@b_Gl zp)sz&L!m72@G=&7M2APaXl(1hLnHeZC=LUw$NdQISlhhJq;pIsZBvgg(Qzg^z9d~! zk1v4&$05Fy&Y74=ANzn#j)8;0juV=oo$_^D0RlVGO*j#ON_G&N&94G-7?4{8S=Skm zYk=TffawoTvjvdrfcyf;Z4H8E{0D$~o1QUkrUu*;ZrY5DsVOwQNIxN*yAW)ePqAB^ zGh(opujvoMZ9y!aVz;%Jc5vm2gtp;UA{zCp)JojigwQo=-f!(h=(>eMcz>Yj8I-6! zvSc`A^o?}R>|=hw`V|IfkwOPEs#9DZL$xwLL@;VP%$;yI(ZRU5Q_M`gi*%YI)r{5~ zeIw1o%wsWxk0sbqp|2T*;H@em{^l2<7j!y|x!X7Me6ty&&p#%ZLPYa2qbbC31vKMH z&OatZnq$l_! zh*#_#lGhT*(}O&o@04=OMGXA4*w3Lz8fCBywOTM|)RG!3<3!5{Pwt{+yu0X>{eR*2 zMX1L3L?}5h)WLrdIz7N(u}GFTk;`M2uXIf3Z^7tm-7Gw8uv#)GZ;ycf7WDQSY8RnI zOPR@n@iJ70W^mmIX0}u#Hk68TewgK?V7X}d0w&n1=IQ1n7%bmdE!UlacgCqEu>4}O zeDB2v>0tuPZK5z(?poClH-WXWX!*;d1dG)V>Hc8?YmnLMPlAvMtiue}XRTKB=6A-a zCa^yDe>8!0jlnwEYMtm#YOu}|t0MrK(A@4>4vqucnkm1U4kaED>Yo zNHKWG0vc2em1en1$LsuwCPR!#kYdc726b1Z$>Q~x_;8x{#TZ43DdIG!(kjgdZUy`6 z9p6dkVlKt}9NPxPnId$E`NCbCTLk09`5SlB)F@!8Tm_1VZ7y_2w{Qzx!QJC5@LmqC z&q0SXh(Ai_Y|Ct`lW+#n4hHQ{I`+Vu3@^pg;&GhiN2t{4ug9k zL|)76{k(bs%{`_JvXA%b4btq3y?TRwjqK>QeAOX8dWI%w`+uhX;7=Puzfe2-=N5!+ zP=D}eB|P&vo()Mhkj((FZ^I-rj__;4tZVyFGB5nv zK5K^pzs`@XJ>l9*zxF(cUdM)>-=%Zw_3Ix_dK8_C&|!UJmnGMCBoJA0eGjsbXD_`F zvA)0HzkYb}Tpy%K2=iaR!tn#|Cqu;bDddtrn{J8gcah`$V){c|f0W$ohUvDr{u^?l zn;~LS3+(y&6`t@{G_Gru53aylZQ&2U074T}AKZV#9m9j$OsZ#1`0xPkBc0TS2iF-Z z{SfiLv{TOLJn_~8W_psb1F^V|pgt%p6rt%98u>Lb^Ksmj>dl8`^wcw{8;wGNYxoay z+{FX%=w;L<$JO8=?>Ug0c%NFs%vULLMny5lJ@B|KClC*4C`#!A5KbZUw+O`bp*Yj~ zC=lDy)zXzUlM~6M!S)LFkNGM-1ZRHcB5my9tN3b=Vw9EW@|myFh{N=zbiU;Y3k3=j zo@My;>A(~{uExHK9yI-!K6yRCg-%Rqh7MyxfV>{*8w2+;aBIAAsR42lrmRXcVvc`! zF3NOtNAaKyh{b%(MI^!&rbdcYc`&F5)iq&|o#E90|3SzX-W$YX{Yba2*AXawF21nK zI`9-+%n?>gCPXly6*DUE7<}It7im`TQJPEj2`3WHW<9NwlSx|@b&$+gX(`pOKhON^ zc|7$Ml&h6gpE3-U`}qGbps&(es!x5?Q|XoVQhj1X;yAoK2doocSWhyM<0j5Rz*XrJ z@y(YGiP6}MRp4vSqrzVif)lCknvVZhj{z0Fsn8)YnK^%91t&*&U}%P)hTGjU&_ENRuG=hN#LPg>GqY2$nQ6;Sr5Y z%SnTF91v`>0lU3%M%OCcrwQJMIzwsain>S0QM9JwU%S#fOoGsFT8ziuJza!McV zpFYvO!wJXi(*or5068N--WZ#)l}H0Nei|TW8aB4DY-~ir<{yFY2?Z?zPCaZMY7$=Auv#lG`k@gSEBb9#xI>4~8*tBsc2}OHRVmFph zMz)QWxZNYs=xgB{&sjEpN*VI6K$|ySM|eN~HZ)$2vGFcqllg8oGhUU#F*74F9}`TO z!H6a4m3C5n=Chg4XRhKKJTv=4BYBWpmpPq4{Ey^|$ebhiXD(2>5Jay$h*Ym;+OyF5 z(dujFYwl#(1S40-ti;`W)fL++Gf${%u9;VyLB92@;*$Y}EGA{bTE6xC?Z{b8peq|c z6%}{IC%~R3W(6C`uGI8I7NQ~Xd4>h~zJqHY3u;8(rt?uAlIpWUvO+iOb@C?U&3BY4 z&C$&HDvtoQiuomVK@FKvk)`4)>V%G2Z&hs3NU8ntRScj^#?I5tTEkpT-$GT(ikp?B|N#vX0@yiBbM|$>yQg$0>P$TW5$W%|6nEjZP-HCvO z$>5Qh-6lI2yO*+i8{42w>66`Gm)$>mktP6gQBMf9&&G?vQ8qDqhLk;pQcI_iI!iII zihFv+U#ibumHle=C6od^D@u_qQH1}|`bl{9S}{9;mxDIBXXj|SZPR6M%Ra3UdgWHm za|`C|L-k50@V}CMYco`d!AJI0m%n7+BM|w^rlz=i4L*FrH{oI5CZo9NQO-&+xa#w| z4=`Td6e{>{iYVzqBNOSKxM_{JX|6`6&MKvI;-*dFrgbjhInzs5kCq>Lz7n6f-smb?v1V)VzIiQ%cP0Y!Q&B>%h8k|8Jw{pxmJMq4e%_|YXI2Ah9 zD@ItSJoiBEIe}qVL$xaRP%aHN>5sdQ5RrRC5OdFpxyQv^oK7iJx@%1JN>8M|nEPv9 zp}@>{kpQXx$}8k)8M(-UGvtC;T0nKk^A-H_THz693vz6W*wv8NN6hPKG+$O8C$T%^ zjZpMlPBCwin1`o!1xk?lu9FRp7xR{hd8j*Elt2|gUxsw?HXA$S!8M}wdZm|CpSL5g zI{zse@PXk@6f}>d$~#Oj{zqlX=kk0kJeJ?nFF@WZ=6%bh2#~jldB0O*ZVZsOi}}sP zd>@{v>9d;s0rCzp|1mKiTiqcShnV-E7W#e8f|_=~wSxsUGaw7p!ah=c{*3&&2j=Qz z402qx5JTjrrTQ&RP&alp9IN{({eb9(rhPYQ%{A=D`&N|@Acg|5hk6H3p@j}xCgAD! zJYVHm5WLMEN}jKF3JWVK)pG#KNVOMr5MRvpRR#c13jjv>2W$lB55Oq^T!VbPf&dk8 zBm`fLe?L+=^55onG<^A1G#T=)2J;JA*u&fK^D~WI9V6qFnW0{G__;eL$N&BuCd znqbI3Xv#m}3~JuZVjvgIKV_6l(5elF!K1^dMl|oHJd1}-P!UCRenS3gmzy@$D}x~J z*IRxqL@z6sqNHTh0zE}(rci*M)IB>Yc!(md*^#$8@yN3vq#zuF$Nw>SR;B*$18lKi zj#w~FEO7I_SeV31 z;E|;;sW6X46mApz3rlgLX%2=UI`dtz@HF=c<=GHX_7MvKxY0mEZTrX%>*R-b(=ZIy zqqo$lxye|_;143v^pqSH@O}n)GEU$KaycA}h9dH0?e(Ns0T4uajVLb@<#}%AI1*xp7$4NAm9=|MH&g{}fls6lx9w_|p~+{OeMrxfU0?!>cdu?!vV;!E!eR2jQ`dxFv5TMU=d6I zu!Occ^K+=_j22{U{qLv|{#!4BbQ=xG%|`#NzoDHhf^EfZEyb;WY3ek+fNFKn&4N+g z36HIz`n2sSjfP+&m5|WzZBgR3<(6&pNNjZ!2KV1?-2NQYxsMlK=(gSHt3cI7+zNumi6=MO#8z-eDJayrWWsF8Za|9qYj@jVXhaexad}JKo>%5$tl`&-Loi4jmqv7xJzqM+y(FR$3jB*?zg)bcCVFoV+7N7BpJTL?oB|SfSK^F z3d8PVX*VjP3v~#nk2z{!;{ok=UlVtq)%0!=gHbaMp_SUxTHK>E%0i#yEVA!4!X>62(0>anIXs zWq6_Tjq)zYZDh*Rm_iJZ>i0I?+p2UPWAmxdy1nfvOr_r&guASuJLYBg!^gt*j?|i+ zy(9LH!-%eUK%c!cb$e$P4*)6sK~*&O*GKL(?On@++y&kP0C8`&w0E5|=z-zpyGltF7u-66g4v z#3(5hOLmAQd2V*-{aDA6cQx$SV##H(q|VKeu)IAR(7xm^c)fpVn*&)??@evRQXCS; zC_o9Lnov4gEFCJA;xsnIw9Hq!tq-Q`N+(r%C`{tdt!N&SYE1otN{0bfN=%anfM6%ThYR0N9^-NXv4YIy6vVxXp9W~i7bRy;3N4CB0A_Nj>0 z?1S}NL&Zm8#d~5!l~hsW62MFU6&UPjb+w|X;u?xvsTV8$7Aw%>Q{`|ewDLiz(vKI} zrO=AsD<38Dfnw#;V&xMJHB>o9stn`gE)C&L9}}UW$`xW|lv_iF%H#f(Z$SaxBQvpb zuUJ_qR%WY(hQFvyn|q-4bErDhs{Bf-{LED*m?3&3Rqyc1-|@PP=AuI;>p!M`Bj)kHlN^-p5O5j>Q94I1$BA1L7C}hqr5IEE4|o=id|H^2SmK(7}x|I zMpczqRVr5PXjsOo52PwQG=M9+3{|zG>LeX-thymqeJ56ZsnWX)TP;XcSX1??SXEzE zH-@FE+mLA0Xe8AV8mgZWt9x?M)WKGDm}W;({pya@6V&onzbRI~ELBIlc)H6QUY%&D zE)c78r0Ntxx|@sY{qCl|`jl9G$n75f)nB+OQ1zcu^)Eb?r=_pyA=Vh ~dDRMXc* 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

LMyt5-2>oW77c}bih8vbS`plrprY{_ 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⁢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®x*{dg%!stUgD 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 z%0A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⩔o3+pYA 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∨d>7ZscuEqEv@zTk7VFlj@QaT1w$c5=hcS)mhh8 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 z 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

&|Sg zwSsYF8{v^H4kYo&HWt~ibp@8x3(WK5un1%uqxn)mC1|St;QSat3P&^!8$ogHH5Aka zwl+KIDli(+{B35uM%Jgvnk!bz#o+3O(`GG6O&?m+0WIA5kxM4W$|!Lh#xn=xHZMZC z5`vg*UV$n%uT4Z{mqK#oXp9uw5)zx^shnnvioxnY(H!^N))CCyJyyR`pRnPo*8=&Z z4x!S#4~D^~DDE&1eOXbOM?v4_am*G=Cb3b#+(IxmPf!TNa}nzZtnw4h)7;)O!>$Gl zljh$e9miziS%k@AhDr0??l5Wow~A52r1=AQ{&iu};%%pBQPLw!T3Db}3x7RKmZ)LU z!s@iy98f(Z3I)>w9dC=TJi?^KSZ2dru59&U^lWoIvV8{fR z5HL(yoI|O!IOMc7F7z4-Y6Dwa-1i8RmLDNwOK-A%NY;9ow9E@OR%qI?*#9j|T7FEq zEVA(^v6ev$la}qFP)iI^G=XjZQE$yx_X^BwI z9VRW8Q{V5H4H3~e!4)Pgvl%8WodhyWS|0QalZFhFmKTvQsT8suVUoZwX?e*VCM}<< z7+EpVOTPtowkm?;=UGavIz#nVY#m#bGDZdg*l|F#3i4>nWSqRFuvna}*77ilnFbo8 zg@6PeX8oU7QBeodFHlsw;VTz~>tCI=CO66E{F@6Hd4uyIeSo~T5Eho-*qR z1W_m2tCgg0`(oB2~tE^%!V7Z720={W%X+HPKOM z2tt-nrPf0T57({GRBAny&~dp`YP~>L$?nChc)3Ef-i8otjR&#K#zmchYno`+jZpl3OTdVbT1Yk+5hYPdMS`eSNCzIUa!73g z-MOh*$jC`J^mW==6tMS&h9NLPzTZ^w zZP;fAJS0u2ND%F7+mweodbB6Hyu-L_+mFaj8qyxj8E*gv!{DEY9)}2Ti>FvEPH2VL zb`B~)+X;Z&wD*M|7De2096A-I66=w$pwie?v^`1@2YA@aL#9XYtC8@AMyD;_v=?nz z#BJF)v_0n$nQzRBCchnCClKxOIBhM5sCNPFa2E^B<(xiPwQB-1+clt>_SW#oOxW43 zHSL5ckwJKaL9|0rx8vxDwO4g$yI4B39d=R^?eO^Km4JcA+R?^#uu&p)hqgONNksof zL70zpIkeqf%DLdQwW^!jp=PSWP-zdP+M~L5D2zE1X@yYlDB4$1fohbruK}=KzHo7j zIU4cO5GL|=s68j~+QZaVf5)bwxDnLtzd{*qz*2Ll-aZxzw#UqBt7rE90C$Aa?UxX- zkO;Ceedqyfpx>9P4TqtQ6NxPsM0+RdIh?sfT^>cqaYK7A2*5yaB+Ci5 z^G%Srf9M4(z0l!Zr1FTghC<9(#R}7*n7hJssHtKE->(%N0%`lzaHklCC%U+9%j+(< zp0-1&%0Jwx4W-;+Akt8{HC6>yA#6EPCQ5!HU~0*CSk98~fUU4ZhwN9Y5;OgWFv5#= zj!EuJ|1nd?ay($*k~>@wrX6d-y&W5q01sGt!qRH?&ghP!0KmpL!H*St7g7v>?>mM& zZLRak(Ff^c5#Sxa0_YQW*u+EKIK=xjpcVjCrZQ!uk;C`QldgxQE@PiT#x2Ug)S_EP zr@XNM-3DmjYh`pQE@f~K)2SLq=bi9Cr8Vx*Y@a_6wz?K!`=S!k5Miq~RoLo}5w-?F zNY90>;dEhZ)L+;F=OH~6wxC|ZX2bM(lg+}`V!p7o$`Q8UABC+=B#N!534Uq92$Gmts+YBSTcdnkiiK z<_xjVmrPVQ|MBHMV% z!bm#~GB~3v{m7|U{v>DDHVct0P<&rL5jJ(=pRR99KAkTjUBz1_XS^KK=zXqr_oChH ziSF9eu-ZMcg9QC)T<;#)k+5!OME=Pk6p5AX(ji?5?t(_B3;M4vYgLDI3FJ9+^TvOi zw!&#aWa9dDTy_OiUBQlvuW+HQVaL@tTuly<{N-vrZ@Dz1JslKsT%LD`=K1gPykiW{ z@8G3%(IsAA436`afc~hMVO(da^=+pJRbV@A+p(?&X54|J6IEY^f{Y0DmMydx&J62o z*fWQIiqsS>LtH4bVPc2tZUG9x2`68#lKP%jjtiip#(3wZjRr%_LF+8wToIAh1FY@&NRp4NfayW?J1 zTN{UsP(}AlDA9eRT-O}g!L0@Je2+YbKogdSSAX%!wNMaH6rZ|OkQH;t1uU!sumu|M z5_P~cthZ_yJgrVQg~ie6u!Y3UdPSbvXNPTv)nV%lR)-zXt%mMl(7|AJcwwldS{+`G zr%_L7QuuI)2p^o=uh1@h9H{g~=btvD-f?B@UNX~GX4?3=OgV;3tOv|QPxe577(ChI zLvZL(F*gS&)T0e#_xKcSjQ;B}RQDgTQ;0P)t#`&dj`SqsTsMQLVYT^PtlfJ@T z6Ii+-7)&3)PNY{d)$NszmuxCA3l;2j%0v0yCWG?516(gJpbjFY+x5Wf3pj-oyubim zdM8sCv}kSX3tPv$u#XEOBfGIy_Zf_Y#}EDA^KwjQNpgj!Y|*+C-8V|)uj~14PGlGn z{YDwuFmG@Rm(ay{@ER%`(+6tH)>{fmfsoDM)?aPe`W)gp^iW&2J`ibW+4|hYQZr=u z1GoFDy$#Fst0I?|v1!9~DO@{3!%?9g$fhojY|^^3sq2^~&%>g5zF(e)v#INNRxUG0@WMHG?p?Vu6&Gpl_ORbI z6#>Hp-4WS`6Se)Y5E#e1xE>%e!qzDmX$dZ5k@O+s{>70>VGUtBFUJfZw3Vun-AI*3 z&kNVV7uwHbL8?>{O9sFN)u}&5NMD6$O?LlbZWa5ZdJ&;E+5O{jW@xfG7vCQ-*#8Hi ztb7j^V4eZd-~Tr#*8f*^tsTyeIc=TG$<=nCA7Dn}yu?h8CVoIUHt{y#swz0tLi!Z* zIb~UBtCV@1br?_&S`NTkgU-{VxvvT&4dB$w01gTVG~nXMx-h)ETH{bKaTAm{U@(8# zc{=lVW`23a0Xb{qv?R4Q4j3H`R6h{*(>jd-$Qdc8|LZU-pP3EV!9#{iPFXM^M@(^a z#><^zS{e@%D`H?EnaL(5j5T=R*AO}rCFbS8)(T=E zHihWi4=WjQdKqZ?29E7UTt%|UP z-bQX2HKSOd-wZ*DKtR~M9P@z)&C1V#MdU=BGit_=X!uv?z2+HvuL&~mapXMgV@y!ub+jl1q)Nb zD4aI~G_(%diQ(;WHdZl1#c@(a6xHx)up>x_#KNqb!$-R#bNFHvqZZ`wWGEIh3!31G zF-i!#sZ{{|S@>)CVM^Hz-Vb9Efj}1_1B_pl6(hQlCd7^d9x{a0bj$;1`9*ia!z}W8jDXHq4#c^|5u98b@r_DL8mymX zo-xcvMSey)A(X_op-5}l35~cy6;4SNkfU`~O8*D8MR>twBk<59Y$u329_QR%MCD>Q z_z`Aek#{^E+Y5dXxc@8ApaG(#`wzkv?gxmBmMD5T;wL1GQSkPuV*wDz7Luk#N;C-~ z+n{~%h?H0fehVn3#$bogh%Bd_BXAU)eryPhD(JK2`!A8vY)8Wb#5Lia<6r#WF{hH-)Qza%An1wJ&YYo*=#7v?_2B_)V z5LM%maHTv)D+$gc+X3vp=Nvgg#`4JSGL{{)+}%6^oiB&Kx_%Atjf87MG+M3Rx=%q- zjlANt_2?t--lxVuFdl367{|)+ZI!GVdS&?b6F}>59Q&;mXH89JSR5zqS`1jaQ;h0| zILGS*xLV?_4BzfiF=}P__9(Q-^;!Ywe`iDe?JaP`KB8!-zeYTbD(jw&n{2OYsL;%G)G+ z=}89eDP_rBIMLEcypj?i>S1TNlxl=CV^d^I`OKXWGnPt97_XscN*MJ_8A(pVn8Tna zHcLvGp-_P(M9(Lh%Gq&&CriC9NvU+|B04oC1qq*f*iaBoEn#qK$^jLqIyL2_hf`B- zyuqod`J75>aSx}a=A*KyrJ+r#uhZ72qCr_WHMJVOmD-jxO<;6tZO{bIY6GVlcHh^W znmU4FotpXsui@0xAEch=$ms-g z81#fwQ}5BKsV|6rOtj|I4Om;>=M$Gx*VCyRY)Gw;`YIx+trn#lIuU>i{=!l8t1tjl zHgu)b4P7m2je^yk%_y4$vPnb0r+tB1^@|WI6OfC+o`%pRKsH@US~r|A*x8MfDT3S7 z5Q=WzRtvO4nPDieK*pa=f-S|;#+0dm<3t#ghNo41cL5hN7&k`M09cMaywcX;X>&n@ zPI*x>APJ9Um9#zDMymlybw85i0ZCs3B-I0IV@2@USeks)Jy!$lzXc@K4@hbdkkl|B zsS&ns3YdeX6w0QlE*^n8kD!3b(}+4{Sz83AoFcJKzqt??Z_aCAoMa71vZ*;Xk0ugJ zcKYsexi`5jeAoN^*MF_|*82Ygx4CDZefHUVpMCb3Pc}i`iWRWOiWEdo z=xFZ@E>@J&HKbz2=Y)KakXs13qsL)zvEn=S3sV(8E2cyV&rw1ZK(-Yc0aJ*GS4zOa zA*hi3u}P~;A%ICMiot^uBKR9Y*qB8VD~ExL;P0HHvlfo_N34tigOv-oG(dN8=WC)h-ZKmetvrb5TS44F{W|WND-TjVsr-}voY17y=#`kL8VH`N zU@b3rH;~~}VVleI5y<^P_FD{9_b5pz3fs|H)GYR!9aS%abk);l-bNus@W<)dZ+`@1 zDCMh4$|u<6f2cHi=JKns%|on8)o>S*iz4u>VmH-_RoIarR#jXwGm60TE-U(~56!%( z!;%*?U-cJqzCrZSrJvP0O-A5%E}}mKxF<_kZ8CFr&J$K+{v?=iiY8wqoQFiH?$wW= zZ!cEAg~txn_X?`M`Ylp@wHx_YClDEp&QYe-g(%W$5~#Wy%CE-Kz)L+l+VfrEWNS4y zfJV)=M1wSgBsDi_c!9}Ldk6%v=1ykJHIKrkYA{$Jqo=elP+BTZD(sp>6-vw#cXg(?+Q&h+79%ODd0?Y97L;nA3vsRzsVyKx4O_*NZan?D2}$eF(5n?zqc%#62CB}1#8-q8zr+%+p~N|qIFU0* z%xDsm0CgY7<4;|{^70+2(;#5ow?GYwUf(kTAlS;w3t26w$9`m93#b(8sjaP_1c~d> z)@sWNgz9G!s=!ME@nZcGf*uW00lCZu6n6u7ZyG8HsUzWDsX=OZm;<=GYx2J|an^<`L% zvp}oyVU-q=G|r|Z3Qfd_jq`xrk7I8n?A0nZ6w$avQ;pO_s{ya&Rkd+1rP!fOao}Q` z1%lXkM8Kd@Y{dElog|@TKTt9dee_orbK1-s8q`U|HeF7!;yYlu3D+9F@)XK>KIyuU zblvnKp4ae{3c{6&s+->AVczyPEe)xfh6=QKL2PoFX<>oUPY+mLZ4lpqkWDK!EF+r* zl+6m34SrfqtD$1-;4ZzW)yMmEh$$Qu@E*lf+UUvE;uO4|-3nFQ8$@KqlDF_s``( zg)dC!L@51y;;0J@)1QK8MZ1>RpF)+&zmAwg*YCA@O--WO;P;0-Ea4m{9PVNLKWR(@ zoFaR_AJ19lVVm_K4~vA&sOf6L=27j{JrB`(Ja_Vh*iI!jPtmlvG7f6<>s%u!2G1;N zahvCYzvcwOCL?Kn7CG$i*!c7AUNdI8#O6W`zod6!YYVZZ*mZLu0OicHHa94^l?+rm?g6pox^^C}r90`fWh(ul3$0tsA+9v4B`4Lg98RodPQdcUK;~sz z3JE{CT|U$+XsLpnEguraHo|~gQ#lDWpj^(DGlYe5VIxWK$y#a1+446MsdBdb1i*hx z&cI~~F46_A2K7L{5Wke3$r*SG5pnIDao{PEGl1n+F+fdUU~!164sr(Gg`9zn0n3}6 zHgqR^Y~vOKAGOPeHCU~^5z&eP0~I5tMR+sT8copaIeCJz=BxFQP(QA9E~o|pz<8W( za`B>A-Sa6(b!R2joz`P`z6glhZpQuS@V(4Kw|>U~yxz3_-oD<1k=tm!VCGegTg|pU z5axG~f9x5G-Dcv)!=UGFsNgK-(cdW3BFc0dE`HwD5)j{g1QoWwlIgZK4nUAiWMC_i zxDDKG`;re>;4dK5wy!lNI|1Rp$n$R}%iZ=*!1C718UvuN_V!3T*u$skYHw#hPrH3A zl5CHnB%0Ep6m#(`5X8j&bC{DtrrQ@n;oF}FZYj5SGS=<+1auQnQ#RXo6BL&X5GpSl z;_vIAKDPf%Swd5f{ze1%?Tl%d!@D}bzaYZz_EAKn_IO9SFAOpp}OEF87BJHQbEcze6U6Dmy+kt-3@3{SeSR&Pfml(VBcV0pWR^r^O_ zfQUP`@n&wvMcY-n&GrnkX|Qxbk1DW=N@`aZJcfYSHW0^}=+vUPt1Hw}#EWcK z1drhraMul&IJGG58m}A@6n8=9m^X<&eoIl@g~8>nXSH=^*K_Ub%&vu0XLcn(@Ld?l z#}sMmjE-2|RX|bb9LE#|^FS9!lgCcPf7GrFcI~7x*!3BuJVGfoWe}YNAeJFxupeA( zy9{Np>ukUh8_p{e>0~wOq-_YEn*-u*bRgKdMzL*ZNGEOhL2Zg*A2i=|bW?1*Hy*7z z>Gr`JA$!{#JPWk4w>{rp_O>{Zz0CnrX|sZdf{wDc6;f0-MYSir4dD0NiQKl0L~i?p z5`0Jrv?8N!xBWywpzIEZR@z|uv1dXeuOX3l5}rr!yebNb zGa(_l<-HJPFQ$^%XAWy>;CuGYCw=douPIVJ>czo049^vKj-vIY3Ps%PLuDcWFNS@ZIV_q21W^pg$*lH`hxYc} z8L%wU+z84b;=akum+!-_J8|D^LVJ|ZF81Ysi~C+8b?=iZ!3%5iPG3t6R<44pZjqVZaoQy?R4V)Yw(J{qoI+@r zMQ34Y_2R%}Jkvurm165>IQC462cCrr*il&Vz$;Y32WZmuz#HbonP|b@3F(1T$wpkE z*83b-sbEqb=pP(tMAu_KXkxnBd-ntYc3yi|Cu&s=d(5Bvs655Q+E zIj@{^B@v{s$kjtol@9g_Se9M|=2`_%D*^upv2jj3cpVZQyoM4Hb71!14dx94z-$cR zof!|nJ!rsP_?|%&C=E^D@K9(%6AT|*g2&UYhz>4cB)yagW?Gk=*Ax-8V+S`7ka7*! z@uv(q?Bm5m)5r%ur=IA+?|@S)2$uP)1kA!ij<7G{@^(bye!kBPCEl8?2vE2!Al8IeRvVxuIQf}#}b@sz^9e+w4b zxi&GjhHz10%g4kof$5;6V&6xoGwf!10>qB}nsM<93O4oxBG#*1&<|FLvHywSabb7F zF4R*jnG)n!NJ~WvO|YGxtR8d_Y{(yW3tY zpako??F(a(8SvZi`|uZng|TQH;oeTTYGEvT5}|mtFcvXyv}kcW(9n&MN2^@8P3-4L z#6_r{@@R0nD2H%ZNGXy<6~xVEl+>bpAcb92BvA9BW|DFdjn@`!L&jAh`cz(vJ|!5s zXN$f?8Gg*Rd$Ls_0C1_Z)he5C?gj9DFdH1j@-?*QywFtT_C7+E}l7zvj6 z;uopsu^56`tMn-ON-Fs!KjQfb_z#adJTnVL9Loo zIOOk_rsDBwi+E|a;wC2`W*rH?v=U{ov?O4$1udO+(opK7c)o8}#7mD-5ik9nl3+|{ zTdyf%@V-n3g3G!ib{U3nw)M)P8*y1bgqE>GH{!AzA@j0G08*4gH{!DK(9N=&0Q!~} z5{loQg$m?GwOBSoyq2kQ*#aVo?3XPg^j8U;H~fT^D~=!)R*?#qXX42Th}KrjI6tJQ zaQPYzVB06e<<$V|pfNi6CobQCkoHIyb+VTq$MdyTdCR{I)sN+;NO{&U$h!RBfW@xq z2{Gkaha>j3cFMC3C*@hm=B==K`!^cpQQK&p1!rWPj+oZ?N^J8cJj~wNzo9r9xmuS% zaO=wfOZ*V7C$e;C)0zM*c9MPtH23IYYWA#NN=b>fP@)1#6zWM-lbYoB@q85!?Rr>R zy`m=hPYys(2z4M>-w!&mq04Byk{s%67#q%9ux=rG5VmXBEBO`MZFug|>diJTq&M3% z(wl8I*tVf-m|#?EoMLn~aBItKr#G9O^k$=}78`~t3C0e3vsFQFHdt`{S?W_-9xL~o)5-hfd1&bXG zZ+x?0N%#h8VYjB%v4(dA_Q0$O2!)e%{ybDwWEQhkIXu-!2+KdgzOEQ`rxY$-2nR+J z#aL-aX|@{UV%KrU_$fwqV|P`4Fos<=CT{?Bwh+%Q8y=+YWh>$)cB)V)&#!jWsWn+#vh`nZF!X|==g7!?| zhu3#5=1i;w6Yq6oB0xyZgv6NmNXvwCG23YL5pl8XP5vx@4!YLiJq6{;-g$5>z}lq_ z+N8Ox0YLRA{&2jr58%h}qS?E~x0ElRVSa=4MTF(E0+z&XLO^)zdA_TyQATFy1Sbw= zyV{y;2u35wc1aUwe8W?3J#^Me+%8{b#ZX!Yt%b7K!}8w~+Sk^k2bmp=%x8%I3bkMngbb4Tod6)g zg*<~dCM2pTtr(Gza%XTR_XV@^$0+$YD4&1la6@Nb z?8j7v_)HXD{3^;O+q@3xAA6fjArt)5XhDeATvbDN+{8B%{(i#Wrom@RG7SHy2!w=g zg!Lm~eW5g*xY9;I+ax4(3Rv8~fc$is_i}}V9%lcm5Q@gf7-b-ngkeLFGy%UvfHpd2 zn?Mxl)Jwu0N|x+EOg7;!2agF4u{?2CK_S&oC7-2AJ~8{o5>67sNi+M=-UV^cyfR*5 z_LElkkyafO@E}3rZSZo89yCV|$N?S+$Q9~{xr9P>xRw@(bn}(NrO}R$I5iOi4q9z; z6l&tKSR5t5vjxkaf}@fUw-I8k29XnC)zNW?XgMwPhw8E8D?+)` zKFaQHdoPCufKzi&A^(rXmt-*A}8%s>cxCld2Oi+2#ynRK@yXWUGT(oJ(MAlVeBWvNa~KKFP?v47|e(i!$`V=1G!-&O}K<% z(AGpDX&&-PdQ>S=w)V~Pi6AJR1=y-5B)vk)Nou4&tLP6VrG=!oJE$`Woyb%gmGhz{ zlr`GYQFNTNZ8(_0=ZmpSETVUe{=6GhSJFYPx>OTL`aMXWln~Oyd!z{$T22=<;nu_P zu$!t}VIjxkx}L{yb+~Rp_8lD$H9)TMV8rzhSa(g-Sb5O#xMqtA^K`d4uwEg2OzH`) zH#GP`$Ky&Q#kojvF1nS%m8$AYaXc<`E7NGxMbPoM{92unmvDW+hTta$18H0N}cy!lY${5^rh}ng4 zh~WMd&o2TtaLmEWVB*a~f8764;@{Q8`KVD$5A#_mBhI7KNOlmEJP~-XHtsLxl+Y#f z+!C;)uc5e^c+hpQokSd4o)$b$E6Rg2^t?8h@?C1jpO}Cpqbs!!BLyhy3??w(wLB>x z^b6q>+tiR^fF8_U2%a^RO1(kM(+ccok$k!pe{jo>8yE)(gD4!~hDoWg`k2ubD385? zg7KWDTO>T^DJLp~_o)z)(Uc}%8xYd6V2A7~tmG@fRuM0Wl=26j^B9?uJ@M;H zQvRTZAhi=E{jWn(>RhD`iN~M*i1|yVYmQQHfC%(6=0PD)R;idG%6v%xO$!xgD(0&* zUjpx`^C*&ql(s(gb;|7}ZoDHZJyNpg@RNr&Ro-wFu%%iw|-ZSY6# zG94lkkPDH%n%L&-A)oXL3NDxfZqXgbzy&{BFQo6sa|~5@ErXMe)4%L!lMpTaXSKMI zD5Dpip-8lj673alLGW5|An+h)WLygx)K+PyBQkD7@noPolr5A=@B(x9dz6H-d#BT`2zpst| z4)N!pzKs;$h}j__c6bDYRqrt3y6O!R%&;*3pp~TE-U?_76 zxZ9_3IX%dmWX3^%nXghjHVb9%(~P$mNXX12i834TV3FCs8Kh&Z;xz;!tIGU@l463U zT~bPMCLnk_BgGby;S}L|2lvIFE&)r<_$~rFmahL z2xWIzlihzr8oLP8>>z#iV35upgotd+G9ZHGNiKFMM9Ic^3KEiVaLLuH$f$L=pnPZ| z5|c9cvy9?r)1SvW@|aDHclMi5aW>|Zv-h=YPGB=RluZu&HE9pM6|j`^2&^DyJZjF* zthy4y?0_Zjrk>=1-CG$>78<>rC7}3v5NCx3hx((r%aAe`4OFhHyFxk_=KzFUAcjci z)&pUCj}YnHPZNNHb}2heC7t_?24`$^Nl}G-?8Cpb&*X7J^e=b;gSR`M`So%J(ijLW#;^O;ro zDWe&bB41A_(Em_UK>hhWL6dq5`6JAH78mBx97;ixKKYn`RZ>8!`Q(GsD87}Hjf|-!G z01_7tRMu96g1Ll8aWqOSSP0{=G>4&+1TNyC^VrP#mkkLhsnjos3v{s(GLfi8P2_47BNEo5z++(nQT|$5vUvyg z@3ZZch43*DZU@5l zixGw~3P*tOED+wk7~vjhSA_d-2N)_u~hJthfzvmtdJbUa&mc7nk6y z$0ayl;EtFbxbfp3!7}GsJS{l;eje+AiGsx;qE7sdI?+e46qnSoy}Sl<-{`jva@PXuBY8DQH@7*M~E8|1I$@8h#|{@w5c>_(k16jaPta)W&hmb><_ zZZ%&H{90~^zXrE277+~XIa`xDAvf5j+8(x#5#eQRuiD3e2OYh};pK85(sh0|C-U=S zrzG_hueGg0$X3LNhz8qcWcLY9%cPsl zkaAS~Q}I4_u}}O>s*8+&fk5m7&SU-*r(nOEDgG_IpXXr9>iY!CYKY3O+BgY9+v2z3 zN`k$BsQ37Mfmhri*C-N^FWBWQKSsEZ3j>^Jr0*>!)#A)J|7F%ch;BI3C(i)`C;Gia zp$-~Gj2NBY?YUm(xjtn9Q0apxb_{#6=Qg9~9?5g3nX?BLn^hgV&P?$ANF1|fQ2Mz!sJ z;TAa>nVw#>_A&<8MtSq0)-(pLwN} z*;^B5TQYc1=Jil<4cZnd^G36-_AddW%)G}oi73|zdT{VtMCLP@@A!^@gQcP& z6RiX1ATyC*WLcTi&9W_nZl|tb1N?B%@B&9a1Bo(e(|$3-ho3T@3oS5um*vbfgpLKCGRa-_!4lwC_2e|KQh}A=^QlKyIk_R zC9hqJ#0n5dg&fH=*}GHnzAt(AXpvM(Uvi{~=p^4D{yKPUw9z-i>bn;~2W{^#`JRBp z&Q4Ubro9G}eO>a&8d^G=RrY05V&{+%ws`8gO><(dr+g~Ne*O%lr+UOi0IlF1% z9IfDwB)OYO^0(aJyxw`2a|tQ|+>sM1;Wfl*AsG8m9R;CTl5?tt5U=PUG(LKu^EEYe z@4I?P{12$gPH!R{8m^>u+JZ!L2}J5~uE%$~>)D(&qRH7>K7<-!>rtcggyj4}avmi) zZAGB@wPsb!`mZsuvy>=E&U2THk1{0=ESpc|EL%*8W6^ielLg4Lq{LXQ2t`t2p_G^v zq5%uvFbq$vVA+U%&c=@g%O)>4Wfp!xZb;gcRF?9X&c7d|QM5BI1J!VlN6*FmywF9S zMVq}A9HuyQG$=+y3@+>RA7E`0rdT==H=y)$($DVuNC~cb0Xgf=+XmZU$NBm2@pf|c=W!FN)M9R~V4zccuMpur}l}dJr z&u@GgPIjde62%W?Kh|t;x+*0d>_mw$WrhHog4Sf&})BIb`MzHm?YWUCrl3^bx>rkds8yTyYzzuZm`QO z)xDKqG-!6$;#-}&b-#;%^}{(pYf=_p+@HF?f=Nsz7&d^pPeRxSfQ7T;?(wh2%~3HJb$C{IbUkP zeq_%M&o1bv2$V1Yy2i5uv@RGuKN>xs8a)T%J^LsvrLcPr;WZ32UF#fw17PrcrexyL zb93_i3;@m4yT6nlf%a6p5kh5+xXCQ5=>Ex9*^>J~V{gh)gJ?O;{XTx6*^q1ojn56q zcjN1`gk;P+lw=Ua>CwjIr>)74QPJ4H192(&1+)JE)dX8I=8LwxNm!o&%WF+eCM|Gx0m`&=7bUhJ@lI=U3nh-PSJZt1xk zsXdBxC}M7h$)^cM&Mn12H;LT_*pcc?j>U84Zn6*$@&!H6(rrg!eQE#>DRo ziC;sadzeWn+UM1GC{g_siOwL=`)VSX;+Sp}a~xi(4`M#h#2AxC8IrE1WX{{6HrhPk z89>ON0eJ$DKMW$biiV`QP?(RRKS#6;(T6qB5lLC#i_Z^y1Su`6FsxjS>6Z0-;dV

2}1QoBR+*te_@YXOd&#v*0?Iky^o(9-jfhX`E#M1X{f4TSsBi&nWTyqT3 z>nXX$8C>3+x@p8ityATsFXHRjb@#+7OVUqn z+%gwQHYhoP^Q}FYBrIA&bUC7<81JnN)*rBQfc0Ro8U`C6Hc;Yd9tB|hk0Ih1YlK)67dn z9((U$qxZG!y{DbtkF)n)@$~*9d+&`|OG_pD?S>Xpdjj+8wlo+ffn z3Y&TwVoVK}X|qK|UMLc+Q)+}Q^-7{AS5TvvdaM6u5OqJ7@?YvCaTt|gWu#n%tcTzO z^nabHf05GK5lQPOr(v&kJJQCq8*ORVhA5{^R460Uw728aunbi3V|yyu32BL-9Ug+F z{*|@@Ty&02|MUphr=*+}yoK{l7n0c2ya}-D%S6OtwC`g$L9GNqKIgtOD-&XxACv z7~dmGbbMdm0&Y8+=mkEv5?$BVSAb|3lP0l8<$r)w!iIQ%z# zvk#kI6k(|o7E(A&53FnC#)^RzH&z@#51>snR18vishB`8L8sGIJVf7ULWPRCc%w_8 zg^C!w$-9x^i?h*pLmPnYt`*IqT(Kiysq^ST8OB!eLB-FN<1r=l11O`*!=+;ckrQBYE5 zUt>W|7Y>B$fsiT;koV!evoNP&GP~t9)(mh1z|;lq9O^Le$Q$Iws-Fk+sK>^)btu<9$Q9djvF&#O69ISEGEtn#UIDWnKC9Wk(K z3!h7=Y6@5yMqn-lYZ28;lW?%H`eUiOO{#8X z(d!W1I~0x34blCpzcKSdyro7D(KSUms74RPoW)eQ|A;8njF4)EGBWFt@QUDuA!E%H zYYis(8VAuNpHwqdDF`54k3w*jSkcZjqAJ9iK`!7eM*b)$53qw3}(ZRDX+9Z)Rv$0Nf`eFsgL@G|^c9lvMvHk4G2BS`TO3xYAbt z8oo}F-S;894AEAPA$j9T3jBgZ|4Q|zLWvr}DG{~bv3>OTbF19gFt}kf{J^s)3(?Rp zM6DDJQ5;A*X+U>PXg7z}FjF)&V9Yf^4nsQmZ&QN{)R@1FGBx zxo@dGf-8ySE2PF&v;Py|-V!b~o{$>9Al||e?kjJQntDi0of)$m0O=?HVQ9JuFJ0xR zTfl(Gy4S6u)bym(^aw)(kFnBFW79n9nfaA7&w`=p9l+B$jExLhWl+wMn$lUS9*FHP zZTLBp)mr2bTQnQ;u$^bFRe~oVb zP}d9>KaLs;)Qje?RIN9k#oOIa;SV`D*XK{Nv3~4qa`r7fMN^9b6kdUU4UdXwxu;=) z4n3-t=P)S!JIwmwaF$HCa~#&wTZo-ZdO3lYbn9Ux9M=aw-*M<}8{TdVSejeWUevD= zEDcz7ZI~xm8kY+ee}BQ!Vg{W~A{A9vxlyjc5c?S3(KaYM3-;1R09N15NBTbvZYvly zE^(#N)_?f)xsVmqz+zACFg@bPj}Qh%WfhWva?gPc}@@B=-bWYH54Z9}p%%ouCpRUDZRfF)QDbz~nAhY(>qgN$gicEXPo>P;cc zpd_4!?9q;E0J8@anByM6(rJMq+`dzV#Q~P(NCQkB3s`7s=&o_-9d&2pn7gU&1wLl) z<8Ac*8+)H%$9roR_I?kIlv?|D8 zIR|Z--HASOYZn2c%@K^wTkTGaCR)3&DNf0Gm+ZVPlnWs(clLGO!|6Mpayrpiway69 zcRu2L7JXRfYwGXnITs=M9=#q~oGdpbUzI#8`94udeGvsK>XJt$lg-lyszvu{O0pTV ziT6m!cS*@+v#mE$-4kDpT>qpj##sL&4orH0r-0bB3s?Q2NA_V5_JTk>Xy6{-j9`;YN{sTAj;nb92DI?KA`j)lPDWj?~ z!jPBsoGIlIb=!~i?}(H|2qcThQPxGIpl|=uXdSYJ-%250d6zZxGi}j^RQRx$2Fg)V z>b;7BqD-l^rLvZz66T^n$a6xn}ZN}Jr^rB{$i zd&z9yi3Ag^A4+K+vpg2>lcG#%byx--L^#o=^iCRI=bIk%b;IE6hUewdr+zGUQ>Cwf zSHo^9DZO5y8D&cUCHUKY8EEJE&%jy#kuydRXHlk%8RcggQ^yP$AL9qymfm5^z>mRx z4lbggd$1lmb#mq-gQd(_=F}GvnvBB$uFN$^?J;GRm*Ki9`pLM=17$Obj7u_Q{)Hu* z&nV!ZqcjG?#`)(4U!!bZOcHPRjGf}0CEC1m>0M9R$W7kYy-RZq=(DNWi#o5H0PLf< z92&Xkrh3;3#h$N?EXYTSf04FI-RXn22cf9+SO?1C|{&Uah=eOWxyV+iB!_ zxArH#lDt0>lF|FS%-^UGz0d)E+$(IVudA;&7FbO%JyaE=?@HO%htR2NNIs+4b_Vn& zP+^;}C_TpNL;JSlS?aGEeK_0u1!AMHr^4i$U(uOs%@<$cBTKVgu=&;l`AA}yVOfub zNBX}sW{s0+d+`oih=s_MGg8(xDQikQ&ZA6OZ`GGFd;QyxRT{ugI#~}5HD-MvW$iax z4s(Wyq896%Z8(r2nS=7MOheTP;Zu!mn9>`>}S@2jp;6ss4oXZiSOxgWZD~ia5 zfvQ%dlxeSVz*toN50&}thU`X|(JOb1%07YO2s7pARB3bim;KA+mU3<~=8TYXu2uvY zLiy&5RPuF|THC5@QqF8+&LdLJw01Z%gE-+;@hA#g4l3A=BVhJHaEu>J%k3gsb9({y zte${!Q||oS7xS`UQcV32S=8mm5dbbn%$4zN`n%^yGk;WGTsABq>XInJMgK)ZH0 z{|SO94eZGL7=+ZOb!2`rg_K5hB-?_^np61ak@>ZhPHCn`<{v}oQmy$Mus4>vfcZa* zru?%AO(&)<5B8O@vCLY~FJNhVe5kR2O%b;JrcV6`Qo&&J<+XeI!b1~O1huIj+fMVu zN+m{TLM|8$gasgQJE88rUPEBKVhU;m?c1VBcci3-su#E2esFm@8rpa@3e8wlbaY&#PovPyIm z;#5&v8Hn7=aF=O_pk6U|rA9C!tE`83`iuH<&cc^Lsu`r-WGR|8q!uY|Mvb8HDzv)l zN%XI`Vbu$_^IEoFEm(HkELe6q1WOxM!}fN8mFd~k&z*9UOdCkQf=q0wCe+27JT4r- zXdpZVgs)Wu+JY-DhrE1=?Hkqsz6)3@fc0%VEchY?>pNsk_oh(06x-P3_=C1hnk#`%tNN_!Q-UaaG@jIYT4ga;C4I7;D% zbP4kur65feIbk97@6p8LM^O3C#w8@8*KIw_7)NhDkNV*10!zXs>ZP|Kj+R>zwo%B+ zxDkgFvw|>jTmoE4xc{UARXZvPe-myMpfA>8lXOpfe~bno!Vw8s4&Y5mA2CkAWdY#H zaVO(RJ0N90z1o%a*`Kze8tkiO?{jDzux~eepKGIcJ|>uFr}u9e{23Yt?E90wKTG3) z{d|0|fW`s)`O3?D8VBsZ4_*BsM#q~8j`@V8wxYOf0MO(F2b}i)F0A9Pa15a#LWE#+ ztV?iUj~QaAhp)t9qcLLVIOaP_gf3#j4E_t2Iz7tsd6d)sEtu;Y`YvDHb+Aoeb~Hd*kT;0>nO`6B~!c z`Vpcj#f*1q5d=M6UXuMOQ&OHtHKG;3X2O*Ff{9-x81=(b-1ydRCd8(%l+}DQVM=Yl za^M4@_CT~T_Typ&_`@zXFl5NTf&CO<5t{B5=`LVnNNU6FP-l)*OM9WV=) z1Fz%RB3KThuP(3(_NwepjZTfmUfu7(fI3?|8?R_h***LO96L zH~X;3bV0KNFZQkfpWCZ@aNqyQUftNY|NmyMZtOe%Z|~KOjrsq2ukQOd{Xe)@_x;EI z5BBO3(*NyVT|!d!>e8!bukQOd{eQAo_x;D(@6|oHPOuzWDOlcf36}S}36>A2eWaa? zv2k!4gHt05t9AY#;5W$Sy~^)fi(QPU9q1qYNDkHQ5F=8L;G1>WZLTq0$(JmV{b}8R z@{@{^Hb{f=452Io%6+(*?Pt8tpqacEUZGsjWuadsj9rfCH-rK9r&u&1XhSeXSY?04 zmq_=E8UdHiej}K>;fwv0x>LA|9x3b~>q<*azYOD;Ul|2zBhqpRz&=>(5u^L36`MI@ zrZmjiybu@0S;I7gIxCB9jE93gM4CTIJ1M1oNwdQKlc4+TP-EH|YEM5b;>}BFQyYhJ zg1}rxY$eM6^zP|{(&3`9fjPa0+HRyr5=dnX8<^8??L#42LQ9`y=Grl(&x3j^j^+bn(;AT%A+Ib zN-iFPQ45(-h^4&b87T7D+3HeWMk!y)%V-W*4xeI6c^Pe&5F#Gr&u4~ZE)|6MYd~NI zkZLrqCme zImhbpH$nDi+A^J)7X%?4)BkF2nFL_D6$f*BK+UaG%B<*^*6*Ii{~ z|ClftD*14))-NOv32*d8OTOV6;-3AO=TR*9x3Quv$>5s_#Kp)GGeb_v_vZgVMgb6V z5s;Sd_o-U+otnv%Q8VgSck6--}1wZv(SvrWZ%a_B;PT! z^|#tnIMw0%!|MAE1lWNr$#+V_y#SHUL>sdpk*Yy}U@R0-p~tIR_Gew2b!TBEO_~_8 zP~hD9v+gDk@sRZ(zBTi-x~W+&WW9mO?M1{EbegqD%6g0Z4DSI>&C1ML4Ox}R3Mp%g zl(m*EPDLTVxl^+0L{rvw{&VH{t@5nDXj&_N)KEFQd%$wEla$@x%xem;FdV=Tp0pm4ve!x3D~S=-$HuhQwhCVu z#I~Kh7J<{{W){#7HRfC=q19684BJ*@G(Qdd3-%ix!}Yz`x_+{-Yym1Ofrx;KaGip52xb!R6^3nBp@&(Jsm*D~I$bP}{X>S-z7q(b9Q})X@p(pYOlFtx8luda|MjOeeJpN?U z0FMIed0?S-Xs|*PBYdmrW58MsESl|RwAjJyTAGRMEC`)D9?Z7#71X}N*#c_a0qqK^ zV6ctmOAH1Zc|LYv8;*({*p7W%_S*`CPX05RjEuHD23)iYJ=ty);VQ7EVmprDqtMo0 z;dq%P`|X{P=&Ux8eT>0=b-P6NSqNsTiJm~B7>IOEP4w~sF~W}Mm;Vfnw{INBl=LKU zw*vR?cDNq__Y_qg>uJRVt{Z3lNO_$$4kfntbBssFp>r9FlDP{dgO%aq@8X*}4OsS- zn{nW2Jq7s6aQyFxVe7!Dap&)ANko z3}BoC#sw9_-Z_ZzAH&F$o8w^{349B4s~8b~yNY2y%rLxibHYqus5=-U63`#zmXi?1 zFnqu`Cg_`adjT2=zpEI{BE!g%n;l;PBTVJP5yH?hjBL3%aU?LpRg6T;)9_rHJMpQe zJZR!!{CiHYpJGbW$=AlzfFBR{;y#9{BDFWQ}_7<1_gzDLB_#$ zQad|7eNZV2!TK$|#odmE5QU20DaT)Y*i=HX++zR9{*!Qdvp!TBbnYN_HN{{Zoo}w@ zYwK$jSQ*QW%8u_fU&r8jIZIu>M|`n(JINkftTQ0b*!Ao$eo+MP8;SmUxh4J$Xs9#C z5+f+41e<9xBQbwU7#o1`xu7rZ(hL)TzT^D`IA~6`u7ACwpH@lV@LeyO92PiHLfjY*wjb zKGY4$qM8NXi6>XFh)KGhf*H7LQE$H3g9moc>q4pA;&3_AQs(NKyOH+kL_#N$yi9KK zOclB~4sp4dtmS~^3SFAJ6AZ_q39mwKNgep*>@-Kk`x0iISwI16sLg>Zp3a(S_4=!?d_*=Vp1!< zy(DeYM+9e^%JIV`NqWA9@uspmMk@cZguR!O z%D-%7?-e$BKg!-K?euKcboiP|{3&bY?8?&rG!TyMv_W)rF= za<*$RMH*ejvde?GRyJK3;o3wZ!CY`$G*bu&$)CGCu4az;jqEx|m~5pq!u6Ai+1%R; z%+#-32VLh0bBNJB(B|#|)T6e!@VZ3DZ5NF0+l=nWF?X`lQ#LnR=`W8W#-k^$7>>!^ z!+obh;Yqvu0brbHPa)RmUZ7C0yPv1{juaknbGh72M)zjPT`aqqbj2v?WRH?H*6S|L z+T#u|F>%$S`!~t`o$P)OXsyMakuZfNw7dVfRF3a?I$_o}X(pewWi_KlZb|8uVopK( zjy=IC-C+ntR6kOp2*f^Y;u2fYrlgF;tm_0A7hD#7EMI>kSiTv8H`Zj-gVZxAFE*ag zHD3XcI^S8UG#ibGE*Azg_u&T5rxcn1{2bd~nP-T*g9H6?OR5`~eF^i0qa4@_;06Hu zX@M;O{wWOb&eqZl$SrA|fhlQ$tpE-Lu)hjq6^aQGPR*kF;SODyU+t=gu-lRH#jt1=gwsFmYqNK@l-@&1J13?6p&_e7 z;k$s?GInyhaj-G{Iw?I;N{{G3EB#)etXF8IPd7LBH>M{^>C2_`7p3(18ge093US#w zR*%#>EC2n1)+HW!ugO{)TRGQ02)T6pTV~rj-qoF!@1Jpvp6L~Cz>*Ppl><~ zQ|Z-i~sJ|0#H)ya;qF^0vfyg*wZtgSGnAv4e#`&@_P@RFKW7!PZNx;xb!NG1uu~7)9E6htLfm9VZ6>3J9G)gmc;YgmJ5mrLa37u! z_Xd&Ua3UCY2M9KSV2Zi9FOpPAnMGiaa-n48k=!Oj<__5U7lzDF@%0rYdx47Gk7Pfa zoBItldizRV;o@Z8s|nxWji%JWWX*b{-6^+tr+FXEt3^Rwi7+oH?{frTAEj)(uZt!x zMg@!d>#>&NoNn@NXnI{lS+09T^1cUiL)w;g?-;%R8og(f-X-n}R+Q$R$WOz1FDT5B zI76Ke8+_m_c7?6C!8ZjjMe7!h_AS!+7G-&mH_XJh9N%io&MGC}!{JLa_l8zR`*L-@ z+$*hIxg9lCO=KZZ9M>`Obg=FKV>T`;?R=Df~AZq^vto zDUl@Lyg68`X!WG5d8h_}w_?M|8`PMc{9Gx{OdjG^0l8wUgxY`a7?cGIao2~TBhVH$ zX29sICS6uj-exXVR%<)4DiUd*PuAyIxTLrFDwHbbD~B4h^-?zS{kucu%pQU)c;z%^ z-(tv)L~tcLu$xUvy~~(A*^o`f#DQb<3`*R&2T#p@Ci^WxOg@4TdNar)Ny>ibB6~4r zw-~cGNZEO?Z4hc|HbQ0A?7D#E``bV*ZUXJpF=ii>vRhS*fehmt6=NdMlJ7L;3^wLq z`r%AFtQ^#9PG=&clQT-n8LDEioO13~F(xoNOtr;Ra;A%>oY{PqLcYhA69=qv%pk0& zT0;eCyGzOmpca7RX6s?hTl^#CoVZ9fQ*K`ji2fqWjrYm9BSGT+On zx4rOTR6UHym8zHb0Rh;DRlTsOdEe*#2@lYpf~LH46>m|t80BACwI&SxU&x(5M&S(5 zC#%+kqq|1XC2%F6>$e_`$p7FH{96CT&W-+3!4*=$Vl!N!mG?dr$lHwt%W#8_2UB4UYp!f_;}%*^$uvygfMqpg>Modq&?l#Lh=sl-kC%8 zFHA1XHWsdz3Rg*m`5h!K+zuj2qnB8?KVbQ3jj{0SkSEg<=Y`*D{nz9bI^&8y(uy9^ z3bwgk(;Tn30n|1MtT|3xf$eQStx-tfs)9rut0eL(VvQ@_4CT{T7Gab-7Y#d+0l(V=c>r6jFnM>3jwfRPF?;u)~+9qY=8lrjA7$`=48zq>L8 zFXVSuHtSY47kvz6!SAlzj_*tO-IX75zq|6dZsqZ!{Y=k%Yy`gyzq|4$a3QZeAF%vP z4O1Z6SkzA{>Orb*W`4H_O_1t$+xgd`Cl#9*YAkxe2LJlYSk=Gs5OV^n;Gv5gs-*2b zbWusrLl-r%G;%u%GN%AlC?2}#XYitUXk)Q{%$@8!yj0vvD(=EK4ykT*afGfoV*Mhn zo#Lz8X@|S-;&H{31TlrS>!Q6d7C$H#Plgm{c*9rxm{j~wJEHD`Q;U}sCu_ZN@oK3! z^&*dDEdJD3yiF>uQtMCz3fNZsVZichHwY7V5A&kMKS{-(sThL^W0g+Dm;^L<<5l+< zS6wZw>favg&L9?}v+7}K)kGD8<+N&nig6F4!_-(jdDTMWszhm(U0TKZts2{3wFWBY zT~T!ER#l0nRV}L5wy!!4YGb2JtHXnSb@lL|Uma>({j9Y5p^J17vDy~&&_3hp^@i2C z$V2OpB38c}#PAwdpERugqyq-=O&)zs=U~ojt`FuMvF52uct~IusUCezrL<;kJI$=w z5z@?*wF5=d+TlSt*P^D8oNHeRdg-<4ia!RlG3ce&eyQ>RZ@f;D*7cUwb?xAr*4+eI z6mPulQNy~)LD9x^MVX+{U$@M#4&C8PHTv-W>keO1w)N=H@YZVm2x&bw+ws<(mHPUi zUEIU>&g_<3*1OkdZ21=cmbxI^->zRn0QO<6m2T?#DulcP5E3S@-)UU`k+l9jY5krK z60QFuC=u3k6W3n|SpMj1+R#gF+&0`4ETjz>fGEw_P~!%dv?1nV^VqOjQ}`Qp88+01 zbip+gvEj=giqE)FZ`g3QBZ_Ju8;1n*-gr+i?}&{nFQr7|#-p0HZsVWQ#&1D%`)*t=dlI2p#BB_L}&uKhXNj|dV z9?Mu#YA7i}Q0YD^^{ZsNp`%FW=VlDI5*#FToZ_Ns}%v)F6 z(K4Spsn@!R&>3Y)Kt=ZL{tX15o~YE?oiv?GK*Ap7vm$OkkMt2 z=*k|cR7Qbiv)akb+uO2t%9fyLuSU^Qds`N7E5kO$)6entwk%mHbF?Fh_O`6DY@4>d zEjuEWy?c=}F_!l>mYtExzE`dM8q{NZc^4300%79Vg~-P8!BTl26(f>i;P?{9xEE+> zZ_DG1<+G%6oS5c*m1DgT#A5Ajd6HDVSjFHu<*OJLMu)ezQ_4$l+P+S0U*gNr{-53& zWhy@x^cxlEEi*?MWvZAE^cxk=sqM?*h>Bg8sNmLrR9gq9Ry|PlI5N4G@-$UFt$Nj}nk?o)hWi&Xo) zRQpwj;;ADW=3Nl9UrBXRz;bSfscvZbSw3Q`8&Axc>ZU7aV2pK`Fd2k2WERBcE>m4X zFwSQV_8};4_vE^R#=6f#=eae$x$YkzaJ!(4>pQcI>-(x1*Wb)CuAiV1ub3El?* zcTQ(HBgKmd`DZF2EH`v!D`Y2Ws`0#$y?<|`_el2s12x3wZ)Wd5(kj~d``G(WwCn%; z<7`FEn``%`6Bcj0k^dQQy0-{NXuX@&BeY)ZygJ`gr-#~ph2Xn$4;5UF?PjwOJ_ONl zpzJsS*oSz>tYz-GJnR5dfAtlxQF+}+p2>OrXpfCa%Dd7`#c(o|Eq3?k-6Z9WFk3&R z@(D%YlXf89OEaCLHRD=G7OQG}vyM&oOcKPWeBS zmF-qTei6>~&9NRcOCQ_F91prBVl|H3<=mM4R1DHuioty&637mP={ zcs-M&;NGe=tT|Bc*c61x1#d_NOQnK$%+})|^8>qo#7ZNB0u<7J22;UW$Uc`OxI-#9 ztYAUlg0p7-Or-c}?3BV`qO}kcnEx5{0Q@co3hyp_xOfwD{e|NpY!MY%;o}4%*I)P? zzT3I}Lb)&-t)>}vhOKLZ3TaUNEgB0o=`!eX` z1pl-s(~1*~=Sf-e6{A;n)~)PZoCU72$iK3m%Kggg@n+M5#&o!tIc0y-+R@61qG{zr z%CSq+%GY_zY!8oEnH}u&oHnc^_w@`|hkafUN)Cqu(4Kytk`w?d=%2f0!bRR~# zZ@ys!g1ZsyMnV5PBc_Ie^+7ZqG2s&ues5zeV#yMG;3qbfl@8Ub|5_5dN=W?KV;(CO0sz zwlIv!FiKk2&m0BlX&jOg{ldgBct5@l{Er;iIBDYprK@$#Hvzt#))w zJLgF|VJq4D1vu1+VI^IJO(s=Sn??YVL7G~KCTz>PE%l|vOjBFdtD4%OUx^QPfQDcm0Vl>8@ zh$RwJO=2%Bb`*O@vBa)13Rv%@SU@p?y<$f}RHP%gV8w>r*pit1N&Y`QCZ?D7eKWiF z?nU$7yE@D6%=ylob7tnu?Ck7pS|I*>)Ra{@w&*S2v}w}*f5ZM>UkKe>x&m~d;oeST z|KR;0>51NjuhRZGsH3!hIKJU`pcQ(&QC5E$?t_>ihzWI7$M8pi-nf6;fhHPM-d}it z#Y*$i)}ep-90fdcvj$$}#F^6%{I@%HLR$&}i$2ba&b9Gr7-X*yh3R6KS|n`=pOa5LlRw+^OSk{m<@sTj2!B@00Sjw3%7gmHnf#|-7p6-sOUka}cJ~z{E9(s|C(|?hFVg5sO)-9;1w_JmT zFGn1zliLB_AX{1+MQLT6HKz6D_owhsIla9ol#(1q}F;Jh1cH7Of$| zGlzDz$Zag+e1Lx%_ydQoANmb%6D|jXgDwXDIrN)^D+YDI;0rML0t~*1TAtg49O{sR zFF5?2Q8nWXOxp<@{;@b@)M6Z~QU-O44p0l7a^{QdsG+j-yt-txtXC@|$Ty>{zcLs2 znY)GMB%mv=l`+nd5dv*L8wJIEGv2Y034Dz(e=V-TDw$75_uzh4 znKcc)!ggn7ef&uixvyXkv*xC#wK6;SM|a0Y&c2yFZPNQ@j`htP;okxxJXJ6X$MQ8Z zvD_%Uo59-3 zGGhHZWTRqa`_;_$!&P?)%I@x)-PQtyHq7p>IkJb@K`(X4o+PMM4X2Uq$X=2C4Yca7 z)y#HUT4nEI9JR{MaBGD<6+N}m+BM1kH2c4jS55G`m*bt=7`%Fc*N+yjoJx#i?ag_P z_}ez!#)!= zJ7*UX+~u8Ig7&$dwJ*l;G6TMM|tP^O6$oQBg^|)r;+QQ+cvKyw9&Pixi4AT zff?(%odIeDm@xGB&fuk}NMa@0#e6cc)g~U%q+Y z`sUrWNF*nzM?N~>$^#`ewa>5Rn~!(O%tk?7{Aq&x@xJ+kee-)*DKZO%pX9>l_sE|P zOXM%|&7bWeB#W2OJ^8dkn2S&-^a}V}aj?)UHAletBVC1F`DLL$+74!^#BQsO(=bFk z9Ra=ZxVOCvUx&Ry*e=y#+wl4%=uj0s)qAR^l4%^*G+;`{jYyeUCgpji1T@3Czc;KD zHSP?5fhqc2jD2QVDQXXb@P;yFGg88=6nu~1bx@~6A~|%$4JO6SDX1L@C-usL=i# zz}`4VA<6S{81LdT3DFpS(GVJ}-mZ|>q3-J&yq1P$g0L{#?yCw#0Lsh1Ew zMv-Y6ghUd*qS*dBMvxG{5Gi<9#L90>x4-AFik7nY;NVX-9qJ=AMEMT(aAEgF)E9WZ`$aX#dmGn(lU){nT{h6&}(&!hk-+B3>diMTt?u6zYxp79T!mG zjtl%%3jv1)J~+H2+3ZKkA?$qn1q|$BQ^W|ckOuB}7H0(!lAX)I9px7+JO1GS{C|f2 zcxBVT9sjoFB3uUURGr#)s@v2g>(t-@GHKvWZCnQK)Y+57G;k-3wq!#`&Yfm6XX*n3 zcS@95Y;9{9}W#A^XOsB6A?!$pRuc5in7%*@EatnAK7yN}l zJ#09Kn8#?~06YhHgH8hiJ@11;|VxI0L7rf0j2&?3CID&!HZ=DdQl37#u)HB z9MA;l*FriwrK4Vfkp$ouBHagc)E~h+qx^$A8gOnx*VPE9>pba;6LXfu2Z^tcf1nq_ zQwaY-e>gz{Ss)A;o1`)ctf5kr1p;wTRWW)ZG8?c%S^%S1q_+eP-8IfS82Xb_1d{(m zNeA|%X#xjWB^@}}Uk+9qfxs%|KqrI^eAi5H@mcKR!;ka^u9u9qyBJ}l5DNKKXR4}8 z;5jnF5LYI+7+rBQqQDo-CC~>-W0NlD81)D46#ZM|iG%twOwKpx) zbu>il+Rrp!*}kLeTnAET8hW+q^3D_&^DIl_z7&^OxQk;7nQSyo_yCimWOCTfh_5tx?vd7JrH6~mAZZE)~y?wH&f(q7~=6v1dmV3;Z=#Az_mf>gsI@Z_N12) zIY3egh}vxgMeX)3MC}&(FZy;{0#Uo+F2HvfpAC?HBk7l!^wHBW*wDiK_&lO#k$@Qc zXoYTPB_ne;B!cigPILgyBASKZqX=Yv}LCQa47I|91v z?(l6n8?{Deu-BHs6_sLUaQojf_)=zo)kv~4urhd?8T3F_Jy4`QPa}g>%%BH4iP$9N z5qi9$Qd9;#-ev}WdTQW|2oh2H0G{&`sAzc0DnzCwlw=vObX`kyj%~ zs(ug%FMffdZX^y*f+F@I6p*Ipn+R>uDXAi&5Cw z*N5GT_#lgxEU})Y2%liZj7zK%>-mRDQ6(1S4I@0P#DdTX2Q~F5v7lCv zDyW%NV(V3j1wqvsUqkX>2W%8H5h22(#DZc8n`4!j1xxaPWrGCkcbO~k+I%eoK z%Ri(%SYko{gXMy5fuhwzC?HKQ4FOvW+DfcfdjNZ38cOtfgsiO+>-8+ISS5Qk`u{7j zULBdQRbssc5IPEl(+hV_HBY-rtk=6Nv0f33WQp~P@hq`cEU{i|5zvr>m!iZru*7<; zbC+1JER`awtJz!iVn5aEs5u~0!RWrt$h&Rn%M=fKv<2h zx%bE2Ad@+~4c@CFNX?GtQP?lI5TV4gSc3nC0fTQM`(W&$G73B!MX^j7@x9G~K#E|; zLyCn3*QWyywE^i<)m|?cfu|lWC-iSTAX=Zn2v`Sb-Q_lL;Ciy5*Ls9ZX8(H`61x*2 z3)p!fY=>;feNGaVV+liV#E3g(gqhDlb>I3(>id+X{6;)0XDnMs-{$_2K2UsP)J<@} z@StyJYo(Fn4-!pBjqQv1<63uF@lXr<&cFqp-oX`6+p1dBrp71;FNoPU7vVS_)kZ-~ zY;{Wh*LXN-X6=A?4_;4^`aOyGe%_Y&rbzu>WNh6sBK3nCQ!mCiy$KB=(I7ajemxBR zxy6nfkR{NRuHUGCm9Aeh5E(Gye3x|nj+0fEDTR^_dh{=k@Fbo|zYR)d?*4Bh=l*^m z?_U==_s64|GCB8e?8=$4kg_uxQvX(lUb~@^5%!9k&oNp5mHv(^WVoAT8!UY{t0L%s z7<4T$DbB3`AdJt1|&UZ18N@1BW0$mXY70Vbc|`VGo?GA|!LOVGoQ){5nW( z>mdi8XTE!x?*^-Gn+dh8zmd|peM=WTk`nG(%$4TsNDYt4;Xb&6NHu!&78hs z!yeQc*7_7&2X+0wHta!|9T>C_HLWF#plaG6-tr8>Esuw%8ie;sJQZTj=McE8v6UPB z9nl|`QDrb5?LB}VTpI?CR!xAwSxm-n!yepCi5^Do?vhnL$8}>wza{S ztg1^Vpaumf`oU8X^Q(-Jjuf&C=Ez`hq*=uyTch6bg^{=@yoU^~L+&DZ$R$f&(+>>! zi?Kgg?ZR|TLo0dsfuXN~XlN52YJ0Gk4^kV++9O0eX4VD=x2I~o43G(iUQZ`>5f9;} z0B#30l>T)n{HrPkQ?Q{d)1lYP3ih2PnDm*$IBz!WDYVvM6_|^MgBn)LWi(HrmVz7) zYwEp0@N6C?dU#D`ui;N2Wq3KeSd3_3N@O|X*5EeW;x?SzhI?|O?T60?KH3^R|w1czm27Ps`VAulQ)8$!nv@~Wke>0?7MzPEgA z$RJzmSO{V~%4v|{>0?K>2A7eq@X)|ASQ1>O+l<60(=xqjn~^tMwqeDRKDI4= z?8qMtF{+#)MpwfcMtt!YF+aJ-YNODom?H4V4|Fwg<{bjXri00-Cb)8r#bs>1;1G*< zMx(kT;5l@G6Y;7K8P%Qojhf0sh*dR{T-IS-8$~xT3bVShIXQdskuM@v8u|-enY;rd zi&2|!HP9^BQ8|%_*@c+N&au=-z#yA(82A{4xQKAuvpX2|8?#_XHtHK5KJ;ils+#`G z@GkT@0789vc!CEnkJ|dLP&moZMsRzfFG9?FY5*JB&c6VXhh0$pcPMA|L&s80XAmqB z4?RO?QBSB6-o7n#3Ehmqd&Z~`%b=l~Y0%Ij9$a^hNgf6b{g{atO+hV#hJMbRV9-#k z-V&kTF(cEUqaQ)N3H{a38y1!|s1HS9RT+)SF&aJmm`3Ocq!y?E?2<=!Qjw~bjP8zT z>-*S99KuUmHIY--qo+BLG~UqtrbVa07+^aZZ8dIRIZ+OxkKPOcN3TKh0w-Eb+yDqY zI)e!ZnXp$Tj7Ne?{?kn4fNeAeY@;A@Bjv4K4k&Iu6F=hNCfYuXx!&<7II!uC{?^tH z3q*{0++RI41EYolRQG6w4z$7;%yo@vgGYN9kSyEA1~bOr-C)LGI)o|0iw|_h45jX$ zg&1P`%YxUKpA*i(xQ@-&n)1(mZ25pv9s}!-iG^9CRb&&!r63$b$;Tj0HKj2rEcr24 zc{uT4QzGa$e7_rm(}IO=&~F5d<&^i>ryulAsHS6Ig?Y!azZ=`aYJ-Dt8{j}hPeX4s zM{^D)#dz2r1*tcRbK*-gl4~?7_}Gbv%5hhl)etuh^*t6ztB|y#G4n_x2iDoKR-JWP zd6d}l_z&~IJ+Lj0e_))ksJe~5d1xNv9+!FWZggBDPCkr#i4j8RkG+N95PH@12zQ14 z_#Z-lq65M$p+DJD=ub66xG(gl_Y1vR8=?Ew6ngalgk3^^rh?FGSs^`X5;ayy@2jt@l zBIMRq;a$xXkIk*Z12nn0Rd|3`O#!CevQQ#NtPgRaDtA+9N_Z9}W@E-2EbD-h0-n5OSd zKJR>j@Lxl`+r_&8O-QZN3#XMsFeQcM^hg9QdM%Fhp#U zvgO2oRDzlsn^Z-x^Ui_9T+}Fg>q(6|)S zrnj4!W)tzaN>JWz=4G(5c{@I7bk8Lqx@hO4E_ zE{X@a8AVG-JJkNUvpA&ShUb;x#IGh^UU7WBQh@a?L{YaTleJ}yXFpd1lERBbKD8jJkS%hKmEAF-y*4Lx0g)IcLumxns z_n5-*ojP2n;A{h1c)@ZA6!t#~g!Sr(eGwHp9Mg~HnswC4aDSw-{$Z*G)#IqpUtNyk zkyT_I3pOGYVLV<>@8w@-A3`1gjm4!#P!* zE{S$v^;qL3{7IYqf?O**#`k33%%)Bvk$F^lFE|YWy zF*6X3f?nn1#F@&ehn3SZnbR^?POFJpjZn;N@bk!NrzabHgKR;LSJ;9?nHChzPN;<++q9!s&J(OEl^r<8 z!@?HNyak8gz${sd7Mc%4oGnF+L)=E_(NBn^$JpmNmbxpZBSodCl62%kF!>S+mX5&O zZM^v$!|^rj<+#gSFrnAtU{sPh;}JejMhT}6C)k`2-T4OGT~Y}0o~Jcr6kWYD08roD+*|`7{pj zoNtDCvB(Epi4KKb1m?INY11v|amr})f>8_u!45Sg>UHxR6$gzts=cjhaGkAkqYLOp-|9d&N^o!n#lug3 zYdZgU!4Q$;9*rs#{iY$-PWLWsN2&M{p}aYcX7a)(AM#bT@EDntfQmiVtk|sX3mLnp z5n{*LViz%X@pgQ~?H*&Neke%0n6XQ$d2}5KjEhFs5xvzAF(XvFh|c0UBrcEtNGgW5 zp5He^I;J+Ro%e8!4c$=%V_M196XWmM|HyZw!=q`qx0}l$ zTnt;%+X3=?A%}Bs_mk&~qIf<=o-dB(`Al<|7c(Fl{ChLTKFmXmh#8J;aj9H3>xC%q z12e=*GaQ8}&LaHR^-(iiTww$W@l%?>JukVAm!I+HE^6qK>;CP*0*j)o#lt?hTqZew zgXEuJ4pf;!5TV0D(W36e!i0=eZ8`QSoVi|d!=OvvCB)XJ_l#}U2#NUBZ6|NYP={jQ zE(k$h4xDv2^p^8j-QybgAX7|@;xquEyCL5H3z>GXWg0h4MVhWHE?!zcE?oL9X3sK- z+pl6b%2-=r#g(drBQn9fWp~{q$9;=eVDVC*wa^@5E`>zuH8`9<2SIsg9Az7%W0 z3OmA>P?alZmg<ag>bRSzc)SkBR^lJg(b$4>>MX&@haA^Z42$o@8?+93D% z1qh2^@T+dNOZ-)Ns&a_mAVpxYqjJRW<@g{z^WZXi295>due)BZ#lbO*eQ72K=m**pDyqs}l z)Y(-sbrDX_8+z+nRHc-Mu{_B8_~rlbrnWp9Kx>%d{f0D!ys3S^FG!w^d<`CL}!e zK!xG}C;@NxJqg(mDr zJ4sT_F5!eqP|Yskif}bMYqBQ+EjHmtAzFt>Cq?{y=ytXB5 z1N={1wV1fO9yz4SFA#>unj8u&4rj>WxSaz9`+|_WOuEG+=Ud=**Vz#=HiEABecToT z#xeRQJ~&ym34xCgb++UNXjiLJA%uK+73W7`+MoE0f7KO#RmLn+=RIVwx*9XUE)F<- ziSH(dFGg4n+SQ%?mD}-#b-f*kaFUHeZE>S=U8s2UcBfG0t1qz3SKm?}hsL*UaPgaR zu5uK;=6Q~y*+kZ~wwg#?T)bm7k*LNfurKA7@UG)3&}%DTE{WgW zfV69|B}{t&E~u8gwvkjBsw@+%^lLjo;9t;Pzx|icTLvK<6MCDb2*pBgUl$fFk2)Tn z$f~!l6yd5NHbr_D2BN}+& zO>G!~Ggnup-q!~G6c+4;2ypx_^DFGgs7-LBXs#L58S8s72mjh_| zTE)h5Fu+Cw!rW6rZoK6da^pS3e@-DcQ8so|n_hAY35l+7(7S0Mcx>uM9#Za2ST`Wc z9R#ZpuA(}1sD^;2B^{?iB0e?_-$-S4!h7vZ6D4ldNoUe$cSVFx+vZGq6r&{B3|qaPRn`9oZ9L=I7r^1+_A7twX!qRh|&i4nM5 zbxU4rP4S1%^}Kr`VJ$*3N^c9((zJ$*!X1US_kaTjbatKkx^85G(>fx~!01cc3vZ|G zy&j3fNzlwqt^!L1xrbr6B_df$9gw9|CD}ioWZ<4spWKCkI~JL)rTAfAU&J?OJb|47 zOu-$I#UD@Xw3HFNhMXxQC}&C-IZY?RCTCZ~@!ncXSANMTd!LYmZ?h90oT zCM=Aa+ML!(?L(SCD4p5@G#8imf>C=tVARw_B%4DrJlM38k$Wt;n?^;tmbzRTHFYiH z2|Pexk{d{)rlPkAxCo=B9+h(5BB!fF*yMy!Q-7dQQ~zf2uS}+JFzP-`+y&&gjG9fO z?h8QZfiPARyZV^5bl*Tm;DWyp6#X^~IJA93nCreF{;EYm>p?y!n`E*{LxoRkg;sT5 zh^-rdVr5T5)n$Zqd|KL2oUyX=cAQL6x$$BxNU~l7?KA?W@d{-8StMN$Kd0UcIL1Js zv;~G9*dA%YlhNTfN5tkjI3!~kdu3?(ym-!U*V_;??U=t4jwx=k->#O;B)Q+NR(`wi zm|ol85PbI6B_ET-dE0MS8^2v`{dTqU+tuE0?M1&8b3u4uiHk=Ei$_PlMOb2^9k}kl z^9iVOox~RX!75;Uu!4>8u1E%vIfZs`ht_zM)EH9J06BuON3_O1 zuNyd{m(Z_KJh;BN$45v*J8DQjMl`5`Qx(GERgtABE-O`z(Zq|Hsl%Yuet){G#H^5d8}b$KeU_48*IroUS2Thp;Cm; zgqF@Qiz;lB8SM0a?ogeq|49PKo-kw(z#hM0b!eb z9HeCwkTU(DnK1$3m@N8?EB>mh!;%kJKI13koUX091$d^nEhES~63JH(T~z`z>-Z~o zu7H^>ZNRR!d;uH<5Sn{tKinv5nKKZgVEV^hrq7%~(`UvZ|I8S&vDqADnz;$q%cMe? z2Vwlot%lw$p=^C_Q;u~l3oip}S&hkqmH{N|6`L%ma_kR5pk=j^l{sqw>Qq)B0I2lD zjwhDI$@MWH94|U**cLbo5q(wV91zbWk}9 z0e;dAo+!aP2wqDt-XpbKgAGgta;`_?kYniG3#IBgpMlh+dT!Miq@u2L|3kKd+1g_pYbAtRNdoUOaNjgLXYGu^#xF*&#;DTc!CWKc%Q{p~Umh75BL7L3I_e zpMdIVNtHhsyz={6ya36^{cexDCQqbj`J+HxO;PV5^>&LIhR9E~H6shO9r4+!spg*{ z0=K+MRwB+nSZ6_?<$oYBIjrS>q~81{>`TJHbij8qAgTYBM47;Tkx- zi%J(tTkoZ<4^KdtijXEm4b#+z-&NPD?>{`xZE8-%bMc;bIM#o8QZ1U3X6f2ctnf1DG6Cw^u&svyg(h~Opxt}6;<+q{h zVC<%8Xh*6byy)TKj#QyNkM!gLZ-Qt?{M}O7OiL$qWC5Jmkq|@gog}^Nkxisu=8+Fa z1xGTV=aDPqc#0HoYnCLc_OM@2dLH?OR45mDCkZ)aFAY79{0@+%=aH`w@sHHgsA$px zXJ7(NGcbc>S&?|Dr!gD}5gyLi7*0KnH9WBEGv>IZDx;@y40;-S3_W;pauw2lPWo#e z`N$5d2>YOEMYv(00GKsV-B=N3Lbal1ialdx_f^!-J&r3H39haPPz;h&t}9WjaiP3q z+eu~HDY}L5v7r^eDnulFuk_GGpQ{MfZi;^JY&TwX8%2NntEQ%EP4QEP-se5AA2^z+ z#dXwv8L)FP8n{du@I5o#$4ra!5RMqyv3_W<)y+(cPpJr8%6SefrPYcdUGZIY!vcQ+ zrHVhbRoRZX{)q#`qpZ2be;}vtY!!e*?W2AOEj$|dQ9m*|+7^(bZxLcE9U?{|j1}7A zb0N}6kv1F#Kl+ZL_kCH_cUIP;m=e>D#xc@XHb+Yso2y7w*-*YuUG_No4YP!$27J#O z_@h#2REJ~Uz=V?Vv8PNG2_GzDnwoWzF+*fb2eYsft@|CHVu0m z5-~#cx5t;dOH%{&7F^nHPb$e??|43pb3D_~`*ol_t^O7<+VNu5%^kl6w#P4kq_+pj z1;pMlNq!)guPiR4#}K1mZz#`U8&b66zex{w;%Qj<1jpYeFck0CK|N8m^F_RN;#m$j zPqaV?^eE92Em)!_f{4c$4frJ3SH7^326u5{1d8AUcxorG&P_WJYUusF-EI+boml9S z3(oXJqG-!nd}5179Y2vl)(~FR@e_te=X?U=j(#0v=X~N*asyqc#Lg)VXS*8Aj zeNN)$^5htMn>jhov(20gXPY@01I16`Mt(p8TbuEw$R{z$r=7&$ct8VJ9vA}I@;HI? zYaV5A@&wD^Q=Q!#l|c7XAqZpbx}SQ-Q}#RFzW>LmybD ztnQ~aF$oWA2G;RpU5w~U9x9(Irpl*o5^#k8yUJ+Wr|`sYAZPVT%E2n9Q1=JUcB_1l zDwotoc*)RCSB1*l(?lz&<5sz(jY_dpW)EA^8)1N5#gajuDwa&3iY1&%D8W?1Ag{72 zmMm5~mXKf-2~c%{nvr)7!YL0OOLC}V$pzA$CT$rVOFm&FNq&cpB^bXB8t&FHojRU= z8UZs$XIQM&8_3Zb#t>%VO`0trutAb1q;=`sa;S{CqWEH2PaqkspC zvf7{C3|&s6fCqg%3cihWTSzD9Tu!5uPkWZ~X<5prZ;}wDJXqK*fQo$@r92o5^|UkP zP_a*=lm~~nEs#SCoC!qehk%V{7WYR^ybU@7RnA~4N&Z4)R|DU3CY1I*6KX3`AGD8L z$z}sm_8=IVNXDG0VsnTQl8KzHLpMn_S&~hbZQMgPhsfq^MT932ZlL!?nMgKg(U=&a zis7tn4vSNOV2T@ZR;#leV7;@g41LHrw_#J zX)1RPGn9-_%AMnkoH^g`soc4K$n{*1p%3k3R}L}SxuH_Ib72tf+%%F+AlZY;AznK- zpURzEkAR1kHs#K(r}XF2iN`n_cn{^y$*Okl29!Hjg5*?pJ<62IePd|ns~TGAJv0(- zZlj(1*4>iMKd(}tr*Pk9adR6!y*S?mA=tfjK3;Pur@f50F(}`j<#_vWelkn=JSSbx zPxoKkA3d0DRf^)W25Fn@-sk)llahI0d~hBQXp%T|!gTe@_8k#%qA|XNOU9o=?en-@ z8uqr@7Dqe(Jv2QJpE1l~Zd^kZe7*d(*GE$-eH;m!AzYCFw|x+>6uYHpr7r?h+K?a? z5`-;%$v^oS2s?{(zjQ!ECv@Pk_}hmZh~e~&x^howLg3Q52unSRsC2GmxssV+rgfOZ zRz&Q_N|PDMT#YCk4jB6IAXQA9MlSt`Bhk{&LG!i{dZ&g$511o#{esW~s|&sJOriHk z7JAUr2#D|Xn9%!lMK~h#e$NQKKc3bOxF+<0B|;yxPw0d9Bm6A%A+3cz6fZOl{YB`* zaeptW@lo7ir(t^(*9FxZW)I&eAH@Z4^TI{&WFFGgBiv)G7Z?Y6^RN85o}7iF(99)9 zg-#fHRw@Dicqa+*4K!Ro&)}|*QMj(dLZ}+SSGBT|BkgNkES>U zF6?QxhA{L1VVD9^4UaYsYi8CQRFbgPta@R1VM+_bqwEoR?)Jy6nY1uW$%i>S3My=x zWP+7pT393@wt^yJHv%+weg+XC8`)=(79}hj<4*OI}@hu8A z>HEPvb{y1ifhqd5sC(BjPm85Wy#w5f=@8WT0gR+*GqL zBK|V8*;PCWBjPVwVm6jOYO`U4k%69tG20*UZwj&dZ&zW=Zb#a;Noy6xY^<9ZS-~od z+0q-$o)Zl+3}Z%STT;Z;!M4du5sT(IG8>Z4UP~HzWfsZobV`$glA65%L@^H(3CujZ zkXp{>{o3qe5VdggXL-%O%{UCtW`BkOiZ`dg+j%b#(QEl545h8Z^pvpOTQ zrT3ZB5~qO>WKJIlGN&W1Vq7IYX97nabEsGgAC$bolArq(!uN(Ye-BC?#Uq>DJRcRI zZr|orvr1CFg{sYK$m=q1q0-;aTaK{GUc~d(m~OHoQg%`Kd52I2^Y$5fsH>)PMJ&-b z5dP;;#Pe>ji0A!42=3`Zo7jpNvd{Mh!}(Q^Iv=-ip-s#eLbdsrJ_*(2OQ+iW=FoY* zA0nPGUpm$1cYtl?zk;ZDR3V}G<5r^q#i3cu@1r%Arkp>PERp^E`6Qo0a@FyZYMs`E zCM==}7bGIAH8e*NW}JJQCS0&XMab0^+Ja0(d!sn{=DW7wIIirkG;@%>;10s4cH=Gh z%-uc~+^6vzUeI;HpN2l#HWHG?b2LKgn;ynZqKojNP!3$3h+y(qxVxA{)w6 z`jyBx5!%@87TL~ix5!?!TjVf^9f_ggm@QU|Gb>#rq>W7Uuv=sl?H0+YmPp*HjM-Ag zZjsmyQHw+k9y5nyiiWtzp;;m^B{*h_l8b`}w$aEFj3c`bVcy8|xVqzNkCFG;9Ymry z$H2?#BSM58a!2T+t_yv1O`(rzFZ8kFU>3QI3NtF`cw-UXH^hfyy$iddsUoxR!yqV! zznGOY#BL|Hcy57pH`YQbroi18A~_B#w`Y|}In9(kfmnRC!AenEJntC|?i{G%vJOZ_ zqp*9hh+ao9cW>VFt^+C441MfRa*f`e+2HXJ2<=-u@4-_Pv1ciX_yXdd9Y_yC=&b-Epnk}j zH~An&>~7&dT@FgbZtT z_U>K?Ll9=I@Kf-MV)tLJ$uo14;8F^f4E>U!U$O(cO!FQZ<5Q75i4nNqFGLz0`Xx_g&dF2V zYuieE!2POZlY|tsf<13wmuVN93`T&3)Gzrk&g3S@HvN*%QorOI5I6aPp--4@>X&@m zmWy!fm;8$v55S(v1VDlk>bK|Fvie=5V0$+qWEvtBFZ&gClZ`;>xc4|C(FpjXAO79+ z!x)$`YVZ&(QJxGLBG9z=va1u$Z-%h$Dr`Ban2i1w4C1CJ2GU}3F%X|`h`qNE{wu_m z<{{F}!-RXkba`^I_jei~<*{fS@N{D0J2p>VuH6fWZ39Hgt4wdmbeG%a3qFVvDFe}8 zh?E5gvGDjw$VR>3lOlHoPvHiWDR5ODP*klHZW5c47lXroq?XFpbQZLcUxOD>@M9CZ zI=_cqHWQC2*@^E!$9LfP@<0 zi#%M%&D2Z-N0Rre!Uu9<^G6W*Av8C{zU?TY?zSRIZO=#=7(b|GE*})By#W~RVbatP zw@Fi{(WI%-4jjS^eNui|lcsXZlvF&97O5MV?qO0yiPZBnY3hAsk21EIH1$54z`m-0 z?(-@Gg-Q3-V=9JbV&4mfKDoYSQdnYN00&@;aS}ot1l%`O8I8PVGftRB+n1zS_4-S~7LCih`{N0asrS`Z@OS3WmK&6<>KmIr7-%959ZOk#< z2xuh)82#XX!CdZdyZ;e4^Zl=@6vcdhYcl^c1a%gUSpJa{KVpAxBt$h<39#+{5OCbj z9h~-$_TSY9#rGbontYmEM=jsqKhMyozS;;l`6Fl@L44x3f0GR)A1GR&zX<}_0qn(& z24^i*KkyRbYYG_bwk+ENT``Lz4h#aX13hiLR)Hk0j$qnI|H7U&2Jcx6K2qWxz)ic# z3H^pGr-R-WA#%cqPaK2;k%R}=`WM0-S|T0Hvk32?k{`T+5u-SGi?luzlcrBc?~*>s z5E(G5$^)igFO$AdMJlVO$0NF|)yv^KF(BLr4b!)o8pU|&wA84mpUP22DnJ7Y&wVij2lAtqjbjO#8+M z^4wu*WuTp9V7QxEjM92#GQpdXs1DGqYX%5g*rphxtCR#HX}G=1GK`hR7R>sv|d8&V;v(O)|}a5jj&# zbNqp`vgW|uzsRbJgviz*;9L(A!y>CT1j}j$k+SOBDxTeCWDPU)8DmYAgakzpw3wiI zHjurxW_?Hy$>`~`tO17Hv)5sWZ1l?5V*{3SK!|J#kxe18?LsKGAw5fWA5skPa30y1 zrk6azKaw>*2bCh{Nsk(z^Acb=&mzMd%vH?jVb%DY=WNCHZ#6y#WAzzhQR8z^K|E@F z&UlELGu)~j+-elHIR_71-)k>*Vy;-aCvw(XHQu6udopQ+a%8!EnF|29*mQ4;+mYo) zTH1Z62=ksa3G-@u5azXW5kk(qV78$=+$7By>w}tuhqk!9f`DP);TgC|k$JG5z+8EM zsz_C7^2()h3qIw4yJ|LN~4sV90-Y!b*th8jq))?FtdnhSqKHF!~aDZW+{k2VwOZloR`*PmUp6X zxMt|H{A^<_FU+8bd`$7pstlULEHib*2^Ypx2I_D*qO5v)7^@{`Vtj~tiUanfi~|LF zy;**we^a$*qA&$G%MT=SlzF&6c^^i*nN^vE@DU5)a5w^n$c5M8$e@VpZNxYVsM$)=a)*VD z04}U;wFDDf*vSP32UvCqi26}pbkW(f@w~1q=MVWKdufsBiu#@TCV@8zPnWnj@L9^X!a|uTkH?E#SQG%bsz$6 zFk-OFw4|d9#Y?Pu$5J5OPCFfMXpeG7#iK2Gc-bOO;(bO41WsctLMT1lQMA;fyU<4Z z$Rw>Hqv(N-;-Q2%n*1P|H#0{ujuA&s82aq(a#z@+UqTb^3JV#JRRHjqWbr3i{NP!d ze}b~L*|v`1bJ0^!3*{(nzRNfQLIyCKW1*@h9h*g#6RZ+6Ytk`@Zq=k?Tg{q;zU^2Z z;$5RTB0u5b4iA?+g^^VY@y99iaqeq=>{nA`&&o%UY9MTpo7Wvb4(glk+6S$V|CbzY zTNR_Z7Z$LUE$kk>&!{G{F95#n|AsB3ZhuxC*LPDwhWXdd2)X=4m*%?T~?Tr zhoOSUHo{Rz#~R(aJ%ucNbV?^b;U#20`2!Q>m0594{=?j`hDV&l3YNLGJPHe(=fkO; zstV|-8t}TOu-tR*+j2WBM&SXdIQ8sr=Drb(YV2 z#HkJBPu5$Ro4g`5{b%eh_5!Cc`!kna$Hze4g;aPD(!fn?xxTBziCRo6>eK)jNs zW$Jnf%x=~7l0If#hiE03>43>-Gg&=-(3(DDUs19UVT~b9qia^1E0-*C_Z1}@Rf>9n zw`8AiKVlLk7>Nk`BPNcqOFlsO2#-^OLcrxR3%lfh4jk?p`uyE$2VvN}r&O|MAT!vpTC-kgEW`W zf1T}wBHo8hhzVprcy=_zK8q38f@^9gVzUOGjbP$?JdF2rXMci2Ye*d5%(ph zA!7?*mvfkGJU0S%=|2oH@;Mx=0~OD6e(v0K@H&SHlx{3B2zJr2PEKKh<~5|uL|L4h z3F2H93}^7qIdE1u0POMpvz)Ljz-%fr%0VbWMgy6~_ni^NdV1~#+R3>yhVJa+nvx4n z!zkq3*BmyS`vvlvW8UtBg%X>NO%^Ouw)3!=$?w~eW%bA?25eGV1)(nbsa+v3{u%9cTsDLurQOa@`%;)G?sY_KE=SCWwX z3q>XdAZ|TMw{$zgPK<8rQ($y^tSP0bF*xis^r)Am4~Gd#i(rD%G?>8KzLDWFL}Ddc z)XPMjAxd7keX;T+rC(E`8_3upMF;f-A2LK=;`GKt3=Pl=SQilWGGvrH7RK$TZ@IuZ z+zZtq{7L61jCR20flNi%$ckuF5KXu@#iMSRaI% zrS!%AV0f{Ur8J=f$jDRai&LQV#c?jB$!0#;K>(M1qg5nK^7z21+@-I-goi1YRv6;;1|d{GA|Mk*%~g@g*Iz0^wAh^R3u;C zRaHi*Uiu2*Hz>GM#>a8Jeht6;Y)YH zL9ff-+tRO;GsKnZFy9`fH{9Hn8Yq@xV6VXKUwOkmoW1g74yokgx)Iy1>$NogcpEFr4I5@)77@PbG+(j=!-^H66$dh3Hu{VfYf-HM8YN* z-dyEsZEF0sIQbmvT+7$dMXO6F?kOJdyQh11tNOAQ7MZfx+A+BL+uOQ7O`c=7I z{n|a+1n?k% z1#Ak}+oQ^`Lq$f{C!(mX4@B0bs-t9FEaSptoHZ`Fj#taY_0=9@M8@p3HK6NooY%ib zR_X4n?zyx2pcdGEP|2MYO6mhX*ZrU+6B@bmqi1XYH9lys6eJBkg*t`fqDI2}aR7tq zWE|!*eKrp>%gXn`N=7e-c|TYJ{$F|AhM>OOXoqZWbW)bX;sJ8zVsdsBEev zm~H4wdQ_FYw(MqZ974x(V;yLgyJ+%lG~CGQ<^~{dZh;1SstCpU=6SHb2|_pPo0uADFrP*lOwvIQ%t=dR0g|N3?hUwH5jmDU%wA`)NmF3`~Z*_(P z;GR9VM!;6da@?0sV$_6NGZ9tRDc<64#J3i~W_bU(tj%a|t_+LY%-VhnPma-oNSaL2 z*0|xnmB}+oQlRdnn0ktFfZ(x%Cw&9%aV=l znE&>RKr9F1c3{~qP9nI1>Gnhy0#>~}2Z;SdEO}Tb^a(qm+ervJ4RPlJ9Lo-NRH$z3 zgl->Hk*X8AU5se&5ZruY&7Zh^30L+$h{N66Um|>O_qVt2nT@(5Sb5P=-NE)e;tra` zQrl(^T=OUHppD+?ZC|^FDEiGiSb8q*^dZFMw}R8C@tqkC9H8;iH_bJF;tqxZONTIR zBcZEc=sQ^8w{)FzEQiLd1?VE~Y(|t0J=|;l#GQQ>GETOu$+LIJ`2I_>n{rpDb;vgX054)asP*YtjQnx z`|rmrPk-|^Nb1mf?g*7AL$Cqv+Z>)%lB=5m?-cgT|cSWpVAn#zs``lUn znvi$Ybik*Bchvjjjm`0YpFiR7dx_t-UA(1MRIVw;g|^OMih~l>k!KV}4JuEpQi}Qu zc@DAX84X)c(|m;Rc_7c`%rhEBmw84f0k#4Rqf0D?cxf|cIT#ML7`kS?KAzT&T4MP| z%wZ4=dw?Khh9tm}ibZ`vFx(=TxKpdU2<1Dm&*YNo5Eey5xYT_KW*~VB`Y? z;(1Ac3D(7PK``n;f<}@6Pr(-Nf{>>kB>289wZIdaC2xR3s6`N4q}5%bL)b7h%(n_h z3sPYoWXVlXjq#xR!9_JzQegxgn~Tiy>{PKATvX#E6p6LMMblWmA{|cYCed? z)Kt7reC7BvxKDpWQn4k+*FywOG%fxm{Pk8}3X!8O+}g+Yj_;3Y?#m$s?X}wRp#|tr zG)MecLtpW#7FoY>*La6kzh15QrOx<8h%;CJ7xWRe;!}O&H#+0jFqU5tiR9OcYsRM` z-%kWYj}ifY&JwzYhV0cs=-$~vFP|m!M<)xt$#8t@1&z4*GuSjf0-MHf#1`33Y>|!h zH~)iehGz@CeQRtq=fL9I%0eF-E%f+Wko_s4uc(T!mHHr)@c#*C5#-&Cl~mIahgdJf ze(5ZVN{CtuH}j%*;dn%%qQw43$Zvs%f9))aE(bGCkhkeuHNV2~D5>yo5FL)_iLU5L zjQ$qUKOlOt2+4a#s~aQo-YX}x7KZrolDG4(nlaCT=IfnTYR0@Kd30?|(09(Fm{kBx zF+n?Bpvw|eY=LgrK;Juy7Cj|=;_fKWqG$8o^OiaNblM9!Eqc=gEeaxt+5F%vT09=v zOjU@*VJ^fOA{MVS5sOnS#62MX5I#$~D8v#k3-RL@L@dFmLTa-FwMXUgqqAs(13-J#TD_%7bE7033#NW=M6~#b=nTQfs zg)e1=U-7wx_=^aqY9;?TixTDwpQt(tlz^&bHm!>UC0JD}K~^mVia>i$d`b9JRG7p! zEYW@nq-cqK%#0Ezn4(2!02IN*cTL1a3-RMG67j8xSXtgecsYw!b{0MK{4HqIuB7QaztEyOta?YYvK`>ajLaZ9*LgW&$YPN;I zC`9E^9*Ao|M3{(AEyRz*h*(W;NJq4~x`ps@7Ofr(#B7CFJ;sF?D-n?vVx5Jk0K|tt z%rOx^Sco5MC`Q?MHZs6vuGU$5c3scU2PYl8WHPS znuvA57UEGL)e~3vsU&5$pS!i1iaK#A84l zLrvUjA}+WP&q>5LCSn79I~!s|RcFx#_9G63*s#Zis7=I%6Bgo*g?QXqv@sP3r$TJZ zb|LB#vGIzD*!Y!&c*0qYZA+~(sLi|ib5*21GNqW{oJnbynS{I0Dh1mL%h4|?# z5nH>Ph^-iYDO*)@7Hwlqj8TYf^IV8?L~L7cBDNj05Wdc$?U}-7X+4G5e%yuFOvLt2 zOvLuzEJSr@(T-n`$3lhJS;d9eLd4D{CSqrM3-OGzXcyLrFWIaRyV_fbA4`bXg@Low zeAi41QNvlZdnEE$q!7Djx)5?0usgv-?A~J`YC4OOkD%KzTU7EX3-Qxy%p>_T6OsI< zg?QFkw6`|$Sgi8c+suV{ort~k>nxAGBP~QNXHm*5mDEe?oSg-F}r z5^4bvX(Xf?X{DA>b)7}~IqZ*9i2ack;@%M=_HQu}`&ox&6RhVfIuHWHQiV7$-a`C1 zpNInsO~ips7NWkh=pZ_SB?lDZ;7tqhQ*|N^{$e81=}l!G4V*=XS|N{R3UR2LC*lwW z{8EoY3oOL*&Z5j1G(mjugHAMaxeKwLd1TVtQuEBC7UBhGQFc}25w8&0^<0PzL}a%y z5!wALL_=p$&Q2iAkzY=M3$c-ioSP;h2X`|{4?ky7?r%W6uky&N=t68FB9FZWrOIn% zAsRW0@=-|&S13e&oQ3!?nTY&k6On(!LNs<370|UOC`7?C7DBn*g4az%0X>AYZWCuw zVLlM1tqL(VQRC`+*O^D5H8v@fV-vdFrp_Wmv|~M4sdB+pf`$5V3Q>sJZ{~zk`eB*Z zi$r!ngO7UJLUw3rA%7~TkR1lPkR7I4$Yw-#WaqoeLU#Ptg)Fa-ohrMKo$6aie2xyXFD8)A!)FPF4$5ZU`G^4w@4dw*`_`I8(~;l9?} zm1i)l6#k7?9`*Ju-1es6UxA3akI4TC@2GrSsGr>4L5oVko$%jgl)kl{b(T7UXBrFnR$=Tmq3+Iw z4=`<<#Zf;*{Tf{zm?V&B-q96sAu-X9;&0*B2QY1&#nInH{}kg34445EQxO*u6H|ql z?GIquIg4YykNIU`O<;CN%)-jJkeG#(Eq*mHahhGW_Rivk|5^CeB5z=JD$H-VP#CHm zfAfKSIyj3LU0!r^(a*r_l9)wb;zD8;eMiiP4`8}Eix;n6ymfJg=2eJdfZMJ}^~xXYrCpmQ-8PO!JCgf)verNwX!*aKfLPtOv*Vd6J)VS0ol$a6rVpg zSx0Aa?6lah*!Ll5Eu?7Pu?um56HSYa!{3J}*U4ENH!|*>xENsSN=#e?E+i&yJ~0m} z7vL;j+JEV=rL%!)C^1W?;6h@S&cNTo7buiRrO=(l%X%#9yX;+Ho|Bkm@8CjWmQBXr zhsYM_EROFH-#301F!dxRegZBeCVnb056afrS-iaW@`1}Ko1eripMndCS^h7wb#WH2 zn7ks6AD4+rlb99Da3L`(HsG&oYA&KBKc}=}uU31-k%DLCb`udTy&NlU8v2g&&7gEd zOOWeZOA!7N`nH!5#vouaeA_vp<1Ivedn1G(1kAy0-;3~}(04qEpd(;@ZAY5WWzjy) z7Tn8OoZy{MDRHBBVKU?ycKCD7naNzFYw3^l(1h^`v8d(V35ye0JNQ#=Ibr-^)=%N> z157YTmnS48+<@J7YBdwyM-e4~r*}dM<5)=&4&kr!F&18ys#y26t_g)&t%OUy3CA4? zg@(Q}KYkbHsfY2&wV$)9Km(iL1MYpm{lmmciCw{cH@L%XEAEL^7)S1jY?ChT!$5FA zDWi2wtgF>d#84+}i$CQTU*Z>knyiL8i&yUft1}N_ zl`q8rtFwOb=ltT&`^A?^Ru}x@FZ#t_@{7Oh7k|Ys{;FU6HL@D!EZ#g%_(Zl6t{SA( z-Mknn{b3Z$+yUR%^{Z$C~Yio?KCWgIu6C)$oBNAz*oUP3hW7 zKqY}?fs5sbjFT)sCCjbUeVgg{!15kg{#J9%J@6RHRZO+kmUpcA9T^OfOVrgHD##`_ zjoFNJ7O#D5ZN0UF!D*XTb8S^Co3*bqj@hhzo7s4DI9k`WfneOru{IEli#;VD1(qY$ zzPolGP-t0eDPIzevDU#j$&xPB)5U>hJXmh7wKmbQHr~+pRC9A(^AVO=t@4Y%1F@HN z^nuu+$RmC2@pV4PV;Ax``|Zk6&u7{o1kiGvpERf6HUEvv^(Q zb+y-BMjkt~n(H35@>ur@~R?NerU!_M}*I9dBl&`feq$a0sA_mK1SU1IY-B`!E zk;wMW!aq>Vm1TL(eEc3id*ga(9Y? zrq~i=jGAanG)-d?yNUk4v-_?<^85Y%eAsupv$M0ayR);i*-{B2i&2iRGk?#*S1wG@MVXhZ<;YTGH3k3l7YbOO=%1y;K0~n* ziQbitWwpxk%F>F$`Z&=otF>X8R<$mx+@jev+}@5vavn&2 zmi1kBYmoE=$NJln$OLik&HjYZ|O0Q3HzH}^GmE9wII!JaC-Ll(R zNoK!IFd~^f7{B$$deJ}IA0)@?vT@dP*Dv)+hJ$2i_VVllNYw!(XW2-`5{!{dATI0K zU?90s?BbrCrOV!E(d-^bBM*N?$7}sJUTGm*t13|o3qZd#`&9Nl(C-BLWj6ZX5scCQ zf#^4^h2KT5lr2PIAt*fF+-&n(px^}xPplL+cP1E7*zAShhK1hzI>cxfQCK7$+w#g5 z|1C9wxPAwvP;3c6fF<2R%Jx48Ky;xkb48CWOE7JzU?+iLX?SkQ0l{TRLw}kb*9Fba zzHr%acLYsQARIR4ir2y&g8NC(?CJow6s|_l>{h|S$k<&D_e9X_nFuPah*DlGMnxJC zw*tBq5Cwj7@k{fG)$a*Xjo>OzE=s7#ImdOM$`cF-(YDu62$*oRu_uk7Br7Mt2bq9x zJ$!((S&ksZFoJ&qwvBv|63e4888!x~#yG|}A@7pHv>TN}Unr%9T>VcI8n2?Inj{UF zI4$5~ZURAKq?!$@1y_9w)^qPOSgcf&dS7rg?QwvulWI080NcxZIKzvRYSKYX-`_?p zUaHA>6A&L8#3l+I!l)ysyt~|7!h4wcQn$hjl ziOKrJ6~OIJecoF@86GCCNKBU_j~WtjK5C!FA#!KpNx@Y}JYRMZwJtW*CE~ToeI5!W zN|KC5ir$*F^%D#V`$e~{G1jiVwRr0%0{^30g2lUakLbR&MzytCwRMkLkAYydF{%W^ z)nAm;Te|09#OOgZQ$X{~)*o_S7X^KL&^&9S`Df1S4m7K1jNJN2^vrQV(vLvJE$2m~ z$2tU_sZveOTRHxD7X_T?am(p%C6Y6iK&%7Kz^^~&GiNj%n10(|-bBv&( zR{+IXl~bg~{a(WAIMYE@&RMl-5B#yFLmhKnu>iJ=zhv-(sLO3;(Hxi{_~&*OJLdKP zjzr0IPgJ?1)jDXs)rtDns@z3#>3uwM69N0W5sv5RPOEZ{s&%Ikj@GwO<=$57TfiS< z+N;XzqBiY?f1SR+l&3)kVR|1`-U7AW2f%pU1yx>@T6Y2d1k*lM-X67SAN`YG2To28lqehu`+7OCdo#(MfIn#0fy_4Gx)R8!*KP+#nnYIeT2b5${|S15L-6&q0vSS)F_GY1~4zSs$K(%DqP zdj8I1)Qh?9*!d;=Hr=uFIbpH$qR=Eoq*rXZqi8r`a@|pc5y4s39Yx{r+jK|KGF0p#7BUyK}U_Cp7bjP7!=FcSEaVVVmVHv^yKJ#aj z?l`1p{>`L24ka`H7SbJuwle=#(jAA2nLm&8!=X}HcjU0pC$jFyWub4Ia7~iWLccZT z%A)ukLvbghWVfhrO;X&cc&Hq?D5@A|{|@QxnxuF_@q5rD#UENVNpUO?#yTlc2iwtn zx{|n({i2YxP=I7AN|H=q($s=6_>ii|8 z*3Mt@If1D2mt4kgz0P0quvCf8U&=avX=AV?cmC3DY7-RI>I`)L((!83LHM)L`AcD9 zI&}Wh1dFC*oZw%YFM5+vkh^|L5B&g-vUW&wvMEH)ROVi`#;t5N!XMC?MpfBn zRasicvUSxn5z>_z84=xuYOSQeNOGRE;#yOQR91qB*-#T@UvV{&2{lpf#MML=)I@oI zt|m6?`>V>Qb9J=^nxgyzt|_)cQ-FMGS;xqch@td2##^YdgXJ1&_fJtso+J6KS`(BEvDIgc^upbc_i>jNBLn z0BD7Cm}1~~dbCsXE0ytDv=}%7i05G!97P@=wapcG9R|*|XiEP9unlpuo45&F0f(Cs zgWg3xO;{Ey?c4-r@EC!b6o`ey4XF=g@1=VV$f*YW{oueK-Z2*^xWeH*7U@T%N^r-C zW^sZFzK%%8K7}-)j~<|&7EPHcc0EJ^1)1=cI`>722d5T15<21RtT-Wv5b zeCVN20se>*+@%EiwMdb>4pTwAStka$D(C_C7P3I+g3k@UR9Zg5{o2;<3$Uk%v&3Rh zmnb}-Im-8JYX%y)wK7PJOt%mtE$~QqP4^6N6fJ0wTr?xS-I~w|O&t_Sl@k;SR)eMz ztG4-2XC<0*4>f1da<~|aI5AZa@@lC$gWk6{XV3;7Bhc`Ss9Z3+tvQ&b<`e)h6Mz|w zFbom?k-~QAn+R6wN#Dda#L~pq=l4vyD2DxUj!`8OO(L%AooE7E zhf!~8K?!R67`01)-?xa9a&c?&Qbz3?JGDtl9wW>3q*fril2b*oCwU`CSK*AQ6TR_6 z_o-7~oAfrx)Fkw*fGt$Ml_=gMl&NBl6r>)A0!~Us;637DKk+cB0Im-1srBymNretP zT;Vau%i-!(oaG34kh8IocC}1=qWp^0LuIG{7*xZ|> zFdYGL5LsOWCGL#hQmLl07tD<^l5S%sfna5TjR(wbLX`soqsqaAIs!;k0~4wOuzd~8 zrAolg*E5%@0Qse!xl}FHRK3u^G%^9^-N1x012(#Wxnu!sPD69)Buc#d$nMGxr~<{2 z%j}m%ts{THxIS`&ZuN9Fm9YYg-W4hUD=<(JkXug`kQl4=R51{KtM%kvF^g;(>s+hi zBZ}kpQUz>PXW3q=$b;Wz2cbm}l4oAt6~_rrwwt^w9Bm|gTvVP}mFi&0RIO!JO&M8A zRjJHhPL@(tA@d(0OR4H0^H-3iRApiQO0txyPBVWMSxQykFn={!N>w+R-%R#T)jio# zGEu17Nw$Mgn=p^*=-#Ros|%pV`zxARU4}gV!AV3 zbgTNX|1xK-T&kre{j7)0)bR8!ry+6%VJG=U7K>KCo_s$b_{tzbomX3eu-N|6iMmft!WyIfy>1D3qrdKsgEc114 zV$tn2zAn(*f^Rbrv`!Wg?8R*}Gi)=20=RW%^6@}m>48coG>(3-8v=T*WM5#1?$7$c-J9)*U5ge^DE4Ufolhmq-s8vmYO6!D)W@hxR%!9Rs&> z!&^s&V&FGE(hoxBLm_MnT^aJV{db5b-33pa>S$sS7ON;22Bcv_P_R|Dj68h_f7oX@ zPtlRc!$K2=JqF6!s5jE|eGwWCNtkktu!cuh9;DGl8q&pp5bR%5nauCq!8XRJf{mT@ zag_8A5Q?OvBVGf0pR>e@p1P+!8LZ&oMpkkCdibDfMm(0=7U-Ho2hI~W|6NOx!j_p& z6na5Bh)7E%vZ|G85S$6O6hlN1gnu@MB0)<{p38ynCOW;q7`+`|FC!wP7PdYqcnH@dG;R4F-LDrNovL)h2I?Lse@ki3z z8X_Yy1pt%SdU;j`Z3fPaMW56U8M#Xm{-Rg9k};NJ}VMKPTJUkLvjxl>s29~1s< zM!z-iO~5z$Gkia9;QO_e`<#sL_crkTV05BBX~Bf-Ya`T|rur*EW5Uj{X_lZlnj~my z=Aqj-I|1bswfESKaM>1NrnkaWO(uc7#5!bGV`t!eN;u=&*BkLaV=&kX^_E#bXV7U4 zM*Y(a`cb`c{|tlC(usXx^(=##8jStt81yTLQJr`?Ptd@%fL3u!oKMxhCh*utaL>T9 z5Br5?f0l;y(G$-q2p3zRg#R z9#EO2KLUTX6P*CLqX@1)Fn>fN@fVtCc%`diCiH?EfT7TYJn_mO+Hb;8dP$BH8hc63 z_QqcyU%YsS=uG(~ztaw{-bthrC&-J3=ZNmNaKC}BnMU$1l#cF1m~e-yjZdi?@f9C$ zWEu3bbp)WmJ2V2&ND?NGvnYKh(dNhUI4A`zBQx&MgT0vo01$n}? zJi}bgFy$|z2&k{14^g43IF#d&x(`BgjO^%yI>m%U2>Ke-RaC~H$8rJ0(ET@2&WW$W z;hl4n#ahmZblus+fn0r^sb9{C^Bu}LG1gj6>4L3r|1Rjn!wvo8(uqeIYOaiml1@BMCFM|iNhdyaEa@aqYe^>!k&7UgbkcQ;FzF6TdemCdNe@xd zNq4zoKV841lhG=2{lPbRG%9g2Mu%FJzBe0Jspcm`YbM1pp_-i4eNEfF+Ut>r>j@Ph zf$5cLkj;D4ER%2ZQJ9)y@-sPSeZL-5oRO{39#dY2(}K%mRxYPZ2JRF;wW$iFXWzi) zau)^Ye2eC!FUU^O*=z+uhKbCOyYt@o-{!)UGoTkqL;94*M25^eFfesI5}9fc5d07d zr>mEyM(Xj1K=I$T*OGvorbct~@-ud8(9~mqoB{8LX2AZKBTgsNZt4~I?OOx@dC_eL)ex*_*n#?Ppq)f@7k{4^qlFxNP=sz_ zoc40(u6Vu*a??DB9Ow@jCQcWK>U3L{1fp9QrVSvRMxu}F(vrx_b$^mDl~%>d}b%)$)lJSdmd zXW5eSQ{7XF@T5n3IYI{=67i1@ge7DsQN{P%gpe>QbI8&Ior#+65*P}}Lvw_nP35&~ z1db7z3eN*h#cUI7Rb_KP-R+=x- z;28QH+>aI^JWOFaAzNF5lQS5&OwqFw1y>115rly6Engw%oRtnn727qwM&MahaOk14 z-x48@@PAK!$`1bsKEiw$KNya&o+0@#q9RO@*^S8*v94Ue6me!|!(|S>-i4;pBmInZ;b8w{m>q1b9zX_z1H8-|I~xpHEhrUHPxbC z>50H1*f4!j$D&~x3KABDGOlJ=r3W4S2^Kw8JcZFf~m%<4=RAE4y5L<;9B5{AsCf3Kc6azDWY(QIafsC{m?Ao{otmcG3YPUK@o)y zucwH@u~v_2hm?Pgxy6}d@X>qQtFKeThlj(x3%bV?rjv-E`Gg=kBl-r5{>wqanJnL8 z;B=(g0{1=2K&%vzp9te0Ufj!snhiftUzQ=e3MQ{NNOsS9%kmojjSje962wtn0TIHl zGkFc);vla-G6w#!2n$+)ZHp|g;m_>yy5L0~!R2*97x3jEug(ETs(}ka)4fCW_6?1b z3&QrJV~Sv90cMqF%W2DF!Ow8_1fk%ZtbrFi!Qg;%0VJFYTf(ULnp#bAM*4;5s)@%C zg%(^m0i|CE0;`@CoUd3Y3?%gT$SNlJrJE{9WESq^B6GuLArJAD{-KD!DES>qF8x!n zsNf607Igz`Q71<7%ZdnLh!(*>$j2h=y`25b3AMf`icq3p?E2CrI`IgkAnq?@z9@fx zi8IuQz87R>Q7yGoXhAnB_M+N?WYmxC#yn`*Mc)|kfW><5l%!P%3Ibj0PDp}q*TKB9 zfovY3V449fd+rolpou{HEV!O4_Vm%CJs^Z<{~8KU1W8Cl0(gx`0Ix@J&pLrK>6-tD zT{NIY93))GE2d1E^Y0;BCa*tH!!LdXuBSzK?*oPD6e5_sGL8HTi@pfmTgQ4sp5P2A z{*|EbHWgeA!F1-AtRg=B{DYy72erv?C%7Cho<)9SNX-iGN+!pP7w|RaIuaJzkP#N= z^N2JSVF;Efvza1S&%cm}pZ|-A`>&*)zi1|l`{HV}+Tt>TSj9d5A%h5uk27&!JeiBT zlM)5E!wRqlg+R?LDTO)k381V}6ac~)A)tVDQG|-fM-w#okHByGl(9^~GYHb`7pj8h zZVErZa7&Qz?j5l6?lrKp&&rN*AzKxC_qpf^>dmYJu-wepE&bc(rQ4g9ybUr-Xg6`m zXwX^$lj4hgbdzC1n4WH_c&iEWHyRktC9@dKcWpM-ErG`RC9%|_mTVxf6S^h*=|n}u zvYZmd{hcadNhREAH2rck4(XRARrWr=<3iH zvI`c?h1X4=f>O5B2GIAg;>Oq{W?1FE_YPI=dn5n121Bp<;sZhRCG4FGCs9dG>}1{t zQjOjPFF}0{TDY@;&6njiW>>tdUIBz%KtT03MDX{eezsDoG0=4>Xa0@A?todn3J4`Y zIQwse-i*R(AbbaebN@#0V+fH_O;m3noVOvwh@MfS!E73Ouc(iIOSg$wSpz)0J!^tQ za9-)Im?(@`{H~bl9|Xes5Ll(a!YJc_g)}nOO@{RmuqdEvT6#AFwnkl~^K^YE;F( zCJIgu4HFav$Q_I3>o;>o_Mp*dv^x;LLk}MPI*K!TG`iDh4G4^WlL-9#Ob@!}=&5v( z>gZ5VSwt#p^eSR(w86e-F?#dm-|AU5uMZJ}J^b|| zCE83+EjgwG+$-28&O*sAJGA7OHyF^`l4Aygm@_pJMxrre5HQK7!YKS9g>4G}-mER1 zP|`79VTB)s9diwJHs%|P=2Dzh`^7&LQ1&r@0Jcd$)dzT>iUQgoSSTwlp%YRDj7K#E zjB1MqRQ#nvCz`F3vUA2ynw6M5cm#w}^#m-E6+NZ=h*Dx^-Y_K_0Rj@p^a?-&UWyYm zdpqOE;0WxK8?Yaalg~9DV`_FA#_Jgv1n^(DgitFodnd`pMrE8 za7+$_@Fu;NQ?09_xa( zp*PL!uCn|@Z^KA3(5&b33=6?`sv(jvz6Az)Uk|*-Cb}7NAvoKdc~6B!-H4eO_sPV# z%unk+)RTWUgFiBme+BbDpoQtncvll=a1E!T3^f$8He38dLyh4qKRIW3VlZ5%WDb$n zqeLuFM>VxBPe-YMpcR#Jcwon-bRs5ea zDLv+YL-z0wbFdR}#@AKGo(3cK*{*DEu!s;~Of}}=)=p{>Q0t;HZd04S1w)Ti#+xeR zWrOh~rHaj{*03dwFXjG@T3{*s5{U5i{@%0A64QCUNe+7F^8u;R6W-TZJ_(YJ@I=(;u+#Z-x~sm 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�WTo@IR+2L`chkX)8Yco?|7Y;e^2bbkhJ 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 z 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ÿQHU6bIhpu;VXn@jV3B-KF1 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 z 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 is9p*uv0mg^sh>Qh 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 z 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℞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

@=d+@1&>s6RDPlo066WFLb2nQp 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≈A8%08}F~lfFPMFE-g4- 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

F;)^6lM{h zI$kpx>DuCVqYj!FPmo@F^FAra8Uls;gmr_GRPEaqfErulAD z+?`b7v!+F3=l^DEc3bfiyZgl(@vC+-OzfIaKdoo6GC8@kKkM~N%2M6phtyt4(vRqr zG(h!<7o&hua(ool!V8sPuDNox5W4$;fSlM%P3w#?KB9sms6JzS)VRrX^`Tai!O3^9l~!eQJ|m!W{PIBbvDCGXfVq#!Oq- zKd1z{NM}HtVG9If*j2;=8>6A6xPAdBVM|E+L6IfcS)8;glX!7-tiWc6wC9 zEVso=v^!pIbClIq`ud1CNLr?#fZybF);xqF*bComf0W?LqrtcY1D`kxl#wU&jJKWk z8@=I2iRkesl4VHh+&=xp`EV&btpi>YWlJ`^l+1*Ywa8BF2t=-MM7p6?#AHB=li`C1 zi;`9UA~01#VaBOn8RuxcpqJ{2sXX{-s|zO1cC-TDBiTgIm@kt-&_f?==DpSeM<9r< z-=H|_s(a9<7hr>pUSlI8BC8hFMdeZ`c6Aev*lTfHs5BQ&M4dNSPZHTx9?WF!6iR~` z5q8EdLO4(V zJrqmch^g%BEedDoX!|z3lXosDD`r_r*0Njgw62#8BN6Qdm+WA9>?1ULic))MGVJ*p zx4a(Hh%Rxnr4M=BYP6Z-_1^@%16Rm0N3?&c8ch?Qyt<(7K5gd&(-E;4s|3!&!Hf0V z_xA03KRY?a2H90ZVg;D@x`<$*m(u5456dGaPXE3yGTq(2bEh#JpRMPpFxG2+r+chu zot#EQZpp+X#6ms{u*uvh*-8?^`x@}{kRcT^zVGPv%K)My=hyA zRT9w@vaL1~NQP3786g}9_*C3;+M&W(N`Xv@O^%bOy&i;GcOCmn zY{h7Z%Yu?dN;Y^?h>Lh4i_!$4Mc_AA(!KDYgmWq+ltD^2Hdxz;+|DK0)PQmyc<%R(cmk8V`}!Kk;2yhPk^76@a0An%Kd3N_~^tT8@r z{;-ER^N8vf!rht!et`)_sACRMT~_@yTqC53O=v|WO&&u9<_zEXE@U7DfgN*5yi27u zz)7=Xv^@8;t)0!XvJk!z4i?^Fr5jg*I~Q$Z+V~4q$tCGY!ShnHPL3?z%Y1_tb&`*I zu|cs;Xx+*;p=`Xi?b2+rxz%08Za-q9u=w6=EF(U+yx_7B$=PkAtOOKxIwKqslHJ9; z1EBF@=%jVw-K$r&QFh=JICSA9A&pT}mf(swz(I@v2J@|rS8KSGC^t>|oL&COd{f|O z5zlLuO>Ou`qYiVT(_z`nClMeM%w!<4dxgqCZQoa1l7Nt1O|75l{n@0M$*zMtoS1Gf z65hz4fKNnw4W2TKe6NGCW>CX9fwqF!aY}E;~l0ZRA(KlOC$!XOb`zya7vQ={FAJFB*M4a)v(a2zFN-8dEX8k-S3Q(%Ja@)8sDw< zOIOQmkdcHgm|+b?9Qj}kB4v(hZAW8N;~1@S$Q)r_0`h)}FPs_v8eojTTg!C=%R1a`B~+l83Z)fx9vg zDzny-BcWX`&>wAJqT(sFteLf$$hE@g@9DNC;Y}_m+J^Hbk(xBIg+#dh=`WKoMV!7n z7^MYn|H2(=V|fbr=@QZgRd|Wq>a5-o(z8$?ihBBr*EVILw$V7LnZM>FA_h-Pm#N+3 z4bXjGDJOGtr4`2th|!4%3JKOVhY7|bY=qcO#=l?t>esLSkJ>-oxI3CTnaSnG$1=wc zA3AjO=*2_Fk7SOWy_mT)e)&S?R^|4s`mIcHDRXyZY0t?0N24QOkJKLBJG6A;QTDzlWGI-9wYeTcG4*;4kK?2j{l%6#V( za&7$X(aFqo_U5t7V)kZs>EUGdQ1@L#dt9E(K01@=MvJrHfSERCJCS9Zil&tGR-c zMAV08NA6x5`F3Q_*U{wZKVQgx2@)#`SC+IUAiB%|1Moy?c-=K5^m@)qU{j z(F0Wf*>i3Sj_f(QXUw!9+H(s39aZh}+cSFd_|fy{k5a4tjaqeXWNBh#X_neD{mt#{ z$gRU8-&{U6x$pRe!sUDs!+iKJs%;>LG;Vy~(X(e}vNsP2K~CuwxeXcvae_un5M8c; zFi*~o9zS{H=)v>1b4O1Wr4jc=?k$ahFlff9^08Cdk^DEs?8xk`;`Q>}pD&FR3a1L^ z?p&T5A3dEvF+X+m;KBXGDQN1ExzWRu`>yVFTDf$CX~@l-)Xh9`I;ojQK((Z1%J3Zr znLsPu#>Wpv?mT+5H1c3#q`EXNjXfyiciYlv=>`qp^DDaIQ68?--<*0_{ENdgQEYrp z9v#gcJbL!X3{fN+xnI9N^5D_^#d}BYjy(Qq-X6|3j-n(-ydlVUG|CD+9Fq6yY zbGgfxFPzIPeski#lqWL>PoAocWKPUx_8h7nDV&}D_KWf8+!wQFZ+(luE`9q&;oRkK zzsTIZbASAQ!+-hcpU+;}d*RPtOkF%j|37<$9xfxtNCvDAQ^28-OyS$Fvj>iSIg&X^ zKaS(aVfnEzIXaTLe{y>6>h&*X=F49ckZI!L%)#j5{)=CImHqKxabo`jeoP%4lQ%O5 zPs^K;%;WD4W{(~{h-5)8uf|H}_g|bXT)%#K-(D0H z-5bBL?@E4Ob}Bk{Rg}2hueSu z?|3|W@ae;QKjN`;a_{kP4xWmlJKY#W0pE7gTGj*gZV4yO4CdZNLd?7!18U!mADkr1!*^}qbXYsahw*1}f zNT!6B=Og{{%BeGR^9v)Hg@dOq>^pgW--C#d}g4vrtDe@|S% zU&RQ2P2ae3qWonxbK=;!19&`_xr$!v|1V|!J##y=XXf7HQ#Zy=ozxaQ0Y)U)e(?pjhU?jk_mLeQ~`s zo*g|sb@KM!@3NObksoe6z}wpBc=qhM$yyF2(fFS{HF~AI_tHN3JG+9n$71x31mz_TsHu)xG%}x2{#QXGb!(M@PTQFJ8X- z<=v|b4{8{jo3*=>+05OqvxV}>pZDg@mh*r4ay)nTOMLpbV_#?IbE7BbN)PrP_{+YV zKi@t3;SGzzFOPr!4Yo~hPgM5*UheZvDSJy3ETQ4{F3+r?nzoqNo31B z%;&xT^-tgbKUii}+nev%g(R9TOqH?JYDU#n>_E0~quRn2ZWQj|z|jIuVQ``@)*-0= zmnM!(Av2l+^A?tBv_5NZb#N+ane6*`d`&C44Xn=)_o)$8p46_$KJr=%4!+37r?Fs8 zz*3G%dWE~G_)r!t`|jVVE{@C{ zoIOFrRji1%O9(e5T8!#sra;~vH?MVr&{iDT2 zt6SXQfQ8!%0`Q@AbcgS=9~yLJ*5>mo6pv;_U66%fFKaDa-};O{O>kk)?rb0&kG!A{ zZ4gyI)mv*AaP>qN#XdvK9ngs1(5T7v)C+Dqs1XzeP>$PiXR*t-+CbobDuK7Oc=)i> ztm4KjqoFvUM(x+HLOQhGmO)8io{$57TfH`B0bOOV_MVICAoL-~ zM9WAFgc=Mo3U@%2#s;R5B@}9mp2gcm(Z|5N@3{c^PIbb$2Xm#d*2OlxS}mcCE6rDp zt+k$XL%Klp<6qBF0!|{zREU4 zCPog8xM~IiTiuF-EDNGqSfV$vfr*japhLqvn|RDsdt?pBvwbq6GF;9xyo`c6OD+x?1>xFz1iWOnT}Uc(edQSfN` zNeOQe92YbpD!y%iyV`_;%$Q_v+CYdV%wR6hnbs2?`9Tw&@ur0+WD~xWjm~>!O0N_% zsd&~Qu+(Y`Zmd2apg5S6DDSJ*>n+?I0^-o9%J^&Q^cW3I^X!yKE|la0%@xk(GKhv4 zT`nUF2ue7wF6}gpHdig&*}wr_JT z7a~I#VWVV2<8=~-P|Vh~mFF;+z22gGf4hjW1)Cz>*8@u=1>U6WpbuV}w(Z~wX=;QR z@4qwm@u&`Pjr7gC!kOQi2*lRzugr{8Ucy(7j+?`UQ&%JWMVq_m4Y@tx9~hBTpP#^U zx%G-<6cNi60_1|^N&$(T^wCSnSg1V`Keg z3!~}4d!G7$!C!BpCKe7jCkt(6qpgbYo5GY*k^ll_MW$C+?YVQ&lLom4<1?R5w|w^V z&p(s;pbD28X`cYan%IZ2_lP`!Asc4?ZZ}|VKdK+mGKy3Zl5Z=y3jJLbQs}nH-jpQP z&T70{Q`KE3=V1LEhh#8T@B!5yA>{Pd=C~0(xtGvBU$b$VEx^WS6akRgWNC{7fr7csPaW#%C!hx+jmSZXK_R)%hgD%CEA z82~C9;M-?xV{;CZMxi6O4o(4jdZ-U|DEz`W4___51KiV{O*vDgGBhg_vtQUPXt`(* z!jf>=K6_}UA=7=b4O;GL#EuO1b{@2Qtyk}DwRGjIv`Wm;R1dbv&0DUSEX*t^ZsYy- z&?TVNpb%`lDk4eOdcEN&!&Zr+)eSFgWL`p6fNU%Q0UaJFy;WD)lEQ+xi@g0s%bLj) zXdxvUB{0RFD-G7x`?Q^;Cu^|61j42namNHHy-qtw|8z)Z-g%;D)uDop3p$J^DCHgi~s?}Lu zYsyxp*Im+MxDC9W=r)0B5~^wy6`Gb_IRLYvsY~@da!M(}PNAum2afyli~uCLTG4Jf zT%=oh-~L0`B~&f_;IToa+P{M~;5O7Mgp`HG@-iaFlSYq`>!3ea#pR=i8`z8MwxN|! zepyZd$$7^VvQoL%Fc2Veq^E&H964)0R#hA|(`SY*maPyX2skQw^|za*ere{|c9$(n!^Z{!(4~lP1&k z*H4t_e8{Lm_pXX50u;p`Fs_#BmLqejGm?a-xCnkF(doDn96_;L@0CR|UHtJ_sPk4O zyW^AQVtYZQ0%>Jvc;DRr20t)OV+p!w&b62>*z+Ws{L)nZo34v=ON8Hz`zW5U)Iwd2 z8B0^Xo5Sg%DVRA4f|1H4Ed&4ZZ>wSGH(I;E^l}&7f2`hRq02b*pK|r?N>(kw;VAcK!*>iK;)AE6y=5*+v*u%sN0|-gnpmw#Rlp%7d6!@op^nAwza(ufA1orpy1`#WPoq!|EG|Qn ziKKDekP}mA$WAY#+e8&ukiXaRCq1cqJU_8EI?)YHFYz0j))T*Qv3$ZV@v~{*eTqq+ zp3WW@reZu3Qb6SdbCEVCxdcs5=25j@vLw=`r+4X_o=OopJ%Mau=xc?9rX=1~A1%52 z6rq{I(mXw}CA>*v3~b*w5l{{Dh0vqw>D)?w*~}#7t;rTgGsOhgU<0$7iM%1>8@PZ~ z(KA~LY*=a{^Qx3=-C?<6_$Cz5dlZ5bf+_LR#WD_K@H5pso*}j(KqD1KP=M7kohc=3 zrB{4gvj!3R0`oexw+(X_8UNLCE?zE{=Wu&p0Wgup+5fJ}LpKfHQJ_c2DylLhg(^vz zGm!v^uv)(oyX+jye|8+;WZqsZ_o|Di6nu&hOA@x)eoT2ZZpjT>S|ib zoFgkd(-`(ioa5jvBh>@Q5wkAz8_EK}VT;#_DY=JQra5BRHB~492m2DlP#e1m9v6En zIEC;P6P>`Jvdlv6nr3o-2oX@8r)MTPFWRx! zZ>5GP8ha?C>E*;&IyqvpHVE0_WySd*zM;#nRK0a7g-lj_NhzcQt=%Z-1Xi$5X%Z1@*aIiq2Bl!V1aL+N6bLPC8S* zfK?qz2MJ4IE}7sq&&-N$3yuy;p6OzksfW41GRo#lY}OOn*st&3Pn1BH~=dvY^m>MRP$S5|jMN%*c#gy*hJIfSOgVt+=hx-#*jQz%qkM7rZd(T$Tt9Wa>2DcoVfq8&m^k(=L@?hG5TSVbN2j$TqRMg>Ib`rtEws$xG|#@&rCCG(kqsWm zSLSCHLS%nq3X|nqFNn3S1xtpa)dZ|3v~0&VFSK{KEZJcTbu6P!lLpTA!02_S`JR&X zK^U`AfIx&@f%y8l(Vu1Pd9OkgXRWNE22P4&H!Dp(b;HMQs8hKv*A11ziChyg{6Qu{ zrI4mUxyAZjWUMXf75||VJn2Qjj6>IfQBhbnzY&F+rK>eLEGb<@j%Se$#C|*40>qna z&R#sN@>!*jm^5Z-5z;Q03x;;70~s4MNd6UUQt^HaTfM|xOe1G}OsNDKP@O`ycb=J( zvfNfa1kSr4;@#4LD^~lJqT(}|LBvIb3=2JoN*JJEkFz#!*qNT;c-m%SBDL8K^OXz> zZ~4@~puNQ8`~_Ar(wwxLiX9nPdbEN?oG%;)I}F9snki!w#^+YuZKm)?(3^%mf#9kq zdX}Y=U8hiF*N;qfI`y8!nna;VxM%hfW=tAtq}W0qLsRkMX>bXEBX8ZWkh z*xiFxqTm*(13!#O%~_mDUoZhxam&1JBPKIN$`|#WkU_JdPO)=(B*D8GNGe)uVa`Fr zXN<_&(CUv)<-KMg)mOB;7_GHm)7~$<|K8zJnE1XiI}@QYyOXLq$2AEI@#VT?N^Ebk z>i@FcgI}Z_VXJZ`Dy4~?dfDu~Z7S0MC_&zIY!e6dg{Hb;IFZMplb*d~C7CCJoi#Pb zizwDvG?}J7WoH-^v`=WQqO{jgsg9;1MWVr^Wv6J}JfHM#D_|Az^mjPNE+zPBDoi+)2k|7e!bE^xX4?UKEqVJ%$7;Eu7vMkR7EH^oKvE9&VwGqLNm(#|NMo>=R zi@b>q%fJg&JKuw@!h?2c=Cs5#P5;2KCnWMz?ATnFW+ly`@QZ2N{a~jdaqK9!F}Z!}@`s$sNOC4` z2?d(6X~4ZNCt~2lhaFNb0*1NXYJy#fKygd zHeIO85dO-`6yPS&*%XVI<(NtA@s7VdGii3PSTkw4@{d}-nIclz&^1E3Yde$ELY(y5 zU+&#UaDzq%5{ox7H{0aOkENed5ID%9-iZ#DGr$f==6-(QE^aoXpL;)>^aN4*l!U&J zPy1HEbjr71V;7&`ivmEdHyh+=r(leQCxM=AGVK76$R*#hE?x1`M07rxe&l5KbK~a- zp$OTx3=_(fgu7r{07NpELbfB-_yk3o)b(NVDPO;MO~CI~cNNvBMmd$e3@VF)YF<(` zq+$sclZ;RVS7oX0rd3aZSX>aXaozldPE2jK$#_d@BFLf%s7lj=NkpJpe}4J1tegE# zsdFw6>F|SKHo(c7=6h@d^AI4XDvv{P;#ki{^EH-?IP0Oh;q(Yge6n9t2R4|XwCqAM zgptfqGSsCCYc{$qFdu9UdjCbv`)uK89aMj<`&9WkkAo(#tS{f$c(~Q0Q$D=(QziY_ zfCH6ywF;+^i5#ajP`Vtpf;^P%#SNSU+aUWqxaPWqQoU&vEma&EZc|mEBzM{rA&*sH za2Ul?@dYTk2UwR~+6IUk6G57nCb)4g*p}%9dlR(v(9rRv==k(Y{h%X>XyF1gf&>K7 zFLrEfV=*k@JR7%SGA4SN@UEwC=NNo6HTL2gpq z9O|-#6@j>LUSi@>#APtJF@=)2v>Kh-D1kiPE=?#?-QY5W$#ez_l4-R{$AM)hR!vlT zE1;EP4%cc*IB$SZ^v9nB>ZQ-o=4B!?s;?e9sdt(+bOFhRY2Co2QBgT9f%_4PU0d7m zS!-Z79YB|RC`%l6mC#5@kO*r6{Pti|!JSVn7-}VfPGLNLZSWsDyCQL9IcXmLcqAU_ zSO+1l^B60{+%8K;HmDR?viYdbr83y#JO+fXicGJD*nADqmB8E@%^5ls!6E{Cn=cr9 z$``y!$>$;@=W<^p=ka)l@^~-O@+7gAWKQ~$T#Czrl-GSu&Y>8T604ud=@_fHImE)r zX}C5Bz2(Wepx@rjCU+3oD%#8(8dklgv*x1xvVgXQVCr4!A%HI0!;|s&-3Pm>lmw$=>_R*X_jP-q^|2K&&jYMV-G{1qo# z|M&lwV<%ohaKpogj%Su`jXc^n^6*}6Cv&w{e349 zurOQAQ%t}D;sHK9clkO;9?X7|UHWGFM~c^V7h$|cYK4)?$f=S0<)urHAKx2!SUX1% z>L$LK$&SpNLG-!NCuc5?o&4^=zG*)I-J?392G;i9IX!;`6)nsjJ%9Y{*~@269zUHs zJw7&8xOnFD`77r$5BFvf3+e8ohgY)IZ2e&N&e#bA=lf#r=3M1`l!?C2W-9YnuFRGu zCZAl-EZ@8L{o%i+3p*!gGGkhH>6cla8cjQd+UpufR@foItXqibYHb}=> z+u-ERfm(CWn0NKrWGiW~MGCcvMp}+wkt+y0y!6O${1PE@I3x~NCx$*8tfI48w1v+8 ztsNAh&urn8kJ{v-<~kpM<8)@8i)pOkNG~?zX#XC^cn!OCIcN2{^ozzUhlFme*UrKQ;QA$2YYUv_S+4zb*(fJa9E#`gUg9N-%Bma zjV;{Phj!x>?R$KcwwcYm($kQSDS{#CbUbe!uhDH)Na_S~x({Z3idkij;gRJYe%~*# zlf!(7{BU?vrgPAz>M+goao$y7V#B1thwW+M!=7smm^j{n`0DzxHB?0BBs(%M=mg{S z)n0G2i{N{DyF357-9`W@xTvj98sGCShuG`pS9|Mg=RmQ|?iIADhqDq_`01vOUgR{) zKQ5jS^GRrC$0@Yw(39m6Hd<({y6KIA1#COWt)}thY9P zh`npPv+ukUYLcDI1p2^4&JFy-{upJ^1YTyDT=YL@+n`R1!~4m+s<{7Q;vY5?1=u3TN^v5Tv+9%?6*=6m!B) z63B{2%D6^Q>zCPQjU|rwPy(kQZq^thM0`=;GK8_C=|yd`NTI6NMIh611FhmzqE!&; zVb_ruoqkewLSW9}(**FBfI{TD#@mq^`$epwob~3IKBQ{n>3L?2`*fmHC709N11Mzq?SyKg&xt>+C>7q3HeZ-JZfhb zo}WIAYL2fMky15K@-a=+aKg&F0T0Ze2}BFkOCw9uE9g&EYA*Ze+B!azm{f$&GFC=N zOH1rHEuGBZv)6oPj)=1}-jysYt9Qt|oWm!Z65YOxAlB6~pV|{>Tq@iSPe=?*IA8Bj zSFji)L5@>mM(5)99xw6bhw8YaQsw>mssPaMqvC_Uvy@7Xb@Z7O$Mec?5zopEOl`~$ zH20YS*yrFwde+$b95728)iE}Vp70Fk_>^uH{;t1N$cX?JwiewR?20>eVX2Hg0GYHj z0>9AaHXo@}eegTy&aUY~;CE^{Qe7J=MR+5D_O#X!=r&X}tRg z`e@d{IPP4)Fo6`g0fsvukf~V zP?2sGRHeg(+x20|3=OvJxO;|{+#}Ux+9Q5}?qEv+X9j^nvQLbfbBcyq1tew9He2b1 zi5j3eqN=tc1F|}Ip33H?N`_ltq2}vqu_tb;!-Fowkk0y&d0lC|`(1X$jE374{nB>D z-NIMOXa9Ipv^lI}MbI8wmF|qZ-RLe+SdhnC&CYuhDUxf^+SXI8uaR~M`-D0|?1m1M zO*vy#W_?L*RZ1qUH&PNVFW=pIxk?JOIUdMb+ErTNxyuyQ64pwTpE{hmDn?w(huAi? zG>BMJeA|=q2w&>WM@(}lpKxN&nf~@WAWf@L?x7re8n?w@VMoyvta+IXe{Ze=NA#cc zCi%qTzOj-m-I4q+;kEY0z6dL0h3}(lBQ4yPO-`FmWikcTy~RY^V64o#&dll$BB|BE zxZ@v0QZpRjPV+m)Tg<G}oGf_IdVnu3Z8d>uwu7-5Ll<$nfT3j)#BiY4fS82aPBCQVTWD!B|?Ix`VuhLJAtYTFl z(&8mxs<)c*9p8lw^ zhzZj8b7 z*Ih<`rA#q+a}-a^bwL8BY$!ztG4`6*T+%lE_X-?guR6VOg`0(upsiQQY1mL!7v<5# zoQ}0zWz$Ke0!l5+Gv-)Zn_@o$F!%y~OsLPRQ7s*wYWb8@F{!i&yaF#nol5hGZ5;h_ znI$PjLR(_5f*0zMk&kvv|Nj5+j_FwD81_qX&(npG`uBD0Y2J@U_8czb60+HmyZ7)j ze~K?8`);Z5@XF+oz26)^etiGIgZGbR3fV_z4rji@H+8P@Su`5P?5;(&t zr_Yqp)o%S@W=S^e$f<)&aQt(M zHw5X2Nyn{0u?5~&dd9uM6BfOCQ!r&ehuO;P#$fp>R0c_vZ41j>3Z}P$B`Uz4qWW-i zaGpj2=Ps$&Ri;0XgF__p(-R(y>ljT6oGUhSXD1{!U=8#Kw{1umF&Plw073)yv$DQA z=W%2cl{Wo|CNtB~OPuFk_~HACrH=~6gzu^yOgVGJQP>6tTfk0yK`qMKq*akQH~Wlt zFsaG79flR1EsCC{N+X*pizXf!CXk$xL4go2&38B_gt90SBUg;Gy;xA-3;qYsGH^T2 zMA88dRUY+2nTwW%)AVp~*?7fWm1gHj0pK>7$V*KA9Jz2SYE9tNCXED6bx3DFeU#GH}yWNADx_>&uK&2!02J;3@*O7tybbqEiNb`(-F2Q6FO3UeF}= z$fiU|fGq8-xn) zSqKR4!ij`+O^WA>C>j(+5(0t=(Q!ovw-->+65kLbIIPeBR|&*mXhb?0VL;PR(ZYj9 zZWALENJJ20a)|h#*+VDXM10Wvu{0UH_#gr$?#j2?lds#8a;3u+G!sk2*XNkT*og;r zUFqW1aD=+iJMmfqEie;QS*#3N4pH;~IFvyCVMmqFUN}cVq>Mkoq7TDPi~fq_~#wstOJ!U|seqac+1+L_YEtAcRs*Lx?=`vfIXWkP3oK;8GY5 zRb|*WCpP09O6NW~pcW!N(Cu~D{&cSBTWeDo7rU+e9Lu~8l$Wgz_Ohh2qMtA(aOZ@d zjoUdhJmJN%d)uEI-Gi!T|9_=LFliC623>o);(V?Ue zQ(-k@A)J6;HUZC+Y8}>QrZzuut=ZsVoMzdwg z3Wr+--O!4IH8rt`wSjRaY6~-Pi_L7o$L4D+yhHCiQk6cnzBTkVL`U7y6o23DeiI3dcA z-mjOeG)m+J2S)`rfO{Q6MunhCZm}##j9r#$C;0=EQAd3#2G|znI6i2h&%KoQ(9;XJ zpR*&Hyu1^SL44r8#C-xWwn8V3M3j!xo_Qt^NbYs&X4m{{s6$&X^AP8>lInG@V2rLb zHd|L#+RI(_&iLX@s-|tWHs0hnaa-iziVI^7pX1!Qo}_GgS&6YTMUvhemn&PsI+k-DGWg-5x^ArQo5q9cvU^Y&C?oOTj~JJ1I<$hSh#s z_)z;m%n2#--i*Lt6;?Ueq{YWz%Z3OEnvL~Ng~BMiOKGZ;>wU`iUGRd7SJIKhcj1$A z*yzE6wS`R~D5qUq;K~Q|cx#VOt2l4DEJQ-1AiK&qpq4_sbf21LGl~i8EH4W%8<61` z-X9dM6~l(R#D(d5%|c%ML?Pq4W%Mk@Njmca~;4Pmy*a(Fp0EnL{wpqb423qcIFL4G&mkK=Xi*NDHk`d)(1 z>k%c(7TK1~=uuB_DR3bi7xaLn)3cXip5EvEgX$S=*-?~d&O%E53XTTm_jx4er}ddW4!X5 z!+Nz^AJ+5CwaKg}oF;Z+AQzh?X|%{E8&qR@dAx^vCb3D%=T<1OqPyB&TyJ#WDCT|H z#2E@QZ#EEDUK3cQ{tY4PKLN`+fc$%5*;3JA+44dkmMxZ2(DJWjEGN#?ahdo^mER9z z`LN-PfrB8QMG~gLMzQ3K!5rLN=#N!j9En9&oT)3=d{JY@00@g+HUw>7ZLiU>N%9{h zDMg;F5npK%2M(G0zdZu%WT2dRGdz_gZJ=h#&Ops#*E4mXrf0VsC^K2;WEL(-+QM}l z8?v~eG30T>_Mu7kY7McPb*kU3+F>@Ib-P(DOVvKGHq#Ca$zA%rD$F?!r>Q1JGJh!0+GZhS6vYo2 zE`}E@QkGX$C7-qoN*k`JX=k{mV#}5ILX+1`KKk!$y#iFRo+sWJD>{5nD;U*L@}7_d zO&)vfUM?F_jnD9sMM74117jKPURO*9u40@%#E#;~nN!hbH?4KJCv$Ks6U5jA7Nats};wIAvt>vBNIGXXHi*)Xi!}WFb$ErL(k*AC-(&q{( zAZ3|;Co3h()5B6sxmSNME|cMNv26mVa{Y5~Ru=adSnnz`!e5E(HIpU-jfipt(nl$3 zze~>hBt0$Oqu-yJ=CYxI(P5!y8XL~IY*?)IVME+KJ!DlZ4W102)2gG3rDJ#1F>+EE zEUfO;y2IBx(j{^t@vRIStmsN3{l&`R}J{yiVYt2eR%QGd`+7kI0$J)iVKJ_o171}G&YSMSVqk5zK9O)^uv0&du|JgrB;&MScYVkT^=FyykU*ali%(umA`!r}>VK`)YSZQ`Y+CNu#rpih{DS!k`?>eEG&eIhW4_|>fcLdtnkm@` z5pcKHU&F4L5^#c3r=gZFmS*N>O6Dt$JGozLGt>3yy7`J@m+sf<>~wj$Y`)_BjQh1R zH&vags;|EiDY1eH03A*vQP@)8I+L_moSB(5``#MR6`THn;&KoocId&*);~}@g+#wG zii-gGbSzIqadl`e0hBFcNCO-&S1)!aq)X!su*)MbL_@yw-GaQl+y>)gC|+JDTdZ|Z zoDj?@(Ewrq*7f?-T(M}rhENOe#*8YS74 zdRHsGL<9#GU9FcseVp1`T`VqY6)&Pg#;yWbFIOrxjc5_YC-S})%k|2XLBl}ptrupe z=dH>dAn9VYSeUaav#a)oeK8dTdT*^fRhhMo3&6NKJykAMOx{56U8qeJOLOLHp!b%` zg~g)Qnfn2G*i;4Oi}O>9vomohciD8fRt##G162bADHJTS%PD@)Ncabe(+TO=!r-?@ zaT)mmV0j{nr)$1O{CZ$6t=XlJE{zwZmu9OxJMiu#P+G4|wlk;?!Mt8BELcQz!2CsW z$p#(+?5+c?9q6$oV6;myRiP=;OyK&JhND;TRUrju8UJJA6t#mL02+`Ru|`IYSzvgsLGXv*>cr>4d8a6Qk<(; z72Q*nW4$q$9VpA?#p&XL)wkz-O@6L2RbSAU9Yuk%Ji9Peam?F+vRqu4DwcKg`r>`8 zu?p+wtJ8B8eKE!)pNkY#$J^2107gSK8cU@P68{196695fPPPiu=-d7yadpBLkcyTAOA#lJ`542O;9amR#4s=NU&{xC8B$ZO}P@ z_!>aHK5xDT=)8bKQS}{}BT~AgaCWg!EYvHWPE8y^k=$@P`Ex7QmKleFxVCs1VyBWp zE7-eVZn!Z%2E06oNBQ`irf16qpNO}%AYrFOsl4BYV0KGIdU0bmFexPm_OVe`;)~+3>+cQ&8#&r|>soTj7R-#~b zZf2n}mnsTeMjpQ2ZCmPq^x$-FTl^oAVB3hB{|O|4aKXUjL82r`*TG%Y&=UyKtX(P= zr17C}khhMAaFQu4Je-_66BmI%sLYhhMnU#9@qXnS@D8NFY-tMafaYre-m{Q5i`tU1 zGXR!uyIoT-JXfVN86FJF1pM5}_-{7t2j=2n!|M%Lfei!fx$5h{T5s9(HxhxvwsH%D zeIn>eAu^j1VYiW{fYTr8kg9 zeW6^_&=^I5>OD7Ko~>HNJOJHNb+%HqTCb~m$9rS2IZ(T2=8N;r7H5FmGliM@yv6lE z?Vc{rl;*9QcA$1oElkhMY4`Acs2^{v!upwdX{u66!g`l$hp%l*1BU`LQnbuZr-DJ- zTmFFhJ|Xihyrqr9=Ye{ueIS6J2=(b2wiVbh#Fs|xQrwruyXY@(`s&y2l-!v-2z2Xm zb$-!Nh8<(ei?p&0ItLIxQ!6dhHHJn}44sQO%cAmbkFe5rw@V6VOEa^z`l5%k#1Wrc zqu$*hwflvH3F_?#qQTjeOzFagP94J#b~c2vyZ9J3juQueB7Qqi{6Pm6h5dlj&kUjQ zKxcmuOjbfl?@|yK_@+)cusb>BhN=0vS?BC!ptetyW=qbx zAyC^3wc^}@c2VyqRKlhzVKO~6KU?=bxq0jw&O&qeDmzu_K+ND^j0zq)g8d;&`d@No zATDhrJ_pcC-2;Go;Bx$Adb+ai>X1rZ59qN=fnEq|;a;8{(039jTezK#I}-o_#FwYx z#b?bM4#dAmF4@3wfaufnbMsC?0US@y&rX}K+d-;y((R4{)?%@Yh##Jo&f|_K_Mcx@ zHyk$1wXu;=yNL3X7E1|T1`2^M2RTdaFh}+ng`7( z1+GMkU5coJrG^j=l)Cz}`R;_7Z9N)Jyn{U*9(Y# zu%Fmoh5Ch=h533h4fPfO4%Nrov~DOkX-fYC>igd7`i~9uGWdf6{6wfvSE#M3=ODhc zXqV!?G(JFodFjXiCzVpCgUPrvc@XNvbFhyI(uQZFss8=^^+)JQ?QezwVM#Pz;DG<=RfcRH)!~M?vZomJ@+yPDB2= zHS^zOHV;fE#NEuz;fMq-dFWV5Y&jHhVENrCUP-iJV=1xJC!(kae(_zzMw+_Jqvn`9 zb}4iUXfhlmYsd7-#gq@xj;HHZ#S8$nGF_`XCnlYZL(z__m8!!6-Aq=T?b#I~471LBOlw?}w(>+v0@}9f>)3gAZ;_+1z-oZ+98ks%NdW zp6aYQY~`LO$0teyEOFBba)>WD^9Y{U98M(JrBXrU0n@}01^ia+U-CB> zFn6x*m+K|xlx83us^!JmYHIkDg;H(Su{Q^<;N_|6T-h!L0&y`rTfu6;2oqP`k9EeR z3iSQr%tE1P?cIUM!9oAU8LQC;`u_Cd9Im@DB?tOGPG2rg??m5^wN*)~BAnz)ew;!X zKbLcdukmx8LqQlWdFTN7hoI_neDe=MrR4EP-m&Je@F2uhqM+K8`^6G&=&{P6Vi#Bo~kWw)7&(8H()KtqQ z9R{G^q9&zQy{eh77Z&_es64eJ&i1+2HWpQeA~$UDGQdtHgVwH@d`|g;vv)b;>6Aa{ z_LIiy6hFA;|CXx*JN}=DxwasKj~}@Wu;qxorzrk!Dpv76k`fisR@0)9D?YBeeg%mA}=v1H<4#PIg6H|XO z+Uk9UM6_)cW}pCJ>xFu;Y9Y}< zSkkl?XBQXet-U+2#zRY=o3pxf0JgQ_BF=0YDE2jNzb__Hpkr4N7iPvbF3_XqWO z-DVDq@$-xGwQ0Lm5a`%t95&q{*85FW_+G8msxt}ruDEs6HPL+z_4*H(?@p$;vRIr* z1Id92tbb^j7wQcF>=R+$n=vUkFD>xUUcK7=zUp?N;NZXX&bPW~VYxF|5TZStT^!qp zgZ9v;lS($o9DsY3G-<1thscccOy+BUO**Mkg|UkW{8;qw;FJmWxwYuuY+4Ttm}qbv zEeFxV1#`?=c{m65QJ!I)aD3ApI3?v7e@gQL`yNTD;{|>NS#(p3O|G`SLR;*lzH)3M9dwsZ5 ztFON7Cfu0-2sLKlblIY$1Mx4?$~J%-$8@U|$E?o~G=T3NL#hm=+a&|6q?vn`XPyb4 zTWRJ>hk~npC-%T#RYrFx9dH@PsbJ8)9_>zJ&>ywnEFGtxn4n?=4+@n*8$@8Yp6EY%dTA{RGaIw_G>@2Io4JK z?$xP+e{ZIYpUbYpSDLv_2e}5PGjqvlxbg?KuTApw?B@Tmv0WHo5D1@$?VIlIOaiz| z^&Z5lSG(WN>`X8R^rd?-=$F?!6993DhmF91r~~mYoF=$Mo3wFA#~brC4#ySqbz4Y{ zcgO&1ZLa8R%`(M4x7z%hP3(bz>uwhgbc5N$;i=BHcwt6Ij1GDM@Uqi>>jrxHOm=Ny z;ZHbg>?&&(Ed=liMj$qhELrZhJ_ z?Wy&YUdtMnpZ^dw?4NPvRl9SgvCZkkKSWKM7keL3Gi<%yP6R>lfeC~}QQ)a*o^jsQ zI-j#ZFcM`q8g!)bqSc2acBF!nOlkIE;+;u|n07zEn4;bHE8pOC4ESfP4j;qoT5Z}I zS$2lG(rveE26<-}11+Cbq|a@rPtnT;W=4-e;h@#}^qXy-uC}_7T!R;_HoDP98?lBu zoo08ly|L2TcpWtybuCrA4I7qt06r0mlzOSuN_Eu_VCk2}>#gS6`(11(mN}8^56$1) zskLLhauHs;eWG^EA-INhz6kWnN_Amj!5+v9^vZ>)a@pB04B(|)n_Zku)+=M3F%T7~ zl(V&BwP^L)U>~uBSllz(qd9grWpNR)K6FTqC{%BQJu~@`SStJz(A7;9Ph$T0WIn3Pbcq0)Y^y|D=V#DtGyBR+I-XaFAcy( z7smz|L?C790~mzT;z<#)wXxi3t~WP&U94f(y6xyyv(eiEq;eVE&E|3ow{WPkW>jJ2 zQXwBbU2R76g1<$rt}1Y=+gypDQb(Oei+;Y`>h;j5x2vr+iZalI&b>lS;M0#($$FEj z-dKrHDvF780jfMYIP$Ww{N{D1y@f=}?KPC$e#OmOX>{I55&7szvl%@@o7S7PMz4{7 z*=ga7{syXho|lqTdBaA3;?++Ce=Pu&v6y)W*xzlhH{Y%{dVRqE0Y*IGs` z8{J;C)aW%k;BL`$8P}4<5`Fq8sZ?K}{|xSjnr;bqDqC|vAe9#RkI5TIrNsjMXTSP~ zgKD$%-}po{IT^J#pe}sad<328Pax_lHTus~>6%bN0+~dCq?;?zf97i->1Ll9)K%kN-UT3r*)M%wC(W ze^;u0Iyj+|dPU^Gs-SMg#oEA%4=w~!05GuPX=LK9cLZzSRYsCf9=3GRqTv%I3=JFM zJ<%8cit!r6!0+8?u@D5;v~g?{{6SeK^yiO4^2I97d}~;UNPltp1c9s}Sl6=xUctRM=2w^%AInCmcO zON^Ph;+*5x9^&Qf%(RIo*bgt0nyWB#wlG&K`$sO-MQJ?c%y!8bvDd$jetcEP&*?u&KP$B6Y;g~RQD%+9A74CP#8}d@< zOB~`oGheuGEVsCCg=gG1)KB->@Q?e_UVbFi+pya5%pB!ruzcme)n_mzn|tg_-Z&mB z^1?N7%NxsewrC8{uV4Mo@;}|UJDNF_$z>jm+`s!|VPfRY?U8Rs z9xjaR`Ton1ha-EweUSZfB?T;x~TafB*WD{>FR! z5AUCi{PW09BgaPWKVBO7mwy?#w{PFqnUk}b)7fX)Z?caoV>5-!Xm)|0Za=v7uriIu z$2tF563e$5f0EzN`S*`H+q3Lllu4gXXCLNu5s$`#Iv$Ks9skPT|N7vTJU+`7kyrn| z_7io_C+)M|FidI-EkdRx>%=-f+T7nMTzrtI3h^`NrHn&L7Xs<6ib{$ zK&7ri@j?k8L1YogL}vmbQEGX$m+gnUY(Ln`FZQqL|KS&}`!oFH@7qH}oRcR(P(xSs zz0Ix`fOFzR?AWnm&#~i=bAx*ZKi;)3dv6CCUAy%7_NBeMkMiFs{^#A_U8)=@G(96t zFWq{4duq?_qbJ#Dv~rd`q08C2_IF$wT_1UT`|>{R@3i)JxpJz|bV!8M<`%bkJKD zAK(50gYq8+)}b#HnvO_+U)*?n`|FdtkB+j@ZG{h0Mz4auH^G-QErn0;2jKqG;^6Zf z2Je($uu2SSV;S5qcsqx|3+xN+@IPs!%XV}4@$Kt}b;jp(#@DeT`KH4%70jonbyZqldGz@9y`#I24s+gPN;y44-vVWqQ%=&#%6iBV8v zv%XS-#fwBu($r=Rk|^#Jw8Oa4pHU*${m+Tb5VzN^Vh1e2meMl_ZlZB4G`)&z3~|9n1p zN89L>$4Y1XM>PA>;OB$)zIpn4ZLJG9_NVc%g5Mq`vwHyYxm>BC{U7E3KG)`_g~%}e zwL?mgXO$waRVMDdzvIJQAMV(>W5)-(c6|83hr2#_^v$V{e^(j({mxyx_wL@cXVK zq1#!w;F{0{@oUxL%dNr9vHm~*Z_wB#+iRQR3e7HE9K9;q;N&utx8}xbHogJJSf^Xd z##dG{Y1GZ&plx)1p!S820f)L;8Fqt1ZJ_}*4_-k0`J(+pqtl|=xS7?niRr14?)oM? zywLj^Eqn&o9K3nZ1?L;=X-S;7@V~%smpyzidH3=3-Hg+%?by*=U2AvNvmu+`Se!2u zRVbk{nIY(Yz>G{_xk2BqJAv2R?Ung@2autk7M+FW9iAOuTbrnN;Qv*B-(q_MdS&)< zMnCvUd%2li{k+CJ`10Q8+i+j6X07@U%@?B3!WrEu_BbJp9)~s<_07H4v-SEsdjsUH z^?I{KeS5v}dcD~D44%!@=hIHFT+e}AUj=$~-l(0V&eCiF&e0cC$D5!JXyRDH<@N^r zp)2)n7-MP!u2cpMUcydTZA{8H;o;59f32=ISD@)P0P13Q477CdY=W{*eX+SAUf+7Q z(CjR1tYB77l`uD6lB}>epbL8b+b>`o;A-#Y>&6P)via3{hQ8`6&l>dw!o|PP^G%Gn z)r{XbtWA9#<_3+G#_KiuJn&m{y_+pnl|h|$=H(PMpO zZ5e<9#jVB)#}3xkVy7lZghzc51FuJlm;{bB2ChK*h(y7Z zSB^4^o}UNOxV!kG@c_hwrQ(ne>+_A3r}ov&EWWLEH&@~8?=%;xvH!7b6#F|J+XqAs z7_F{xr9iD>&oUg__<;KFx`S$DLK;rmN ziHqjmda*IT5hPc5*kll`Q|w`}(_UNTiAYX8>7&X0*7LCSa_$wXb{C&J0T-V`;G)E0 zp=WtGM^fo|1L3&dT=T~w6{q2Wlc2D~k!BfRg=2MNwN-1krXjkYL(s241~0slh&w8_64k=g9liX*TdO72E}4Sb08=1y{cnSIxaO|I3HsqtDXrA zUIu6oe6zX%7u7tY&l1Gc@H7O>vNvCEO9${gt*z8IDWj;S=q8fA zB1{1+G@1MJtUdo1ge>7s>t<^#@w+IUfM)se_Xs{F5fGAuPM&bv1eY674zQo~jlbW7>ym!W zVF4_A1-*r94^&W(dX5L&-nHxjX^`rWWIeD&%et6-fH^eVHy#?p6F;v_2TCH)XDfb)A?gBt*6eJ|T`SHDP)O;XNfiWKfdfrp>++ zsG+)H!M4D~5QxtNJtBGT8HulrLaS{`a-9TpRI}-zFhwS85(e9XZ88{PUD9rh*MOnm&`jS#cR(73h)n%VK3C76xO?NLQ^SM z?aOC74H-^lSf>)^``t1k`4aZWR1DlsgE=MGUdRSC3L{(N5&^db+7MX8`7O%o0@$ej zB3y%g21PvAS-sOR=*3DJsl%@d+b1rMFfjWhfJ=S{Oo%_7Xn?v0y6L{;8o`{xLi4F? zcB3$E2b)+P@&`+@4M@|DPNi(ytlXrOEEtX*i}cSCfMmx6rc-01$;g2%(Io$V-1)I2 z&?p(Qg?=~99*m(Q$AEvz#03-BVA-5Vzz4u~hpIeibJwku8mfXNb(0xuhziL~fSIuOXY zR9whQwN))tR}e=6Nl~K6L#MqcQQjm@%O*bz2HJr#*Lq=mf%_6O(6|^l8;}bw-guqg z#$0S$x~;LqeFps0<~Kz{GCWall3xE!5v7Acz|_L88=E%((JiQRm}tc3 zcs7ey&%vtT0orIa|49;-!JXjDSz_4LshlZJ| ziOS|T=6i$UUc`C|avq=v$DGV)k(XGTX3Rxsbf8!P z#u9rkPV@=dcV5Afn(rD3+)EJhqR1lmmNtuPb|my3Rny@Nn4STgJ!(Xr$j}7T?3z*I zHMBA$a)^rsh*jaJ#w(hU@KwWRx(H`!lMA|~@hc|SP+CnwS-YjZY)=nN3C4wT_Rs&U zUDUuOs#Wh-o}H!sNGNMPnk8h9DUvxfU>8z@#G)4z7uUV$Fvwf>Xdmr*M^#Y1sD=vt z1QkmZFxSZl?hF|xvgrJo+xpLFD^g20OCJpGdqMg4>NGG5ypOI%!7|n%W*2ZKVDY*25!6`jsxn7Jj$1e^o}fwES6;yBrj|Zt0(%pF zorMOG)Cl|%-T;q?q`sjh)(DOTW%d|Gnaym{fkPZnX0|+ffsdLfBlFU-h{<}EYL8nB?>vn6VE^e08cOql>rb;z4*$^Uw!tpsVhlTa? z(O(;#HrHO98jBFZH1RnViVt{i5;KrA*;rkJ;h{>Q@75}5eo`&zMyD#Bjb#Ym3|n{d z$Jq$hOiH#~*dF;fts4M9XRY);5LV1 z$CmU(%{QQbHh}{OYUZR;`GVzxmtto4fff56$_%z;RNcQK`1VFzsWSE^%`e7ZJ4d5XnXG9~Aj;WJXoBq8^TSgmFt>HOo)`hcR zSm*o)gdR9Mf&tqL3$ZPY1nrz<27O{YMzJjsnLI;{ycl?x(zpT1L|%)`75XBCh&98a zg=K^|ho#tJw=mAo-Vk~g4M3YK8cmA3{;>)-DGXxB_g6@+fcKf^B)VudUbKb$h%@PA z5z&7P1vP{38D0)5iz;&})x3kS9Sj%+1RFwuQEQIW0mT&DK+FpM=>ub+h=hB>A246_ z>WW6ovt8mIrr%lAZ^2KsTZemo6$T6-#|Fotvi4saEg2q5kLa^F)%B^Xp=3<$jTdko z0|KbZ3s9n=y&-uSMoI%H22W5$6)Y7q=+Ftd2zT@X^>}g+*tQ!lkUt~tX*wqe9+6a+ zk!PRQU%=Onw^KopGYhf4fgBLZKdcWt4oGgspoGJg+Z>9kKvENo1K}VHL)2t5Po|z! zoAuW6*)e3<;CQ8hkj-k~95j=RCJXZl<^x^oO>AS=RO!AYR~QRVG90Pnm+Fm$#;LZf z`t|3*{hqIZdg%2MVIg z7WNl#bz^ybeXWb+tPp2?(QachHR!X*yRy`y?gf4{BKYanme*HTZY6QN8F9-%q=Hzx z*)$zjD{ugrL@$Q->aK&^niAf0l6jFb18ST#i>(;Zqht<-jvIU_^%$deC%0OG#s#o# zz)OT8t$XYydLI;j*n=8|vp#~c?9>PAtF@`8h5Ny$EW$ciX|!HI`-F22=&>W7qLsec zE)X1$fovZEq<#8su|qzMXcGOq+~0;bL1@^^@tE(>mwm`4X;Qeh++w)Cr=D z_|rr`Ab=`8oLTt7RC+lfMhO}9O323efduCX_7oVIFf0o`m{VG#0mX2O#!u6*1mK&D z0mj0cFfEvlVsv0UGlpHq8;74ko)(4@y2p#0xvRsw_7)Doc`AXeTdmoB++M#+leMQw zfg-Y-ns-2lRJHi-7P9QJGiPKCk~wBK0&y!3J6k$RoV({X=sbY{%Y2Z{-0$UazK!m& zXV8@KM4V&zse7+xJQRKS)O#SBPj$ih|-S3$j~4&?i9o`RJoFEL?t7zD3xmn{No;2Wtp)a5yd9H zuuhcuScn$Esm2e;)3$MhC)sQZ0h8&*x|pA`tVGK7O*S`SH?pl+eV?7$Nm(?MKE!Sr^1I|#xP+q8h*Oq2vd)YQF&z#aYTu-ylJ8H13eZ|9Y1#N3H z)QW0}*zo@NklrF_6f%%Mrw1EqoBY>4i_=E4$(ou_JZ$*QCm#jD#OOO*5aBGsp{ zNVj-?2^7u&sVC)$%nmHC_z?r2doSj7Sx;ZhlJ`k|$s$tsS-S!4 zpipIPYikmbOt;%!LAE~-CD|ypJ#=}Jac~5vcbw6?={QrNpc`~5#F4-oA@(G5rk|Zh0>N~wHacU8y^F^TfRD*1Mlb#W{FZvaX^a{MwnaSU zG=A&AC=p>vX@RpaEcp65Y&LjKnsMP}0J_4xYd-`w&Wv#y zGGnpLAMAiwcvr*OFY|iz8Ck{^o|)SMU#SaL2G*%hu=3p`sS?g9f&TTn0v`$Kegml( z>(IxI)bzb|ET+3Y$!Fv1Guc$8F6fiOrkVyLOq!B!d08F#HoC0R?PNj^jeFNpl`sRZ zP9AH!ZH{9J({-$8%+YLOt;fX9^ntmcJZI%kv)hS*h;7Jx$gl$z?Zgo_QGcfE&5a&} z;ILU!AZr!wM_ zw{!#LB6&-gI*u{nOmuKIBP;}mI*h1QBo)BA%RFB60~`^)D>LS{2k6zH>{MWn4XfoF_i?ByD=L93(8!|^Xb zTc$5v2+ueq`wje-g9&>d%c?Rz6!C;(P*}^^q|PdRrW2AS&8n+4Nq_&-DIcxz&4OMkW65tId^Z6R&TVgdiW(F3CNOJ6k!o^D-|Vo zSc9kobfSr=+~N_amRUcJD+{t7@A2=^B`9ZB#UA~t-hIRb6x5;#$_}t2z$j}MQX>`7 zCymqIC5&A;w>F33KZWFXE4MTEQZYfLG(1#=KiAMHbY8+hO2QNJJDi5BOf;5FSy2f+ zV5TppffNUu=Sh&yjXEeW{sW0pqlLFVmdF-eOVa5P0FcaqdaH|A29$3YQIadiOa-d8 zm@j<0%&nAPp<4=`j4#+WdV5_Fo2}@Nf^tg_RrDMwaTuAFBlcT64fi)fZJtPib`hK$ z8kV^E2Jf>wcg-gfwp~h5(l;WI(lz35HzjUU7zl3LH>3>o8H%bozpS~#H$O26YpAzI;ogXdorT(%l(W-qKSGJXhhoYBvSwZzIzN#|3y;fNVk+Ja!2C#fHRhz2ot9 z?L`A_H&CeWBuoj$i6)ty&qk$2J_-8#C|!*n!lg-tXdW6HRmYHwGZF&i@eg8> zuaTHAX2Ba6M;A%pW~-qgg9Kwj1{#scMzYc8HGJX>kUcC0?%*BW(&Q6PBmK@-iDQ)T z7MlgTeEWacg)hr?RSKxcU~w-{;>i-3o1rSscB2Wyyo)#3MY^(3oWs@@SS2h*PaWcV z#&-G0k{Gl%c?q%?-@Up5sUhcSC@xnD$Lz)D_>lVXdUg+W$lxm@%?cG)^Ip^QnRmz| z8Awe$U+Px%dB`YO-Y$mF!#==@4p;D3hc#KC^Ar}HRO+eA6;=Qz^`|bV6BWf#!gi0y z@A070C6JFWdEkdI?;)FIzaoG8xDd)V$IgMPKeG^q&4aYxw~f%7=@q+EB=!u$_O zPX!KE&9kli*S?m)|BQJQgI@8AfG=!y#~8z{jxzO%VVi1hO-h!rnV7wF*jQkf%4phB zLcGO?y}{mMi??i`!d+e3Mq?0xmMs`j7>vFlvcKN#Nq!|n z<$h8LQh+h$pW<)q66{cq!%4HaP!jDZ8B{+C3?D4EXTYty4irFTxMYArLO|p;$Y-QB ztP98dz*a_R;ib8y_R4eLFAW78IXvOEw zRTS$GiwxN96m6in%tImlX#jo4Gr-nM@+2K7b+cK^^ikT>0*3;V{GNZAGk2Z-fWo50 z=_|6rn*Ry{sHm*^n&^HIu7lF9Dc7pe2wtlOx{gX-;1xPw0rMw6g^zL;h*0BrsMLXl z35jxCJcRECH8dS$l_L9x*LKSBlJ)imq9;rXTUcqXb>-|1&sfpQWY%hTnOVD%PaCo; z1q6y^Py1>$FckDTc@fV}N&1p+D>%9L;gu#bIL9& z^rF}BvnVMO8q7Dy1rEcT0EXfzdX`2|MAJYsIy{M)9Fszt<*(OkXYE*5VL@@&QxA6` zhVsly9{&h7#XNE^Gz9`8U9*U%D1~;ORLO;EGL4c#$7P2wuw$7mC!12Y;eAjaPKv_K zHwi-_o`2oq?UWS74vs5$FtaeE`g9H-%q9Q{mQ!qVtq6ruu0f(Wt0 zNS(l5)sT|CviTHCv_9joRyi#kd-A^%foYyz1qKF4f`FtIpZ1PvADJx4W6kwtS_IlI zpkRiO_fAwEPhy~_G8HOC0!{K~4m>u9^S5~r(D*@Zv)~it%IJEM#6$x7wBQ3F7N+D=C3$?PT8ppg&v$JY}0ZLYCNc^%lH$2h#w&34dTF!A%{sdoVF9ah#w(NA=KsG zes`4`9Kv^NvAK^yRtH%n;EUd-)rMm#Rgh#zs*(D7CT)JiMDQ^rRBT%&oOq(BW?5Lu zLFEb4uhKs)$%>B>IpHD#;NgX?uprAiEIwwh$+M6W>v`0?W&DYpsKXQU0mzS%Tij<_dRC59;i@@I{=ye~X!g ze7{#(A=)1(xe}fqx|^*9`e~b8e;7?8!h|#<{^-`0aGvVP#`-jFIDXKQxv0mxRzp@V zo#PBjROdP<5)Zw{m`E?&HOZj`^ahfVKU`Rd|K^B?k$|fr6ysZ>T$;#okQ6tN zp%WJclH^I8O`sZECQ6F@dU!M=U4^hKoSJAJ-R6p6-3-m7auEu$Eu0#Hz6UULn}jDS zP+>^w!bqVPmA$ax5Tr%v5EsctT0B`r*4i^vpE*{;Y!xkX)@36c72({wf-ib>3vHR> zi0UV>JEI0N$oZnDOA!Xv7Y(PyYFrw@JdCVC5B#AeFlG(h~a zxh4tB*e`PQQ{N?m5AtY=6ckti*{f@SpsSS1zyX!{5=)}jIA|`A`JsJbEX9G=5AyFA z39gnfr~ZThkKihjTR{l1-@Xe5cMM!iI^%7ws}OauZP;;+tCHQuZy;_Gbn^tTkL@~K z$qo-D7^k5JU=o^x(ew&8b;Vf}PGFUOgi`sS!bb9u?p66OL8!_y$|CFPpOu(=fIi}u zt@~_;?JQDma*^@90=X+G0fcx1UE8TyUK63{*3u`*uT7us7D`F&H)D~w1F-4 z|HOxDXQ^DG8&yX2r@&`jV=;#d72Ie<3(awB1k*@UjUK6MpeFuAh?_s<$jn)DjujV% zb=kDAkfX!<1xihLZty9KdJHsInxra?V^pM;YPa z-#7)z6A(g<+{f`ltf{8h2WYs8>3cZO8N2^k*-i*4@%p``-O@-aY&F@7ce9&%u3_i}xzS1LJomKKS(Z;K-hXyAOVHv~qB8a_W=8 zYkP4!=+yla`zvFElY917?hbxAcz39B@tw-GfiEX+4@{i-VAqYok=-93I(YDC^du8u^bhPqM?^MnW z+@JjTgHP@a-k&->cz5E=v7^U!9j)B?L*?+`t--tZcMhK3Te&)TuXeD4vF{uhoH}&~ zK;5}hJ6yT&PUXbF)ZM8o1NZM=p7?A6cL9&zfBN|T__>RNQ&Z#k>h9FkrU)C&m5U?8 zBNr~f)mJ(A$?ijE-#xwW;KHF}+2L~^eenLfhtC{1@c!Vzv3>6jRE`|Xc7L|}z$c%* zd+_{$vlrgKx9`ib_XiK{KmP6cqboya?oT~>_`!h-d*6Te(4m8S@zJ4u`0wt4%0Ya$ zd+)yeC*FO!|N6OoU!LbjN54IJ^e+dG-n#ukc5?EgJ3HQc_rRgOd*45IGSiPf9Ga+H znE2*Tjd!QMdAIWCf3EyEaqY7s6Vrbf15}mWmF(!!=!qjE?|*h;?9}mFmp<6{-m$^T zpT{1)ntlJ`vz-s#yL<59k>kfZS5C0S*M|=uIeGT{k-OS#@3}+o4!l#jH#IOZK5+l` z?fc{R?+l+m_|fj8r_P=K_~YHU;&S+K^>>vIzt~l+UcWtZ{mkB@@12-BcXQ^#mHUU! zytg07_;B>>2>Lj;=cC;_Kiyy1TlutdsPf_1JC&!Eb3>Kd`ID88D;8ab9V(Bmm~|)KKA0_XuV^go^{Nd`AFh$LCa*_exTe{nS6Unwu>j&ZK{-PGEWLw9fFn39 zISq3{R~fOMY~y;&=P0wnFpPdEO$c(VanWS18628YknQ`6-_x1-y?@Q@yzjLK>E!`R zX0x7SfLkl<(XP+NpFYT{vx%ku{KBl>S>aaZ^RqP97zUNjD1&&EPiBi)n!Q-`463T_(Xr<*<~YO-NQxGPC3g=@bkh(t3o zF3uGC5|84vE{s=sgL6ennJzG{h<*^XTtSp*WCfK?VSS=E`kbX|A4}%JkOIy;X5bx8GVDZ zJ6y>?ln_otqNQ>ito3#Whi?UXgOU`;N~RbUCkx>PWlJZ}{DdB8-CnKHDwGS~9JUMB zp-_p5TSM+FgPDL5!9w`}ax;{puK!SPBDn$~9c~DTTTAUdl!=J-Jy?!LE5Asjn9JW- zLP?gDI%1g;7q>~QwB=eh>{`3U4AcN(#0S*Ar2u#OQCbCZLY$p6!E^$W118F0Q3(e80~d32<$g1KG~d`ns)6;#mfQpu*%c7_?U+2$ zxi<_a&L`*$M1?A>tyQhZJV`0yPQoEk0MGGOnoEs!-p#9n`phJfm%EArchZ66Y>V3} z)Fu0F5$7;)1#!H>!B~%6Lq^Cz)`*%j(vu`Bi>c9f{}k9Ks2n9pR|H}y;>1lKmLrb~ z5a4XHi@}7sj{;4iX4h4vLZmtp5PU;oQRH2HJ1RAhGrFh%Zo7T!}R?c z5cP)&l>$tmFwne(su0z|eaBwO5pzK`9}p>64G2UTB?&|@{5Eq5MZ&ZXL5!0$HhTM& zuqB^GENE@yPO8KeN4N@)93QBN5=j#eNFUyo{aR19e|X%&$XjUxJxFOP#dh45`WA^w zywnhVBBaa;%ea4A@tdot$}z1JWq}63BrqJs2TX1`MBjreejG3vX|-JD@M~snV`ce~ zP)i9>hW$*BRm2c?JUBZf3(Gw_sHn9kr@^t;!mW*DDI?tRP!t-rrSP%R5J*4@VK!@c zMexf|sTcehw$KPSRii82zfvH|$M;Jt!p^XLN(9*FJ))Or5MLkhP`YnQkdjC`pSmeJ zLKEDbR%?z2(dC?0vAiF)Dd+1if8M(J*U!TG{j}qb7@p@2R=yq>ANXQo;L(HI1CMuI zzdkrUeR}ZW<8Pi`8GQQqNago~-#j@p`1S9fjt^e{tn&4f+Xqfm?hlS1hAHqXDCdni zT+xZhnyBUf`Varde=aKKf8RIW%T>onYicbdxBkjQ`ntDs|1mNnkU;`9!7uFftA^pD ze93d-UTXj)`B)0Q=Q`nHJ9YhrX5l_##Z(SCV%0vz_}IP)z2K7QkZUAx*QM%5sEm)a9n(&rt)ZU05INopiujFu2caL{efvN^ zqik$I)db&S&MFnir1p1E^fr+z32Ot|p7gYe!1FSA2qpxAs-vi|f`msVTy<>eQ*L-8 zuVd%49EE^96&RE2n6=z}qY+Ium|neQ)SK-KFE)^3M2~7Wt)#A#)+*{J?T-v9Vpehf1tPlaS# zJrI%P?ff|``2jQ&LY(|%gpSGb$N@lNc&FZ64|U2=Rf`T`u`c?5_7K_;GC9{6cml+9 zBjYGPM23DBG9Kn$KH`-0a)I!)Z)vbgEb!Gk_NFc-*nI%=iqs|3(J0O_Q2q5(J+>6V z4!}N_f??y?LnAim6H@kU&;C9ielPeVui zCdrL}1PM7sqQ7b;gPuOr57`B8@=JNNm~kGyguY)@yAF6EbRIIw4X;f+@R854-FEa$ z5%LJYP=HJ2PM6# zS)KFnQU{g55t*a>l0KstN*;FMb;7|4UI3u*d56*_R%`OLK&TAC&7Lw&V=`4v*T)2c zxKzvn$*(OGn@!{+NdG0FEs1qqy`mtq!vJvq9@*q=y2K^)^_M+8V=`~*Fqw)bCnyDz9HfF7*F%4~StO&HX_KQ!%URp}4k{s!+%s0`YZ&k2 z8?9ZDofXJA^iSOP8=$)}PqEw6e^}Du076BAyJFo5MPV>cIb|%J`rS6+Pil=S;7_L5lgy6{d>t;8EyCqzb zd!h{;oe7UFU@_t3wKY>r-Zm7gEtI`Wk|sn8)0I~kVg`lrlmhYl7(B0!V>~Ei=yv=on7{Yh9XzaRrnQwS z=&LN$ICHq>Kv3&oOHreO9T&1X!W<%CNZl~K)sWFEs@QXcG?ykq4qMHs1U1+sF#Z3C zZ>ruikqgkQdL+9OUYWocezjj{Ns!QUYl}sB>!t0T&A-E?1<1e6$|krVwi8O}yReT? zCvRhwE81sy(dTwo*TZJWH<~1)gKHzyRuRQcF=Hq`Jw#*(kNDdCk&%FJ?KD18r8_t0Nsc|ZNu zG<&c=|Of8*t{prJ}|bHGyt8be)V72mytH!|72~ zRK;qk<)1oOVDEA+T(HbD8T39Uk7B#t^P~lq(6dGPK5V{iDl*gn;+TQu2&Urm&?Jfj z=Dem5^}mUW_IwnZ;fn)^P=@gy!_O zs=fk3czzU`1#i^~zq|6N!_f%{+5m%b&mVUz{SZ_#x=$OO@8Gpl{YL54bX=Ut3tr5m z_gdgLcRAa2RI5+A@6(UDvg~XC>l>Fj_e6Q{86gM0@ruf>>y=@+{tm#=!l^pyUlEJX z8dB(B2J(QF;iC% zjh8(mcx>a976V|!8$%*)gEWOjM2tAv3hrNhfNcz8UAF>At)mxkN$15Fj$gK`*<1|3 zFJf!^NW~~r`Q5~2VIkf*+#3KYzejgX!bw|3e>{!MxZaiu0#`QFU*O8vZ1TAc&$dP# zWTjmJEyzW22^=|;Ypqe@BJuCb9ez{Jjmwmfft=v1; z_gmim*7v13ks6CKJ?&jIBn6pCW1J{%Czq=g+2E~x;>qNC-QMmR_X|V%w#Y-;x7qQ4 z3|t2~zC_#E5fF=`x-bJ-WP_|PA%C8i8Na2Rl8#%PC#)< z-^n71!XX9I5U=T6WP+4#z-(!wCGkSZSVhiVdzHtI;%*gS;&{{IBPnj$SvL>PRb#kSlusZrF zx}+>-k0C&8WT(-a2ImFBvu^LcuJb%xA*_$|NLLG=?$biAjv_+eeXE7 zrM{iU6^O05Z>JfXB5D7#{hZDoWi#1#`2Ty^be7#184-dk&PaR!G6u-O&}Kc%W&VGo z*(G~+IlGcw%|6erW!JMW^qIXO%rKyl3ya)hkcI%Sd5PbCEim4nD8iUR_{(4fgxO_- zB!Lh&gV{qxE)&lEk{J|mZa}_tT=QTT&dz(*|Xs0}2*6^2-C5USk(YV?~omX6|csjf013N#ZB96=# z(jn1b?6@Uo#n>s{qDF5hqo+`^0)QN-zbjX2;ugTdU17m?q?KX!awP`0IIwK&;Cf7O z8KsyTEqbOGlftathy$K;&{<>O+UV8mm!Q5U1=?te z@XBGB4!Q(-@_^D10;SVr?u;HTfjJ3tJffF2dwvaMbBG_DP^o?6^v=M%iZOFGQz+M# z8uOivdS}yH`K}O?4%b9ruJn;}3$b5ppes`SRSqxvBVHwl;KW5yq5R<$Jj6&b9z+0Q zkDe9~=J^9&uImF0l^T_%Bs8njVWI7WYJt`AztpX&cfcST>PzVXx zxmRdwOQyp-=TZI@<~!xd1JMtdDk7SOaZ}(Ls^swq6A1Ux#nEfwBM{_0Sciz$SXn|7 zMNV@zmThQ|5_ui28>R4_#%{uF?zUb)q9VU-Z4D~{rK_(f%!x7U*~QWvYUa9N3c}Oc zP<3*Ak?e}-;se1swpelFVOPj5lM^IXfMJamoFuwdy`i6Gk(0Oubfz-2 zh|Xzl+kjDwd}TN{Y7ZXJWPyP`xZLOo@|^tb2Y3Xi zl#h=C;; z2ri}&gmJ)|6g7Q%&CA^9qDa0Gl(LT^G9p>EV9_NES(0GHD?|)JUaa7N7?faUH;P_B z6q#Ph^f-8K1uEs2z_a-2CcYgw%k&fOCKXZd^C# z_o=ymdp|q%O)6P!r^7K4=w5!NW&6CX(0W(M4&ieqEBhMKeKNZ$FTTi2_4>stcy@28{?q z6q*W3i*32GQCTf0TI}36O!31=r&hkO4_`?77|tWXa%f6yBdMCryHSd^k-nfgGL8(E zf|&-gv4p{O1fO(?kbX|*Lvdsu8uCAwTDY@b3hTg>%3o6e(sdbQoJlZ=>xyeHYIudL zaq2O@ueYdU>iM|QkxO65(|e|RLfpt6rTB)>3hK3zc*;dM2JWE;V=AB+ww*458b@q* zOGKTmUsN^|>nFCoK_lr$1Hvkkql$=Gc9Wncjrm6ttfwN7E|v3Bjy=;BzX|}R<>zlw zPAlxqIrWp>BZqKK(VXfvve0#oEAUlg;!x%w4IO>gU-~D+7c#ctt~U6$6aIz z&03zQ)T4wl`#wM7By^0Lq{#(X@wOXZoGgnD1E{vE;x51(%jk2yy|{^04Sg$y%`Q<# z7w&`-ipY6wl^NVrrhr;kxtBtoG)wfC;%iKcFYzNntY%9xU`i@Nv)E5z6n;yijOy1y zv$KFx*fE(Zx_5Oepb2QJ1CPD1dTdQRK!Sl&KG&%nO?s^ik*S-R$hs6^hEfx58ZrXR zElrH?a|jvJg6`zvwbDy#*s@!wmaH=jOO)LI122N!Z$b1qHRmx`KC{T6gaCTdQ6s5% zuaiVsvW=2~6F0Vq11_%62Nphk*Gm@Z+ej7p34mR3>D_6WtbDXhIGyb-YJTdMwwQXd zKMHl znBlx0-sa5tnQL;3Fy6ok#FR$q2#(TjzXUJn?T%u!h&ap%2A%naP%IMjXSsG%f6tP8E|hK`|AKbrMqXCna%KAi&AS8<&pCVKX#;jFyTJ@ie{mkNxZ zhEm!hc{q#4rD)xR(H5H}ZqxqWRwcI_QIbs-U8Ox!2+r5QmST+0`Yb%i{h9oc3Pf_h z|N{c*;o^P8{Wk?UurfPJtZZGrH8*1sfQD|yvnCDCNwV|`k?G3FOo~|OAZ^R7|GF{dHZu6K%`2or^( zSBtdBql8K$O?1~cSD33*Vk6j@ko*k!Wlu+i2f06Ue-O#{a2Zw;>aDM~!jh~TbA0}Q z#ID+c#60uuP!J5SJ&Onx662brxj{vseeL6i1jSP1m`ueug}+1=!F*!{m6t%4&l+n? zo|`}^7aSi!6u>g;bJHrIBzYGyBJG)Mh2(ObE>gl)FdQ^RxOYW1h**SFXtQt!&OI}% zObyY38Zm2#XPVU!i=8G;EXg!du_{rJZKo$m>JWNy*+iE@9B2lTOMBH2cL@CcohB&B zY<`RUB-ut!CCs1CP=XXSRqID=QaYkzf>Me(3fUOG{@E!?q6^4@Vm-ufVv36B})#kYATbt8FgcUeqB zu&f}2)b~bvb>HA9;*PqHwz`Y1_0-#)_3y)9$sKIMfhk&+#D~oy~PHQ$FSKGK|Jw zy&FCMuBhX8`1?g;QG@AeyA7!&Ke++hwIw;2maQ+w>NL_7P&5p3bP2UB;PGc=EBIf< z6^eUuf9N3Shb@cZ;`WzSgpOdECnuC-j&EE+@=Gq5oQ@3P%u9w;S5b%zCAaW&5$emO zt2o_|-hUzE`gHTdhtX{G{QVPl@dWO#fX}yu8!}nWIb1X$-QqGw=vlx@*(D!-9Tc>< z{IGFuQICV8CApMC?}m7?5pE<^|EA1B?2B}BS>5q`x&LG{{M>r~wC`R?*d#}Qls@5V zfZUsC1OB?S4zl@ms2v?`liq2{38Eii%e|oj1K9!1@ZgU@Wy0hy5k_U}rF(74%4jY? z`3^>{S9@P9YoqKZXBvTiO9AZ-EagDMX8~v=>8x)S+Y1WFb(l|sdyd;!2Nkec@cM(g zjVt8LF>l5%aYqo-dn96&=T4<7%L#_988=J+ZIt`K?~f@q4?W6)X!Va0u4YU>&eeE> zW1-eU(Mn?{1r-DttVjrjO;ZSq#JLc+>d2kkH*XSiIkGGQLL(EQ6D%hPaC;^nc zLtANl5%pFnch%~3$8ZPf&-j2YO?6N5b7Cx;gJCZGyF1gCpL`>QY2>x^#Yadv!i2T! znKp(g%!RVaJ5`C!zjS8j)9=CIq>`(Fg&hem~xZl7J9wN#oZG4F{WD8oZ@U&KQgx=Hw z_W*;+2`(#DARmiQZ?5IzaW$aH%eEi#9bWj)%K^AsoV6a`Ot zRG_`leG?k)F*WMf!UL>`IOyBs!ax7D@Igj4!@{&!eJc9!zv{^r@#2YxZDx{|-d~vr83O23|K<2wkx`ha?RhLvYO+J%(CNhNc+Jn7R@ew{ zGb_tw*m7FV1M;&9Pm7asPM6I&9SB+SF&Srko!f1RV$?@X4)R7!Lz`ro1n(UeD#3O+ zyv&9pFiS6PdFQ@8YUa=BI(C~w!O!U`(bf``B-Qv$R=&AfLL$$2d(R^8!8N)7A+Ikp zARsHLrhl%Sqe}p<&{0-N(c2{92q<3*FMSY;;A|O13YI{IduqGK$rkHtq-9i zYOz)yU-xeUh2Ei{H#{&_!OJObXlYOY*unMCyjeou-^vfnz+d_rHyq7HIiw@;zkQ8x z%Aow6Xz?Rk5Ie~opYyjuFfkYXN&za&=Wc5;ecLme?apVb89{dBFKkO8-)c@Jv&zkj zyHbKzLd&sKOxpieikGqDRO1S2SlS2d6LV^Tph}GYJR#|q8f*#%?O4W&Ftu31tLz&F z#I58(YB&_72D8bTKU#B+dzPENUx$(#*FZcwQI5;nwp&D}x!lmYoay#{*@LmdgWR9F zKPWMuqM|UJb4W0gBlmJhGry&9&0+4sRl_eg;#h|AA$gFJZQO@9yn#F9WK_QI9P!FpV*YM@B>JhEk#|LN9jpgCSJlEbv3 z47b#^+bio$ptGO)a~q}lk)tw}^`xTY&@!X_{M08GMR=|%(7De5p1=dB3}nb zD7FEcktRNfI%zL5dk|1~koz@)sssTp{PV;ollIDe%lkOR>(%d=ofjDcb?DwU zRm4$5>3(Bpfn@r0gp%Uh>&UgvKK)#lez3rO=T)^jP=fEX;L);NRsB;Ulj7gYO43}I ziCdcG!Wa466F#x^`5UI5JZt>Z2J`_W+MuXCk~^DB^M=0$bs2ObNMmK~7?_ZZhdg(U z2*jmVJZ!7D4qN{wwRI@_-Zph5K|DPboQP((Fe7L-)lr|zDW=)r&colG7q|wGWyj>Y zs21)r1A-{ZnT;Ec*Sfy=Jl-nBLN2m5XM^ics_?|&|BVu7BFg@r@@D>KX)(ID#dyJg zz+n<%FxLZeq@5~)*FG+rBw;UNf6xc^i;LZCnYu#C{jV`|B^9-Ekv`!909Liem;4T2 z^vzomdoQ-iXN(lPfZ70U5!DIV;f?tARr_4h_*fdQC zYD8gqU5kylqD>YEFMVy!ih?_0%VkJi73?&)C$<}~;|vv-^#77hfDwZrzv385!gET+ z@w>vwHhiwVgl?Rz(n^rY6nmJ#y6Tc}3i=z4ONJvAVAlTccIj%d?hG$(+UCilq(7_| zv&bVv$!ho1l+Ab-s@_N+;*P-DEjb&Rm>cx+NxAV5R&($Tu|e063OvLMgTHpf(%R&( zCaQjLROMd567fBuqvTwdi9K7E)t|iX@7|G+Ndc_saDF=ZyT^|qEMs>a&n zVSRJhD%f$!J7Fjs#3p471}r8i&#bDU-XRn$9gzb0+-B@jnm9yv`bn9BB&^i64Ndiwo%DVkzvsPr{J zl5zmDGFzoFScCF2O5tc=js_B@m79<5cyKsHQOG^ys%k<|N=a-K=~*_FP!ON%2EV`3 zp0BTb-PlC=J0mI(MGBks5rkHqx_XEk%Yigbh95%E)R5#%5WP$3)8&_b-d?51<}h8`mzsX zQ@EQ9B*CorUjSIT7TX$j($Xf45FXH$MQAwr8(39C!O0rfY!&cV0fxL@^D?6}vA>s~9)a1k+>^3VYUsUDDqnr=& zRXPJ0L+PJsv!ErTjqdBXoN2qD>V!KT2E-@57I^oOHtzqpOn9j9fbW-hCrG{ zr5NP?u_cpjMjZV%2uyZr1e&5ns-YzrlHp0(%n=sQ;SXXXLx7%^b|Qh}G!T2Lav9CO zId!Jg*vC%nkzvXVw7K=JQqn|Z@c?gPw-j@7(zDaO_qWCwTNn9_=dVpGFs$U@!nOB^ z&a)yC1EhKzjm`&`Tl+>z;L{ekf7RbvfP2e)o_mnm`eFQvw3YNL_F7JJv#f9Z?jg?; zC&~@KMs7ohF6+irhUc?po7^Xy;m-r5{qk+Vc=ECj2&Dl)SEO)Valh@|*A21+kS(!Dc*Y{M6Fjzmfu zm3O{P-04tnk3s$Jm*dg;>Agm*4?5UhMNPkHvxPDJ{!Id-V(au@j-SRCrH@NG>1mhS zaafb$hAO$PQb%>64wl}3N5wqVs6>W4E%O%(#knM07FWLKxt6widvf^Ygz#%^sG{l- z=dHgbvuCJj%e`05vI2r372>r_#c_Vg&V8%B8!sRwootW)Ik3Nc*+NgfJJ`0VZ^n|{ z;ve_ynm4>CZC}!VPrKZ1ROMNR^4(@Cv_A9(;oz|FByWn1DSD)DphZ;1vnn|;J`%WC zDd!GXOCv3*)y3^XNQQ8p6<{}l)eiKnOe2(tna0(wEHsRh<0t}#G$Oehg!Nzm5|UB) zw9%rirRU^KHKA4J}U+AUU^ z69n*^<@&nx(iak+fVgF)=T|uIFGcmjn)aDosV6QO!k+`kDX_je-^8ZXsDRuZ!P@F_(ZlS+G;V$mZBp ztl9*!5a_DUW*!oY4`-g8&B5-QinmEPB8zaB^yg&8{WKc_8*;S$xzOQ!8%NY;15!~? zaJFX_NaJcNQ8JxtxTgg&EjlRD6*iFp4)81moW z0#IPh9Tdg&VFg?{Oc5@-E4J`rI9wi6Qih)Doe~soQYeS-6rL`&Tz3ha-CL+kD|R{r zkWy48{pkJ@N->{$9+S!YqC6lP(Xn}NM3L%s-b@LjP%SPQ7HJr9E~K-Z`!+0zzVS5} z!_9K(^@`<_MKVkfyKuF`$rrCv40&UD>d!$FXUx%cj*OM%Xg_$fEI5+RKF`%%fz5pm zO*Y+EI?Z60NN4&?R!!n71VOjuR%6TlZT?j_F>dBIIp8oD-;z^81i;7Deu3Vw?YSVP z8ka(2YI^-u9V}h0CzW-M+*F4wA8>0Aqa;p-L4kmucKlD@|HIASAFb>;Tsd1EsvJDL zchBDahYs!8zyHjhgOw`-zkfRL@xZrx$KI`szV}Y$+O^8mxo@8Su`+t8GBR6va_R6# z#}AyyP9Hh7zjExzmE)DseTN4s9}Z1lp7?Cf#UtNL?>zkEo1KH-*DHrk9l5mg@YS7z zmEE82KYQr-=(iud|851{Nvzfd-oqbQ2YGy z`|l3CQ^8=ncJ10?^4t_dNxj9$) z>fqqx2ba(Maqp*}44xXOJlQ|^`18RXpMADt@S9_UPbT!&vxCEfj}JY%_4MH%uRpl{ z@YbUzU*0B`E>E8u{$hIg$*CuMYe#nOIlXi0%i2FyPJB^$edPOV=gyt{=-8iLjQ!(| z%DEFqPJHv^@sn@PG>6WA`^nCaKBycxU)z6r=h2ULRF1tjSlNH$z~KYuj-5X~{`seP zy}x>O9*q%KRbVP@adslA05ZkkDopf=6%j5jTwJ<>z&FUKisqL;^X_( zgO!mlZom8V(D~!<5tA3seDUC(NFH3xt4u8GIiz3H^XC`*6F?bPmG0`x_9ZLBPUKx zIC@79f3)|rPmgE&D@P9>x>l=v_|-d=JNUYKZlH1|VCuxF<5%~+k9i;5f3fn}xsxYP z>^!y;e~#|j{n^>?ch0_txexE!ec}jyp5L{bKMr6Y?KzJx4(&OX9U7_*ogV)nJ9cR3 z?9k~C20tNS7pjNO9DD!Wi-!*%ymjWIgJUO%fHS8jhpwGHaN*2H$A?Z{K6z>4%;A$` zXRm)XeB$Jx1N-)T`bqWV)r?P14BxnMe(d+R_34NEcD(m)W$)q3@9*J88Xq`#xpH&h z(c^)q_a+A(KCBKr`g-8W(2lrpO z^t;Nj?9^vK-2UqRz5IE4Z|!&QRDQpN>%zxiMts}F8Kw(=sc)>-JBt^VR&e67(Yde& zw=mAacEf{}=KO_jXW@cd+!rL{7m8G8{XhS|FtR7xYnyV!jaQLf6`Ol<8CUN#H&(Op zjdh&*?bfn!7>d$}b}+_8l{RX|8DP-UQ&5+??TyX?uce|k*Ues#tK)1eEr@zHF+GLL zX^{Mh^0f<%mRuHyOJ~(^WKT=1h~zfm!v~XhA5Y&!sB{JO#&$mH|l2bW;WG7kxn5@hO^;kB092f=* zO{>-VOE@Ixit(|eY`fS7Vzkq+;8bmFT&jvY#w6(+7yH1J#(jRUCY!C7u<_Af7dH!s z@gg`g@E@SK1_lAP-OVset3|AxCBF>}HW4YK1tTcjWv#ZiK!l6K8$Yn(zA8w_Ul+NT ztv0as$UJg`75A2rX5<@Fb>EmfPQ3HJGw)-n4Fd}{;WC{-&=j;E9FM~6VS!N}TqLo{ zWPh&!>tN@74`x61+?8hK7%d7&@3ZnaJARR<}%E3N9# z<939};FSGQQoZDDVsbOpSd@`!v`ftbv zbtKgMmFRhF(|`B}tw5{h++#T`Vmpun}5dlY~3abRW|v5GHT9qMHOQ`6}t8 z&`Jk^pBC|F9uj?tYbl`eFE>yMoPJi`aZ1$H(mp2a#zDEKqKTGyHewS9Sn~BL&IgcT zv&a#`B2>Dmv0vcDtz7iCA-QQc;xcq4Vf4~#1oZBcnbvazxRgDw(a7g>$G^P-+jLb{>YoapWN z*{Q#3;7%>{JiSm~0+U;Os|jLV!%ZMY5e&sefPmo zhPndz{r6Mcw8|fNu*EOtN=}CM-qywFk$7@yKQwXpXxt8w-d({F8XTCcR_!<3p(9Ts zBSP@gPn_0J4X$bpjOhjFL&!eO)Ya@hZgR5A*iW;IYAbhF*Vc16mpMjI9hw1x!zV#C zFid0R8e!KgD+6jr`a~~a>c?En5Q4XB=t!F2kuup`E1R4#w$xKHi zj**cKZR?ffB^hJ8i_({!s>2-*cG$Az(!G4)eyZxZ6f=1B@lQMMi9tG4*mR&#Y4DTxcD_^j`WNe*vVBD#``3S%`Tw96{5w)RsrHPC0})E5>zMLzqnWCmMfFrf zwzxQ45%rIYEtLd&71?>IqB4gZwPFwU25cDDGZU5sG)Wc-o%xs$Q**BxI8|L}z3QU1 z&+|F)wgg{Ip;Zn5=y@6Rq}8<*sCiUmp?|^SP8|{fE!Yz%(F;(?ys{s;yXw%AA+sSZ z;VFdsNc8k5)IBz+#1phg*|io_w9UI{iY2xwPH$2_Z?C~~2Ymv9a6ikt?S_%Z1N1=VHrzDM1H(~!I$g|(myH6Yxr)O)B?+*4aPU!EP;shi`yq?1XO z<%G>4KfwwbC@kFI$rQR$`<{6tN+`gM?2(HK!IW-c=~)b)=DGW|^Cw!KzM3 z(xkx3W#h_IamxFMUT4%LZ{4v$dzy3=Z=UFGqNv>}Gv4RhPz^<4g~Ayx6UP_W%uw^{ z@J5Jo$3Jy}soO(UUl98{KLu2Yktj1qMjz=n-o*A(z+uYtxNTk?E zFdkZP2k9~B1o%#474{uZ$199ctJOCTQAG{G8+cB0iM5K~^u= zIdh3GUFU@oaeVfW4CCr}M3N2xmiU9HXS#U#@5#$?V<>X61HIck3j=|P!?D7QJ9P`u z&4Q$U7_DF$=|6)=e&pZfdQAQZzuGTi0ECRM@g7A9v2eIab%#YiA+li77obS+qE(f| z5Nwd@q9Vb-+|YQOGEH+ph%y47GK%%XIrl>BOt|O@eJ;~fPtu{*o9l4(Qr$?OuE6k> z{-8Zra<0_)K}mi#2X8ht0qi+AFqFKYG5YoA_9dN$rYYIwb?}O)z@ifxc5_R032F2| zv%KuNxOm!a#A$Kbk{o&o79NyEksGLvg5(q5*wp$G`N5Q_bX0j4XDb}u&YBQjnuUDk zNzkPj(2OkY(cN zy`{PxU9kYjsp90yVyYv`U`0wkc`}<8>jE$>%Hm728Cvn(R )*rrsa+eqEl;!J>c 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"!~Ep`+wcrV$Y`9CST633n^z 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 z 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

|yt|h}V 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

F#I8PvXC>;CJ`_;^?6xU*LayK6mzPS1^3G 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�cI=L+6X$5 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�ISakL)b&RVNg+lH7F7wbx$ zN}qp4wSnRc#tu#x6NhYnF&t%NqXWoWgAyi8mJ${tN`|3JglG-n zkYjc^%Ih%Tpap?l%SH8~aqzlQ$+zR!Ivi{~AQ;zhq4*>P4R#=t2Ou-0K3zpmC`FY8 zg#xjniqrn^D~v}ltZ+Mx*HC1|4%*2PM^!D=)x*mT=l-O;46X`j1y~_YAK(r-?_AKn zOi(U_wzm9l;Eawm8OE&Gtl^QM(~GLuDNuICjT+G?Q>-y52>I%-q(;WJOf`K$zGNV0 z!rjFtjH1Svr?@GcPek%jo4cyN>S6imz^*#tj-$=YsdJ^reX~>F9{$RFaEBj!O0U-J zlS3aLul1FNW^pIT%=Gls;ZloxHy`(3KYrsz|G^Ju zJ}7?z2iCa@7iXrYP8~UO=_v2@cvPPL!aAgGg#J;26)!3fE*X49N;n=^ z3h^;7Fnle%krE5qLq}Qb0v}XLs9uSBv?5@`P$lE$8TQ4;9H_OBK!GPa-;bHX()3J!8RX_L4a9dP_jfUD4m8@Pl3*FqmG99I`Wh z0g_BT_A7Eee;zpk)55_Eh%uc?7G}!Z+X*puIG^`xR3OhBYWdB1Zk2zv195W-2sJl+ z$Umt?^xrygPqdILcS@g?F8ASXv2Q&Jcv%B~6XlsxxMl3>$8(ce4t`f16h*ZVH3?tB!Yt(3YwNBWbDlIIMSG`2;T>WPj^*q9puM z$_R!O(&VY>>X{bMY`$o+Te2eO>E1Vuf`HDiKex8(>ok>`_00~vVCDm(o0A3fR9<{Y z8ZhdbP_0J2=$;`EQat{8wT3*1U221i#~`)yZ|qBK=U>{F-0pfQE4aIOFzxIKuOkYP z6y?9U-&}REr?U!;iz4ZB;KYkZLMW_O_york2LMrKMxa!bk=8=gHS=m^&5njyv014O z?{6iR$rK(b>yak0u#BCi38A3$jmBOt1}rUQ;CjzR^Yj^=K!LH^D_GZz(=HZ*kqhFv zACSAHO+xgfs&{>dHF=Bh5sqx*0%nR9wX}Jjy;y()^^AWn=>AcsnNd&fdahu(0)qqbIl(7kUhu-WPFn|^x z2+F1d#vasBnaOi!sb|fZc}m(%7%q#WjCq5ES_}1MJ}1M%^r<}4iSpY@TKi^x-E=Sj6 z2tFx!E^}Fi0~m1j_g*J{yzTKhM@;QytA#7?Bv8j#4M0Jj^^k%v7(uA5?`&?|74SGm z9zXs=7$3(`TldzO0IK6RTb-eG+`PGkw0Ud`o8Jt++=cNY&G&{tz?~r!KMwN4UCUc6 z*fa!eHqBE3(Ird{Q9WRp->W%nep@XpE*PT5XPGCI^WFq}VxwXlqiSUBF&jP2H z=o`MZDkp_6NN05UQI7-PfEJMafi&JYFZ{qX@7g<6e&-DYVj#nQ6nMg~VoWNr!+pi~ zETxIq%;ECQwl%K8iPC4mnXyTW1PoP`NDSs5G%NKRCGlDXDYYI^W0z;+^q5E=pma2o zS)?tu-8Tj!YvULuSg;>Cgd^x23AY5oWW5b2a4hh&)38Si5Xxm_&9o$*%>$-F7vL;L zB#I#S=~)m4Xks3_N*5?kZ*Z)GG9_dg(oW$hfj(~8(>jOEv_N2y(?D4D_@x{GXF{v* zT!^wD4GZqjDFcP9g`yS+y!w`nCfg(Q&$_fW%H)_Qf|v;`1$<<`HSi+@vn(H3@X_HN z8oR4P^)^oW{SxHrE>eo&?~qNj^MGYjZ340hx=&^^a8e&C#iKo)1t&{Gqy$L?X|C*| z!bYiRwbke_IY;6GacQ8Z>`+pzhj0O|wsp_cb{!R)yIXDqaScempbn0_m#d0=_B`fF z7<8&T+y!TQ0i;>$tT)%FW(XhAkgT0rjvY?R2n5E4c+@0?Ms@~TM3zoKNZp&BC7oij z0hWXeWmt?t0!t~h7cmLh8W_G%j=}B*6_cKHNlJgRcpjq2Nm*y5huk3x6mAE*ONs#y z-S4clo7V0_>|$ z5kRSMvj|`W)dgg+Jnf=Xl75ty=uy>%%0UK3hE*hzvlOJ{YWu*kEL6#3j{(+@kVIWU z4m5vWjNpq1fP$h80`YK`YIc|=B-(D=#A(oo#OS!tE?G_`MXFfjJfp_eZnq&UibD76 z8oc5H&1nR+Jb+n@^&lf?789TXXd__6CVYd8@NYpcc!p&*0wC7VP+@4$h3m!`?If~< zu=r^cN9cRK+(k)6aEHyxh*Oqq&5K5Vx^$v6aldc!Qs3de(~nL(t&Ej#oj-B%*vY}u zXG*7#tA4&b`)PUl@slg%*_&66lpcRnesTuaxj+4^boyxNS$PImq|XfEi+EPBedi=NXuTL|$C^?-lXWQV;NBe=y{tFV{QG75~;> z?=mX<2XVIg)1ugpxbh*|rNARu;}6kLNpl0AJIl1ocd6g3f#*{bfpkVOm4*(%-*^o1 z|2TKPpVCl8OPl8Aqqqp4~#z!9?T3m=B@|-kN_N? zy>Ov2FBR@MKj=&D@GWo>-0ceOUEHKxv2n_m{4Y2Z06}5{>&f}!W{Vmjgk5C|Rr!`JmK~kwN`+_eQv}!_LPu_!T_1WX%=?jj7oUP+ z4hWekfpddw$B_-x+)}l#4qmH$b+v;3{Tli%cS8Shgk5yaxmLUWRran8n@2 zjo?uV}9-;EoYhn}Z1A`FBa%F1nRh(#Ty z#s)NLC^a3V7@JH7g|PpjuwJ1z(G$|GUy!as6uOv+yxP@9u`ED$t;j#oLo#-?zyUDCZZ>N-jvh>2eFqG} z9&xmEKOmm_DgYlA=#}YPA+3gCNixrbVFo@I&PjGl0{2E}Il}}KOCv5d;hRC-4W3ca zt%Xz55cnZ^)^`P>3K~DilBZSszlBXwEh$drSPeZCWWqGIp%iLw2zNI>bV|C_2fH9< z%0C=IQUd=QlCZR8JOx1aV4gl0w~7rpU2OPn`7Xs?5B>}0iv4!IpY;iC@Y-gCD{m6@O|Y;pL1EV zAKtiZ|E9S%4KFO}1km>({u*;-;a-@Qt8?Oyz7{*wcB-vOhx9PO9l}s6Z!AinA&lc$~zO3!MpqSU9gJ9uUE( zhr>Y6E9f$dz@XI>AWc?=He&!sOS+(thjV~blA{V2THAtVibfUvb-TI+_1Jj~_&oF_xmvxO1+Dc<{n{E7IMY67nJ|u)sH2GJS zjm~?xPfisx!OufYC3E9ZwaYlE25B8F9Kzb?0~=c%oZL-SNVjA#Qa{TN@~{mbGxtH=T%+EtTS_UEJS;&_e@0QxKi1 z)WQOR9t@vO(bpb{S4INq&;QU=mMCA4@7p2*b77;in}UR@BOX=Xi9m zZCon0Bj&L zPT2#n1iZ9fD}mZ14lVlT0X*e1NK$hc{AV6HR%A-|dCaOETIeNo1ng|wT7~JHjDn2? z1CcEkH^eYEXT7yW4p$zs zg2HN)#=8y>hB^A_r@C2oT1m~3BkW6{<^1Vw5W}9vX zfj*C+sOl({kl_(Rfl0>a)`<%_ANkgy$a~{D7x3z$=}hu=)Hb8Cu68m>FR@s2~*DpgDk!R78SbUa|DOnvtyeY2cJ25h6TR5FPr zz6?kXQ>x;MACJ`!%@qU$Q9#BHWVG>opt!DTqxQ0f!^=MJz!Uw{Ip+#bG^89jq{M(R zL{!3IC(wV>q41BYSDEa$xYNJ9`NNkt;m>YR_4&tLFg#eT8&GkX6~xFs zVH^csn5Jj6*xb_nv_%@5^j}G-j3PiUsI<0`nFu8XE{2!548m1MIpSi|1RRY9UBOc+ z*j)kFLrLHOo_$fSlk3k|tnvnDf__e^!X$3CXbAwnoJfJi#R0BR*>8I~*d;!a-BF8XGkE}6PQ2h=j?J3q&EoI$v?F%H<^)1JO4%vb5MA36E1c`C zVWU*N+C~%JiUw!UhG7+zinjQfbDPe83#?lMFd4NE!fJ_Zf>DHO(?6NyAWGv;;RFIK=u_4c- zEExwIGwVanctyuk>X$Pi$3!rUVQhp#14^P0U|!_n$cS$YZcA2>1o~t=fUWG5j!0ap zgmzMbL16*WB8+Bqr2~~0F)rK-rp!*?m%#uVtBi?@c3m?a@T;iVY>vn=mHS1e(RDhw zOAPh;AxH=##KuOW0aDXV_NUQIL#%SSlVh_{Ypn%eW{oRcVBV8lhXbTsuaT>}F8S>4wFlx|Za7~3<4>gV0 z`NRoRSOCz~{>O+hwJOhA?TuAI#s*r++u4RQ1fHB%Ep!8#IhMbv};br3Y(S*HRZ$v1Z3 zqrM<%Exvf1oHtN-SV6BmQ?rgJ&@r+)B2-ngu(f_Ad?e+&V3^-GH_#njkowmV6$KeX z!9?F8R0>mWm_cuH^m)~3#e2dvTSNBSkUlzu!b1&~f-jhdQCvf)`<-VV7o9uL_7gKy z3k_R=5BqX;y0p&*vA80)n?)YH5SjZzI~Gs_le=Mr9~x^Z7(fmzT#Xilq~`)ze~@I* zVCX}G`{BiEaFq$|!hz3?g^MO0NNfdGmks^aJh+*iHe8b(!jvwky5J_!QA|LPYJl~Db&@iuw8h0Xf`xRL&8 z!_7<<5draU!_<{Z|7e}}l(;j&&w`PpoPqd0y5Bg?@FtJEJ(rwUX*8EVwCCd(DsVDn zoIS4RYhjXzqxgO%9Ljd=`nCsp5VYz}CK4#A$pAA0h+auxA|N5baOF-|UsXsr3=3jV z3ifYed!LHm#HW!J^x3Aeh*tSB!Z7*e&id7$r0Fo}>lh$FJsQt~jx*kB?|UFq))bDg zzHF{S%uY}tBwkt`L6IWCJLO+=C&&|d>f=CQmK-bN70t#BB=eu`SM?=44g8W_hv9)8 z9JSQr!w>@h-`nb27)ZT3W&mHc@P&;=D9lk}?#sj}#<|>eUl7BHpx9sn5L!$#2DPW7 zSyo~%{dj+~zS4$~WldbM=e#$jCj5!wcNaePI7Bh$qOAr_uQJ@N&4Em_Sj+e3Vt7N`~DIZFk za*4xY_KhaWJ`#9DtFcjOw?jN=c*VB{lS&nXcH|Tz+j?zaNUmRLD@^CW#E}B2jU{na z=oP@VgjV^1{wF!jk=3I1V?oZhMRI_B_&IQf9I~wUic&jBOhuTXZ6W!EIvw3{7MkV> zqw~ZhEqfAN-!ic%MhSvuNkRjNo*vi zk0v|kqOS!3j{`|DOa(SDGF_4_Lb;N}CWp161^~T~x1y%Wjp1o<-%_eb+BmK&M?!cQ zG`3`cZ(TQl%VdQmi&y$ehAmS6!UQ8B>3~crFaz$hXxsQeIuj<4MJ=}^L5qjpM3s)V zMMzMj1J$gTSSw*z0V2cH2|6*i_}GLVHA_jZ%>q@~i$d^5E6>qW6^2oAIFeB#zI$u4 z0Vlb0=eZAE2TqpSh4}(%RuwmlPpE@>tS%~4w7{g7M{UQr81n?g z(PWMS2v|ss4wjO%G9kttMonnsM<7%?G$yC4P%Cw}x@)Jd8d(d&aBw-El41ckagteA z;}h!lDUyUTe@d18+?-vb>5Ey2B<-r}$>PL86a34}gxoV9(lrEYM1{mYGGEyQ#ij~R zN95(p)PDo1I|^yLoJ+ok<+DJgbRcHOdD9H6AGw#4%}qGRG(Deq=D*GQ4}fN8ok{ZW zHUjNRnLxf;8Jd7*1 zT$-YOl9&Vlidxl!_n;{C+Cu0?g4%=LBV~2H=eO$_2D1R$;8mmYVRIJ8X?wv9VO)*G zw>MTEszlJ;h%aT5X?viD(-g7$Fkwi<%&sdlWuTpO?xIm6mAQ(FRKp<7W@jR$^m{L0!Bg9+;RR&z_?NxN%2=Fj zCaJo(acog8Z_M(X4H>|{NKSC{5QkLPI9JRlmBY`#vMYT^cn#+tF@*3L;e?PYx`vht zD6Y1`1~_MS>1b!>q7lzNC-0U?Ot)1j!)#mq^b1TB&jThvsxpTRF1nw;j?C~#T9#5? zE4hrn{Q~RAiU6!7IhvR?`Rf;$tZ;Yqs9`QYbMHh1n#4bj9zI6xZ*H6NbQhP5bgKQ~ ztYL=mS*ePx^#0}FYiqaaKB_M~XK#Fb;oRj?rF{Nu>B*(i!TT4^oV(=> zvTt_o8a_UmI@>ohHSuxZ%=n|e$5VadQ=@&4$DjPZZ)R>{<_y4_oqTkn@8CzLu2zp6 zC2%v3<|Zd*r-u3teo~wI-IWU${&DEy%%k7`ZcqT9`}E<%`;%9mm2Z{r%}suL?C_ya z|M2l=XaDd?<>OC3`sR=0k8cb&4*dO*EB7W&952<%kEf@G%9oDf)7<0P@_E$KemgLE z=~8LtJc?>BmcA%Ie*Dqd(l-O8FUwDEl&@bb-M&zI{8{On;iF?GD!6d!VE?Jox0PeZ zr+-&2eKt~>I{&zI>f2KF{FUp+@XhJz((${c&&En<-U}T4)I>wbmvg|%1d?qVxW-`U zJ2c7Y4E?!|wk7S=A#>&oSurbObn4w1LOa-@PJ1Q9WP}+?4e5XR0rqL8nd+$6>9T@C9p_9*ekQ7tSmdlk+N1P0`;P?3}Kh+LyX3H%1>FSt}_Yn(Sp zK7gxUf}dQQ3E8f%hi1n=fC&p%VPM*1il0%DYl#P0vDI z#?n>b4J18j_7vST$jpG74ugAhvw@hKhD;-A)ge|*GM5ZzHO+oKbIg9|iGq2%`9@GN z-fAO`x$>$5kC|-c21}+j=*D`V6lSD6%SH^bOE@nUu)B8RoC_^!R@Q-)BfUjXtpgxSCA^IvXM})Vx8er!*X5c2mj7d957X$GUgK2XdFf8sm+a)4zlLV^d=C^anSKtvS z`ryrMIQ7VQ(410nFADOMJG0p#9NEF6FWiKFS>_g?oQmblOw}9H0pexYGRJd(3YcX) z17 z0dzz|dqK5668m#w$~yB$I2{U|Dk*+AhU33`6zAR|sjzsm?k;BI5Bc`#a|QGy2ywY8 zahjJKt!1?BLCH1t4UBXZ;uT?hDU@SOi~qrlN1p!gBuMPFB)B0>(@2MXZ51xtp^N^()V$1+Lu5V}$&6TM^IxYl{o*=-JeKD1d!jG{e6ZEpza_99xD=(;I| z7IJa|2XYQ8f^AkRJY2B(xnheGsaL{51;$-w%S~p+rzKK@A2kf^V}ffJG55X474SGV zZkR`!k+3Ih@G@DB2s`0yD#Npz+%21PJ3G%!Sr(m5_j8q(*dyzU%+2D%i8Ou;2d$); zJ`9iP*7HU(=eMA^%92zwB9rC2ttM1sd{sr~ExFa|w!U%K$5(f+I?d-BJGb%dT^=EP z#-MckK1K%*|3xoEAmvq!=oCz9%lau4bX&@d{q7#F=mgatYM9Dh((c-Yjsq<3HsZ7A z6d-Z!#P@y~INXCWwYu=%%MCsG9=FKG2#2oKkC-0{;##>e+&_8U&3VI{^#)LvId! zCi@PBm8#xOTf={RL>@~MgAK#yg!hkf1qh2i#;rmR9cpZ52X|98QKl!(Py9~r0tTyK zpfD&o1@bVp1)v5JDGc1K5lO8osdfni*u)aD2~n>}omEEUF%UrlQOTBLP`P0$a_$*ymW(N5_uj}C3B;&FpoHY^)9Tno zerQx`d!tHmkDX$C`D&%>%mgHgOWW`tx=`yO0?tV+;pE{I6&%MfQY7-sOMYI0?|f&y z4PL?XIIb>+F_eiT9o%Cs{bAEp0LsNUwKN^8e`2k&300=a22MCo;4xdMLG2*5hT%>d=>XhjP-&5EfhY{J@8Oy=h8~Ci6(yUfPId#zo(IPy8%P*Rh#-QYYzm&D z1M>?BhjccvLPl*veCk4)WE9kKsEP zbc4Y8Euq1TS2to2_E)f!wAtA5EdpY?WzZOS1rp-oj}E3j!#iy0=OTPRxq=5C{ExdV zXsTz&^Oa?V&I0J#S(S~TrvFOlos9)DkzP^dqabs>Gn|nvl}aAGpEAF5CKzVWV%D46 zkY!NfgdOr^Y0YZTs>hO+PM3mxrM62fuB6-_#Nbwim#lQ+WWju z(V;y@fA(I7o<%b)RQ%~ai5Zd>0f(OykFEu`3~B&1WMNM+Qu99Q^?R@_LE!K5e#Ha927 zG>9v;(0slU^NtdHUQJ&NNo$!0IE?lJyOMlgX)XVmy^4Q%uK$8o+s+F=TR>?g)f)3P8& zZj*K#T&x^0g8{_N)`Ur71iO)3_0i7Li8%`66?PRGS`3`8?SEEA=in7V1H0x9@B84u z{1dsr(%Y@qB!JAb)I*ge8z96=(zhFRX2m^CyvhtBfF{GeBZdIG3mnlmga)<00em>P zT@$`}1dGw!N1GNTq$**?K=Q_$JYK&8&rcF>1b!P^)_Daxk()&h4`<@7I5HWUm#o6M z&qgdLW$&7rk+($;X=-itK2fqt$%870;GviyIKtzDLi3uAQ22X~P;=q4djxB{ zpD&2}EsV|L{7ce}qCy&+G(8(A5dJwCE);=Pf}XLtW$eDv7To%)5d{01Ff89@*!UpMjk ztKE;sM;m`ws9*SE@wPR%?hU>`gKu~LX?%3@k4tE9f8qYzw=yz%IX80e^2p?c-3LY| zr_R6pnVter<$jXYit9873KX_;3Gk`+xu2iu7!4 zqjCZC$F6uFlne9~hoD}yuT$a$cpw+!(S#TQRO%}`ZqmD1W8E!q~L=^tVO z&)fY~n5Lz`eCc(l5Havq@55>d3OTcl`la<%7NbC{0^=q0$;J9CB{axi$XWBHRL+1u zl#QqLn?aK);=lp4A4^cN`g{&imCUgF0|Hc$P7aRhIx-eD&%UwY_4dYA3$4GbY@O?K z3GqH{G(|a&`kDIq$`7t9YArv5%=oMaNA*SAxBAjztCnyVSSnPjZx%t7E7qR5btNS+ z?5i{k&_@k^0bc-J3&I)@4@#tkaAj%aC^xGc;>RE^BZo*%z$*;V>~(Fx_BxzJ5Xjny zlCO(UWiNt&I)lJ1R#!rDco{gnV0fn553miwOO`Q{@DS63r@6zZ&cgD{FC7-re7}uc zxyU|V=>KOh2>QL*Z5}|y9>{f3sN*SOYM*))pKY)+YG!jyXC@QE#B?HWn3*VG%e@=j^>>{a zx4O$@P$)yZ`L3NvgqU~3A0hh0^`|tbA|P)L^=vQw@FJCUI1Z^#)-e@`^n}EUSj&(P zAIQ3KoDV0C!Ld+)RaF)jy&O9L8ma7X)1Nu2fj=)h?N>;E7ou2*UfLj($HR4h1V@54 zf$Ad5x>z7t7*qOll}#<7b}S{mxCzT4(HApNSOS#>79%3NMP^Bmr*(+9|=M-+XV8RAXBQwxa!7W zd~NXpOG-)zEaQd2lCh(@p(`m-7S)?%*U4EdMJCBV!46~y-tuT|+R6oZjq05ZiueTS zSLekG`mB&q3=St2IScbGAPQ;+R3eIArVIH(5~$EhqjCHiqKfz+U>o9wslJLj)nXJ1 zaDa+Xyxah^Mk|lUH#>=h0?_=TI|Ota0ww9a-zJ;|yZB-3Of?(L50Xwbmt5`1w%rvG zH!c}ZC`{~|RY?IzcF1fKW`*^|#Pz1Q!}0KZ1lw|zplfvct|kAWMVjJ5O$RL6+Ug& zzn8kWTuVv-O~2)lXP-7J)Yi?Vx4{bJL&B~_0f&bTD7x9%LPSzh{W-ylQpM-Hz*qF5 z_mZ#V3qi{P*Ej6ARIExK4se;X3!(XSq+7`+y{^i?xkol1m^-mD#tNYCz)c`d+WWv9 znyDxfzQ~h!e5UfU)BFam&R|bvb|_Z|S=O?1*>HkTL5O9{s(yc=I67`~_O>CsUi$gZ z$$WVn8Nctth41}AVSFSlO~*&>rNQ7TLfs%6EIfIFJ0j@7(i5bq;jlH~*0hd}^_z{a z0`lG#8NNtit?;OY?;(*GmG79OY^Ow9M#JS2nWB|FvEw4nJVi`H&tH{NDo2LMuFC95 zuu;fz)xt@dk+{p|61g4DE6+Dx+x#W$2oVQuT$>94_{PhkCPF!;?WLhre!`6@W$!^k z)>xQ_;toyV4V6L3NWL)V4yzLKhxaL)#iWhJT5rY4K_Dc*vq@1d1#ozY1x^8oj3mhs z3_?XCN+ewpYG}(G-&%V@%kk#cRsry^NGee#8OW3k%xc)fMlw*p(P_4ul%8m8gsm0# z79?`r%8}|-lXa)@BGl{nKY*&amWEX+EqT+>5m4SEZ1Ym?6rJL(A!Sk_9{7VCPKPQU z`(#*q)z-8oWDv{31x!bb>L9nw*RPUWSk&-=qL>&K#_n5k<5BnqYzHZ5CE*)33uM0n zn0YAzNJTNMSYmk=mSV7L6@zWY(k;Cx-lplcI zJqG}I6G#?ecQiW#p(~u28w|9^JVY}F_JJr#=6rihO3r(U@dP_2mK@`#_3ug9AsR+wr^oogWjv@jpTRzbwY=0ehM}+jWlG#8uqrr=M z9;zJx5J(TabW^HWRKg%_7B!3J9qde6FGkivOCZ zt9v1*(FmDnq{ImwEZ_;wj_B$@d8hzjM);_2`=Q5NmkvD(AnRJ%U1F!M+AOhU(M?vJ zR-s(It_VlV!jg#pTJBQ*#tn^&m*nn5sTnUc!Lg^>T>2Ii01^u$0~lF9fT5UmeeLOm z2e4IM64kEao07yY@-G3e@?=5gC-5{gIxd@I>8UU(yXAL5iqdHALzhE~vL6Bv$>#x@}>OOCEybpygg6oG?plSPzG^FmdVb!rKt1D3v=?7 zx3=n;oK>QP#Cn-I#4sGcn4e!$Ftxe<6S8`8B28fF)-xTFx(ujA!@j&wKkK*7_{Lq~ za8PqiF^PWc2GtPs+euL#k^w-RIhZByjl&J?l*)&8;yqS%AeHn49By`gCt$pGVCekf z^xgp)GVx@t2}~lOeg!zvP82jiSnf~G+evYXk8ynK^^_JkIwD-M-}?#06SmsKOg>Jr z6C}ZLmILaUNc)i+W11QS-x9Yg4tpK`81@cY;V5hy9$z#a_xZ0Zgo{A}zNAU+d@2U> zNLM`8HDlG{=vWn@;+FcE@sd$r^nZybD&jLrS8k{^= zJXs~!W~lZsZw*qN3-J$RExu_u&z2nAK!+y3Osx!)^_MgVL6L_>>$IZDo2Z=0_TV0j zSja-qZ>+NZz((8nkiNv-0o0~gH|$;2ve0uWCDseIg2ENks}~l+)rDq(I7_4OSg3RO z6_;9H6%8x_OTITVxp=eCgY@SvQA+Xr`0nU}WX3 zK7~|cKD=N2>42U;ak3E@vMNLS>#ji5SB0dYRe01eB+?g7EXjWK33n2l#m|_tO{4P4 zwo5ScZjf~wgbIonJj;C$dWcepU)Xw`mO6@UO~_ysq0qe9-`a?rHOK-sHwX$+>^kpN zZbnE*#p}Y`2x3JVZjZ3@{J1!*hr;Opo{#7(wH10Aw|wf zFafZU{#Juik-x56IuA?h;Ru~yveHAH3s2V$>-P@o*ba-fp_36>p-mLGVYvc~w%UzA!ZG|% zj*H<1{VSpV{pLD5BG~oMA#f*jkFEwZ+!@#MbWNC$>sy9>s0S@kL$vo#4kMp4JZQ1*PrR4@w&L=3zkqeGf^d_*zNwkDGR@n7Ie1>kHzr zY0^CF#z7F3X@J^=U{fuEh|fw?>{Y*Ppf#L?;!bUrt*j}z)3p8e+0ZZG#p$k_338&@ z(i)CM2_!P!vhe~@!CG)8HET3N0PahR#P$6&+hUQ!1!JhfRivQE9bM4~q6cggv+6-m zmlVV3%-uw{LVO4#0NhJ_fIALI>&9BvctArsZjh~Q8JN-Ei_SWX0Um>bkmaZ5lMN2= zej6cQr~wW+Sc>G(=r93)GF@EgljO_y6#c!zK!X8_Y3o~#h;W`hl4w|gLGcIC3*z1d zHnIAt_%zO}x2b_;a6lk{iry&JD1^6!&I&MF_93x<@OeR(H#mgu#kGXKV~0A3I@DP< zm%%aYfD_OQYV-`!sL%ggI!^bOW~(Oe(Zr)w5RG2`gwx=g-`wo{1krJ^-CvSe6Igon z!<=~Zl4gkEpS;#jiUNqnPzLU+jR5~2a5MXf#hGzo1`lzB@%K~OfS@%X*DIrWv8$$q z3OJt7AJ^{owx2#zI4DMX8#|I1AwxF@E=3x1wbP-k%+kwN32!pPBn9d2 zx@a}{_phPS@O%p&tuh3fL{d-)I|HQQl^bL05&c(1N_!vy#ep5V+UO)iL7_rN?%)f! z1IG|x+gWrw+hr&ck{7c%oId;n4gJlnjEcC_Ud_FV-J~UUK;`QtE{Fo$vfEKa4cHd7 zp~AroXSPBNG9niY(cC8@CaXr$=55#*-Pjm?9BJF|J)JImtJD;>isv`eOFeP{C(yUTyhMp8?~g6$ zuem>eIVeo!LHHL016g*20WoSvO|TOtQB2+9ZnBvQuVg&X0m z$1ppY_(06zK*g$J}tR%E^>DI_;l&7NDSRo|n`iNLI`Pe!ybg+rdIGIKxG!N8HF|L5SB`+GN zFjdB|anYw(cAw@UROvje*TsEWbet-7z{QM!uz@4BBcFYvm>s?xit_LomM}6by0kuL zxA8;|F-TP6iUe=wJphEijS_%nKvZpBZ2^~Dn`e8|=o#dfkUD77Qd=)Pib}O)QQ#%k z^)N=-pC$o?DL{85?pfNsU4kuLnT^8*sHwSJ?Jdc{R@t(0@51>OdR?4G?&OAp@t@)V zhXJg0Gkm_@md>kRwloaA&i06)x8mL-BEHuIb z4p7id>0Xy>-fvE9B^~*cwv(#f&H(n!CH-86CH z%q=cUb}&@7-QJA!DXt19-8Q#kIj*$`kT{zXop4ef)+^SZakx44#x^tngp^>XU{uj$ zLacQ_NlK0w)N?nr*k*=v$PKOzLx z&3gYGDzf~J4#U`m+#OP*G3S!68!O@o6Y^9A2C0KQ_Jn)!R!p|CwZ2T7+tBeu8h8Lz z`^%s!e5~#%oz|F7R|1;^fV>1h;*k z07fDn;~^3As7)&3BGb;;{tYMJ@_$VAb zLyrRB3{66-0^0BvUBe-bQo;uFJjQ{fKZF`Abes9%$TeD{=p-)b|g@MAhhY+Y(9iZ2}9WqNWWB|k+mHWzGBAoAH>VM#(pJgf^vKV49a~9B)_|mw|7K3v?9eb<=)!T35LvZC%~d&{dVYK~wL; zuT)RhZ+Etq5!`#NO=k^~<@7dND81nA45bYRWs?NcSUvRp|NfEWdpf>%?}7S}&$HVT z&2!_~{O2R%Gug%cw|8ZCcV~AOc4zY!cW0Ms*_GciQPbk${e_XG2YW~E%q`rXIo+(y zFW#G*{ra-+z3rS>t3Zhn{T`u(wMsJQt>_OJhI*WP{q{LP_}Z2WjOaWXqJdN|v)k?q=ZWNhz9 zcI3P7E{tSf@7r^Dvi^_te|&H6p4yF(Y%bgP?MQa=IR59$gX0fJKR9r#_Q~jbBiZlI z@6OIN>y4A6A7=Fv^$)W#{!gPhHgS9p|Ns5`kJ=ZX*59u+?$k!I`b6X4;jh1`k7Som zjxH|Vxqt3N?fm%@4-Ws+_<=JY@PBIKQ;m}&+1c~EKOaA`yY{dD`t`}<&3`)a@%yK~ z{}6wj`r*T4PhX7h8Q=B(hv@I(vZE&^#!pQ&E*%?x?}Hz|ym#!=spe;U#!npE z^*)+3?8ULq@nhHcmF#wQx_RLb=W5yUZ$G(qd+bi<)(7wJ-IX0ZIdgdG%%S&Dx%5>1 z;BT|hv)RO{BhA^V4@Yo-roYK*{{xW1@f^9@*!qpP?3N8 zhe!VhsM+68JyR>yI_;V5EFD!yCgo|UitWIG5#3Djx{$A`*w88sh7NZwZ2Fk_UCNyf z&7Q>wJY*sDNk}S-m;#D7&){y5EU07}cI8TZv3hL_k!>w763{}h800r-Z_@XRn{rI7 zgw0)+y-gC#e9r_9lJY6MZT7kk(Zf~wI!XB?p_#Fh*yh6WrN%M}zHYTZohqix3>KVj zehw7Bb%urc$ILC&lPgV3!Ybp$^!=MA71CNd52rUjKf^eYWvCrL;wt8PhoOVlvC<#G z-=D%^4~dfG8F%mWmf!|tJNC2=a0*CN9e^V9jC%_(2!QxE-r#Y%Evl6;K7eWieDU0z zq(Nb4cxzgE`?23j_c*^PK9`|Y=>*S*J-NL7eedAc}?o8i>t65m5^HI4stQ#pt;5#^c9^;R3Fla3;Ed1jXJ$57=j@ zfvACk>-Qu_{7M>ISd1Kln6)N+$1`AkNnjA-LX>c$gk)*p5E7&`0oIs45;)^?9f^wL zJ1=pohuVx76A+Mo!~J|tLqN*Vr!endxL!na+vFrkn}Id-CX@hF0QHiDm|<(Mm-tgo zl+QpXHb4PZP&?~RzTD_MXG$rOk~ae}<_`#a#1v!-I@BLG$_e9(K!h<|l6e7}%d7=D zI+ROfJ_8UCTZIfxah|>;>kloEQKLHmyG80NT*`+zj_5(%R5sY#JI)Arz(k+5HW+9o zsZq9`QHtlz($s|1BBl5BP1IwR{?y3fc&kw41xvLi@di9&&!jI9CFWVdgkT!j+}6AI zgo(jkE^M$?jP|VH2=mo6E#4O$ueu)DH;B)($g0&w@D=pb4lcM;-axz<8MTaS6erle ztfTxvWbNEyfvE0^;C2$eO454l*2~1X$6lCj4ajeREeZ@ie$orB*$HXgA>{#RV;Oe$*Nbcn$ z;1MC7l4l2N7WOK!eW+3nOu-|hoeBqsJC4D&pNx^Mx`@$4t1`FJ*S4itc?6Mq;X5nsWoz3E! z;>taH`uH>`HIZ0A$5qA%2<5nyANvmw~Q*biHvgDn2rXk=kM(ZC* z@VO2ED4T2s?^^iLG+BmbS!sugY`nH@Y4GGx)v-(_pfWOc9+~XZJa!ebbLp!PB$B+5 zYw0*iH%(kzYQI1rbZ3o;>F8o%(=-={tRPtIwIi&?ylf7hp$&!)=N`XemsRlam=iiD zE8im?&(q#va^-w;36>KVuo)nyE~vRq14)ECl5zkKSy44!+z%v7a$4vFl0?%uz{utg zlAZq=T#u3wbz#XBn@f8ZPaY9Z^V48x=q)^{D+LD=5)(<^MuEsaJoVbTo^M-VbSNN~ zZ{5wOB${3>oU)5{52aQld}uK#B|vVU7Pwa={y-K12^sKXgtnJwC&J5)oysDWW(z}6 zApe>kZ(<#w(MiZT_@7&~^3Xz*7mPz>M$DIqRF^zVCfpd@BnJ~jOBRI)RH*5vRUm|e z3vGxSV|il|oU(oS1xXB-6V6rSByYhTRqCzcZkXO%^2gzQyc37i?%u>BQ%sXnVf6G{)G~uC|=t^Qlj$OoU zCU(Cwa#OZ+q!2l+G^*640S-}1*Zn~xFfrN1yScgTLR}kV$2kZDF@^H_6Nz(7(AjpNn+}h@?ghh6FO@P|WQ_^MCpnM@flr`9mF#L0Pcl0}4P_#VuGz>xgfIPZ#kv}{haz8~mQJ1s8!w_q3daijDi>fJR@A0i**S6Y7uDA_>XkBbY`T`h%Ih#1gHdx|XyCZ0Z7uH!A z0npHS8bfi3P0^6(Ay_qI%boFcR@exC83Iv2+R3;7pABuuN|56Mr~N-S%2W`T8C`l( zdmy?MObjHFs-KXU3qBBjlWRhy5WAWwB_wKjTE4XXSQ1V{0w-UEC=S0H9M5u^0=?nk zk)+dbM>;h?Z4&9*&V>&vmj6w=$Ah&w3TCcj!(c&C?rStAUisrqK1J+af=4 zqbKAucarDrc##a<(KgQuFI4t`Wl~v;h?p>4B8_m64fx(Do(!NZXd?8oH!gL)g}L$J zFLJ#Nh&h$x=ILiphJ~pmn)Sb*2d)f)on3Jc6VsPEa;^ktoV|17guYfsivAsJ>H0J6 zi?Xc%oTM0syY8`F-kTX>D*SQ$%v^EYdi!&jS8kXLr-N3|Nnl*`#08vq8`e9t%RqXy z1?ge)S!)x{nVaUMTL@>~U39oQ+v{y;l4-!m8xHm6sY^^CiBeC~u@sja61%aX<2#6v zNy3KL=X9JQJ4kS)wxHNdi!VgqOHb*>S+D7%{0O>XJn5f7QwuAnW zZPdf1Q4M*Q5LyPI6FLjQq>M7E5`ra_$Rwkr)ECKzTCdyd!wLDXV;5iXMSj=fT)C%&xAzicJ5R*VO62+sn>n(9d+XL7MVBmNH$(&{fTq1Mx0`-0vMnwFCnO{2;K?q`~sEy>i z6ix#yLzEs45A;Vz z?S`>UC+7vI2|*rV4GojPKu(k97RJiAyE1W&y>(llSeqzo(*}c3GExbg`k*%kS=hpQ zKA}I!nwVrH7&P3KBYvs{z$@9(|ZB+opOn?B5%#0HwA> zr)ivu+E-_}6!pMV# z$Gk#;U4|7>lA)v7x;D~RPW#9Z@)N^HX&=p}8@gk!u~& z_f3K&+wCRJit-}=*F?*NsOFTI;$XSO2nM&;eJLiI>LDc=oYH?eyt=Scccn=%IA=!eMo2}LqBioo zoMrf_&8?*D`oy$H12PF9uj5InB%5!qYb^FU^Y7CXDyv2kf>bmp-1nE^P&^~d?s9G- zXgzFR5q(7SpoJ`7E*Mf2JP$CLNnq?NiAK#u0BO&REik`QjC7}JZ&3w;&e{k{iz=ky zx&{fWMfFG^ny^C;^Rejq*5En5!uXU08LXl4Y4N&-%#YG4dke$y_68k)evw2HM2jJC zy~jntVJISQ{0N$|P0TyH`WF|T! za|?#OJGqh)W@%kSP&4q0C6vpT3Ir67WR7pXQ?M*kNbQ=!gWvX2K|~g;wGd{pjICMm z3#{=Pu!Q_GIuPax%EJ`q>9^Hzf1S_HMn*A+S;xxrpu4v@k&fOCU_&l9gE_Ms)R#e2Teb*54m)kp!hcQ^H@7qzX4X{3xh(9 zLx(x{w{-|*hN_>Oxo~u%Rp&aOuaLXOiOOwYpFqWG{BFEBRDj>+;fx0x!$JQ7ost*_ z-DE0yEvbISRB5I+c4I4m(7M{-UEbW_c%h6b0{S6*#yS!Y zPl|g*fa?N57lm{&6s4YDEM3~}qNgBS3Af_->Dc;r^|)52Hb3I9y;4}Sax?&7&>#qH z4=TVQP*e!WpE8NmDkbv1;-*j*wjJ)o$v32k0%^oAu&=&oZK}#SK%#XJRP@!5mwBb) zQeA}^%leuVa0XDHH~Af^SYpSuJI+Zz5towwDVKyMnp-`NU^7YVborU)uVh__Xo9ZQ zQm6Y@Ionn6e9f4k)8W;d3;F3?Vy-Jk!cr%GiywNp-{T+BQ)p?qvqaFs*f)6Kb0G1S z0Wd#f{BY0bXlc$!o~!8{8U{%dQB5X1TAbOi_7rK84In{Wrey8bkMyLujFre?>Fczg zi6q^4wenJ45v(7+7?tA4F8nXUs+fgN1@qD}OP$z<5;x1vMBFwz>bjhvU$775Nf)<) zuqjQd*vM8T8jb6FvfXaE)>T<~>*c&M88!G>58Y4&IzzBQObSf=$b~t|eZ`?Q{vK z*CF%$MPd3^2UjH=l*$hUgubqZL`sk!{z7feAnoFeU(-{JNc5UH6cZp(c9YHv`>i!& zRr+Fr-)EA+tDMqHqV6}gSx3bio0gNGfv0qxMDD=~eo(?kNZsXzPTiPzR1=>V!JJSV zfb6g+NLpT)1RVwyt1N8H8u5lL4JgAQ-g=ERDD5Y8wdyX25{EC|#Q*~y3gL4ZeAj&( zLD)3!0f=G?FSoXM*?jwP2lvXY;tDdLA`TNF(48mD)*(^8TkMYB2z-T_J&bd}zvSy? zDHJsg+Gn$V70G%ap}eNPWnM*I_n1Qd&)x>j_bOAdLo?acpHi)A$t7vwS)zUjs~3;W zpob9u^|qw`gO7`uK^yf5swz~oDR zWJ3)5G8p^x(<>p|LUf`XZH4Kz-gM!C#Auh1>ksX1=of|MJMk!XTv)3&GdIjCNJ5`= zjA%YtP}?vBmj3I85hdg^l)sEFr)z=Z6Pd`i8rp|7ScQiMre7%j7mHh`WNlkYUlMH^ z1tYN$25=!2==>tE{|+%M>`0r~2IfH#UmHDk5X2YuoxjkZ@%3t;G0;9ZRZyGw*1)9a zFa=0#BC_AmEfqmt&PzekH7l4tjlD&oG~XUFDYlOx3Hm$=w}o~p;o73Z4sif~wt@Ol z5eg|H$QXT;p+W1E*9kG!&3tnm(=cWoehu&iy~NE8ZFub(&@oBgMoBoqk?>{2j?ygJ zZ!9_lZ0QW13DODNjo&l_w+VA{qke8~Zs6C&A=CEnJ2AS%#}iFhLkAYA;T#W^q(oNSdqqXW@wQ;)lG&G<{zFNVgH)z`6pW2}>3l zo&65~ps-nCUb+^(qX#k04J)<*5F`JxJ&))Y-%R2NwSv$9d3E42-6H2HbidMhly+HI za?rcjBmYa>p8V{4X5`-SrYI?LPD&pwJs~fbvT;15Xp+uAGmtOISJQ60D`$Q45id2JN>JBFR zg(T~PE!gS%C=p%tjdq;^umE1kn{BOp(_Kw;Ls76OPzVtsBA|7)-|OE%&1-ON+J9wr zzRDbP!K}jyIFf7z4lx2D>+`&(Cf{2autZj%(JV0tHnwU6E*?!e&PF`|-u~-LNGFM7 zS|7abuAQ<&!`~)hTXaI0-bEeC`ioe=k^10t?Y=i{x*EtqEAY*a2l3-|r;Xz<eEUkXqFo0NtzzuFokWFlvcBRBJyhxp z6ioO->SQi42`;J+g)FCnPMoAmlv)tG&-&Bvk7=o{W2gE#8SVsPoO-$ zYJ+-cIt!-oM_1ye!Bs+F%nL-J;r~!|o+?75=|Rd4+K%B$coDqzEEDK^s;XW+k%@3u zHG)%?Be-IUfT}V(`q|SX%J?Ht3ji#Y^2NFe_KAuH)iFrgg-LPt<#KQHUi%3nn9yO9 zNgxn{q*w1Ps!P^l8<3cOT>e8)fq{gX9zoxu9Ej?)ko@uk;hA#;IA9CSUsp7@G+FQ$ z(j%`$7iJkR69VXL_|U?YCm$!q*CcT@LvH2ln~W3OnoJ(({tQ**kV97b*Y)f?z|EdP?Tuy%j43du3{lBA91rkpJ3oL&Hyu zpuTYhJ!ziKKmCN$YQ{V3rS*$~FFiE0Bce!BdA9@+on!-5Y&}q>xvmvzX}tUI|Cglx zM;`fX@4f^3vVR;IZ)P(i$4+HmkKCWXKRYtk&Hia*>P~iHWNae4@X7qW%fHL!7Zw&4 z7w+Agz5QQ*lYPrl05fR3Ff%f9ZSMHU?vYOqOC4Ec^PS>}GB5Vr`*zuQorv2NeQtTwgd@yI;FI%31;6*A{Q>l3!!ljoSR31KIrj z$s^hHk!=28ZQ<^Gqqe`1E!OVeo&CCYe{ODeZthm?-tm1I3J@$@t_$Hq_Z z-u=n`k3Kqe{LtC4=E>>*l3hKX?fU2QC(nF!df)Gm82@XO8u%KY?>Uar0{0i^?(h3A zb9aA#bbr=3xcl?{BiZRc?mjk>o%!RQ&yOCSx%}aglONVTIq=@^XAT@Vdh+Ph%>V@TvE|JAUPx_kMeFbPx0P&s@3j;J{Z`nRx%^$i4du_fG+edk#%a*3Rtx;LyH3 zpX|@h*X|!ance@kHh=d(GrNB>oBsq8yY`#x;vMY4jm7NDxwEZL$KT&m8~X&~fB(tu zPa5Oz)iIamS^oXr(c>KH_<_%+{u{?>%w-Gr@7y~6(NS*Ep7BqcC%zbOoIQH<=t%a_ zo+Ag2j2>%bC+0r=Y+ttP^qJ4`?TLkvEZg zoBDKjc5r`o@Q)`>{_fM?W=BwXA-lhHeSGr5g^Bl2o#4B@ zv&Se%wpMy*76>jXS)=5qfor1M!i}BcH~Mn0hV%xdSAD3RuX_FG#TUY{JO85h(u*&V zp}EsqMbVUgsG8sq(99;QbP6)XNqI8XVDs5)tS(e^$bU{WERIR6Tn(3E{O$YgpX83l z_|7FGB)F}pmt zjcpdWkk&9?44~F|rY)#+IR{dCW}2#?L3o6h2*b4tN0Z3z;dhT@3hS~KNVS+21h)4n z3?ss78|E9@y;q;l$ONt-q0RH#NXNa1nhU*kh<@Ir@d5!Z$ajkm*Kw`ytFvd>4FEGA zvJ2Z9a3YY~*)r54*PCQoXRa0u$k3tg7W_&0U#e3C5OP7|Z*~Pqh!KpM3kEm99}mza z1Fo=07|)>%!m%S0m&+W_7qr0=zPSfy)L;wy*4KqB%Ooz=&)fE0l_-2gXW2o>^iC~v z{WBhk`wf#wmj<4=m&k$+CmNkw$p;Acf)$Pm!eG!_V-luy`Ftfo)R}OQBu^*8XTo~S zYK(Fgl1}T9TzDb&V3~IKq&vjN>DautOk)xwMv)wz_6qq^^c8&A1&ER4m|d)J80~Q- zAcn>PTACCt2KEW+s3@bwTSEbH=~5F6WONkZD{n$C!Q&>AQ_DB@#$ksv(wz+&z$BWA z30eepT8F@I8sdEyq#NCQAQcj;WVU1L2NAgFNAi$N0nrGvvzh{+)*%O;oB=RVN< z<`cSFAF>|;Hik_y`VdD0kYi37By>UI0qm-Id+M6(j3>V(vx++?aiv_M+HERuBiTzp z5kU4r-yS)t5Q*znRM$0QPWq9Ih)p2^gs-&020m<1BOrzi4lbgMe4E4 z&`f*>?Q5Gg=XjT}g`Kl}T7ERW6b|>5+5cgPkOYCqOGhicbw(8qj0(S!*~XPMe#UiB zDF?E}J^Zt3rw9h$hW(-;&tMCp`2>~hk{)EeO&N&MYP+`;^I9N{^zB8JsfIrCKo5T& zsxk*!b&}4cv5pggwM<%Wt_j`8NMnH_M1I>_+d~F`6X48cA)_?;iwZRHYN_p&EAX+< zKcR@IQ-$3n@eaHpgovb|i0gf19m;vbhbSmwmsgFT!m|S6xPfehD>_7AHIF9BS&%|+ zn3lrEqD4FnHA2NePPSg*iYE{P0xRfzyZN+9>$KX+N$7eSov&-Rh;%R_cro){tBWAqd^4)6&%g3XK7i z%qXK|C14XX5Xy+)SxQbwAjt3(db1kr9HvU)Dojjx4aHPEG+E%a1O}_5sKvxjf68Ab$Xt_?f}`4;Yk8B&URywk-I>X=*}rZ-(bo_0G9B1qgGa@vy5(yy4a@9oY4 zNTEnaERmcy-iF-;{0U)j!bGEc{9(C$TZ`d8^W4~kf5*&!?-SRjhJ>7 zAssMusaV#bZOM%hWVdV~BC8r4%w6HduW~vD6GB{dj$ma9c_ep322X3RO|j zeGScq*|F97DCIdD6wfAgI<3vAt=^P0fn~~9ee76W7FEBhl3I9S>bAVpcdVi%`lJmh zdUnj?M<8jbG)82(;6cc$5D1xXYYS#7Ud=?)K@VO@T+e&lgLPbVva4N0#epMn{hfs+ zu9s29QmMrHkd@#7#?8>FHF+YT82GB@m}a-w=n>Q%XlB5e7np-n$kM2{aR&`HBQbll zx-#O5AdEu+<3|V>dEri2o*GhLwUU_5AYC8<^_KXdA$UpJ1DaD{`6QL=_n}-y2G*zb zESMl;912L3bVZu#N;zns-RzZ(RiQrQ!PaS#v;m%oZ$i@CHg2bO*Itt*jY)5|IWk^< zyDKSa03OWCA!D`4WP%!BM}a?1oCYhTTjx&4l>ytS6u>M6oj{igV<}EGY?Ux54BH%3 zoj`_ov%lH(KRJS9+g-~M-CiFf4%zHPcNjA)kr#qGSECI{CYIYl%}q(e$TMV%0V=%4 zU+uN$$^-D&biJ@=#7N+*uF+1a*?bdYmEmZ_LY%F8NNBY78vK#7kePgskRst7%t4Aj z&3b~dp$?%eBybDq3VkYLMC`G`(eYDb2m2Lo7mJ#OXe4$(2qssE>*ogW+Z!h)FO)a| zq~4U$knxE5H4Z(xXa}?8CU%x4ZrmK?{^G6}_xfd0O9GcO&C-ti{>wZLeq=*`Mm88I zfMlR3Iw~MSXHw{**R`pU<^w1&3(!L2;kf~D_4*ggeu43jWE7?GV5OBxah#6aDtAgv zQVe95Gi&-`=p_HOP0VeEAe@@4nk3hVsR$yPtzSD-4k6HxGt*Kh0bq)FAlPC9!!Rs@ zjweSGWFhS!V#$LRP>UvNfL3coi%MslNHf6G3JX3mfJKwhW5f=jZaJHv%n94pf^@vG zG4%w-Dq7xA!?2}h!YOQHFca!z+%gL$Cus8w!Hb*>L?^|rjTQY#EKIh zy5;2T3EP7NgwHWJ&66@aVHHjWwt6;?$dCEGn8Y5TMvfGmNT7#~a#N9Y%2C6**|T*Q z`%jpO^!$Q}feC<;Q4-r^8wigm4B9JlH0QyI`D3v4dPDwD>1(F9(UV3z4OcgCavss5 zL^>#^LEVq-{;WhR4J_jaI&!OKMKMKupCaO0l)tb>hQtbc*PE#SFrq`rI5TJLP9eXHuTh?~?TUy@%9uH_rh zZDw(~3q`^qpf?J)|!`jHH8ahgHvWB)H+R51(+9Dnh^B8GCO<_*35jsTU z^5fANHtivpFsylgb4#s!8+o9x^|_yL$28IfoHKt{IF7Kbz}YZ<7^11Hmv9cx=%Ok7*W_i3tHAE!1hI7B zDo#PT?ob}%k{Zz(cBMIV?bcp-fZW6RwFgWcniNN+8a1F1!=N7XT(+TVs+~+@i#een zt$T0-XKir~(ZA>&f^nO83%+hLE#ne=(^WX8sG%d=qzQuzSzqw4(CI_(3uSAxsDOoG zq?5(92--aGc^_9M1_K0Dtq%(22(KsQPlY|k@g+7tIqg-0x4Tro>&bbC{FaxN(hP1GJY$5~JHXZni@; zkq{Lz=SzQ&RCi;j43yf^TquLtoRfEu>giQx%3m-ysM3bMae*=-C1nPTxaNlhudNr4 zJGdv0>+ljOLouCqUh0oK$y(F}!}>8cbTGBRX~S(2c(eB|ZgxEdseoSftWO(AlHCXz z+U+*3sJ*gxJf4&)X;smM1`(;bvDJs&4W|iUmJtfwy4eVp1dh)bee2DP7Wtv*o@Mlj z@Jxv%0qRtZ+uz!7_p*(yu`N3fFWriC%*o^y37d^C6XSE9c}z$Vj~{bCc!y&pz(P<7 z;x#}G^IrZ8ghsLh;a9-PnO^q^wio)AZZ8H1)}26#1ePiias!cey4}}2)4tuzPoQkkVx6>fFP#aGj9kTTFnUlKti)D005_wMd~T!7?1#TnXrWRp~72UoCJoc#5{#0 z4gG?1B!#3Ljr_+VcEVOOhYBp>mWLsXnp=J)QJ)vwv{^||&@z^l?-H9rI)$v-ZLt0h zsv4MKtA)71wfxlGDwN;9e18JD{G+gw--m*tG?>%afx{8arM$jb|GwKoG))!7rU>%dm6_6P$T=|Zpq>&6dY$IOqKqCY=anFH@^ z-Di+AQ`w08m}r)$KKhvcnRFwJ_SmRN2S9YJ>0DC^;h}Rf8rI@Y2cdxso*f2xqXT7^ z>%DDC3|wL|bPmjj>maLFt}o^eiHIRSauuo?#2!VHwWsoTt}{rws4@5=**ls;{MM=M z0d1tH+Si7F%Zdh zg#gwddL&%6>p({^4^3H+Nae zR%H=n!+zZA$FY`q4uh4%Rh95Dgazs|gWQU?sH{Sc4PdpS%85`oPv?;zDX6aDTPnVl zovR-xJ#}U(v4i!o` za;MCtUT^t-ZS^M=dEbt{$ zl#Myb!HDlLZ{-qUs*!A?JD)df5n4b6j%eJag;35Ihu5J#4Dy(f!}GQPJk5#cF2bTk zY7A;8b`dv2(47QUopTB1VYDch2zauqaETy*?5N1w0v&*N9SP82)P-beVGCtx_lJDl z*8+y_e5A@DNeCK-3?lJJMIuBoggX*wx-z#RM>?32cbmOxffMLfLa6Q_ksI|5>buwknzgxO=540$?4}#L z!43c|L^;@;3_>BA1EwM%NuEIJI3>#Xw&wIO@f@Qs$mr1U#rbBDBRK44DHAyWxNGdp zrk&5D$JilAxvJCKf-L5F#`zD?vXHCm$R(=Vg<_36$M2BWD(4s^{D*| z$3gH4;LYH&LgMulN-IT|M`D(EKBD)LywgLmd^cz(r>PAak3bgFPv{6k zq$&C83kJ}b5bv|V5ztjCL{j*q&=JEFh(FH`**|!J!9qg|MgJFuPT5k-P)}O8jf6WZ zaz+&Tz@7roiKB$~P06I=3bJQA#1f-KuhY!$K#Dl-Uc(*N=wD-VJ=gvkEKPed_gp}m zrS#?ss3uskmT9L7Bd}9u=m(G`7#>44lgKL4XGF5c-8C}{hT^tS(n0c2?rRQgVHki_ zuAf3OLd1qB0K6{BO|cwGI~*Bxg2VE|vVr^rq#xJ(UT-p?YMi4^oa0+cDj{_e)pi}G zgCj21~n=kXV_(O{mfk zNC

uxwoKv|u#kWa7hXS}1_wiPp^T6o})eS=CR{R%89+1IY@8!2Wt1YhZ)DPA}bo znwbCRQe&L^s8@8yC1%NfXa>W2GPNChzv*ru^eECH9YN?Y{QV32<36IR#Ib|Ul3z6c zNua5SN2pc`_dxsI#z=fS7$f;r9D|3(hY;`0<#*no8?c1rc1AoXSTJ=w`5RLSe-|f0 z6NyixV)sj(2lKiO5PsVr;rA~bs0z*0E{TEEGKmrNk6+rg7~mX43YWwZXA@7J{KEcc zyIZkyw;iEZ|FhWLxgFqL1qQ?4U~ECx;qPMK?}EFeRAMurX#&u8e#xI0EB#p# zOh|~hw&s~Z7al`@=FNX3wAc{63?&DAjrv_7>jcWxs%7bC5b$NxAnn&zl^w_r(#AxA zn)kcMvN0%?2&Z9S3M83ANAj&2x-qdQO~Z8;_cmACCb#p4WJs)sm&O$0?0a1pX+`Cc z6fv@GAi?&K-Lq}bpcX_J!WcncvnRsVO%oF#FVb-|E5&iI- zIl}x;{VcrF_QF+B`)!?jDx@BZ7U;;FQvN4Rc^{G0V8hPyPNE8w&A<^*PJ1AInYg0$ zb>Tg>2<+*~c3fm{bH6SwFu0*8 zU=&1$>NW}+n7bQC^ZOa=@&!8O9oC_c!)(1IE|OmKWi>-fuL~0P)}Voef(4`@57jv^ zjo8rTeJ{Dcl|(dB+EPcnvp)9OnWWTN&wUe{#TDC@MvP!YR%j^M`cx3|uIrU=n;H-N z_Ner$aS>ot40+Ig(c5aL*gE@!nVMrEK|)oN^cE2~zu34_b_pQKB7YmDE% z-GT8O-hoso#UXAC$B%re>(aiKrv0YFzDhqX0vQp27723^v=)1KbQN@~&@>!=C{W5( zga`Rj?8}rrh3tcho+Vlj(Xvp(xX2C2b|44p_r=XFL15^{`SD2#CfjY#BL9u7+05(M zpd#_qY?F6U0Hdq8T5M3_7ede!yHmWDYuD)m^#=OMBmoosT%!wdj#uMPZ-isRu(Kj# zE$%Cti8KIHM>SNYw%`GN~|vJuZZ{;OJp>>HTLKO5Iks?ygUoO!Pkp>xO-UdVwj{J_B$OyfV+DLR6G}v_ z|Gc=MeoLIy@h$OF!o8Y+5BnwC89bL_0e2s1;;4;qGrCyc(e({#D9X23t+TtXxQS*rI%))+S*}femVV_ARC; zdkH4V%-B0{J&(~(M}5;b7&H!I>~hO_R+KH9a4DH|qsnajD00!#+Nf6Ru}<{qgn|Vg zjoz){8{{aX8^u0SelNHew0a7^H>nLKGl*2tUvlB`lg?nyFZd;2xuuQd?3|kb5c0CN zjhpufc2N#(jt%;ZxF}B-ujYKvb_4<<`IWk#c)H99$r2N)ORLaxv)7-YeAjru7*v#} zZg24~7daG{+=0or*cGJk0gj}T$9)g~5+zADaj7N#W`J~xm}zG>z=w9|>TwTw7GC6f zlelc{&N>>1AxBrk&h$4h%Ix(`g;2#5=;ULX)EhL|$(l;vx^t@OZLh5pV&H2=%Z9JOX*N7}gv3Sk7o3iWk-B0A}b zWGwZbL1=orf!N7V1xbzOV0=T3d<)AVg z?{ST9z!RG0d*?tCIRw^1l57^I5|hZ6X-Yw%CY`7DaAIJzO+h zhen_V@eV@qhMWi_bPr6s0Ppe*ABG!e+HLA;3+)sAx7eJPK)a(HnkUbS&1EjC{DtNL z0Q#JH9$haQ`H7| z8!c0Bbsl2#g5=1vyU?H6(K=UHj!GxdoE@bTNI8S;7j3v~B!|&5vXH>g2SKHVAOe#*<@R<+U@puo_V8$U^KDkFAqe*t%Z5DFoGx8PJlWJE|{;>Uz? zP>dU$wVMDYfCzc+d>K!nm6>Q6M_F;sO#DU2SIEP?j@NcL(vC6E=Vo8kq@ZMSj z4L6fLLb)$EXBb<<3~;>BDjmu@roO>K5S+^^JPapcJjmMrw%uV4UR|%Ma2k#4iqJrD z!YGTVFzDgm+2(1drNZFM@BCnwUMFWdp)+c?UFcs|TlH{DYkEe5QPLfqe&0M09-guY z!SEO-wD_%g&dk^m>>MTQQ~AS!d7Z#7HA)uE_i8H*XVai9_ZGs+%^N6cS9q8vi_1rN z+SRs&$E<(7bNv7VLz#pGm|(i$Z;^l0R>-3)=YXsNrz^Q>BIZ$E`0?mn-oTUE2^#Aq zSVGm;Q5mR1t75zmUv?~Mj}nE~;^ z)*WUFS%;d>z$L)hNiNJkBC8gy8fBg2-}qQ!vmRhw z$d0lO{nFWfY!RI5QdP?w?D4e*=MllE0dyyyuP@g}fz05gCJYd<MBumY!44%Fpt`WJ2NqjVud9X#H5=FxwZufbQOBNqZCw_WMn4$zKIS@+ ztu{l5f)OVjOqLWv)Lc20HuUG(sUt-<22dc8pgw?<7$0;6>Pl(!;$q!0}# zCEmejNU;kR5CnMga}Y~z zY;P^$-uoB@a` zx^d$uA@tu9Re@5$kO@Hq#};aZtbi&I-8gRbgw(PQCcefJN#;0ZY`?|n>pXDq-FcI& z5I6H_3R|}o@*k;bac}v-wYU%U+#C@sfJC}eZiLb9ZMyQ#K}z&Y7bhm?A>Y9oJ@hlp z@o~C(KzTXzQ?pDD`BvZB2?$%0hDJ91WT|k~1n2-O#3=Mt>}gC0HxD#9IZbO2#ZvIb zIsR1;_s=qaQElwBiW%>knC5?g1zob72}KllS^6y3*Dd^`*x@K3c%>S z5|g`hK4>aHccNo1vKURR>ignOeUl<5`r8w^XqN_ZEQ7BO54%Yu#)JWbhN*CTIYi@# ztgJtk2_z!C82>x$WluyMvhMhHwtn{ zAE3|~gAZd&WV<%X@UW_#+#oNEhZrYT?*oLkUg16-Scl`rC6Y`Ww zP&gBo(k{9zDHDi$3y71)q6mxX`hh~ExF-e?!cZm;r>)&}BuYiy(sM5ioeYUWQ0!c( zrZYMS`TkIL$Td@YDD#1|AHvm^sw3ad@))J<3Sn*1k4mTt5Jt{5H1eN&+IQkm!V#QP zh;bY>hd4q0+bJTC`4@u)3XVK@K;hIPiQjQOQ&S$ot-@eJbj3@mGqEU9>%TNb%sUFk z`RGwf272qEsd(2}YYf4MNeFJTZo(^)0F(8L5vx8I{{(Qo+(b5}wf2THpU@reT%@-C zss$v{wudY3wEsmoE%cZ2GmO!jHdB}2LADeZyzUxkWiTR&zfewLG@O8~AZdvfjdGT- zTHYKb?!if&TfA8=*}J+C#X_rU!%m|m!&L+fComWqxEy4Rw+OD$73k7-fTuNkYn!gM zPuSBCV@AYb5~YRf3yl`CyKFt1pvR3VsZ=C%BV)aV@PVzug&dNgR4%y$S|N4@nj!?1 z#bpr=s8Ckg&(Z^X=2ZQm#ND}IK%<|A{3|n|%pgf>Aeh!qok=fY=y6eNi|n$qSEmkQ z;eV5_>aV&LauPfQ$EPJg(z^;`$5^8ohh_{$Sg70?N>qjdI>BB?qRGaZjD#S6n7g)x zYd1JCAP&6dvS4?(#7Q0Xfp-#8Ih2xM;D_+rEteX=o}ArxPL0rj@b6%qo3uZtLBk!te3;VflTBjEaP{G9|%8y6kD$m zAr;c_={dA}8P<;x^U3=7abz5!M8WWakm-YNR?;OcHXFJY52CnWkyXxfV1~CkuvcYM z8xe4dm)bc6fq;u@kkge)auj6tZ_XXeT|7ywtyA1qV zgiyUJ51R(;(2|1)HjmB|jav<4K_C=u3y@cTjddrPBUU<+=F;kf!-s-r4(oaAHKt7i1J7Lhd2Q5q@0yUP7}9&EF6+S@J3P z{k`NC1c;YvlBsSjGl&9M$&T=tzHA8iJ=z;&60mpb5p`3QQ?|1G?@!w=Hevi58u*xp zd=t|9J*JMN$qG7{SkM|_6us;$*jbt--NeCx;?iQEekSu@Zbol%sT(C_#%Lu4!i?I7 zXgBBH`6`9aR(ZpbQ3Og&5C!f03$+R!aWH?m7^?i-d;X4*ghbz~JKauJk{4;tlB+bF zsCXUOpZpQ1PXK|p5nQ9|6MoRH$m>gD(qy_HHx9Ocl43nKkyB&|!K|Pg*TwWg`Sad8DT0vY4(ns^=dM-NJxnb(!IYJW9(< zF1qD#V|yACsy(Z?EA*_hf!aglQ~|E(x47-tok0y+eD4Aig?IzcKr|k{S5byBXWSF! zou8oQ?d@=dnOO^ymKc*oRY3jXe;8^T*32D7+TME0fkMOTaTZ}~q@jN3nxw(ojg>a7 z8Z80wsuT1)i0e#4fY~GzJ`WgVpu=fjLQd0Zr3R$t{28&!p(wNyeaXMYUQ}0=43xn? zo;)iykCp(fvc&_*ku{q~Rou#U>sHA7<_kiVYJ2 zgUqv`dH!+nBLOhzyp?4MUlpD++A^ly6=PwNTO-L|T-E}X->qli%j8*gbIqMrXs-|R9|VTLBb)q)YK^v!0uTjX z;T2XNk|+O>=GVfs$l?9AqTRJs+0-P|m=?|xSplD@z|%UbS-G{ctfqQnPERJF>+`y( zCosl^M3<(u#$ZoN-l_2x#k!%kB%n0W}h&*&= z+eaZs*W`*x8ay-+=2_||>7PLqSU80l>rTKHC&-U?7#AiI#zm%zZTju-IqcA<)W^Z4@9$cCT-=$&@U(ui{?V*JS9Vz zAwv81;00Rbd-aO}q&r%1VJ(M{nnXtBQyBp2kVd5>;qjh0QV`|hOQJ##36zhd7qQKu}pp=)(gM=a`otHSX zwv~H;NwadiUhZX?sY*8>NMdW5&6NTKW{JBZ>7m3Q<#T-+xnNqpjNl5(cJvPC+bft2 znSh5v>kL4dM2BsN9F6}`f}Ah}vK-kT{J~=zU*+r{f;{oPNXljqwY=^A=?_fjFrQDB z6_F}-A+B0StoWG3!f`7;)$#IzYJ6+)76mkm@0S5k!7^E?{FQ$hp`C+$Y$TSBSS!QV zDr-oPFMc3z5(JEIDz(`7x+wbH7X1(jPD|2a{3b=w*gkz4+seeMaVIu1fF`IL-zm=8 z-s_K&O-zZGvkNnT>O%|LsnYPB>m)Qa-;oOp+$5!?5#QxZeiA+u5geJ8R<-_v?&G9<<6bIiv(|1-P` zSfQjjxi}&ZLc0R8qpQM`TuY_W+D87)y$vXDy@cPPmEpeKkA=DI7aoGpQCJ>^QgJXm z32pQopn?7opO>(nZAuT5_9^a5+w?(bmpct;rr1+F4xxE+1lVUh5TQkKBG4lFRcK)( z-1$M^0#{P}^ypC27PIGX+OdbW7tQFb%CJN`vB zHF9}jVg7@Wdsj#9&s`tcJ#v5i&KEbouFdV9c$ocD?RtH>nKh5zpP##Q_|*MxMzRyN z#nCVLvw82<{gJF*yL+^DfBycZkB^UJU)1LB?v`H%zZv;WHafC+`_`V3y(4!Qj*KkK z+?}7BzkB!O$j2l14~^WLJ3VrBWbWF?{Niy8x^QXoRBe9oO6}UhWbMwCk3TpvI(qnE z{p9|S5AHj3;86YG*PkBx>~M49(7vzE9veG;eDwI(xv?`RpNxO_hkyKVbbog8RQC1Z zY^HYLVAiPZKbW0Ake#ocIGmlV-59T7+}XvCYTum5ZXK-M`Korg_EBx=Om^j)+N}q* zZ}w&1)b1at-M?DT&V8OO)b1Rr&7b=$d-%hR+JXJqm!sL-x$K+c+2x7sTq9dLQk!ek z78VcH78mY*S$ojP9-hh;KK?43`}T|M?m}(iM0ULP*`e&~+IbFszIJjvTdS>q*?n1? z7|VL!)~=q-c3sML-8lWvi|cEXk2)(q-utl&Sk?da|NiXG7un>g?8e#AY}eP>XW6d3 z`!0VC5brvAtT}zChCj}o{OZ=#)3x)LzdgX8d#;@r+dnooI=vU$l6{r!`trp1p@qAb z->Wr`;Psi$jxT(8^vKa;3ujM$eC=NItD_-e7X4D*sXI1MzW`OZap2zT3NmR#aCaRY@RvOo}Bpj;;xgmqa)eG zk>khCpo=qCMh}ml!XMw(=I7@Zj(omn^miBedUPcF^2EMVAD$R{4{x`ovg_CPVX~87 z9^5x}#so{{WAZQ=IAY}a}20b$z&M0V}tU*ngr+{iv3n?KRK)jU*x z{;WH8bmH)t=f@_#`tkJCi8E(LzdL{9%()Lg_^-eFEoND}aqsYV-(CJ)_W9w_+xw4Q z_~6$2wd}~~rBCmEF;|-g9-RC1gFPR8ws+5-0|!4H`}niZK0bV4;{|GE|5*Ldp~k7v zle5S7pKY8O8#{sC??36lVgmEr_egIvIP<60_KQ}3{mhdMWHf5`&uk*wRtx^(@L;3! z_{^Zcc1BGRc-~rXuXehtofl}Y()5 z)omEt`l$YK6&Dhv5eoMqD?hFtz+8uqF&T|tM3BOux7}w<2a5*c=TqA4SjGkM|E>D9 zrR!6o#luAeUpYRr*ngPk+U)5G)05Ct$ncMQvokm5mu^6HV(q~9k=qGQs`@x*J-vkh zfb~_}a%zo3O7>T_{%MDYbSHNyWUXjAtR+_?r6SmS+9lHSb=HbsKjBRml*4^qd=cTA zj0M->^LBsL5~ub38?N_;R%B2UCxRYu34U523U%!p#s&dy$RLO%(jAVO-gr? zILKmubX+y$vZ9CG-$J+rvR1e1Phk_2iUoS5hNWs?G1W+E2ydKR>v4a3lh;Kyd#J_+ zSFo11gF{vBf%zI{HNeQB(tg28uF%+5WM;ESA@>NE-n(l!0$r45Vo^(9hs0kHvNBm2 z6apUb7r^4$f$LB$ai4|vxb)7u4+EGPsL&{_wZsq5rF2%Y+6?BPXVfVrhqP5oG?Iz*vm|B!~r>-O^>^=%2H@A^+A9aQlN1t zY9RO?cp#e#=!u^QX9EKY(d%u1=*cZhv5zahz!uzYy+9#YLn~mqZlz$8zHP!t#N&sJ zv`VRZh?Ft|yC6sQJCAV=4P|*;U?N4w#3$*`?5bKBBw4!91UVxzZ4`F4nLy0D~GzICe0Gjm2mFx&K z!1@=0tPN5GWX&%VVPOS~AvCbrw!1upsK~;SKpM6wv*Xs_%7zqw1I04pA@jkl4Jpk$ z0ngZ0M^7(-qc5G4umlKmapI6jhY_`;ogD#8<2lp*O6|O-EhO>BWpdJMUXmTF<7PB` zXDHzPuQih&(<#{_)2j$vUMI&h#c|&1`p;sM(N*67VVM zx_%U%_9G8NtNwl9bOaKT#)(%2kda0faR*}CoqB;3+o%vMOS2vm^o0ilqs~bi9aTDj zd6y&sJ`K)98>LLBG5&08YjXgRiqL@VxoLIC>Et>iA2m0-PsgpF3F!@MH6KH=%HU;K zV$dcMp}+{@-UUu!M(UDr$%Ygn`q(Mv<2*_!2PaFCNeJmM)(S0>9RhveQtkH!gDDbr zAsp77oO=6^PEhWhezXk8<_4Pd0q_UAN%={9q@i5|AE}`t!Zp&ejt#^{57Ors~LL5Vaucp1=@+FJ#;p9cYC+MHDCTfVsuN z?~x}+ZxuP72{4f248{i=72I39u%YYu?hXHbRsTe<1dkIgW3xAzVP~EbWtn7`l`clc z19gBRjx1B(nO89RMi3P=^IY?6u1Q3c^krZw3BKU{-&vQ!PQddYk#&_eyhPuPcO~0C ztjYhc*DLz{w>k*SoT1C}8{?mI>#px_Yw&reo)+exj4GgTEEV4D(DXm&neGbOAfJ z*h@6Og4`1j$ZU3gYHv&-aRM&;yq;>k!sQm-5#vl^+t`+?dR|Qy*(_NB7qW$37AvS* zO81-j9Gt$hP(6_YUBOOqq=Ul1>rfYAc84Ma@y(-SZTMxtK3xzQyzF53Lzjrh1^NKn zYhKO}VV0kK= z+HtbSn04|?cHFgT!6af6LW9XR;f`9{66~23o|k;bGA(36ybr{G11C({NZ&Cem{G;( z^zHhKY?NoCztu<(@$W)U*LN&}N#OIB6;x!?qo;`!c9<7YtkuwCNWNA4kdIwoPBBiR z7^%~eU6~I^CodLI2qD3hF|0Rfp6ka`jk(}LwpDO#Rr23Bg1fZD`**Mbi9BI8sFdsKTTQaZ(DL+sShvYl;9xdlvEKYAz&( zWi&sFeMF~ZIFRBmheeVKb{O(W(H4UAgea7o_}>OpI)Ge&rBH+gnA!*HbeBj3cP zVGR{1J|q(5_u&c?4nq87Xw#3(4eBdl&U#jCV$2V!edOnA z)hWfr8MoC$a5*cH$qZK^!%U$(wk&!{b`_RVoB)}n7)_Dw0YeqDwAf4`EURvgfVLF7 zZ?%ziaSL{Co4P2JVaR0h7=5FIDxq;9xLS)tW4)5j1SDalF5)u&>$f++>&RU}qTo0M z2|)@Z+8#Kd%3xtQpG@qjNIZnrUa&-Sf-rZggbl7Shz}Ia!bt=bzX^NK1-fV5UD08s`8BFc=I5^J#v>e42kSpXLwbm(24#YpwUPYgdu- zB~A}or%x=^-uu0*cinHVd?^mqjolv7A}nzRCq6=MBgXQTf#-C@bI_Cl4Je0fKe~0y z_Q5mCE63safSP2CJL2gGnOxTH-qy@zb@GCIKqxWL9XOq74}{X&XJd)T${hTWSrc2u zYRY`N*ioQSu{Gs!*3ez1+J^rdt>ZdeUZ)7~VKm2llG&x1? zPZ5(VU;y~Y)_MT^VS^-O1ptqT?F21{u%uI~FMxdf2&tp+vLStf{JcN(vG&oal>Oat z#TJo?y4mK|V8>3Cx+d}ifnR-O2yP+AriXqjd=tly>Ql%IVxbS!mvTlS!*$WOwlx~v z$Jc&KmZsI{$S|z|)P{c8m$DVWyAEb{n8jC-n4A%=s>ddyaU!I$&yR9T&es_xXnLa5 z68&mjP-u4FxhhYdsM8<4hq408BwYqd?;sGTfbdH3=51u`;>SHCKJMRz`rgt4wLe5o zaPi3!$59b2ITc4n63^a%2f<938ieTbw_)eUY%=C05#Br=%-Jvxfr{AJ2KlVgBY_qS z8xBVf!<=M@H`6`KI`9}1ed30FU>tA;?o&-ss{1)1mv5{Tm zOZdE><6V)Yzh2q|oGHHIn0POJ2bl3QXpkxG%ckNKo0faid>Pcn!_@%N2WJZ>dQ_c#57QC=-mdi^?C-LRXw*)(zNkaK)B4B*qaP-( zBx!X)2w?8T#uH@GpeEb0OW5I?5a1=zlW1#Lllu@R{R#i7k5r_lAi$UXZUvV}%}cFs3nz)sf`sjIQZx}5 zki+I_(WF30MnHkRaw@w<_$o)#P?yTfF`}x|w(8Q*4g(kst2H%-kO>+dCRX_y zTo%l3N)OCOcne=fYXf}+w`1Gp%gjY|Hw59{)bLM_> z>KaTR@aHJ$L$9a`h93Yh+t5`48F*C{eU%0qrSfk0f@;{ZN9G|uVrv2wDwZur%fSr? zgef{X{tb>(^du^?$uB{$#ujYH`r>_~azicxFHqUK`{s#}uCrsS1v|;@W;LT>&!GXq zLbD+Gf>>^;?dSgbZyi*%g6(*m-uHFjDj z_(a*J7ofF2l=D#BaIY97^x8f;x>4?x$*09q46XfJyUhV)6l=~W=Sxk8m(MpinF>bF z<*XQ76Tl)32aaZ#9JZqEuemdWb!P;x5KPzH^N7%hoy30&T;$X|`2BHWF5R>}dmury zKMr;PawyI<+Iq*();6&~CnCG}!UWEx_SBc%fM17WD((J`3lQUBlLIx=@MFrXP{bb~YG`YHWz!t$Sbe^UV=ZQ+`he?2&?hxP$|TPM#P#+7Os;5XXH(;lFQb-@N0{u@ z%mCuBE320afgSp!hg}9P1G@b0U*)VlxcLo^niu(1%Pt5YF^h(_-uR+8DR>`{V7B47 zfylr&$Bk>luZJ3mO_ltTJ58v88?uNSAo|KZk)bi2NYdaXD4rPg(rhvnMsH`>HbitHJhc=Tv3KgmNQ7e=c$%3+0 zvFxk#+!+Uc2qzzSiX?287~mTyvv>4vf2AQ*+FzPrQQn1${`)|H>0f39Zhxl*3w-?I zb{l~&cd>?Vf)nf4Ym{NKz74YJpO3Y3AFCDO4jS}SY@_pc*tLdfbfTmu;J`oOgE z;HA(|i%z!sS3EMGQWCoM&v>XPel@Jc_0ev~W5r}J>mzkpCgV|0Bwg(I>2E%|*?s5T zcTb_oN&HV1BOmxJGB!|3qS8noZNbZN1GTK@I_a+q+oO$r#M@G{cZA>5n(_Boa0=9= zhv}Di#X@4~x&1R9PP+Wli<6J+BOT-vo&{U{?p1^|;FH1KQ+qV|E)RO>q&P+oiu|LR z#KCq)Kn6AEJBmxT8j~`jQ@y3yxPanDd?2)B&M}E8X@sX=H zmp(bN^t($xJMzqtA3pc#TOS|&!CSvOee}vlzk2>hofj{3-+$wup8oNC_w^G$>%KmJ z;@GQiy)bwE4Eig*ee~M9M=yVJ{fFqZwD|PR=YRI2*Iz#VO8NfDpjTde{|H_Y!z5K!})prY@{W`wHhwmMqd-IjK%g5#}zC8E-Yjfvb zLjR%bpWHb4{M{Kw1$_AC z+|sMRo_q88BXckO^9!$^J^PQRpPv8uhwm*MfAb$tpZej`^A|rpw{ZOAKQ6q3f4p(= z&9gsz`sB+`{{UT(e)!CZH(x>zsN*j`fBf~=pF1)C{L#6m(d+27F6WqEIQ7$4UwY+@ zPu~2=@mJnubD*oIKDl{s@7rhxG(r;69o%jKDQJCZ{;&TRI@Eu(WZU2Cnna|tc>R9AkB&2YXi;;YQF^OR zFjtN86%bcM2yz!4O<;DS#T>(pfWDFlHJ<(nyV}1QZNmHRF#tG|5Nkx_V{HTrp<^vg za!ZEg5!U#xXfNSoA_@=vT;89RtDHnPwebEG%QRt(GZwK@b_~6(g)rQTtb?t#0bs#u zA`N@n`>?ZRk-?dV{<-r*i$epv);ujV*>&P>)Dy0$5ODq9wi1{tJ$98uLztY%BI?JPg z@KT|afm^v90q8uF_zN0rF%wiUfSO%%hK1;OLh2*_r+z1PTgIYyrj{X^SD-iV7zI&l z)RP+~a5^D*_(0|@ugCeVbGc=Jd_F5>E7cZ@r{05I!ez>A8&$bD6k zFUkYb=Uh9JT6t$9dj&EO)=a*wH z^JtC3;V^J99#g87?(3-?$oE2Kn7X1dDr(`lXw^lRPjZ#usI?~D$?R&*2MfF?mK@z5 zp(`#%Q5=OB#yi5v$cYO{;_e9;U_rN&z9VB8PN<*WhR7o=Q<>kderdjh!;AzVoz)6*0W8)Oi)Hg zKIh9KLBk6jc63YlW^aC^@$qrsMawszzvV~fR9lVlQ8v`ux!`ml; zCCI9@ZK0(gXnhQ6jh}GzZ2wpzo{v|dUz`jfS0Cu7y3kJKfdllbDmV9s+5j6Ew#?Rq zc%mO)PsNUtHx%o)Yn7|V5xARl!OdXo^yv5p;S-d1gXeikw_B4ZqC$Ot54w%HofDo? zE!M%-fN;Xo9YLVhac>jqg6WBv>n?O?H9?b_9?6GzPq;`*CU0@j`&1AFX&yyv_u+*A zLM4c}j01N86(Y^`s-BXwxaTeT=}epSyRaJ%okuZT!yKwvzMk+JhkrV=Hzu`Sw#Qn< zA`r!HmNUQ2cehmJi|A%Y*Y}!X~0*%-9tw|s6hemcS=mE`j*1#>I z6`{Rph6GHEi>8QB33a&%W<_y=QUuqH2u|0Gl4M?KRe!uiCNi&0@xh?%0>oCS)}E89 zRvwPV33?TJk3=Lbt|=EjSUR_D^TMj$q_P!6iXrTfzXi=NFQ+NlytkByOll7)ZHC^* zkq)c%#SUf|3Y;ye_kd*YiQE~24|uQe;yX7Uxb@n?saIYKWN^yS`T%mBTWTm1EF0Rp z7i*VR$P&GVja?Zl>12|{Vi!YbB-}(D{&8J43CB;)VbsCiXfamm6NfWfJl#?Y$@lY= zcZN_UZW-Pt`=@vuxSd`B2W*Zm%)Z2XQ`<)1CGP$(z9nMtnq#aaskKn{KrXHmjA>fT zpy;4xy_YlshR8~)mR9X_?*glXv@D0l!kxTsUDFy$wk14aIPRJ6HO{^L-6SX{aAL?44#R~S z6fVA3v3{3N(rzLE48*WM{$2T!=>%!7dIR5S&!}Vq-7?nCGFT{R)P!a zQB3z}UHyqTOGBB1MDIqx!~q#NqXV`1{YeErpfGv*rNDg85zjwHW_swI#rpt(OAV(i zKudGjbj6#E2MJ4X$4T{xuh4SRoGEkzC$i>Z*j>LR91lL?dRpMPDU(W|oJk9|d0&K& zL9B`4(h(c@<5Zg;#QX6a$E%W@;XI2{Mkd!G;HiD8QiU=$rlYp4y(|LBs8l3hn9q*U z;$3D7nk_S-HHa~pvYopdgBN%SU@_JJ?QQpZ6l87ea(oZb1y*v3r$%?UEK9?^UiHB zEd1FPysx18rJBBQ6LH&0PjwzQ+-_R+xfM7Ap_HS$ZB?CNQ>y1}uZo7E*3ASvAYc(~kryEDuIFn@IP7&Az zr2&zh>T0Qc=Kx&OZow9WOUSLsLLp?0uc;oWKC$K?iTB4CWFC5H64Am!PZSpO<&}^< z*QZh}a~9Qgm=T-?ZeKt}t+NIbA1pRfphD6*(p<5L1c{bC6whpX6Top4Yu!dM{ls^9 z8#BnX9USSBk0H9w#ki;=@{c*NzyYiBu&ao`(p?V3?FO!n#zGlXl{WE#3Kq?lc0FLW`kuH&vv@ggRE$?lADF;bBlN)Mb0i-uM6)e(PkSGKb?Ww7F2jVTz1t)IJCoWdPLpBqT_{ zLnilq8rGWO6yRWq0|($*pa5;k`kX%-E8I*hG$Y>e_5lMNun|y_za}Ksggoxy$O`iP zeHeJG@NkkUS5K8t3Y%#jt>S_**IrPnVn!EQ{RuD-MKAK1y?s=u$q|}J?7Ul=(5-EBJoyFBThD*sk;q+-7 z{n{p3Yu{Z9i%&+Qc4i?OOsLSQ(fnPS4R*jkrNyQ98szIjwK+tRD`D4?wvtHpv8U0s ziJ?UFBK^g~Z}s3Mg(hH-4sEAoQS#bbcdRr&H0PQC#ODa?@PtFwWpK zFd@a&Uj-Ti50Z*X8p~J3^$L}V$thdn(6&Z$02wAZ&W47V%n%+DiFo3HsMx->^H2V! ztoLGtO(M5(EN~Grn*Js^H1)7HW@gQM=U_aT5CA#_N>Y;m#E=F?99j|p?&PdCVn|-0 zK*FwSERTZwIeL~L(8kf=Yl#LQOxYEsfS^d@-kwM_#9(5khOYLLKX95bjo1MxZK92^ zDB|G9a(XdJ(KkLAHa^CUlJJ*JM6rtR5|T$M;Vrt~YcZvt#J~-IT!|<#x`FIO*a^g% zjpO})v+LRo*LRm%zU1O+AVAbZ_OXu;F# zNs4z%4lKG2+sP3&znbbya@a0cha{1YVh(XHR&nSr=FbsYmV0F8!TDk&(%%J;GQ6CZ zRT{I_zZBly*pL-awSSpT^Zm}muq(IAU1m8GTTNDjcF|x5P=yNDkqrc`5lPAGxG;AQ zkI%-B?oFk@jU|)jV`&1Q{;{w(YHYnbL=G;pB=op*LPO7oD~y9AWW`1H@c&pfhS7++lh1*oq8dH#1xKNmj5*0bgcA0`v2qh8nJ*REhNFUqBV8k^LEu2Z1!ND~P{i%q z&16}{(Y3A`X!gksi+n406}gM4|KrN%>hv-G$cliG1z|ZGjo%kEa15e42VYD4M)P$S zoLUJb%uPeL44$jCR@{2T^lc@nK=O{D;&5+mu%Yk4lb0J=%a&=*gzW;L%!VXIo^Iq;!8Y~ON#YES;R%VDnGzkz%t(!l1$RzL>?^j3Bi@v1G_kPYLIXa6E(R?P}flCU7C`+%B7x-YwT}wg|yDd#O8V1HuT>~rL zlB#{lB4>pJP2#n9HL=KK)*JuweULwijtk^8I(5z0SVn|1vGw#JC`T=&3s5q<)d9&= z-&Wf3?yVvmM`_d>b z;kBI@A?7drMs4q5rtAP2`zmgPU%KlpaI*TA0R&}XxWQPLeoClbpN1QK?+XQWgog31 zL5yjnR7pIcsyO)c0@gV3q7CDMJD!sC67n0|JXjtlIRyj>*cHkd9>fl@isqJW5juhr z$%F&(S=&LFewRTRktqGbdCJjjlIkbC!nl)Ox5w28(97kyMiOkx$Bm~G3hQJl>|-5< zE!v;50*sEtPAfo>6WjT0>GH+pE1g@HKE87Kv+GwbTW+kaM{F7`|Ll@NYyJH`zUd%y zmPF&nIwSwq=KsTR-th#l0vnN|`&9|LbDa|v+^Y8z8-bE)OSz2d$}S+eIe2(|FznwP zLQ%C*Pcc6fKi`CEfL5l%J}&09CnuThYwF_v^#7=4`Z-kno;$Mi%Of{`b>xS?_`#8% ze{%KpBmZ<{>7&JufA`zxj{Nw@)sKI2^2MJXn>&5&ZsNj8u)xe+r-CUQGd~);V zr6V7Iath;K|MAB^x%t|qpT0Qv>hZasy)yUg+(*Bi>%MgCwc{tcr~c{K@mH=r^VExP zymIQNFP=Cux6pn4pE`@zfAi9tCyvhj^O3pp-It#~hVtb9;qB9J9DVu7-0x4mb&UU= zKi<7|`OOpEAANZAjpJ|q=h7JdB1V=q7RQs;FH%THc<`5FA}y`wj- zKmGPg=YRI&XP-Nce}8=R`i&dU9KEsd?n}S^@yjp&Ju01larDN~>mR@I&o96H3U+?w ztrvca|Ge|zt8YH{+?Cg!KJn}ijy{Jv<(CPL#l?R(a_-vFPX!JD`nh+HE}eho)wkX} zGWYYNAAbB_=3bgR{o<>b=Jl6<_T$&Ekyqb%`eAFZc6z+KetHx35?WS4K%U-6 znV;hYUS0lw&;85)K|N=*^T?V~zjNm7uM|$agl@>&19UyUxQ~*8T_#1tp{SRn#rJm+ z;Gjm?!D>t?r_Tb#tGGmhx1>`_-(`@I-LKI_z1R8Z*5$Xydyk;`qeut$%h5>!ZHnc_ zYbDoDwZ1|dy*i~e0R9||z343%Xp3^kdm?l!Q4L?M zrc+yRKo!oHu_e80qo`D+i7&gRw?pT`F0+jno>FJ)%W1vW36-S(=HESR=0P&BbH>EA z&f4L0jrF*I=`O7A5qb&XyWAvmXn1LzS3_|Y(}%Z+`Q zm8)C5yG!Qx!KDtgKUXZjx_%(X+&+9?00*>9F4;^}tJw0<+|%=@v#MU7t5*4yynFZx z25rwP{_J>Bm4I@|ZM0kLg;%X?C&D@puaG8IGO!=}DS$}=WqdJEwTM-~ndrMS5@j3( z5o~KCj{~qANP^6x+Ua$-&fQu{R|LWHNV@K!N#r9NQbU*tWmr*6=~pVH8Hr-{QfdNz zv0S+O3BXqF)2=og*#cn*psfC2l^n{+Yix4(vv3FZKM)*W@J0^o^&W1H?=a1ZjKagP z2~2(jdZ)mg3{l}JqdeLf1(Y3BEbw$=lIM$+!4Vp@j#{@bkJx26%`meH-LMmq z9&xEUzz3>mCk>%B4O;YLT!R40;O@n6vSwGVfweICe<@*chLC*&aPU&kN8B59Ep!F) z5iTc;shNWKQE&wU9A)VJUE)0#$|0B+f&Tz#w-xrVt0?3anHTxy0;L?q zm=D-IL^yQvqz#1gcfEx!(QI!tqC8jwfAsOX{RPbN^D}4O0^jVRp9VR)CNteXV39dBE?lRH9?(`vB6}C^Z4D;B5{s@aZw!pyVkRuV3$6y0~8!pEM$jNJr zl6bMi1CpIDzW;E&uLe|{MGHv_zQr4GaU+0n4qvT}2AK|qSRSMc;~=?u&6n-QiMY0B zDnFur!MKyp$ck>TP@D>p-xq9Z$1L55bB{JRdHVvT_AP38Ow%Ff6L;kvBIky305>BA zLse&m+YL8%yN9yzQDrHm+NzEHZ8oKWK?>asxr9>AxD=cS2#)K+A1R_Z=Z5|>rY@)D zCne|>qDw$h(_9-{(%?1V^U6ziAnU+BMZSN3*A#`cT0oj4i4)KS9BZrz6HZ*RdTa`7 zd3?Z=R3T`ge&-4sJ@#D&4{O%rAGDlX?5?tV0~ZJmaO>K|jouENmD5%yewb_d9X$X| zoIOln5M;z$Ea*x1XZfq6iGED`!wT-+qx!bZn@&hTV1ML~x+%^TiWLJ2D$()3(E5ppTBTY_pS>T<#AkA8|IjJzj+ku0R}Cz@En-eV>tg!wVcr+WKhI0pnQ& zhh44V#}e2-Alw$goIj~`9p}Go3&8#_CnAQkFjRyc`3+Mv)!GaQS z?Q7zBgGoJ(3`j>zRia``}>9gLe$&pKNPMshdh9(ljF*t;DHa$OH8fT9&8w`e6b;K~noz{txRItzx0JUBnsOyxbv8=_p z=2Zc(Bm_ULnlsSB;v@z?0s3O_N&u{^`=}%^g}3#MPy(0a@VvHp$&(Wf@$%xR zep%Zk&3=Ti-hDWW=iz|0aq34)W)#sxvv5T5QjckXi)`G5@6VN=>&fNZUi8}LMno8x27YsrOO&b*0(fWg{$pKL3@gl7!Cl)K&7 z_-Ly)yw3wi@>T-qK_=4+W%pDVD5_Au&F|JCU>w7N|Nalnd^&_P#X+$l5$ts2(HMM<`Y#NbN8;;9GPsB z_LQ9-u%4;KC$9@VYrEu=Fan14IKEcp{zPEbgNDtCrtfDu;P`~e6TUNO0&ehekG_(F z;n@(;X(1Ok%(VgMf-SZ<%o4_VT6kqN9bn6)F+M2+)R*F#3e_3vBrRu~;U4TVt!7Em zJeFWwprcljLBN*m>g9A$mvr1v?P`^2365K8tH?;^t$-f8hdp5ep-eC$St2U%Y@Q|Y!=i8TlTkcIpwX}u`LSh;R03i#l1camk z^62OgB%$M;Vl%LKlvJe6Cgd~iyGDfN#E*<_J9A8DSxYD;1w~zA&5Z9LsH2P4?bj0E(V8TtMZ6`o{ zp3f&h5G|{m+_c#1_!!G}wK=7Q%R6M$>a*AEr0^Oc1PNy%7hzz*S78-QEHzCjd6Cwd zR^P=*=}RTAx*xN%#pMVuAQP7MqG)Q(vk#ErZtB#Nxb0LSuoNs zFw>Mbqq#ET&HRoyq(p}AhLV!D5O<2UW&?zfL2e$R8Rvt@?Qk94nj2x2EqHQGO*7UC_c;6k_^3Le zriy+LSTYXgO%W4KnW>?|O>Q7dj;;=i&e7Ym(wq{R%Z){8lBG$y@ShOmPxi5+(j;w8 zE@kCggSY#j3JBnk=_}gahO*);lJ5GkE{m%G?jJo$CQO2Otu=9DkYpq8v&0xdd>Iv}X*1`e zJ%06V;6E6WlK`>@z=gQm5cU;D8vMm|OQUXbBS!hX&KjK}#(Z3Waj*jJERq%$xu^_fR83au{1y@Hy0@(EIL^^SKbhXHa?phJ6r0F9(0Y|Pg?KC|MUGPkMQZw&kvYkD8WU6ca} zS0480z}KZ0abZR0JP+m$nZt#1{*MA3E|^RHFMs;C&iP!r}%MUL34IG)n|+8 zjsNX0fBGNK3m|D;`&awK)hOlU)q`>Yd{8Z-dNVKN-?+lO!@vCLPfxZohM-%)QavbF z#s}5PsyB<3#i|aqqWK7%Of05YUo4|oK=IV4F0U~m^9Cy#0 z!q+eifvmT{y|O`<$FR5l%?E0?s8N1MENgiu+sb$c^X27C`d0V`USPQigLT#+8l^^* z3sXaWm1BfV&$J0}0guFLtcK+cJN>Gyg6$QX$tFWM>Xi~GY?I1B1e)B)Vd_>G+@JASe5Et1;{LMIf zw_sWCW&ZWfh5Yx$3n#^ZAdL@H>dN6x{68^Bwj+(lY9oYCpfRH&f+qIOnaYM z;yHcDc5NdvMVZ-8o0FIWuRL=9vMr0IE((7fy~0!&TTMI= zn$k>Bz=<{?p)LIHfBEx&{mY;KPyO$I?VOhd2$_lB_<#NuG}^!X`M*JPDNQpoAf;>R zAs*9j6eGtsrS_uV{?|16w7UE_blTO874!Ne1c@WM|U>jxU z#%wN<-}@S@q$)3^o@jsO|MKVhml=tN`}Tp`h$Z zT(boJpUeOw^!L{!4cAC;C<%n@W9^0!%?28_fskkiP0)|!UL$VC>Oa0>B0ogBTZsoq zc?Zf=KGh1e2{siOXcHhKyqpL%6839OCf@lCo6S4eG1`_c!JY_3kR!o~3^;_IV>=C- z5CesyihwGIqKnvohXDjq-uH>*EKYnm&uN))V7rz-hh^T-bv$+!$;*bQ68PILQYIgu zK99*Na&l6m+FnBrErPM8nN_Q>)xsaD_#Cg6ML@*7mt?g?JhjK$MUgrH*DzOYUhek5 zp;urjhNTcm_I6_%Zkabcp660B9X7a#fGbLh2v&%h+V3ark{xZ7pGT;hZ`EgDO|Zt$s=>KjYVya}ZTw_1`I`(uEL|qYj3;)hJJ)uU1NLW%ppwdJ2eM3?<-t8H|DN>4#Pe@(_4k zhFp{IndvQQp~Hjetk_#C!Q**IJlzj(IiP5CfLp9_txvDx*&@mgv%;MLq>zCYG-Rwl z(qch}k{(5(836@Z9R}CMEtII|&jv%>ETu$VkQp=dc{%c;s_X^nJ?!UCE; zN^{#BhbL*1E<=Abz(v20?Gf_Ph#!!2%t^%y4tQufYkeNBu19Cy1zv$cPldsUYfgs4 zLhb@|4p0+^gi5Os(#zvw9mfsojYsxUkjzhx$u!SYf@PGPH&IU zzqQADTB{LZlOcPC^d(h~B0S8OSTf`7t9&zM7KnqO+<(5_7{yMk09D$_*(8573$Nju zoah4EJ=L?P1N_{|$m#xsk8MBoS~(2i7TKY`hb``m;8hnd(O}mhjqFDvuyqO@<0i~2 z?3&PQvz6aqH!dbO#%DyJ&Xo<;&H@31x0(b;O(cP4Il$~{Y?%rs;SmTfC~5!M?4S? zZ9`-z_$UYM+jcDiA%ZUV*=j=^zofyyOekFA&%rsm0!uy;QtWtvEJrEf-7}}~PfrJb zyK^?JWnzllsLvK+>_u&YjW#YYXB*i)8Xq^a@7dG_q6P%`;>wxZJ{x6e7hPO|e-pEEKctt7!_Q#vWN%Fv-zcAN39rCaN56Q$R2%$1{;fbD$|rYCiU9??JFK zP8C2U3G?5HD>#r!TB*0Kul;Nb+9#!QoErUn>%LaoyQk<^yC=XxYikU)V*pCYU%zLnZWr@BxFP)SuIEu+;*f2;z5b~K2( z|6-yzxOzfg=0)YN#5%dIv{oMRV8}E=7nv~-UHE9CLw(fuIB}fUv6?ti4qhH9|9$u) z)z@~U#D~}Pb$yUCNr0@dK>@)u4$HQb1=sCkfED0D zQuCeqiGRhDzJb1_P9h=MKsYS$MZUcqY>xhU@wX51@E04E%Qh_>bhyrg_ zPZO^MDA`@|wsojpr`lyVqGLFzV5kqEKNR@__@Hpz-nQ=2D^SR?xyQF`!KbVl8lGPA zL|aS&L&yE6F-QL)+=E(9u1u;l#baS9O%(9^C{W^~jK8s%_5yyMf)(}3?$P|^zkM0xvUTY;7nl}QJT8l>V-r&g ze(OOdN=ZRb;9*!HbZlv>vP@VC;*{lVSujQ7iQ3@Z1)oy{lz`^De%&6K1r=DDIs52t z$3{}}uNqS%I^c_KSWC!1yW1b4fte_`a9TwkJYcOq7!5eZ>lxI>Ouu=hxK`~~Jn^2K z*Z4yrq|VKsL`Z!RKWflSr*c>oeHpNGGsqNV886I(Mfq752dp%E@NKdh>oOPAx$3>F zR)yIT0(=?H0E9QR%2d208k>rgMtbVw)P{eAYhYeR>g@9>QJrqD8`fgWsr(Ue-po{) zuk1_-y#g&<6w>f5kaoyL$wAns(ZK+)8&&dcZ|4@rVxY@45xLgD$K-Z5LBJ#Q?kM0% z>Rs?xnCqDgU;hnv@aos%lazA`$g>IQ`{j7);X?M<8JXn~uB$huHOeYK*6$0}Gz|(} zh+9WAn=DAjgsDHWq3TE8YnX|xdFFiI$0AyQT(AwpK`oaSH_wB$<+7tu3htc)S68F7 zc&5diGXSLDoP`vwHx8-AowNVgtJ2MrzIwg4hEAb2nHrstoF~K-+%>8Gl+1*|Lm&f4 zJj!4ac6Z0DN~<`|?UR$(E|Lg;h__;mAZF&uiSDWKHOeB)I1#2LQvI}#n3A-r0(=QM zSrQI(NAV7@5I#9>Reo#KF7&sUmJymKym(vtVuj(jW(lBUJ3Q_6epW5J;!+tQU zV}y&jAGNP?tgXVZ6vJAbfJ%PEZ55=f_ZOmhFO}i681y4`*JP|EpaU>Z9dK+TA}bY= z3fkd8;|WH*tczWfam!`qj2a02ZEa5{JFpqH$fm)LH_&hDe0pR*B+xEZZJ>ju^E#pf zqU1KZ3b^pgFC?YYEY5^3R0bQMaEi*+&x&>{ly1R(n4;$SWAdq7^{JLQwUErsC>ooW z;JGbrxm+FYT{9b(8b>Dah0ZOsKkya7F(9>=oQCz-z0RtD2UWz?SFQ$Z1g&YIl0cKT zt4v%G7^3qy3QPN`9vf&X6~!HDz)N-AWzGEvqd@zUAcu`X-T{GW-=hMowaqd}M_(xq z#9L;H;Mh+Sx2~pEn?<`~&F|Zrz+m;-R3(>5S8Kk zAtys13LNt=GqXB6(vQmFaSBv#($vd9GvE<&FT#u$Jpni+{)aKm8LZ`|4psn3 zLw!saBMl2KAGl^h9h-3=JKr`uF?O91qG%N=wJMFelv7r8m^CxCcBl2x7GIEm1azcH z-)G|zECjX=%vj(hbD2i_Xi$v>!@mz*idBJrtShazv{4#Z&u)E_H+UC`r#qA%amz3+ zpu$M4gAjgsq4cTvoMGx4>K?q?={83-!|hoMi8*~41rFi%U?@G-8tsA*GYQrXE&_qQ z$-s45{4KQMm*Jn!AI)N1hod|t>A=QAGihjC45NN>>*gYI<96yJyp?&WgO_(7>@vB` zRIx|SW6M4~GEJ3#;dYZl6pF;={+2M4SoxdJu3>6AI%Hpw6{BPx{{XDHn#M{}@mdL6Ey1s>B<6yiV3s2l ziZ@__gTd|8M~vI^@8WudYj|sGYw$@PYG-R7?i}vpLpD6T1f}2>5R;nAjo!|AJKj@H z$QJ;NPsXDmo}_Djj5yog6(hjqgpD!GJcJEJemQ?m955`Rd9t&FHF#M4JH1sfRlHN{ zxF^$F5+!(UZ?E;Q4EMLY`Z2%5@yT9&D*iQn-^LU1Ufa*<8}Xy&ocb}(DNeZTSIyvE z{X2D3?&cR^z;R)_D0IgC2+(2>`t#334inAXis5LTj5t`1-q%s z1L6JLP5Z0cXE_t{n^@@$memJZtSz+c3M#bq2$CB&fOb9D z#!WCyeafaS)@jCX>hJGVZ|x97+rbiXF3zzNCK){*+AuUk%EI`%6t=JfD&LMCNpa&x zPvD+OqtzZ70I+M=1ovTHK~@I}7g9t=9MxmDcC!;i_polkd#=p}K9y`3xO2kLk^Bl1 z(qUQfBl>$ww|&X}8x~69RfpBjQ)Tzdq!fLRdBB|L3AoXRInDdyC6BZ1< z@WnWnX?SEl1YzvyUI9FB$7`y*bmC09LW~+_co4^MOCV>+5HUQC2!An!q!lMsjCKx7 zu|MfV+Um~;BL0~^8nW@x6Mtej`|ht#!3-Q z@^j24HBlG<_9_Z;;MxZ zJlK}4G+kCMM=l{dNxN1+KXFv%v@d9rAq?BO3A6Um_AtjS#w++z5V{|A*Wl*jsq@Ag zHr#@34nG&Oah)2clun%woYFz-Jn#k1Hn}4xx3LNm-V-Zo!Yi2vwLR5TvXn4?9l8qA z%T|+P(ZYX@DY$2uJaQlZRMMPeI6kFTpjPfeKLo8mxLxCZC+=Ma;SkJ${6@a;-9E0wB*8jK zl?Jw@55PC*m*x%bqK$`nU-BZSyAMLWfWDUDY{yHAR8NcGBn=fd=9qDUHCyb8~&24?cL`QQY@bX|e52rvMnXUm2A) zg_-^BoYO=eHQ_d(X^=u0LyeZSQ9AL7~5>a z`+O%d)c~#`gQe~Lpx(fTLg7fDa0i0-$j)^<*scSsej``h1tem{hBXBo19|AF4r95U z&G;1b#fs4^CGQLTSCCt~{h-An_$XI?XQ-&-YeVcY1t^0f8v2}s!;I6qv)T?W&sZWY z@SuQMxXp+jZ4ST0a2rQqfG9EaayGrK`a1XoamZh!hSF#S66jw;xcPoLR_nHA4%2K| z5~IbOt#~DKW+4}6I>+U1W&sLJAz^y8Qh6uKr^P8uJgeAoaeASiXPU5sXj_q^rr|;p zpc(rDa?K%|U-)oR&4KCAep34U8Bd>27~P&jKM~%Ned0jkH8vSuD}&oXdIb2ObD?wQ zfQ805nX&qbi47oS7m8x%{^z*&3_%JcT)f};<-6q^@%B6>85%-4a2`W@i;~^ldVFyuTs_*nOc)No@`){eD1t6 zW!kJ^G-ht|Um9M9ioyj3E6mQz{Pbj^0-*syocjnd^Q$ag+zA!{aRfMo>oo?dG$GH2 zs}4GX87(?;h@dGxSX(J+;I$?}E+uj!^Y&?@tmb@y>X~UYkgDq+B^WhyASKI6C;uGH zen>jHIeIwHQn}$q+)w9jf2J|HL!SDur3WSKM562i48Tw@tgi@esQWeIb_5FX4hcx4)>^%gV5zz0$H0+NKu3W0d+Jmo2Z$R|6i+!orMr zEepqj>m8KkigDg{6msND9zz2eDL4WIY2yimUxl*oVqJKXx1Y2_I{s|uGj*6S+_5?>cePr7c--U%x<5Fq%~6t@Hq@RCjgqfc`dYvfaYtZAD@ z0oYnzR)`cRFxlaB zo7vh8{Po4j72L~Cf593)weae8z$Qk~epWO0Yf~kD!U-m{i9nflw8bsyhC!hy&%|6{ z(#oLoR_81{rpB5oNK~v<3$G6Tuz1;qj?;$DXWe;!5^?I?Eo?Q^;@PP4ZBxS}Kn|jW z;)}e`#z+4#F!~7&q7A2=FPTnc|Ld``U{m4Ir!R(@86*cn3!TfUqA)Ckl=}%y6CHhX zj&bhba{PGbmhMFWj&G=YipF9TWpl)MfubB}UY9j9%h$xU9q|12AA*13cGC?6NAxE0 z`82>p?Uhw8p6Vd2k!jRQBY9BH(j;={e>4(9qeZLsWL49Rx~{A{zsLT_ z2rU1x&nC7fP)4`EJskgG|IC@ozdC_T@A15K3HFX;odXB7>`7Q6D3@Wz7>7l04Uw$f z!8&uqwze#$`w00L-66wsVEBwwZJey<(r#~B^T3fnPs<9`pAFa(*hrQvisBUNBGeLi zm=SFyxL}A@-KUg0o~BLXe-jFF2ACg9{-xUcKU zmvJOfl)dVouX@3?@<|V>`t;QYc%nrB&+AkKBYoV-@=1#hY95H^tSsyIGP^F_*j&bE zQZ^}e2@Kl{-$rs^Ct=lE8kwGsnG~$Z&nXYS7vRd(j#j_n#fxC{&g5g~j_Q6Xn%zL; z$QEY@SINKbBYz8c7u3^EPYs~XL~t@R~B@Bxz7-R4ob-BeaGMuLx2b_#1OPqW&yp3AA2eU$43q6~!F`5$*jl zMrJtSzcV|2Z?I#(rHVR+<$$cYFy0G6Jon=F>KgHWvulG5!j!)S+gLS(PdM0ARKVVC zP(xG?9g0cL9h45IpLMK;AhZ1@sD%v@KIlECG_F>o{K zy?}dc#q#9|e0$qrbq?;i0%&3-MSU^I)LCO$R;4AANjkBz!~ky2eX0yWpkcV^+znhB z>%$`5xUDkaNva6GK)nI*K>P=GZ7M%7-Jefa=56Zv+juWlK|{+W0N*i{6Wc78<`|`& zE{8Ar$!cWX@DF03e;2NW;#iS-VO+!3D;L$IK@d1tx^`Y`F@6Vv>ogrrH}*UAs8$Jo<@}a@rEOU54bViXX87;k zu9A1D!&(ViOHO_0IC(&>A{^Y>ge8wGpa6lFyidz+e2&BZ6&Rb=SW# zmX*Id_S+_{vWp1G(|1xVPFzcdGeRU9F5ZN_{=V%v{W^c_1i^I79YU4C#Rtg)R9IV$ zjx2W;_qRhXpI=Vm3q>*)(myhP&5aP2O^lVFS5ib^S~e&*gvel%ilK8dviW^yv@&tq2>EK>&@?7oGV#N+^mZm)0)1ht_s2(*kiVqj+BaYHR8< zE>%%ZxHo$1EH9TIqL3Jqw@;(znpSJ}=`e1WwYv$b8g_W6ckVqJvx8A*XYjC(+D%w4 zxFPCp{%O9*c<%vAxEW-eN~5|BNk-dxg`1kZN;E-{-#EW1EC+QMA|$X})VHoDh-9N( zz#60ZtK}Q}7?Y64x=I}K_r3*Xh4`XjB84yz#`PsVs|1J$$)9TZE?-qV^tie7uTJnC zCe1aUm=^YxjIUr&wcWL18s_Z^ZuEJL;wo@E7pfhOVeH(TZN){0J8UTQu~M5VC?))w z_idp=1Z*n>my;g=Em<~tYtVz(s>+*{NzF|w3{OYNeb3uMvq^Ui4WpwoBrG$6;CAfI z-8upt7f_N)x4&?Ap|kU_rQuG|ROj&a-Q{ZSm3#>GT?afvG&`zsxh9EaIl3*K@s*C#JKX(sM}h7tf!y}fM?@4`PCgKqa&Rt~=}=?$g$V9cx^0>1hUD5vr3 z4mzfw#=K_f%VhnrJ2=A*?To0AwUFq+6_Y7@X_i_Ov{*_1>AKByeEhaC|9ivl0+d;S zt-vFm9%t6X$nTB@+Ht)_&^2WTd%}oueUL=cMWp>cL{lPmN_Iyhj6CKu>c!Oh1eC#6 zQl%6TD<&J(n{;zj`U+@ILdx%sQ6oZr!iEZLQGxb}I}hiD==0m-`H&mehS8_vQ8J+_ zp@Fq!i80$PPC3EI$ld<#OfTRQP+PIQS}tIo1MRgZAetu-4c{AqSWr?iZ-9AH$_dI$AQ=@%hpB)vEwl<#fuO| zK=_rQ&5MQmhG8&-d~G;3B%^k}J^&c$QG*{WUzd157o5@GzqJv4i?a?aE@YNXj>(bV1y!du9Q*A)H+}a}uHRvuE%xmhu?Z zWwHO&>+*l5T$041pb4WYmgHNy;=vgDPz2x&SQ%_CqiOSPD!2IiRkX#!KQ{W%Zq?3h zG?e(qF!s8RQvK@~(&AU%*)$Y|&y+{9a&@bBHx_}{b8xZf;F3M5B)JQ>RdUOIaGG+X z2$6>aU6-@$jJ5{jd(iCbZliahjDsa*Hbs$U7a*0H*R*^XYDCf&C zl?Iv;GS3}>=B@Fh-JveyA`gktjN4M#hsOjd?z|}lYw=mhFKrgYjSx;ij|L>RdtywC z0|N^1TqQvBPZ}2;5CXPSl6{)lC?)K>f+h08eK9E9Ag9MIGK@Uhtnrf{Km10%U3)N@ z*3md!Fs-s1tBTGKcj8(LNSkagtTC})t*(enD8B=SUG((Ufw}asz)Rd5Wv#Ytdl_i#*n@n&*VV#Ga{W72SllyZn+a`)WlDZt@l(#)DI!snmQ}aB;AgfU zJq}H(Y0&H8LB@$*YN|K-(NY9TRp7f1Y1BXpAGL)p?3qFq_E!s!QeA37QmRR(6WHp|60rk3{{11gV?rq8`;+g+Xz#n*Pd>F0AKf6);=e_m zn+KY!I}E>;sRBlZfumPax&z)M8&CA-R|Zs6j|e)=5w)cmL;99ArY3Z3wWOGO&n;Oa z)B4RZ3me0gU=$-|ceG$6(+m+Zt-LFOiOCnX`xIBIU((j?E!!}_K`DGPg9AF+=LiZy zci$eMm%TFf3W=rY4QX!^dbYdnED0m7_~x>SdVVYzPp?v<*^N7iYDG!P-Dn5`CncW? zbiibeJRar)6WI0k>x>nS(QQ>(9~Dm zSSw7#y;Iim{lS2J=B5o{PAq0!NjX+dSX{K=svPD0K65hDa%`{w>@#ddz{G{YLd^o>y+q*PmzLW{f4bsvpnI9I^ zXM;Db3bICflE;?z^<;U+s{0B3!N!AR|Bj>DB}%nrp|u4)oCX@{!{TAEFSrd`eF&eX z(IK>%NHi|hjqgZnlU4!j=N}gh!nx!^Wb8!GlW1z@U;1Yb0%q|Nvx=`;^sLa}sN)w*;*SPt2~Eyl)y~IU~TePw@TU?<4F09%IS9 z7L8E8O9i9(l@pH*PS#8T*|sOY;->kQw2B5e^_uy3pdDnQXr(D83t>d|(ux#bjY&rQ zJzNS?F?lj+GI)ZOP!DN=-^5H+8qEVVTz?_W#Sj)?gPEK+Jc3AtJ_vs8 z&MF);kHdsijM3ul@}y!Yo176sX%VZGM3}N%AB#`P;7eM|$74K;TD~Z>Q1JuZUDqQb z8y-c%SNssg%(Ten1VWu?q#_k(M$$Y)3v3uHbjFicHhSq2)z z+cFS=L{Dg@nFAN4&rzJ`7b^9}av_N17TuMzZ;bj!_MoYP3o3`~tb9D!TZZEDk^5H{ zAW4`tdWqc%go*d#elAaAFJ|BFYOz@&Rs|s@VjD3R*yL zTuIXDeYw6YnSl^Le4{Qz1sao~4qJkDa;+Rp11|Hn zpZhTTxa@qcJV_6`;du_N%2s2(i8JSIU;z$$wA1_7eY3Xh!6|ERu)a0YE$S=-CmQ+5 z(<4Nj@LK=T+81mVkBPX3{k6ep-|E5bpn1`oeU5Y*U|@W0gRLuKE#%=}&3$bjV!-Wv zTxY-#vo?#>qf2{6k#^o)26Lu|+Wj$_a`~!%`FCgW{^VoLq^3p8Q1N zgP2r}zBN`}oRm<_{XeY)=(3?fh6FxGu`+%hTK^$ahy-D{@>gv2$@qx8qm=n%m+Rmt zC=}GPTo)Rch2icH6#IJ-Pn%C9EHEcwG1)A3TI}`C#dI6i)+1y-g|7e&1rVigAyI`b zf;Fgmqand2k7%YGQ+-ilJ!VI?*!N8nTv##720x^DOEV{%O+mOtFxL1b3%&2yG>^k; zn$K+}dAsdHng%Xp0Xg@oWKennvOX z#32nw8p>0j^;Z$nv?ANY8< zePY|dWmXG@p`7K~8{tl0l{_`2`RlkLru=OM2*Ziz7IYN&`Vta8V3GF6Rm+4HX7M)q zfq~u-#I88e^}p5 zas3>zn}7UpsToZ@^I#Qbqu|35_nUmL&GlpY-~kvN2i8Q$#sqZ?5MdUGk;nc`f!<$h zH1pe5_%4pvy7BMcOO!D_K1y?TL0=!vdYti(I6F?-s~{dQB4S}|X=SPlJA%RGNoxoheOo=W z2U~cGmtn%W&{^(WnpFz6d_lf_YDD4n@#>#sUef@=V4am^l=p^_=W@^87sy6sqG(dt zyC+xG;#nFxWTRhf)#+_8Jh)e-84G-+k#)+$bdNf4kd4>jX`@ku0ijg!RxBK)M~#ce zd1ca)NZzS~`|T{Ab1>3vDh%d*CvYVA%J2137Y$1bjzW+M7Ya3u6$&o(!~DwRo!o0v z>@T&hC#mxQX8O=-wIgkEk?J7oXX_2~2Zhe@7taj2X1;Ks8&uvpNosZjB%XMY%P8iN zZ6)fiD&htl_kpSK;J|HT)PPtD%xAk?7_Fxv#eASKZg#f}XtBE98gaRTuWn{jp$*;s zcI7+T6oL?NO!o$N=?1bzX*~^!0u5KA853}|%K%VA1-tO!6tfKYaC5soBnIeKwL%ZO z&J4(f2fbb5ql(^Jj{I;sw(D61Do-`;+y+$W)?R9wds;nqf_B8nl~+PX)1i|^qqQxM5(nL}w4N!ncVU=c>gbx+sl z*&7M?X&Q_{aN}`~k)tKCOp;lGDO{Znp1-ZC?*C{!89ei^z?SKhqX=IuQJMueY@bRc zCn;ippO7)Uf671XS-{`5*$IY>YwSn6)7WuQ;yvN_aDogC==W4+4%r0gKN518Z&IGS0Le+Cp?!m|NP!%L?K+kRFjaX#K4`Bpdcg4e`ZEIo85miQS!YC z3zrs^Z>to?6Yj0=-qNkm3^>$KuOh+2?B4QanZD%@g;_s23=KTP>XnpgNc^-=XpWT8~2Cgn-*nlM=FD+pc@n}XqXa?3O;GOJ`-b&U*z zas5={NaJUhmWx2HgV0NvVW0Nl2pKY-FjhPo&afTxJ6qJu4efwLTO{Mw{+gV|EEY6_ zINFm!PGjkQ(QaA0xi`9;Ep_C3MQy*?>1ZUS)UA3_tPu_icraif`n}b*Yj416i_f~egqe_#L2NBZ0YuBU$L0}aQU6dhzV|U}=Tw-| z_NCk+wq=Jbd!V!F5t0;`9dB9q0<&+fiExfm@C>93aygvn0^kV9zwGz!!}LcO4d7)# zHW%h9TTP5#tM{zQ2t>NV&NA);?5L@Z#%qZ%G-ZZ}q8K8g9F+k?I3yxf?H2#tHA=={ z#n}<`TcaV}c=2-gBycugKVSUJ2oQVh5n-pUh#Z8MJpf05U+@O*-W5&(s*#Yu5u8bU zImvLeIds}hT+mmKY}5RkF*~uA(mU=)QIW{kZ`V*t=_b?n_20oYSfh28xjTHW<2BEC9V<}150wElad7V{r~G zuqt#94wMU8@3s)`^k9>T4;!gWD2*)ChANPz^yh}>Eep06C83fWxkit9?(qnGOXb&a zA#PaOuSR`~izY zf<<@^^$Nyr@IOswe)mS2g@eCDp}=1Z6M;1M4T%#56f1DWvi$Uso2_?|o2|aWz$t%& zI8=z^LW+>1arq&V!f8z6q$VV4UTIm-u77 zr-dZF2ga(Iv@!JIT&TyQ$EFVzpqhY)Pnbadx%V^430J^vo)scG;ImXdit`Llb?vv9 za8iWVxZ{7pAkbi{k+5Ock4c1*c|~Vcxpo`+vu}Bs6vS9fQ|cCjl>U57g#X)MsxWRp z1%wmXX_N>IbXJ#Fl|Mj|rC>wG=78!FR_!wv+e|SJv}(b9Y0!q2O>OK!FHM`(1U%U< zd+0|2Dc^zXv4|1)ii0{%;ciUi^Pzrh3l*izX)MNC34~n6-j%AT{*JwH>LZ}HZ|a>L zndZhf3`?O`Ico(5!!Jk3S+pd=A|t3q@!v>K1Vs=*4S1T#gs#Gm8#$4c=;W(}vcSla zt2_=fVUnw)DtFlK4WWlBs)vksrmm)Jq1d60w-N4$mb{z~h;#QI(`i+mM}3y)x^ii> z1<#n%2&-eFN`snaPjxa`Ve#b=C6%OfjAI-lBnV%X!^U#-13C>ZCz|=x4G?~3vzo)x1EZfiz^lp-6%kFm4F^d7!kqrHA zsb-x!Y10WQuB7g$aVS%x>;Zech&#B-Gpzv^cqaUYXf=mdP;dh>8v`|6vJ;ya)Yr`{ zkF<2pzc>g=>HP$$FGrYb@-rU~3+>jB3)A1=E{KJX&(S}^M4Tdpv1)%`t+U`tiIhH) zyoJ>VaoAr$knJIzxtsP88WGlzeuLJU{%(ti72*luZ$Gj!r_>)wEODAmdE`~Xjmlkq zF{P15a{!7h*keelAPWcP7XnEB7%wTKeXCI|2NO$7egN_aG^@*n#x;U9*2Z*1$ql4I zkYVBDm4-{NkkO7(r58^}n@vnDl2@PP_*){E@1eYJxd4&}TzzTSw(0i9J(3wfmQB#E zDohi~ejz&H-?^)@Bk;CQdh&=_3WHwUSm-9yIZ=EyJzCO(rNdK5DO2tiEz~My{8Raf*T799*bSd~etn z_7`#@E11??bYi7`!af`%{AcjN_286w;J7XwkcVp1pcOvkqOlGq1A9U^ni*b_Hn-H^ z1(m~~eD{Er!U9CnqGkz6>|cvvBr#)_;w%M;8Alb<*RZ8hz_QBo8Sc7G`T{9y$uiL3 z+k>A9+TFxUE4a)aYdq9oDtv^$amG-P8dAF&YhmHAa^3#O>MvTNb|SDTM(eackjRuj zp$(DlLC|=hyyTeetYBZU6wjZpb_(WgsnYd`OwcNB`>7wcR!1J3(p6Z~Fz@OiT}Q7) z(J~M-$UB&7tGA;bi!13q7B0EZBWL=5nA*oFpGRnKal-s0kCqG6bB@MWC*dq~$B9u* zXdx-yc({;YOYVn<^Gf_mZd)p=!oIw`jISTVpa%ewqC>G7ffW%BvXI22 z+OyAEIM7saIe|mecWRa>CY%E@T!0b3kq8WNwg-@ufA$`IYON%p=K9aRwzTjTd>o-eI|L$USVa}y-Sc9w^4@q&Kc-NsBV0F zJh(d?pg%jywAYaByzrFMx*}j75alj>joo+Dqx#d{ z#^9k1*ggBplM6e&jqCl*z3#i{eR7637f$SPypJYcFmc@^^azd_XG}ciCg2W0b7s7; zY7029yMpZ?trPy1p6i0}?YWPT(N6*pR*8)YV#8}I$R(jkC`jVy?EdX&U9!>JlT!xu zg@{*M`n6TQ!fcQ;Qxjk$yJpGnkMzdR7!IyHS~~maW}S#zWzAGqb@R39EnVL?g5P80 zU}JDEQN|b%Ni{F(F2mXV;b{NvJ=3t5!j4sNJJlkvLi~)H1=P?|L8DvB0ae7!04pwK zg}y+*L5?_sPr?+}c>33n2EK>l<|e{GIG~}qe^d`t)7&vfE!3zuX%ra3vSQT^4)w)(@nxL4=x4lm$IEWTLc!gznpm~^)ot=00>xtJMg=UsFxxm+B zbioqPv6(5P>p2QIZSV@(&E77pD?9UcnVx3?7PKmXKHFtel3lL`jLAi#hIbOc&Q*N;p>5_Q?XSctmp}DZo65%Y_P#^?{*1h(Pp^A`(J_Yw~yz zBwew0csbWyE#V4X>bEQJLeGwefY}39^=fecu`81EL4SH{pO?WfG6=S9m%-$nC=&QM z=GsOb9&XloFK*&PP;BS(!N%Ub{0rOy`S}h@;jVDdz4XRC>&MjiHNUx$-rVjz^uZP3 zfNPF=MtTg$+(kCR_&rcKZshDeWa2aabvX!a!~bG0;C2kH^AU`0bhTL@ z^PgmNy=SF5IEP!vlY6goqX#+i@E54nL5LHmw9TJ(&J$7lx|`=z=l2LPM0WaxXnFP? z>iiJngW`k#^+88#V+20?%K-Cxoom~G!&NbvPxOtZ`oKoVMEo{l~u_ zj4$CzX8}_Xx!>>aT--uyn)f;!6Mwyn)-v(8_vrl>^>^0L0@x3o)BwmK)JoOKxSN>N zBzZ{p&iOix|TG| zt7%I%AbaNw5ca{z*u&fZidFSIBYy)x| z^9SlmQN=&v^Wu1lyonf+O|5y_?dRBTK^_{ae#Eh|`gDtR1x!;m5J`{}9(yp%>22|5 z*pw^e-t&4?i5!C?Ji0hpESWLnZSJaR=jq<?tkSWh5OZUTmP}&YE+danR>4kY7foXhytc8IYHRq=}`R)iYQ?( zZNLu{x6BtXN&MWLNEC;`PYLs21U_CL2~)9(sz5`S)H-ZdhNUl>Sn=U3Pq8zGdv*&c z1KVrx+ft2a9VnIs@ug*~Q-R@ndp=r2=q$h_fU}kHum|M#0zW-uF7&W|R)TExzocuI zd=oUj8~B(tRG5f*09ZgxlG5rG2hvU{B)O8Uk#cc#7)1|HCq1?yp(@4@B&^Kbp%y}? z-0mVZxO4*8>b?Hf4y^Spy0nYzUU_UQMR5TP5LA^D=y!wspJ4!v<_NN7F&lDiK$8Px z4@&}NRl5PVJh%`Y%g!4T@!phLP_^pJMiEq?jR8fDv>3-S9YMf5k0viP@6jpteM>h_ zpruVhJVP`7GvgjWhx90*v2;eFJO0kaK`E>j>`?-1NwhT@-N#Dzx5uDp$!^@>%`XX_ zaX*SBsAI$pho(>Ahnl4)?fSd{<3e{{DslJcr#inliFWin=u?(6$aA%#OEIQ=Y`fy&q5zKy=&eQ#3NZO=__XeD7YlTSojU3%#19gL*P;% z=Ii@l?2O3;i`P<6nt}?}m}pvNN;VV_LurwqrBtD`qk|7LO*acdS1$JgdN3+XOi*P3m0eQ5({T} zjVp2i%8GuS^#xahqOiu|VOGNILyuZRj0b(K9pVlsp#Dt^f&}H%TfJ1T5}E-ccL$KC zlW5PlTzV}4x?@fSEKvGQMc*JtM%E0+Lwy7&7>Fff_h9T6sm;u`Ffmud@&;_G5^8Cq zml3AT$FC_ws1=G~Jv2ln7HobPVyNE;=Gw2+QRCtC zAmkPW;*j8jpx2p&A`jpJ;0TkT54dvLe6H8Uydy=4%lfom13JD=jnRMaD;e6k%*7dvCH zPoe(Vg)^zG={&GxZD)yI+$M!t&*4R)x60k4u5t@(T9(uxURSU!Rs(&}PS*&%+b|W%R z{$tuL5^@-wgM18cgVhEgevK3xEFO1hNY)@D0HO{wUhfw>OoMt31h^ssFAMZS25lY! zm0}cZGXC1!Ut`5n_PFG7my3_w!*Fe%5tBMgiA{TZp+i%V264*-bKa zJvDd4@qaIj3|%|U-_1AawDBXDHO;-H&^baD0oJTEL7 zuqXf6j$Y$5kN)hG)r32Uu$M^()|p#2Bqqv!E-))$K7-sDv7_G)_%Rq38^(!mLr{ag z0^>Kr93V>$HeK@AY6p?Af*r(PL0C76(V*6W%HZnR9?wtN%QB3cJ;Y&1bj+14tsGjb zRLRUo!K@IOi`sJLoQ2v;F*0Fdbf94Zw_vZZ=RnF<+avc-Y_KZBm0#g?VtZ4i-R`Nb-S1=BrD5^HaW9VrU0@ z5XcVIBBT6r$_ZSyYJU^bY_5&WBexq&7z2-B@+h#3mvF5Vv~UFLEzC7x4Dk%ik5~;k*C3Z8fMsG1cfb3Z;~)2IlxY>2Z1L zEI3@oo`5cv7S#B5uz3|ZJA4dwsJx-Z3!pRwJKPspj(x}-O?7H?=TlM`pq2jKHY~8J z1PtIz#mSm`Gv#QFL0sn`nPHR%i4kPrj4a2%A_Fp7dH!PV$BLY{b1>xg`^SPI6$gQV zph=YP9&-y3xCN&UxR(6LrN_m74qs+5SPKHo09Ua-0Ic{|Q*=oFwZXAvzS3oLemN5I zKyieL()2J_`g?OGsuXFWX>y~QqR1u0Bru$jaDy4_FU{eLmluYkPxW$|u7D#B<#TjY zCkntSi)fi=BvQIK_mTf=VaN1LAQl2W0;}C4NjSiS|dLcDqjx|EMa_R;ktY(-G>YWzuM{vCpkJGX~ zunnB+9P^gv$2wnCV@`pE+f%FAAL-s3Q(kg>!=+4$rQrPSa*G;~6|$JnV}M<|@JE8f zv;ZdgP0XcLk4F?&<|2-0!n@_H%jGy3n3`DTX#JOi{)2iv4AaZ0##Akn_lw^{Q?TUY z11M@@Dd0HqDLGF3eKyn$`OLLLTg)74Xd*W?_NLIxUy7;LC|xIhrT ziMw3To9VM_o!%z!YJ+8(@GxG5e(Wwgu$_qKQCDV1ta>!4WlHcS{fPkpSoK=r&w%>g z;Y!W$v;9i0DMP#-kj^jKeU3cI-uG#gXa$}Avug)nLfb)TI`CGl80et?PCstc^1H}t9MU)$%s_HEI6&^c=a{Xgt z^25%#YRE}JlI(0K=5PY3_>&O=xR#+20Y}#Rh?;IRwssgT6WRq!*~#_ezbPNUe+MQ+ zDq(?CmKH>8O(}*-FZ>YnwTB*NefoDkt<=sz2-@rhakPk)xiI<`v zqsSDaYBBP%j&M?>1oYYI z;tWEjxJRZEMK4ng-hY%#a&D%`CeO*qh&R5ime7Yw<_1%779u0D6e2j0(I#qLbj68s zAz2*n8TA8r*!JM)%iaR|3CKLbvvpfTNmu~R;OLw7@PZDBo`yefG}WFE)2H0BhU?yP1RvDP$H#3 z8(nB!OmTc_bf3|`dUU@?|Liw7FLBx7kiI#Ds!zF5i@4Y z`<&4lK=u?h1+${lnki(__hVj&_et4tfyy9_l0kMAtG3cG z0zv^ObSlZ!u^|SFJ1?bRa%xWja_n|M?Tc znTUp!ZaG*4ajgz{NnK`+ETQE#MuGf9?~1_h(9kfKH|T35T6J?3|KlAneDI7TMl4gk za^`k^){-4&VqC`y6vE7Q*%+*8AZtV69-uYV741iZzX{KPQ-bS{ou+%aP)X);!^*7)zQ^0UiQN<42dTp&CPtv12NQtu6 zh^r<+VBOOG;Ub`*fzbvdBrIoUfDXqBLyDsigHF>1_`*sgNQ%5fmWbav@4+RvG`?f7Qq z^ecF&ANua9o1FivX;x;&_(E}RPx+sDV(~!!2GQnCio7-{QG4*tHEtOn#t*yK_S-6o zHfkRwUizNOh%%dHtudKjp;BmB=v?EvxG9d_?A}@LK%`5Q z#F(&B#-`<}1vgUE*@?THQOYtL4nRE$z`)F{mL#639&&ObtycFD^NcdG1?3TP4P%=C+5w$qxuv1gNT8UH~Zvb-So#mL?Qo~{v59^dQ_Fv!soE3?5H!6$&_+| zF85zYp#e%jp(Of+FPm&mx>^Wwn~vA&k~ijS_sLaPrf4A{Hj6T*>uQXV8*e4c&H=;K z4R0ONwb2L%Stgbsn%R&MiQ-Vm<|CI5{wGmglgouq!&r~&i4YXE)8(xx>s*t|`~fpd zu8vWVaaU&&^90maW=?c&)>`joCaGTDuw1f*;mnFGC?V^MQ5i+WL>6wj z!{)K6sxvgh;1xzsgVK?KGiD>>1GW?$qL2(lLd&?}zVS?eHfInihQ2@pzCKOO!EO9E z6kHRSoCKvCpvQP-O?&CJdX{jKE~Gg}h*)VU8A&dI%|XCp=Q%ZQutV*Syan#+9Nc%y z&~3WM*7Sy-*!J-#c6BwZ$-jSq>f=oX(?61_<6^Xzf$>j!hqhmEFf$ls?`*R9|5V+; z3f_dI|9GlfNipwJ;!&DL_ZNJAPho=p?`y1DqKR(#g z7`^a8 z{m(~z+xv!o{QUD{XO2wnhE;j|&Uc6JP43va@6LX{aQCymyFXsVE87q4+JXQ75KxDH z+||GD==N4?_pz~|!+7XI-zT^6{TDxCv|W4qxAh;}(`xN%;qBdhV|T9XJ$$1v(BBwp zPJDl$asJ@Z#e@lW>c*xJ~2_w1o_N4`G#(SZY7n~ej<4-d4OM;ZqQ4>gAmo!+|p z=z(Tq?}5g#zQ*Ly!@IZc8|-T|Ccm6G3e@7S{sa5^8e2|&fJZ)PjDFiV)i-i;A+`^`hTtC>D*wef>Io6mw)Vy_fV)BQRUpFTAHpd6{G$u|qF6?ZaJ>EFgymM!$ z@dZHc8)$ru*T#NNV!XR;+wtG;JaOXq!LN=FojCL1Ho*V3IevSjd2iR2ooBxO@Ie2$ zKQ;c?0NIR;^fg9zeDc+ST>}GygI^4u(!VC&xYisUpEz~)z~{}0vwe-*%{!C#PT>9K z_&p49|Nf4>hYy{(@L~U8KXjl;u@^Nqp&gU3&v7-}}oUD$TEape1{FMs;a1N~dJe{`jNyY=avuf91u zxa;)8k3YgAhfg;?A86cd96Wjan?v6;8y7Ae`%gn3HO`$s{GSG&pFh7i)Y^J_X50Lu z|MmQtulc$2@kh_ymR9I#mmjRr}_(K-JQwF@qr!91Nhv(Z~s7Z|AB$#UW|P6+rEjh{WpGSPLAD~=x^To`s9uSSNEUm z*J@fjcW);igsMILjR&J=PBa@6IDv?f+!|9$VLs<+=_He1fGlY)S_{ z=ZwDYyLBdms#I3%`v%mkmi4!q0I&o>wwomu&*uMYp(Dv5Vb4O0}_aE!ubLhMN zt-B5l?D?H-JfEDnckbY}ugWKH@Y%z=KR^7Pp8dFSi0dD^u&DR0#@NZdt-i+H(a)NPkMIAcuW^1)^zH|Z8{GYg>vt~vvGK=qeb-6PpWbNp9sT;N=0}6)&tLoUgT|c;$G;rt zC*;P&{l>&$ubo^Q_8DHkd;0d|+4*X`@$W8XJ#jf~$J|E#&IIWc~wx%EQx z%jWjG-<@qf`0_#XX7jsy&3k9&oA-xins-Kb4e#B3Xkcse!hHz!e{0?w?>~KX@Z#3y zgHw;1SO3^Nxv#(f$f2#xd(EpOWB=ZqS#FNEn-}-(Y3;`&mv`>Hw6!@oIr;mM=G6xi z2!>{`HKRCMm@rOWVO*GuQN6~QM!~gAn$A$rG4+afUBcC;I+`+*eqrPr1eg<^~FVLfDHGQ!#|Mbl2%FG!{9L4v`@E<){ok7%en9ZmEum2MvmTSu| zUt31lxi8Ot&5m=eYe>9YoJYX($~r;Ke)kuJ8-Ri zj1&oY`dS01K%Ae^%+Y&0zO+T5Jsy^h5=1Pk{BZ?=bk@4Y4}QDKlbb}v17c#Vz48K~ z#%Mx0vV^L2WJk_Ev`(b-yqMFf>m7IU--Y}0Md!77?SH6VXu^1z{ovr_z~ndOy(NmO zZE$S~AYT-C3prf0|G?k}42ziNrO?+Uzh9S&Mx_huFWE{P<{J{;$C*#{da!Fvt>pz@ zd95E@%rX6rB7b|TEQIwNOxd+ScgXvmJ3d>K!7$hU@-N9u4vF7o?RhY zpDyDBDZ`OLOuEt;cD&;Aur;K_3OH9g3v)ODN<8ytbRno0vY1Pf{V-GjL{JE+{H!`( zTNzNqz8e_9@snnc-W{Gor<`*-avu@Jx=0j0c3Tn)Z+&3kgb$%&nQIp~q>`X&5$hb3*S2?rM@b7K4!y@s{i$A*pU^qaw=@N zY{-n#X<{SK2N8uq1_E&IhK3P&P zg>nP;3AKV*A_Y!S6p@o&Eqk&341tME2icJylR)pN;{9>%Po#HYF2qgI5RMDs2@uK> zVGF#1l3H#Z2JQo6$I#yIX0GW(s1?C-)E>s&Q5nmLtvw*!q18^o)rj9~>QVY`$FcYN4QcZgu9*1PYq2!&)_ueH$Vj_hp-JpEMdID(+whF!CwDgb9pf zM&i#yTU(eo;;BliWlAag$G>rU4L|_w;D7mHu|2bbrZc8)pu~`^x*hvWqcw5l z6sA2%BSzqpQ*^E-wE=%+qVS8>)FW|?%0_BuWLa@O4@-i3q(q%-#zB;WOV)}G=NX>R z4K`Cgso*1dj(0n?Id_Xe+t%*T4br&DrH=^rd+spH(TP9^&6;TfbV)t{p08v@!w zTlF8S{NYl@on5IU`gwwDYoQ35n26KYrD2%!5*^`@7ybe-vaqi$J`?eoCK}-J+$6)GS>YKdKcXxbpe0$%PFF)$LJpik9 zWOVBn7n`SceX{T1XNQjNZT$XFW9+lNa5sIv8!oEzk7-6LvE|6I;XfRNmA+-i z{$2Rrf$#UXjvqMmyAJ{R_HQ<*Ru*Mh{NMi%g=uL?UHH4Uq~_{&QCL$;?VsnLwGj#q zgDHMslJ1k2%P$M_(JnxOwv4g>r654qk-0H3cm*2CO6wW!KYD2iVh|M+no8ZAczd}KT4BBS6lvRC1FS? zSPI>8Wl;=Si88Bb?!bCf=(i}cU18Opt~0X6xe$G6R+dSCaRr8H9hO;X<3Y95!@N@f zZ5Wk%Epe}JZM;)0_9n%3>Ppbl58xNp9$wi#T$1!{m{Q8~W8D{5=8CJ0pn0+%G|_fz zVfkr$0S2yC14QLTJ|?tPuubL-C?yox5(~vE!)}$??6PW#Z4X;pKW(OzR;elPGfcHE zEmX_}c`KgMxTzYtviKGXXu++L2AVdoTM1oWdWa)3x%|@jnqEN*G>OAmepg!jf}O4) zPW)1GV=zp9utr;Et5l!Z-jP>S6kG4Mv9*3QUCB!Ye8+3(vbN!%6Sz#c`=IwZbQ(aZ zo|k0#uwl8GdP!>4j@f~`4B-pzSD0}WbJRn*Ps1dA6NmhYb{rId(9iC~^%ji;DC@8^h0oE_VwWuq@J`svO*=T+s* zYBDBCdlBylU4}YG;BV2inL-C$M#=xqV0q01j%K1=mUWpgh&*H-*8a*0&M-}JpTPX0 z7iZCOhT9}EpK+@rl)GVT?f43Kd?bd)1D%?HFEQ98=Xe0}$5Y|Q9j z8C?v{N<{T=Fth=L($i$2O(P`;;;KO~eN09f+Mbsd)k9FUv=n%$)|TPf$X1$o6=j%y zPuweQ0Dq$Mj9!=Aa?#Gd{b#vfbqD(jpNeO z%jMl{N zlHHoV31v(wTC#mzlZf}}aCPkg7Bi%Hyw!?wXPlRd<>AQ>IAAA}Ld&e%#8{j75lGca z-ck3NHq@PE)ZV(-1HKHV;Ph^G+jT1`$BfnjZ8q1B0WIlcR|ZhqzbOg2$; zrBcnjLipU!7QMZo6HvRvXNrDA;$k=*Ll`6>WyBs}1M-Wy%yk*h?Sr&77$rp&aS-Zr zQl+S7X#K89k>{iig^2ICj)Ou<=}LAPg;;%JDEcd%VvPQ4cfbMJ!S7;Ii4SmRe)4(! z%FR&%xzk{1Ld1tRW%DWx^k$IySknTyLBz4Cp3aP^4_MWPq&}8{6kWY2M`PeIp{WPQ zO!bVl6EAW!cV!nCeGMUULu#&DZic{LwGjoVBX%r`A^*#Np}f*iHiUDcBjvXWnI?~{ z^Oj^5ZyJIQM)Zp~A58Ncdv<18aFmY09H@T16S#u2ZVW*L0~6{lxyTFK@`5}*(xs7#8heN0gAfp7SFvx2 zaKx$b^>Fc3x|99^iYs}SwoY7_c~)^x^cw5R`XQ1>tg{Ixf0ItOu+o-Sz-HM~2qmpi z0-hdnZnC^`Y3jSdDQiGQ-Ay8@G6TPiM;%*wDs*l)7>rFPw!HKJ(r>nymK2;cDQK2Z zb8JTNaAS_^^zrwa6wL>@BEgw#1IdfXPT>+qR{}Blw?miIl}?E)KYD3iQe|vn={wVr zr@nLL%V&v10E}L7h-Qq)t>BYggjb6 zU#tUzPrvdi4eGpGgk)w2+e5jrpQq&(CTsGt$Chq|$Tgx>gAFEL1G8N5q|6e$&fIoul`JAM;w$JIv69j|29CjWX%aLg?qPn47Mx+I?gITcWm$YD;Q zN3m%N9AR9w!xf4M>sejDqjwSUyck=pc$=_u{oIc5f`vy zMYSc=PPNNrFIB@_(oTRSFE@)k5M5k(r}!tO7cjTly>bC>T4F{L9aA9&7; zY`bT2P1j@eH^KI#1mPJBf=N{23(%qwy=5;fQla%r$p_NuCvA%H+#fsPXuYw*&V|sYd5UfqyWOyR*M^y~C)R$}nxfySB7RIzP z(Zn!oK^SNu+rlQlNC-f-9TQy%vpXnO+;&w_e(LF-kpE zEhz)Eo~K)X62)N~ z&uoo?Img5GnbhYjAYjulD%V*!sI>7)>vS^l$Sh`|#g&z3V(h5{86OBIC_lrEJr6)& z5>rT##G>DII=C80wX`=FD&!3^Xwfza>_IEYpTU}EUVQs*>umj0KRAib+l`<@7VgR_;R%Uy0gOXuw^*pD6Zj!wY0<_+gEYRLWdQFEg8z!JdfGaKv^p2 zwoRB5CAM30Xr22DYdSW8+fHrD)m_b|h-#l_cW~)lLhd7B&c>l%AxY67`>1>ujs%6 zvJV*4<;NAO4YmtQeW4p(-pFD~H|YzbUq zkK>jUGrOn@2t-nG3^Yw;ke$FmzjR?i>C*+$x)O&PU_3}=Pp(88*F68f`~Vsagcz0F zz4509hN>$JuiHD&Ifa4_n=uj+j9iohhu`JLrFn$6a9+~J#Zi(uzzOGS%Mz%;6X*gc z)mQJDYi(CMD^KJGvj4Tb`_(7&OHUI2Ty33#e$J~g7;MqQvc|Xr*4hv(GEI|qDE=a@o-j`jhDEr|yqU_FwW5xM7;L$4Engb`z#3>?*TyjSsEuL! z(M1$;al~t_%a;c|%hN&;VW7|}p&aGmm373^7j^3q-4ey0;ZkztTtOkTW6Eg|waP(I zmtnYf1lFGOHxnMs9R(jSa~AY`LXbPCO7ga(7rEP>UqhK1sXOa1gT+kYGH?PT>7z ze7((?`30xSDj5riKwK+rWepJnkB8I;d?QaV5*QVq}u6yfl% z=*%s9V`Cjih`BC@MSw)|g5MB9#sLp{DfD$RPYED=8@jNm)#Zmcc?HZFM@W#9sICA;OuawS+Z%{525 zey`u}$o!(sPz8T* z$+~+3c>%A$g)6-i2pK6xC1e5QCRjCiptIa@Zltc~!u&uVQ2yaM!DoeWm=!V$6UY5V z^n`~84OcZHW6APT)RP0*lTQ&2spkcw7gGyc>m~EXd6r^8=gbvVriC?5RkcAL_1o2%zNBR1!y`{Y(1alx%=N zPiT{PxQ9OSXta$^0G-(cFzH)h7ubRPJywTXebJUUQsiU7Y5K2E?w(XaFsZ z365a*JUR8HA`Ui~A2bfn#bj;mSz;Diy`{luLDh9igQ+@A(O*Pm3OqzHQ3-Z0oLqh0 z#y!o(gqgU*hUdP@;xP_m>OflLaPc$Tco)Grpgs(MMDG=uDmoZy?m;5 z!`L?hbml%oTGr)OuLpkl3q@}Q6pYjSq#%elg0fZ_jRA@&HLFiq)T0Ybo`!Z{WMSbZ ztdd#(x(+U$?g4DW(=Z)oLH?&#$Vp7h)l)rr*L zq?gz|f&W}zVbX!E=r8G3p4zJ*8J{vAl*igOp>ROIuWe|dnM8ef=%_yaKjJ361->h! zX+%VAv}@4`F~eTBLwZXai(k_z7X=i*auUVH6-SP)xO9lX(4l7rmb=f8e`Akz9SAL> z0Bxta`>1J;yPorPW3#KXAgzMekF3EsO7}ic05Mg|PACOCqx6g-6kZM*InorM2|CdW zlr$~fplXpM-IqJRHh@qQW8Y| zLmd!EGT2xhm25=K!RcDBItvSwUiQyKkqc+&no#mCJC`Y0v~#-bhsaE^0s*2%5Nu0p zz20p^*`*qYA#y$+^k={8j%mrP(({|ky!h0>81%(?Hmxu;yJbz0E-WXpI{a@-18J># zlbR1V_qcp8RJp?_Ph06QnV!;d;`BH(n>56TOg*^R1^#sFxUksk2Q9YihbwNbK{92h z9$ay&FFP~1U=-YiN1FEPm)#DV*HR+iUt6mBSmZf_{fo04lyv z{8nQ|b61|SxQ6{qPPITAZhwVw5c{7LLmR|54;}wzXJaQ5 zY4efF18KF7Fv{cNxi|#z-`xT`P8nn zG~>v`U-ceKj%^RwZIug4gYU!{i-qgxR4E4sCr_DVvs%vg?RQl;E=jIF<;0XRh8#>G z?T-JFc5R`v^la_b@_lNMkeIy{)rS z>|htRf90wv@8NRGiyk~X1e{T!-*k5!fxgFeEJFgEBN!-@1zO?q3wM2TR?4Hx0UaP@ z?DEV!-9q8mk6@yvLkRSmBLqZiXnJazgk)*xjsX+=zu@cOb#ZK*ThI#eXZ;uBa)mO% zwF?gB>Ca>)8Y~}^%s*S|WAS$q;K4$R*E~=1a{Z-Y?MA%7`K0Zc%Dm9|M)9n16#qUF zq>FG+K6cm+IdrAj(RXXE+U&08iO`SPhYPljb(s$r{YzP`Ed@}1T(a;4%*-13O688QRbD#hvr`z{dKI2HcItE2a8RB+?8Q4> z(O0`K3@re zA*!!AUi8IB1S?NNup+x1;a0lxdiSjNJ{@DP?_%T#qt#Z0Q$dyzQJN=uc+f_(1*g-P zN@(~3Gr_7|?jIl?X()YE91SFl*w%9O+&@PbW46IKxxx5}J1D5^eorR`=g%t{#OD=` z@5Y8&#DF+72(_fbODSNrT%9Y3L^>0N-ZZ+BYOpbXui^CVW199Nw&#uP zUE~g${guf$wHcNvIVl3y&1|{Flo`uPfItMEj=k75?q*m?+CS{@-+Q7?4GqM4&cJ~# zB_gXZVOuRSpMHDBP9Uz9ne*0?%Ox5;+EdgSD=A7{K4fg2Hq_mwiP#5+%9vU4nv0#) z)<7Lgy>%4xJYtxL6xUuOeK4DWjk~1-!_m%D|8#kMX%^Wxi2=@7=5qM|5u}C>MuHH) zUolC8@f$mra7WDl+1&EBxO<&|gR6RbD67Ts2mr>% zVX$22BADgimk22MCJdWXpmiFWyryP|cFT|Rw5cT1r&0za(TUU= z+z52KjaHpV7NxpM33haT^(eBvcB1zk6m-1pTO;r&4Yw+ZkcUZ0n=4Fa+&+x#fuKdc@I`k zK|;EBLrLj>ksTl;R`y1Ug}&s;^H-P6|sr=rvlfW=|;Bi$ODAMOmFV(llZH~C;}&al<9@&*7nLjYay z^2kG#p4TyYz{Sp0GAa4H88Q3>D1sK4q&zPfPCh27dO>S0phE#bb%UrC94e+)JvNb5 zn2i{=G}1xM=UxsP_a9n!Dw~z3#_DLWQChal77Vp8ZB}{ES^1#E2R4A=Opq|UfB+l6 z6eCn4rCJ9=up3I*%2437E6cO%uyxvtPv>c;K*xdK(G1e|l2C?GLF2IH)WfE@6~RH} z5w%X#3qcd%twg;>Y%icsHWVkVj~k=lJ$q*xd$1FUAv61sp_!!{$-6RJ*fL23)pIj# zBFSLPwOLdnrkE)lj;ImqbBdxKm?cpEtt239Q|qs7Qr}=Azmb-Lf`_afhf+Y^dJR7E zcR$k3d`thKpZ9pU4dDAc-Ujjg9dLtZWN9kx&q^LlKW?-oMN{B-k!b3i#o>XY;E*Y~3th#e6Z3Tr+!|EjK8L`ez#)ai2ZLk+ zEN-FT*E+P&s_0sZwptmh#Drb!IY@OG^AH1){)t>^dQPSG%2DI@BnA$bVtR2>BjbGt z92^tC93k|XQWL^Cm^VTUI@-@tXvsl!(5yc^T0)W5=o&y=7HBGGl0PY40Yqkw>;MgE z#*)ReV~$kRDSd4ZZ*_1X4)D+NG~X5s56D0dQLWl9tBQl}T9drV$IR9X4v-?_&z3Aq zq*g}@K_Ji@*EX4*c~_-P5f;H;gqK*#hzTmr5>u_J`dGDYlz~FXaFI+@DA<*SzgJbx zaQQx!IfICmy$^NHfI0QX?m}zbK;M0%LTB*mDjf>;QuQ-XeZxb-rj`3&g+Yk!qO9Bl zHN$bqvc)1>$rLlJ-sa4mE32hyp8p4glM;N~w+>oiDycft!O>sVCdtoVesTIZo|gYW zSw-bga^NcDaud$WNvq}L&2d?1<}Vc@hVB70u;deug~K6wQ=n$M2B&z|+*0`qrv9{% z-Vm+-iwPIVOfI#K9m|V9oCCHd^jPm{yF3cEutYK%9BH@;$TFQ^0Zl&iWc8>1| zm+BN8iD(O!q?QSy`CcAyIZV*2h(@G60Pv}%*x<2ReGP_-uQWwAIBNi{ zusmqnN;AejopRp<1&MtVgzcv-Jz2UQb^hXo@&}A-|B&;Z-;5KR-oO_|$)IIwk>O>* z4uXJ^@bNASRo6rIe1OkTd#3^(0uHFJ3Oi#xPod<7cZNh#_0PaI(=4QvYhDw0nY%@SBRxyW3 zW^bV2z}7`)DBC>Ow8E)qw`r4YkPvEBo_N*}z~5epn;N`qK3jKaR*FFvwb~vLEv;B< zIMwo6Wz)UXYs}hG36y8c<7xQ^c~>tkSDSfpdX~kO-r7?=2yEe6FTUnwysNK4l#537 zR*j0Kmt~7}%R8TyW5-&P@J13V4E4o(LXn6=lOu&b5{X7rNRkRtU3#1|=+klI&k_j_ z%MH&KM47+=LF+aG?<=97kr#=}x0MlWhD&la=s~K;q($HZ4+@s;2J~UG2^`nv5w8${ z$ppPiiC6auz+)zOhFv&{V%w}Gvwj1c4=$1iRFE2VYxMAOy}E`&+t`8ffE zm#!GkFOUPa>`mtYM(#BOaL@kTUr z$Kud|W8R#j=2Iq>6)-a0Oj%6@j&$~A4*o2Q(VQEIFD@4ODkdNl; zcX4o-ZfdGHkH$(MOY6MSo;1iCUV*0-crkJ6#3N1pOpS&`w$WV<=Ud}K7_t60@C;Pi zTX5Ol#P*~n?_RnqYNtAbs$jZ{!I&`OGZmc&Jn>F+3<0x@mLdE&N%MH=nQFo5kYvx4 zS+t;e%xNz(_d(o(%g192M%0*|Szus1NE=8VWRSod&M6zJFTslI@~{6p9rvW}D+@^S zf&Uz(LovTc*YM-=B0~BYjKo|xO&cfQS^y@L zJjebU$s4svUS(aG(zW2dxV`|SzMKk&ySXJpJWlr#ixv~`+Y(|%Bu+m};`Z1KPI4`u zw-C$FAJH*Hf;W3vQv-v5H-j5%xv74qEU8PYW8Nb8tL>(_atcQdR4KCE3+2=mTvQZea`c7y7gRK`Zf2a?@yCTFnZI@#>Ea$za|WQd zKy}PFNI3`w62%?uI%;XFwJsCl#?5}RZ{Oz zzXTlHfN(}7KeTvyOmLou`?Ri}cXF%9e2({M3Sm9o;+Ig65kQX^o(X8Bf@{oBL zwK#o8SwqK3ePBf)=`O#;U#FW$d_bOaj)bJGQhXcwpu?ElEQBpI zlLuVf~0U6r}Xh|DZ+eQ%bIdkWcn6%V2Qo4rn7{J+hw_> z_H=qGdCikX`_Rs5HO(qL50Cg=SavjSbdixf0p&fq7{gJS{SHP-4p=*~;Wg~`Xi6!h zgA**rc<~^z=ayG+%Mm#uzQ!MeU;g>#&2!hUUO#_@MK|`grFwNIe2r5Pq`hE!?51p3 zEOy2zRQz6J96_}2d`|h`^`*-zs4Hc=U9&92-=-Bu&V8}W;#p$ye_Tfb$B_3O&{*o1 z1S8dE(VEs~Y3e=<_#r6DLnT-()+r$bC!nr*;AVQH<}L|dYE&!=NQI>Bhs<*$E5!UC$nb*h(XZBA5IWqvaK4?Ks= zmO(KiQIo&mE;JR$@0XBa0WlWzHQXAnexcP<95PDKUctq!j4(voMS!4Wd-Owm0p;cj zr8J|g%S&kr&8pVrE!PZj;%WR&4y!Gfxe1XpAX z;rf-J!SI1+Zu1`@7+UK^SZAJ*yXqAD?%~H8z&CPT_k~?kGA`XgrYO-%xm0?5|vnjrE?ZCOc2F(Eff zk|#Zi7Sqz>7e+*K?DcvjC#n?xIAKNp5sr;tIfhe&6Qa0^t+~25$=t|&l0{E-AuS^$ zdcs)EbcYb&@vsOeo8(jGMjFDQxwY+1EwF_yEs?4rT&r+y z)Ylj)2YgnVnuDw^wvy!G8ZvkfqL(GQKq;1~;Uwdr%vD+pY}*c@iN~=Mzfn!fH9bIdSpo-tX)EmKFSDH~^W^yhC=yzi#>D?PKl7M(I%?353KahtzcJq5`hZEZ*(be|F14#})G{}6VM zHz3%`AR@xHmwr?FVQn$Fm=A`KyVm6b#B{Vpr2}xzxI?v zwwri*(lsEf2@iKGxgg<9Fjc+IV0>Vm6|5wDk7=qrU}lU+rLLGAvLv{Y;;J0Ceoe_= zh46*K*6nQ~)6%i-$?jTLd{(wTr=G?6XU~-@=(;`6L9(w>+@a=AbwD9kA^w%WgRC8o zX!tSWGJB^2V5S!Pa8N!QJl~a_WCj;FPMTIEl>rUBRL(#+peY=#Dh(1>C9_jhW8LOQ*X2CaWt_oC$rLoE9yljUn20+A=%@-p`~sg5GODB~rEAp_ zl}`KKPn$O63xffDmB~iej4*JYF*wlt8dTiHhf>HU=FsMNW(`NNQ#+kiw`a|N2$X}r zCsc5Tz!rE8^BZ*Gc?xRPJrmq3`kksfkhP_fD??-A*5nKV^0dM;siR9*fb)&y2r1IA zI8G&CZ40;9OK)>4Fa9IQAl|L$J&;LsRnkg?Z~_3qnle1>=QW!iL(F z6QEQel26&*p_ifAbzmsy?FNPn(zQ-4n!j3Qt_lNg&qq>_y*~`zBju&Y#lB)ugu?#? zNq3*Jwxj?^B+`Wlv<$#}nK#~pp$aWB#8uZn$b5Q7uI#Gyd6 zU>&4s@W~t>tO#aT^Lxey1+BtM+2J#D_H>|fY_Ras$v`y_NsBi&R2+$(j8gZla^4|2 zxJN1BQ{E5w_wgMbK}LYHCkI2{-U?bcelP3!0}IG+L`q`D5bZ5~yYO3s$b3L*!sXFWoy zWLQ*Iy|9_IjykSGa}qj=wgSnNP}*Sk{Hcuqxu#L5g@mq_3%y6+07jf7KTXhw>HwsaWKTPUod7#c(s#UIob^ z-~s)U+KjX-#5FZ$Fa4NPk7P-xrgWKWCD2r1b;C;)C93curZ($>CYRH2>#8?rO`=bP zP<_qS2LZ&f0~shtu-Uxe%L-Z%-QZn0KXS&UXs8aVAV@gZ*;B#1wrMk4R*2r7{TZ?6 z_A^FmK$sBSPz|7$LBAmSv_MB;nujkeXT&D#*6kpprHomDgVl@(;+za+?*5>45Fg4$ zanvTc(N~_Aq$MK@sk)aKh0y3uPy0LQ8Y&luG#oNT5(A$L6CH^2*DBypqcMf2YQ)GE zUC};7Sm-+5+6umG#Z=@p3@+iJjvv9tJ z{Y?9oweh!3Zvongde#M@N*|tO_!_|Ao*{aR^OD#~<{brN;YM2u3s9}{CCNbWIJRWR z>)17f`dG*W1lyLw{_<

~;suQ>hYG3U!Tj9j#lEJ!qf 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

v(jB<+R%LsEbh+SC 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�sV$??mbpPkavOPRP1U_j|PR4#p% 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�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

TZe0 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≦Q3PIdp4-8?wGmD6iVSq<$_OGJ7Ij=aE`y19w?fFLmEn~4qZaNS9{5N=|e z1D}>B&mw85@Ju`1;XzN!1>~%ga_R8j#%Z~VhQtxCI|`1^#iPWTxL_wmMdn7|>s&nR zgjLSOr9W}W9{gNf!XE0+#4|vnL)6Z@T@(s|ZFEE)oQX?k4jJIFL!FDOlFc)5=|;ra zC!C9GOqCvL+oAbKo{J|~D7MQ#&zZQ&-%w!1q5=}WPI}!r@}K_x@9sTm&7D4b5}|du z%eh-kGqYne?M*W?vr|ncnvPyRcD%Li%ckkcnfZmeCnuYZH?_2UeQ7Fx^GdEie=|Qd zH~Zl1qibjGUcG(yW_||Ynb#2^S;)_g&gEujMlR)!e)C1{Zqt*I{`pJo7rJt1qTKD= z(cWkGi>=+)e?Q+Pji;NBes{j*YEy2yEqC<(7rB|1rrAe>P1kR)&;2QPbhLS@U7Jl` z%g;@<9-Tkm(qCvfGc|CvZDHYh$CqDTcy#Y{erB+9=n_KoF1B_dG;jRY(cTvqpPjvX z5`RRUU*txb9xp5m1T&hLe>(GMdO;>Ml$-t3P`*_JuD`05w$~*3?7tj?&XkDb`$m+- zzlk`$j|sxl2(g!|&?Pq!d7lWu6L%MbY8aQMn!g2<#YiKQ3Zrs=OTUEyg%f_==k!n< z*8Y#B?Fz%d}VS-N{^ufLZD~ADgYMM<;kAB>hXN1vX0X{Udnx2#W@`} zZwb;vxD34}{^(f2g%RL;cZX#jTv2-bU&WWya0FV=Jmv)uwSTDUydtuU!x*CJMYN1j zH%dDQ6O#4Hn4-fRTA34v(;{^!hMzNPQ(*PIvH=fa5K^XSwducG!u%C`_aX_x@0ayv z@ThjSNTO7GQ$0C;%0^~Nt^R2+k}2J@P&-E$PQv*WJWBYNbdikjQ2lpNqAAB6s{kf3 z3y}Kt$LhQCjI2)q5b~$ncUiPSy4?|<_hC9GBZ*LdWU}4EN)@C6_suW*izv`_PQ02< z+8g+O+G>MhMc~E=v89WdTp#l9ioOU!h#2Bnd5xPfqVmNo8^_SD5KLVkxYDXFT4x8{ z2}!`-R3#`m+%qwqc^GfjzpB#CM#OkkE&T;c-uJay-9;kpM97l%UACYld<0LKM?F^) z!E>*EKqw~zZ(#mP7xmXea&t;q4CJEl{=^VNU|{)JlQA^ z0Uh|`OrDXYqKTYg11hIEl(2LXb1iWBkla8(URL^hVPy8pk^8D+K*4Cs^)yY-{ozbs zS8fn@KSocU$lb_Y$zL4I-5wsec>dz=f5#gga~JZD?~N>7JpQ|Lr*2>aU;5PD`E3c2 zd8;p9<5C&jnX*0oZ}f2e&F|4Ft+O{?+!2u2#4yAh-X5X??rlYd?g0$cc6;+0Pwj%R zZP`;t=cnk*=7xcwkm{zMI+Ypf1)n=UCQpc~*)H3~-i}vg9IREU+r?-~!(Y)4d9Sux zkquRLA~>8@E9i{7{B~6WHps4iFG@oVZ{aR)BB%r9vCQeAn-T?K@=>rw^+&kC_9LQ= zYtfIDS1>miv6=230)WHA!=(-{#D3!11(bwc{U9lX=5UfVw}`_&xz(Z4()5gU&vfNu z{^(dmp~IF=6mV0Eh~ZK%Xkq1@GXEljNT()VekXvJS8%Qu?u~$BbaQPRuH^JEZjVWW z6LDQJ*;)k^G!XzG4nKkbM%Fk85rykjC(K-yG^9a3P;Zog%SF4B|=iDSJ6){}69a5=D)b0j6B^E+g z!f7gFNH^dKs>3nY8on`pRAX=?PnN|29Ado`tvsJX1Rc6`bor>fiAZXw94n&0*kac; zTjZsjX%4?)3N0B66Cv9~Wdu8}iux)v=iso;5W$G(&%uE@m^0|2;X-~l^=#?+==95{ zlYd%aM_CIg=+WtY{9>YS{xn)sr?jNrFF|!I2IJe#megrJ0|ih^!Huh5jRa<7{9lO% zu=Znfqt7N@E{)DNBm%|IuSf+U0Dmbmcv~+02&?JW5(JMq{I5g=<8!l1lYd-#IgZmKtUI{C_-s9biI*~5!C;RGe4*=ZKtAoZJ#?FH%^Ilxw8%kqhv$oTZ!_|un5B%DUe z>k$J>V)fmxvW+A`NG|d(N0!WNY0Hf@EzF-ilY5${t1TzJaI*f9bntGxqY2`T1}2WBmiswco*(dG@KcjGZ2$LV1P5Wqc)p2ty8(hhdY20d7bcZYhQ^j{J7r#u8op} zHnR)&JNhkg>#eNm2JF9Z$PU4@fgngp1N3Lr=T=n3Y`vDogUmU zv>6BnuL?MZE%mLCc*=;&Sce3XtL$*u1>#{8l<*Oai|Bec;#u#jxVKZ{(UEQT;+ z=0YUbl2fF#6#IOG)d?}*wdbUU0!*5M=P1KSn-Wi*DU@8xf}xO%s>?~9J%EgI9lX%% zUhz;thq77Op#i&%?;sw0D98r-ewQ6-)s4sfM_p4(-0y19^1K~dOu9?YSS-lvpbIZ^ z;GD-LCjOd7XG! zXJ||2FMhkPGgc4VHM1D_5gj1fQO0mKMd!2^+Q=Lz#3dY@b}$0ICWfMAaz1eRb{9KE zA44zY+OEB{O$F~o67UN{SrgW4FCaRcgNve*+X~KI)_J8F%TvE>8FQaxzkcRF zKj0N8q#9d`Ot2BeUiXKAggdkv8;|`^0O0{9c0SQ9glKS-Rt3w5S;Si=IN!s)Q6nSr z5_Bp}qd|=cqgjxsYa%_V8nTZ{gZJ z4yAR+aY<(M$LFq@V`$HqdNR3@R6MLR_4DIsP8inFlTa{_@FT8OMB1@kqBA0t| z6b)uOA5V3DJAbQxVdnms^CwSU%AG!)yLm3xc|Lda5#j{d=JEWA`Nvi5oOr{Od+I)W29TSK zLd`zI({KN2oHirf#mWz*A4|o}O0~$obQW+`TTeLSMRg(tGQK`n56H^wA|rhCL;3i7 z2GjFS12r||#nGHazAI6FM%^hrJPce(GSDgksM=JqD(kCQq6=91EeKRGRnSXiS zf?z8uONE{lIaq=7P(vH2XtNEn-!VH5vfwdw$?FpAJna#C53f23eh?xQm01u^N0teh zlS*{R31oM1p%!DZHnMJ^(3}a@^R8Q**d3VgOMS}9n;=|vLj>-q05Xe5427KgU_XBy zlc3mQiP+8TLkZR999yIIom{W=eVF?%i{j-b!8t0Zk>-J>|KO=7S&+;D600K z>b9wW?!D~V=Aetd&*YtxF&H>wRrT$@YpNPC^cgrGh58N}=N2TJimyajAMwp3pIO6o zk82gL5w2+|w7eimX4Z1ql|j-6ATpb&jqP$v9cD_ZqI+09-8H!QoEHS+o`Ev7;NYm_XSnA6_N1l6N9~e16ei{_V8>bMnVC5 z4X5M|k`^bP;>tYtDmQI4cWrN$?l?~WW(E0XVFT-+ba5d}562^LeiO}lt5;%o&0{GG zA)RuwwV;3eitE}4RuB>^ZEquOnR!;mKo7W*+=~%5UX|&O+_rVph4u-*HU%hzw2Ds( zee=33tt21^C+$rC=Qc!+G86264R=K|N}YTZgizmEg|@(ioG4_#+YBO~#G!)yy5cYT zmvuV&fyDn?(iJ)7G)2$d^;2wXq^}%bMB;Xk2yR&#Q$Xm~kR4TG$q>^_FB~rZ@=!sZ z$2S_}M5%7)-jk=D2v1`uLykK!VnWIAS#Wl|VdZ0_o_gBs#7gN^cCkW_U1W7*k@xJ8 z6XOjew1Y~i*?sS)aA;udgM^?JXmkKptiWMa687ZSZpbtc$JE2VP%Q5spzHu)UNJ27{njPE!XoI#oIJg`Yu^ zuj0qt+oAnayku}wJU8X-^yKKcgpv*i41~SJBhf6E{vgwggBmkW2H)^&?c!=Q1uY!< z_%7s^?hLY-d3Kk)KnLS;9EE@_htquS22u};TSROy$uW=wywAiIBH6a+o^^>LZT)!g zs+~p5;7DYAh`RMu&v;AI`}fDR6FZ27Qgu|Re`MNTqPth`p%9Rh zvI)tV=F&Rx+3+@!BO(-E!w4=&0D$wSTd2ogdFs-@U!EXYs-aLn4xn{H(9a~0!S0!x zjcUJ1(aod>DqJ(B=Q@`?&w>_+BY{fq%xDv6DYeTHG{cPa19IEV`&0|vlRx3SkAXhM zc0>t3?L}(i9eS53!q!|if+WoL$vvkKp;HAmR_~np)d2rHl2;Y~k0s^m)5Mj6ikfZQ&Gyb33lbAqBdh3%l|@3?|FgNCTT&wtq|Aw4oKqYr)WAymwbH z2a76p;4XSI+NkEQX#0D&$O|Y(%Tt>>*N4;{pnrXH!~gXVD(#N@TeMhu8uayneFuJ~ zrWWqyM3_*vavG#q&2$#8a7<5exNHmEeFb}od*nkhMx;(hRFSw4Y(EHcAfVK;#EylV zLFUoWTM@dwp?bZ>l_>-P)wx}?c9}2qB{-ur_>Pa!~4vBBhEfa>y8gbb%rEB#eyDltO|@1SB%M*qAgD z0wy6}@JDi?-E>yWm$qm^ltHAD`##2?U;o)fS@-yjTXP&$AuT;G?{0sHmpe9`vH8Q} zg;HP$$0*bOLmEjj#bNU^m-}`_&a{@_^Vsh@`T`{Vt-y#4ue2u5=3WyxZ^b)^XZ|8C zvXto#F90SHSnbe5z~h;IuYFASQRnU>6RWw*vIXjSQ>%fQI7~w6O(yJ&NIwi$f&?_` z*bqrThx<;Ndt;fXcgC??3rIAhiHl72PTY#$PWmE5z7J(A-6=yRjW=NUU2wbyPXvQ% zCA*?rJ_71|C)4H4H#=|93APXxR8=Rq^GdEU4JpiW$^kn7uwz(Sy+3W?E9~QLx`urQ zLTsQbgt%E$6QkeZm8JWc^Q>*q_Svj%_HCBmVD{LQAOtA;v9oyRfZ=zbSRA@}9Sv63 zF)=jN>2XEk^^urD`GBgtc^9mMp_@0*#Xk;yQ`d+12c#EsiffKmK&Sy*mi=24TJ*v@ zzN~1#stxbmEpa+{cELAq=tc6YP`{)ZZ~>%ig9PpRP#tKmIaAK>AduY*AVb89Mw0E; z4hov51$Dl&I*oeFBx@<6lmLpJ5hp124$*;ff&po`j9qRG;9w!jJn2RSUA&j?W+j&A z<+~*r?B%~N9 z7|L0`Z{1)T^j+E3gyZQMM-MC85C`MX(_z7w8p=qbZnVc7Efz-Gr>r9O}%d zM#yeme}ShN!og&jhu!N*plqzOD%<+IDna<2!YJ4clM}`6Bz)?IbJm2;3@Q(_Kxj~N7zi(q1T2|XmDtorBjHX{AWh~WG(LsX!!!?E#3`_vlMST7p`A?F$;3Zdbg zg?0jkGz&Ww9ZwEeK zpil-z93Ki8Ry1>m! zQmM{is*avKY>c7_$O?3f+=e3hLoAe$9o1n#_hLG9u}O%g5}+=SJ~6B?l~LhL788Lu zZ@GI{k&C{Jv|^T71J(hwr(bPm@Ur*I28JED0uS{*Q{zr6N4y0O^nO#c+z#sBfc%SI z%6OE_a2yVB!)nlkLK{s6_h=&W9Bqd7Xd~Q@HrMxV^UV#kxv@tZ5#i_z&2H||%mfNr zeX~a^6|HD=YmY`=hN0c0T>9T4$TRRsgiZCRhMr zzCDh7bt?o{`J;W%MgymgJDAAQ{||CHp>B8Q3pOe0T)u}7dkI1nEhG+erhhwlp)o8G zZXY=Nrl8St-uY!-Npqy>OH@kVw8B99xU$Uz%7_>H8JO221-D)7mxoK8{c$j6a#Hbg zf0Rwab7A@pt9F{k%m7SyS;X_nS@J&`qcwDuMbSP=(XWf=XzKsM-&zxZy`b<-6E-+0jxJ zumeD44L=1c?P6c30&Q;q2bO{NX9cjCEMVJp`_*IbEdY& zww`OOpi720f#SO#M%m<$uq%^b29vN&3qFJqrd)&Fhte+CwUok?nQ7zT-U14F=l%>n zrn;5!@eUrl){Q?F^(^D-*YsQO|2g)T>q8lz$0Q^zoEggbHJSz*esg2LuAo_Y;nlb+ z=QxRbgK6MG_a~XJuFR`ta?yb{3Tk}6k)xWL9tudEx;5U=L+T>1cXiXR4LTYc7`)v# zFxWTnt@v}@b-WD}wZVxAZs1kcd6rL7)*pN$Wg|DXOFwR+Zlo4o0x3d-=+TiYQYt{v zjLPgMW>oVys+AjPSpjaev3Y&omVbh8AoJ!=yi#6WDronvurMd#NfI1@;z-DmTtJ__ zC=a$)`Dr*B{3aN=(E{5p950IRG={<29AuGoYH@Fe!j2#M6L8XKo*s{%3R{d8-=$lc z19B!6mCpx-urj+m6cnlxepV<<%``II9~XiC_xa!mIz2c(KF5O4#m9bJP}E5M@S<#j zRig^ne&7!NbJtEO@cXrE@g5ZO_HqRQl#RS*Y^F*le``ee&@4X{y>3okuN=|xwHy}q zD0S#VPAgWcl%0A$Zkl${co`TQ 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�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�?MY*uY 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

I0j?P2SeHs}mmncLVP?1UU1~BO_?nPybj3^) zW$wmpR)|N_g)x8h58-IrZepG(W}3EeU)%OMj=uO=N82|ZJ~d75=W5wCN6s1PdF{pl zcu)nK{C0G*-uf`7mBm?$|4n{7I$3p})%3l5&+>nh-|i}I+;rs1OaAYz{x|vUX_vTm zGp#UN+xmZ#-+mB|zK}gE?jH0@{wMkEX_x5COCHjq3)Cz&`R%iD^qhWMMi0IV%qGA6 zH{>sYW7d4V0L&);;4a9sDl|H}^%yXl{F>XemHOW;vEB{LCja0aIC{#zjrt$A0JF(I z_#yI>C8I1hhXJ$6@6Zr=Qhxn87E6KIp;AA;4_%J61q;%ByH zN2>Jae>!J9s|Cy^zav$8i-mPwg_Q?plYa-G2yhXb4ZLm(&ARj0pMl+~kW zz-;ml*@S#NbLhM^H-XvYA3|5yJ$uyJZhQuqO@1dm9DOk3>a}}^f!XADqVVYUD?+hq zCor4*PIRR1UpS<5N9eBnPx3p_k=p)i^>MeMzw$rH??gvx@|??I%NGH&$v@N>-W!S#!=d!rXka$^hbAK%9MWyL#15EE{-KYMHyK~FHZ%iflYbZ;srvgv z7hEy|W|Myy9jP0>+9fY&0?a1=Fgj9e&8>Q~nI14DzchCnb{|*&5Bp6;z*z_1k-4RL z+S<|ZYZ0~xI9rK1K+F{5{EhztpC?}fzWtKoJB?DT)c8f2%>ZH+w4pgytF{}K7fQ;s<9UkhEC|0x0^{vwa5_a^ZA z+(G|a1V;8mKK0~r#NQ@RVb~&|xgncX+k_K4^?=zTFmgAJ&P#SL8}bh}&K7}@CCFy2 znl<_P4wx+hqu>x$2h!1mhjvMifY~B2YBX|JgRP70uL840VAOi#LmqA^U-E$2A~1@k z!JVHrxf6c?m@NXM=`2ZeFRo~v1k4tJ(KHQi{a}m9hbUmS2#ls_aN-!(Nt;#zvqfNZ zCcd?niH)KL&I4wP!01oNTMh2zz3~8Mi@=zU$PME*y&J!n`YVom@NXXLy*@Ljkx=?3NTv) zT!WD-jHp*7>?h1-*dpM13VBuBtsdQ>gY!Q{z?F_vMWdL>5AOl9)Bmw_q%MhdSszpg z%ufHuQh0pR*FV)I8<;HuW9dj;gS@U<}2fY*&^UZN9wE*!-jMS z2WE?a8_fYrZ`4|LYZ)+G1l;IIojml~o@KLu*&^U}89$bnv61(cCFs=&n#JWyZ zuQ>rz5io^2rVXd$A2$jA^4#a5v0H87mdj(Q@eY5vRm^vV>`r|Z?#A8e$l!B`c;jb; zJf1F)xEmi&7f5_wAl^95xoX($O-bw68oqd^W_+&J_%a;rJx@-!y^w6~CfvLOvrfq(RO9`;1 zIS-tNZ*9h`fULi_fHm!TVCt^CdfWfi&a=Rp20h$2%>+kJ@>0}yItr|5(F4;3+oPAc zRzG(EYnt@HDL8t}-V;7iCC63xebum{#O>~pmyS4Osb^*d~n^qFf~ z_P_&>&rUvmd|*dlP17ED3G#qvzNK%P0&Cj#z=x5u$M%LmR zn$~@;)|7V0S%z5)UcQHUf~I*7Oh>9o(xT+Z$H1EQJun@q>CJlGG`$9_Y2X9j!HpZm ze=q;+B(SE1pQ|;s7V@5FM~uS`0&AN1!1l;(CoCA>9r`^=O&cFL5PAEekRH9@ZN$mjO5w!oUUKJW)U+cpH&H1>hFQ}R!v45I|ptcZcXe1jX}vR7*{!^^0rY5dWf#7x(X+|k~8!qMJz z-N+wJS1WuzF5dW8WJ>;iv`PkUrA8eNO8!h*CnMcy4M$V*52ckdz{$vz{5rH&2KW&& zC4UaBmdVwc(FmE6U$b5Y*aexAe+aFZ0S-r|M zA7n~?&B__zg~*irnzb{)bfi-9YgW$y(~(NauUS8nt2K*`R7!r$3L4A>jj?a$x zzYLK1B{CI(Bg?(|Y0XiyZwq890{xp9{Hr%nW>;h?0tK1ZvO5ivc>^*P0q5a?O9l;; z`5H16fd?OZ^&Zz%%}aEVsR+y%`S!>BmNL_XgNnen&)bf!tt~T6IH(BtM>;P^E-y31 zI28e%j+MLTd{TerODM*v2t;2v_W9;hHTxOkTcaY-s`Jc)Z?DTd9hr*2p28MB+NWgR ziA+VHhv%)%O)_MDf=opqS3CG!x9w_P+8CLNfNi4rUi)a7ha*!FxLfIi_oS6FM*pU^$xIhbR0NXh-%ZldSMzeZXrdy};ZWFw7TPjT#*I@EIPBEF zx#<`6>A#%9gNi`Evd<5lp38g}M^h2FGHh48=S?;H>mySU81;V4SpU<&rny@F6WlTR z{b%7{_QjUJ#iEkmPplnPr@DWdm`j8lK;M6IHy%JIE1&6PD z7ufQjUHQwfsya^U(Yug~u;st%$FT;F%w?vNbtty{w@rF#>fKw-tD4|wYWcV7vZ2$L z3+mTiH3FGh{;`XHc3p0y{)eqvhfFPhvxy};$KRE?5Sd#3XZ~%Ryy$|O11lj@%YV4X zV8h5PnfoJC%m1N5@oZPB%)ZFf^7o9-NX*?N^I>Fa`F}EGk{;%O4W8XovhUIH<;huwFmshR>f55spX$i z>vcoN-f9k_la*Tj#{1%mCbyT_5#JiM{Eyo?#V&0ma|klE{O!{#jEJc!^J!#i`QIFT zRDbU;2i02(qDoIK|8cLqZk#Sv^BM>X_4PZo{9gtdL>1qYc`h=w{C!$pcluHw^FCy1 z`IlQ0SVQ-?%&(EDOfCPdZVC3z@arcP zZ$ze+zw(!JRd4wHlZtO3Q_KIrhRPRKc&j-?51Cs21O6Nf+UzPbg$K3#3pUOibkJUA z3J+@eyL4|^vA|4b3J+@eKe%@5)Dt6_DLkmucm6<9% zwfy~Of6!|82WAJH@<-6gT7WBl*yNAci*Joq{IJO%@d}w%{IJO%*%Fyn{IJO%>4r=ze%R!X zj76puKWy?xQl+OAKWy@^qe@RJe%Rz+HwZUQD}LDIUq{n&TJggs|2pae(uyB8`PY5L zjnj%BHu!V`N(K!zO=pBV=0f!zO>U3o@E;A?lb2yCu~uYI#pcDu?SVI>4x1U6eCPc^sp`1%^w&9Fsavp=%YfkyX_ zU4w;PY!TQ@d8IH4TY6|Ktn*`wz-G#;{@Pm}yLX2L!E6!OLc8SP>8{ES-oR`T*h0Ic zab#QLk#M1_WQ)KS%B%R>FWnUtf!QLkg|18*xa zAbucn`Razd5;g&|MIhb}d1>ggTecyiYC8XG{X;JtSV73S(P;iYpUtFozbzrs#B>3WM->{17{seAzpk#|c0+kTQQ?4E% z8Nh52NT3pORi|-uw;jN25lEyGVjpzxWbt}nwg@Cr2|1^|`9mQ5L|e%gfy8b2)&{N^ z-K_HhV73S(QVGe?YUo%5KhsvSMIfmzj_x<8$S+_dFk1wYs8fIJRP65dHo#N_V0xG& z-KA6A@=w}>8>(tIe2Zrs#EeP!0=KGgPammTB)t&wcIxbKM{ge^9=%@7mxa8eikRtS z<-WBYbh7gKh!7(q)t_22ovcSsIZtc!5W>0t!1*o}N2@Q! zlj&sb_A2L50NhPLSvTp-$T0>(RG)crB5r&@lgHP49)=Uf-J*H#zl&w2lU2tqa_(1X zkSc$!2|HQoh?;lS!_hN71^M@Y8}TWdSbjWzG*9Ls$hrj$qnbg_T50t4dDK+6y_mGW zcZMLJ92jr$G6Xh$=TybRQ!~~7u$^a++gFcvsBHqHm+bl2)^>{eAGS*id5_C5zvG6$ z6>XDWjvpa&Z)D~5TDv{!0>|tdwR6!Rndc!V4Y_t#uM)6)tf zYbh^tTcxy-`8Dz;JExxGUjlbsHTP+5JvFBoA~#-FV~S1@@bTu##58VP?;+_IewHzPj47VebcFCTq$ZiA9`di%q{`k0#z4s6Gw=jFG zkRJsF?tga*IAG8@ot3X-rpecsidGL}4*^$w=6il~k<7<%^z9YedIOSy*DvoBbWr|U zZO=F4p^DRHr7^%wn>@8D$W)Ks+XeaJ(v@D(tATfA#%MoHk=YB`@$|q=<_m#)8rYut zxl!hw$QK5bKVLExIPch>fLg)8ko#GY?hTi# zwU16#KF<}8rn15xO-BZo_ZtW|zJH{cBgK3{$m!+9Y=(R&^M&85Ch+<8P4CcjrmMZ` zxJqAud~>rwWJF6iXuDUdZ0<2dy?4^nkz368+SLJWp{fk=b&c)gqCP4$_q{0ds#kZ* zec($mU2AoQyD3Ts?E%WLz4~WspY?@%8(rM;aQKA%GLOTJ_i<`{WZn(nr0MT7O+Ls> ztHbUo&JR{czMQo`$hQ`Z*8h6l zqJE0{ogcJ8c2dkb(yBc0)^)4Pcit%TO60<&ok}i#f{l0jZhCUi8kuvE2mLOqv)~!< z(de?};}*&M6FGm;-hs_-0uSht*mr@anlnt0`+S@3b6&ddZQ(_iziUUyJPSG3yhDP| zVPKbORkD+9WKKoyeeBKUMmvEYR?POz=_T`X%qDSSRErtnzVE$Q`$MBqjdDTYJg$KNV0#L@rKCp1vN?N*iBjmAFn zY^3JQipaj5T3Dy90Pc9cMv{M3nfoJu-Tip}Flp*`#N*WXjlb04k+}qUcDsZfzu~)W zW&d&uo28e^Oc#)!X1U+k;R1YhO8bZB?#WCSkTc2*$~#&CkFM}A?ok1-^wzTmVB;ri zf;$$0EIK*3L7bI>?}*QIDbM9&v?uuNEZq39FfpGI^FJXU?fgi@=EoIGS4oa_b{=i$Lx$WNs12U5m^u0=egqxkVt4=3(3- zkVg{^ZV||%2?w_b4*<`#jxH^|%~aIy_Dw+Nh^fXpodC*zR0Md0KeWNs12uZ_$t z0{ITe+#-;_2ANv~@~KJAEdu!z9^4{u3MSI(qR%Y?r)X--Edr(l!v`A=u#UnczbX&&&GUxa+7gP1+UOh*Rywa?rXjy|g^W=k>=^!x5%6)eB^4KQzFmDXM9|yXM6xpM5d>F#L-hefa8%l&-nl@LiYOalRk2_ z&euZbJnI8^Ff!+9AHdXQpyz#f)AK%nPvU5L;ztd7;s@|=WP0YuCVJ*auGWPf$n?~Y zcJ$N_VCpi^b3YE!b3cHo%Ro>5FsCPf0KdSE)3ZO$(z8EuwF;Ue)6+kO(9=JFU6JYe zA9v~bAHXrl^aPM;^aK##E6DT=kWcgskX)_8YRL2y5I=ef2(T40JqM&BJqHAMIWj#7 zB!Zp<0!&>7dKO4CdKL&Uoxt=okQ90vNUqjJnxWJ4K)TZNK!9n6PEQ0mPEP~@-i~jL zo(W<_&jbN}h)hofxkXO}$dNK%b1dgU>gUq34g8*MZ zw!)`_{HCXah;Z zyxK*~o?=cAGi4a}wXf9_j=p9iW`8kfiur?(ueU|!Cja$G$lT<=z7?69{MYXybCdsu zJ~B7?Z_r$boBTIuF2qg#8~M0#Zt~ywi_A^_n{*+?P5zs6a5OjhZ|+6rCjZTs$lT<= z)e@PT{I|v;bCds8EHXFwZ(T#?CjV`Uc5d?Dw#L!i3;{QpXmqxH`yI~K={|Gr^>k)5hh_}~w2obLG+-ylD5Hmos__Q^w< z5z{^2?nE{^r3-iaQt@mYP4|486?tQ0$K5t+-i=HvKrOm`D-G-_a|tr704++ZJ8;5% zYt`sS@cQb{obLHHI=^$GOYk@@mx2eRiVrSk!b~Jntz^y*>Rca+KpC#nlzoK>kRjXlRmY_ zM{qQ)06meVEcAkV!>RZqGOYl$9&tZ-MW~ve7$MUN&}*Nv1hv-oKy^AKcO0UA_LvwW=% zG6y5m3efspPUp34BJ(L^S^=7HapCg*x-wINrxl>>ry2Df^+$a;Jfi|nD?l?UKKe83 zt;}@oMk_%3Bt;z$Dwdg!R9XRgsq!G-Z5L&xBb8Qwj@a?D*U@Y>Kc^#=R)9Y4zxVs) zJu=ggN-IFU9*jToB2H$ycB2)bpBL-T{}(1RUAxf=(53axcdNHl%_UXwQ==82dVWhj zb(DV#TVjPwD?m3i=zPG+O&+}*nO1-{Km2r-n}f_*$g~19b?Amp^ZUsB8JSjqc6(=A z7S>VCFFGRA3eZ!|e|PU_D)UriS^+xvL%LVC97szoG}YoWO|`iE+8F=c-wFyZna05F zb=V^CdOEV6!8xB1etqF9SEdNO-h~{osLQM^NBhHK8>R@neu_M~ubVRXAlx>TEdr%Y zkzJqr4g0cFTC>X(fzlDk75yG8G!K?;)5R2l(n#b8tvZY1^kIn-TLelAklPqG*jTG0 zEDm6cz#DDki1&I)=C^^_BJhT;qHFcIbhYFxFk1xPEXL7c8DUxxM}gTQ@FoMfvhmvqj)7U8nssDhv$?24;)ETbgS5&j~r!%@>$00&i)m_4~c; z>tZipwg|kX%hv@nbQ-LNa96TLpsWtQwU4Fe2X!6{%oc$%2jm%^Yvvc31G7b-jIPt( z?X%tyAbsX+5h$bUG_MYoZ?rc6W{W@>#dt~T*>X3l1G7co9mV)~CU}u5%~B3xl^m9 zO=?yJrXpaPtM#cpCI6>h_?PRL@lTOjiedrmF)kf1#@bKHCdl`wLwiY@bx_PvJ?pEnB(ls>THa)SudyJRH5x zscr3Nwc&1`?+$#rb!3^$zmek$KgWLah1+??E}hhD`e8MH?T);}wzXE~CnyZ7wrrU_ z_KnQ5ke>{%nI0MkcXhh3BiN>CTlM_@YbtW3ErHEPw1(vOxRg`syHMum$Zhi9v>ICz zj*JiP&lepvP|qH|!3;tDnfu(UR&PUl2#S6C_co60t)4A@qe_1-xm@#;H-Lw2+!V3s zmCSUqj(wZw=ye*n*u=pxvPfn+S?^5qUs?yAhNYaoS)rG5Ud`Wi@U@4%?6)Tyo`v znkQzT&aegUzWcR>BmAAT@gF;IrDX&srV(swj8eUMfLJil49?Bbv5!{L`Uj!sGZQO!kK%KY#6b>AF`3^XZyEpX z?2iOsqwfjxozv9(yFGIKhljr=t^+`OrWB;Zk9XU#t7rRG2S$W`Mr(g(Q!Ke^npbHNyyosd^I zn)~RzC9t>m?Xo9!GKV0S+t{`GrtZLBDu?X(*<0o_$bNM{nGb9Oylh7w?^cq9KelVvSmxfyi|@|fyuLDU?9Lsp`d0&n^^T`^M!l)LeNE5xI7#Qa0V3axHpo+)O^Pu@FMXiC}! zBLY)?Qu1q_jtCr$qbd0xe#7S@0$)O=i&|`5d2>n5!t?0hy9N*bbkT2s{OulE3y# zd|o1O5;7%!+)8|6B5*M>C4Zad_{_vyMTL6El>Ga%@u`Wxbh1+Nn~uikCIZvRO38oW z1U@+t_%v>ul7E;hK07g2p{<2X$zS{(pPmQ|XQaB?Qu0q;kIzp8o`+1y|Go=8K@oT# zG9~}=4fqU2;8)0${8hT)QxtO*6G9`a<6?~Q= z@C{^2{_ZpJX^OduN_xnY{3oj7^Av$?kSY0XcHt8hfmb3^@?W>WXDR|ycu?}YKE|gi z0)NNRl>8-r_*}(YMdhx@l>GCb;*%ADrz2DH|67L7Rs^PNdP@E^jq&MU_MimoXb`Jdu77Dc2zn#_@mQ>Z>{QEAy;cF zW|~}35m-NR&4cDWd#gURYBaf^B2YPd!K1>Cebr2p3n~KJjq;qEZtSmO-8%T%R0KY* zTWWfJ^FTE_AX5=|kscAP9c!uPHON#1zSc;6Qzt-m@u1M9yrLrDSK`sd3_3v4{??>uHFWjia=I3hsK#nGLJ{5B4BYvvIxplVr9-rXnz_+LfD~oMjF~rXuij*NW&t7BbUW zLPa3Jvd6G--DIYVMJfW-p1iKPpp}|y_P~u(5!f;){>s`qGS5b)BGCGoQ+RR(nRg>o z5!k<6+aU)Y{UYs>nkC3o1bQ~ftab|?{UUL#X2?_oPG))+yuBf_D>4;QJqVeKz{1F~m6Md)+>!Q&-LUO>i_7foqjQ7PqJfY?`ak zpGL{AzYzbDdfQzi-S7NyG**2=`m~sd&t<~Vbtyl&qw7)|md{(o8^0^$dUSEd-FUqr z;?XqU~}NiF~AE;ZA)gjuLZQ-1m`l3V_reE0cvY^qNF2CZ@9)bg*L z(x>=W4fTQ301gcGRFqo&-OjFV|HoJz6b)#;M=k$5`{rzY@JMEw?@`Ntf_)peuUFLE zP!BgwE&q?{cN^>F$xJ6Jwfq-5ti5NLE;F61)bg)T+JBRIg3QNpc*->>JpDl<`LH{3Y2{7ut3 zT3m$=ko4M3W09%le`?T^a<2kpzK%>Se}`x5^R%D?B#kzpvO+EY2R1g#>ra%~5=T?Z ze{#w1KAnfjybPII{_g|!{~0t;<}74t`7bt@bbMS_nZF=Y%fG_$dcF%@W$mUBlppDP|s*R1@} zbYyV3g`sfcEhxkIqc@93-x6|5ngh~`A2#`04#v^6;)hNCmaCCz#SfeOE%T6R#SfeO zEq^1^iXS%lThX_BwBm8=LZ%fzZ1T5jgiI@b*yL~Lf=nxZ*yL}w7MWK3u*u)<95Su=VUxdoIb>S# z!zO=wb7Wfa!zO=wx~`@bKWy^1r%a_4Ka~7ZO>6%L8$U)(s0bLf$CupuQ|W(OdWIZZ z1dJw&IYG?#h1{W@n1_lvOw6<=xc{(@<%Od=_7U?U0nQ@?W zefaj}z-$rdRD>I^;2V|Kpc#BG#1?_hwUOVR>RQUQVW%YGFv0kcJ*GiAmw=Up@R^J4+Lh5fbkjJ_#wxMbrPk|oGk)fDKolUY%$Qz z5ST3jT}^THZrdlbKkEatMWCw>a+`Ar+u|w$vqhlm9^@3g@t3W>!QsFbfvzRUtwNjq zefI*GEdt$IAaAYm$Y|poV73T!b46~ndh3`0=YiQG&@CD{roy=3(oA5s2z0xMT+gm) zW^^hrTLes~=trF^eqjz@_bS;UVA2mq>siIseF0zhD%m1nLPdW~zN=-#5@5Cnm>kB@ zRdpKA?KK^kEdnNV0tc?Xm-u8XFk1w=Q_(M{z4>a0129_zx=+B3`vr{FGU*G<7J=?t zkiY+H(CI-ZV73T!r|IcptD>>1r4yJf0zLF_^q2hD(9Y7j4k`jL{qHfFlD`LCDBRm) z^fF`)+{1?LtM^F44e|Mbkb5=|v$L4P#e6}?y|l$lM+WyF*2`BsnvM*cBhew@W8hPZ zVOsvZ-s9-)mHTWyat}^7w&icy4tcEK^d+G~fZ3M6DMfp{-=8nf^I_+)Eq~KE9KCMT zx6=6of!UV7=^f1ta3z3IYb#?dVO(XC)K+w$){7)K}S^$Xt9UCI%r z<=;C9x!PTm=sORA*_MCrlgMkEeL3k5{T?OT^6&izxpI8Qhjw|uY|Gz_E?ibNn%nF~ zIxySvH=Bc_wKjHj^h*S0TmEL0VTr;|V6a9~^heT|Xt-ZWb71q*$YY|FndHLsnAz1dsm9x&VT@4FL6U%8T2 zoLvCSw*31(MYebFsy5{~Fx&F)N6qWP=yttpz&d{=+w$)>0!LfddhMAB>-?2$%fH_` z>O6f37Bp9_owhME}R^&zdtbB^6yXKvDc<``Y2;yw&g#7rs|y|oVJ%7%2JK6+e~-aWo}AyW+?4EixrPyW+>H z4KgJ^yW+YSHj;7>iSNsg3E(0Y$yW(dMbr~r6*%d#7 zD8nfE*%d#7a`Ck(`PmgegMK1Y^0O;`tm%q@lAm4iV@*dYB|p33$C{2*N`7|5k2M{s zl>F?9ADgE5)+qVe6+bp3ktzAv6+bqVVU+yriXR)A8dLJKD}HP#!zlUL6+gC=VU+yr ziXU5=08#R@D}HP#!zlUL6+gC=VU+yriXS`5FiL)Q#g83j7$rZu;>T_qerlBb?1~?| zyU3LM?1~@zI>?m#?1~?I2V_cqcEyi9O@Ju**%d$b`8b-ApIz}|PZJDb|6y`U>5u3BET&8 zS2)o{6BPkw!N0<37>=eQz%2MzIE5io5x9GS7W^xmsLMb_fLZXb7)o6RDgw-cf5lKU z+&C2hX2HK==mKOa0?dMc#n5zQDgw-cf5p&JWGVv8f`7#@I#Q_!Fbn<_!{|t*BET&8 zR}7;gm5Knf;9oK9Hoi6$0cOF!!nr0g6#-_!zrxuLnTi0j;9udq8kvd!v*2IhO!F`* z0?dMch4XJ5O+|oN@UL*8%%CE`EcjQr%*N4F1egW?3YXo;R0Nm>{|Xms{7?~K7W^xQ zH^b3X1egW?is56BsR%F&{uRSxkf{hT3;q?uuOL$qU>5u>S@5qIk%de}fLZXb81WgIiU70VUoo;XG8F-4!M|eUG-N6Q%z}T#ND2=s z0?dMc#YhSdDgw-cf5j*Y4=Mu8f`7%RDU|%9=Hc6*&N%ZUU&W~XVy2UoJ9>0$;powH zvhqh$?~BiLvT}J$E#YgA87yWh@cfNafv1)~^CMry7%K48@@IbJt8k^0m0JGHk9-xb zbh1**pZSrm!j(=|YWXui@>RG#$A6glJGtf0{K!`^)&QAW{>+bj6=O#sQ_G+Ek*{Jb zO+~5Y&-}<&F_xyH)beM3RIeRIKL#CEL^CMryI3+T*{Fxv5D#p=~N-clpN4|=2aX6Y<{>+bj731z8Q_G+E zk*~s?$_lmonIHKo-0g8RwfvbM`6}F3Aydnr`H`=}of<#X@@IbJt8o8;qp9W3{K!`^ z-WZu${>+bj72~HPQ_G+Ek*{L>E@W!?Ge7cGjDL(wEq~@mzKRJAk*Vd+{K!`^!5Nua z{>+bj6%*DXQ_G+Ek*{LHd1Pw&Ge7cGOss%REq~@mzKV%`kg4U*{K!`^aS<}L{Fxv5 zDkdI4rj|eRBVWZt%2aCkGe7cGOrlJsmOt|&U&W+xxN&OvGe7cGOiH8VpOlGzNeg4x zs6R;l?L767z5|M~azRg50+@g)XOQ#SfeOQwHG1X~hql z{8K2yXvGhk{8Q+1npXU<$v@=-Zk$&9u*pBQJuJH@=v2`ODlfZxqhwBmI-x{s>VUvG`J~FNNVUvHx5M)~M!zTZX z5M)~M!zTZX)5x^qhfV$&|Bz|L51afmdm+<`A2#`C(l=kU;)hNCnR{?Ft@xqjmsb4D z{Dt>?Q_O1Z-=Lh9RyqH1@GbBxdngGZ&ATYIRR6v2`~R%}(bAIN&;R#7s{QldPs860 z_M*>6cmIYuu$z5;%lGqB%xMHWR^8v5(-x178WVR_sSJ;DQV!hE>*Wje{rnVjCW(2g zn5i^yH$In6I6l(}$7ed>_AMi_J72z5Jepbo+|mBj3gB~J;l}+Ji}{e4-wQc_rqSHD7BE>nIzi0$ zg}kDkn1_lvOw8wmyt2HQsXN2{SXM3)kIoP?^%1!nU)4@HdKF#S@JDYGkESad?&!d} z!qI_FVh$DaSs|}3CuVaoFBJ1ZF_#HBNIdrq63=~u#B<*u@!WTfc<#GKJojBAp8Kv5 z%zfdCAh-@Ce{c)@gszn?TNd{Ko&(2D|AWVhIabWqg&d+MW*afD6!Qr&{}ghliI``J zIZezZLJp(O5O*+FP~}d%V(PV@|otoT;4=;Up~{^ zm(Mi!*+FP~}d%V(PVa(N5QefdmtUp~{^m(Mi!uH%&bEO%u<3)5LS%-GaF< zO#gQ;qU7Jb8b6_-BRkCe+Zh@^i8&rcHtTIwH@4cHD`vV@=Z@Y(S0Q}%5^j7CQ8O&Z{!RgoygE0z!i!H{JOna z&HH*F$1kg7`PU4%?0MgPHVHD%LJkV8@MGox;5#49CLV()8%PCwAGI)iHY)Z!9t3>y zU$1%{cFX(>N4qBfbsshucz3lP1@Z7JX=(I+1LWt1ch;E=0k*jIG$%eo=26IDPS!o& zNTbgyO7)`;$Q*^--S24eW;@_%#vi@c?3bA;eg0163OgHMoryp4m+n<_dSx8#eLYtB z%L+JromQi{@;gr-i2UPE( zsU4sUQ{L`Xr9m&?#u@DmyTM&WR7@FmSdqH-TzBB(&y1I}jhC4&7Tr2DbY9pEc&xtZ z^`=|Ye2|XRHzR_7w2=;`Cl>wN)!8I7O@pIX{EWZd2{>S$wSSdZnd!>JY~M7C)g6Fa zCOh8wE1$pz&*F!Aq3G_b?(Knh-5lQOvwVZw44MY}XxoLCD1mJ%x&^+9RBt?^H;!)9 z0U1O+?Bn znKvV6cXidzs1H1UWW=bo zEl1Aq=hc< z1e=Uao{MDuiK7?y`19qe4sf}}$3D0%Q1cP$f3}!7eY1aM;MFN7t)1t|O#RP-wZ;9q zR0LMuJ-^jv4lpGDk!(u-BQyu(2INtyZhSV!cgg4ZV%{g_mqN~LF6Pll&Re0 zKS`}wZt|a`J|H*wPaed#_TS`}YFd6dZ2aW6pdye@dxFx=;KZ}l*7EEjpE?|Trg;ya z@8LV*@~Jvv9xUcSF`p3gcOjqdB4#>3sR(Q+JoROgJpDgST?Q%w{zZ8yx8&*nX}WNs zBH&e$GuB$3{-2@gAQb`UPseIz$rIT#PWaZS2=vj)Jl$TNM4zGW4yXtybq_C!lc)b@ z=m4c6kb7;y^f-C?f0hnVDgsvJrkz?RPyf&M#n+}HP+~m0QII_SKT8KF6@kEs3w`|L z>Hk?eK&c2+i&}QxM}FsLsVhoFV0V6Cv#Ij*{~S#RsR#`I9JXMrJpDg60pA)Gfom<- zUm7ZZYUilBQ4#QQ-ePDiPyf$Rb)zCsdsWgBb9wrIz7}qria=~e>UCpz`hT9P8x?_G z&(qr}<>~)3;#u!>9-to%<1yEl>XoF5+ub5lH{0_40r` z{V$|zNh$(Em6iMMlBfTL|3C8XJ1UB%X%sjDVgfN>PMFu66Q)H4F(W2aR7{w2Rt#VO za{!T`f`TZ5IiVz&=1s;Ad3>zw=7J>UKO>pky}>Y1Ibsp{^X-KPaa zV-tAqZX2{loBp4l0gO#xl7IeJE41nVdF*c31Pbmi*1}(#{-6H<(bxpypO*=nu1)_h zQ~|~&(4(nyKFBj7IHVppm%9Vs>sS4MAQ_`uqvaU8nU%_rW)h+H-r6&rX-<@2) zc`1!MKy;}YMFZ{{qC2KtUs~T@;|0LyViwh3_)y{ZcK4oEDX#GeVE1c3?>XF8c!g71 zFlt|cG%92)oSn!@)pXA1qASK|zb9v)YvP|OvDXVlI5?v=7=H$-16 z3!LxPnnZWQFA)|WWb5)+S+pCu4{)MI&H-5sKT#VMlt28IvS>GQFmRiyGqS~>Q@F*c zVxKSM(D)kghwiVp4mzXolP_i39n;d`x-GEJoZg)a7?Npd`N~o8S=8w3t$-_RPyTlD zxWYNyYyH@gS>xHjSMD|mpLkT^Sbqn%NDGY*0r#=m)}maJ!qwv)V}dhjj1!=&HA`e% zKcw*GbQiNFf7%#d*o|5cy}j4crE?P$9$Uz@+w5N&j|6Vw|EG4H{R)3^>9%$94~=7h zpY9rUCvC67tETkMJo1~ykAasycrY_inS1E!ZyxB;|BK2uivbtS?pn5mGWXCOx;=cC z`zMXDc$}z{boPVccYk|lAD_Mb2aU0KxOr9|9l1r}-wxCIHh-rvww3P-Bl2~MRe1JL z-}w4(RKAr3jvcu#SAuzr!ezqd+g5$0u_JKx)LEW8mC1$f__<|XrC(_54Sd_?UFLqu z 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�eTBay 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%0DgTA7z`Bd`7ivr2K!Se5~kL(B!i! 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

|Bf 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