diff --git a/README.md b/README.md index efc76697bea7..653775d32d0a 100644 --- a/README.md +++ b/README.md @@ -77,13 +77,13 @@ If you find OpenAPI Generator useful for work, please consider asking your compa ## Overview OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an [OpenAPI Spec](https://github.com/OAI/OpenAPI-Specification) (both 2.0 and 3.0 are supported). Currently, the following languages/frameworks are supported: -| | Languages/Frameworks | -| -------------------------------- |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C**, **C#** (.net 2.0, 3.5 or later, .NET Standard 1.3 - 2.1, .NET Core 3.1, .NET 5.0. Libraries: RestSharp, GenericHost, HttpClient), **C++** (Arduino, cpp-restsdk, Qt5, Tizen, Unreal Engine 4), **Clojure**, **Crystal**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Apache HttpClient, 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, MicroProfile Rest Client, Helidon), **Julia**, **k6**, **Kotlin**, **Lua**, **Nim**, **Node.js/JavaScript** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types, Apollo GraphQL DataStore), **Objective-C**, **OCaml**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (hyper, reqwest, rust-server), **Scala** (akka, http4s, scalaz, sttp, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x, 5.x), **Typescript** (AngularJS, Angular (2.x - 13.x), Aurelia, Axios, Fetch, Inversify, jQuery, Nestjs, Node, redux-query, Rxjs) | -| **Server stubs** | **Ada**, **C#** (ASP.NET Core, Azure Functions), **C++** (Pistache, Restbed, Qt5 QHTTPEngine), **Erlang**, **F#** (Giraffe), **Go** (net/http, Gin, Echo), **Haskell** (Servant, Yesod), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, Jersey, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples), [Vert.x](https://vertx.io/), [Apache Camel](https://camel.apache.org/), [Helidon](https://helidon.io/)), **Julia**, **Kotlin** (Spring Boot, Ktor, Vertx), **PHP** (Laravel, Lumen, [Mezzio (fka Zend Expressive)](https://github.com/mezzio/mezzio), Slim, Silex, [Symfony](https://symfony.com/)), **Python** (FastAPI, Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** ([rust-server](https://openapi-generator.tech/docs/generators/rust-server/)), **Scala** (Akka, [Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), [Play](https://www.playframework.com/), Scalatra) | -| **API documentation generators** | **HTML**, **Confluence Wiki**, **Asciidoc**, **Markdown**, **PlantUML** | -| **Configuration files** | [**Apache2**](https://httpd.apache.org/) | -| **Others** | **GraphQL**, **JMeter**, **Ktorm**, **MySQL Schema**, **Protocol Buffer**, **WSDL** | +| | Languages/Frameworks | +| -------------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **API clients** | **ActionScript**, **Ada**, **Apex**, **Bash**, **C**, **C#** (.net 2.0, 3.5 or later, .NET Standard 1.3 - 2.1, .NET Core 3.1, .NET 5.0. Libraries: RestSharp, GenericHost, HttpClient), **C++** (Arduino, cpp-restsdk, Qt5, Tizen, Unreal Engine 4), **Clojure**, **Crystal**, **Dart**, **Elixir**, **Elm**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Apache HttpClient, 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, MicroProfile Rest Client, Helidon), **Jetbrains HTTP Client**, **Julia**, **k6**, **Kotlin**, **Lua**, **Nim**, **Node.js/JavaScript** (ES5, ES6, AngularJS with Google Closure Compiler annotations, Flow types, Apollo GraphQL DataStore), **Objective-C**, **OCaml**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust** (hyper, reqwest, rust-server), **Scala** (akka, http4s, scalaz, sttp, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x, 5.x), **Typescript** (AngularJS, Angular (2.x - 13.x), Aurelia, Axios, Fetch, Inversify, jQuery, Nestjs, Node, redux-query, Rxjs) | +| **Server stubs** | **Ada**, **C#** (ASP.NET Core, Azure Functions), **C++** (Pistache, Restbed, Qt5 QHTTPEngine), **Erlang**, **F#** (Giraffe), **Go** (net/http, Gin, Echo), **Haskell** (Servant, Yesod), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, Jersey, RestEasy, Play Framework, [PKMST](https://github.com/ProKarma-Inc/pkmst-getting-started-examples), [Vert.x](https://vertx.io/), [Apache Camel](https://camel.apache.org/), [Helidon](https://helidon.io/)), **Julia**, **Kotlin** (Spring Boot, Ktor, Vertx), **PHP** (Laravel, Lumen, [Mezzio (fka Zend Expressive)](https://github.com/mezzio/mezzio), Slim, Silex, [Symfony](https://symfony.com/)), **Python** (FastAPI, Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust** ([rust-server](https://openapi-generator.tech/docs/generators/rust-server/)), **Scala** (Akka, [Finch](https://github.com/finagle/finch), [Lagom](https://github.com/lagom/lagom), [Play](https://www.playframework.com/), Scalatra) | +| **API documentation generators** | **HTML**, **Confluence Wiki**, **Asciidoc**, **Markdown**, **PlantUML** | +| **Configuration files** | [**Apache2**](https://httpd.apache.org/) | +| **Others** | **GraphQL**, **JMeter**, **Ktorm**, **MySQL Schema**, **Protocol Buffer**, **WSDL** | ## Table of contents @@ -960,6 +960,7 @@ Here is a list of template creators: * JavaScript (Apollo DataSource): @erithmetic * JavaScript (Closure-annotated Angular) @achew22 * JavaScript (Flow types) @jaypea + * Jetbrains HTTP Client : @jlengrand * JMeter: @davidkiss * Julia: @tanmaykm * Kotlin: @jimschubert [:heart:](https://www.patreon.com/jimschubert) @@ -1097,48 +1098,49 @@ If you want to join the committee, please kindly apply by sending an email to te #### Members of Technical Committee -| Languages/Generators | Member (join date) | -| :---------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| ActionScript | | -| Ada | @stcarrez (2018/02) @michelealbano (2018/02) | -| Android | @jaz-ah (2017/09) | -| Apex | | -| Bash | @frol (2017/07) @bkryza (2017/08) @kenjones-cisco (2017/09) | -| C | @zhemant (2018/11) @ityuhui (2019/12) @michelealbano (2020/03) | -| C++ | @ravinikam (2017/07) @stkrwork (2017/07) @etherealjoy (2018/02) @martindelille (2018/03) @muttleyxd (2019/08) | -| C# | @mandrean (2017/08) @frankyjuang (2019/09) @shibayan (2020/02) @Blackclaws (2021/03) @lucamazzanti (2021/05) | -| Clojure | | -| Crystal | @cyangle (2021/01) | -| Dart | @jaumard (2018/09) @josh-burton (2019/12) @amondnet (2019/12) @sbu-WBT (2020/12) @kuhnroyal (2020/12) @agilob (2020/12) @ahmednfwela (2021/08) | -| Eiffel | @jvelilla (2017/09) | -| Elixir | @mrmstn (2018/12) | -| Elm | @eriktim (2018/09) | -| Erlang | @tsloughter (2017/11) @jfacorro (2018/10) @robertoaloi (2018/10) | -| F# | @nmfisher (2019/05) | -| Go | @antihax (2017/11) @grokify (2018/07) @kemokemo (2018/09) @jirikuncar (2021/01) @ph4r5h4d (2021/04) | -| GraphQL | @renepardon (2018/12) | -| Groovy | | -| Haskell | | -| Java | @bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10) | -| Java Spring | @cachescrubber (2022/02) @welshm (2022/02) @MelleD (2022/02) @atextor (2022/02) @manedev79 (2022/02) @javisst (2022/02) @borsch (2022/02) @banlevente (2022/02) @Zomzog (2022/09) | -| JMeter | @kannkyo (2021/01) | -| Julia | @tanmaykm (2023/01) | -| Kotlin | @jimschubert (2017/09) [:heart:](https://www.patreon.com/jimschubert), @dr4ke616 (2018/08) @karismann (2019/03) @Zomzog (2019/04) @andrewemery (2019/10) @4brunu (2019/11) @yutaka0m (2020/03) | -| Lua | @daurnimator (2017/08) | -| Nim | | -| NodeJS/Javascript | @CodeNinjai (2017/07) @frol (2017/07) @cliffano (2017/07) | -| ObjC | | -| OCaml | @cgensoul (2019/08) | -| Perl | @wing328 (2017/07) [:heart:](https://www.patreon.com/wing328) @yue9944882 (2019/06) | -| PHP | @jebentier (2017/07), @dkarlovi (2017/07), @mandrean (2017/08), @jfastnacht (2017/09), [@ybelenko](https://github.com/ybelenko) (2018/07), @renepardon (2018/12) | -| PowerShell | @wing328 (2020/05) | -| Python | @spacether (2019/11) [:heart:][spacether sponsorship] | -| R | @Ramanth (2019/07) @saigiridhar21 (2019/07) | -| Ruby | @cliffano (2017/07) @zlx (2017/09) @autopp (2019/02) | -| Rust | @frol (2017/07) @farcaller (2017/08) @richardwhiuk (2019/07) @paladinzh (2020/05) @jacob-pro (2022/10) | -| Scala | @clasnake (2017/07), @jimschubert (2017/09) [:heart:](https://www.patreon.com/jimschubert), @shijinkui (2018/01), @ramzimaalej (2018/03), @chameleon82 (2020/03), @Bouillie (2020/04) | -| Swift | @jgavris (2017/07) @ehyche (2017/08) @Edubits (2017/09) @jaz-ah (2017/09) @4brunu (2019/11) | -| TypeScript | @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) | +| Languages/Generators | Member (join date) | +|:----------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ActionScript | | +| Ada | @stcarrez (2018/02) @michelealbano (2018/02) | +| Android | @jaz-ah (2017/09) | +| Apex | | +| Bash | @frol (2017/07) @bkryza (2017/08) @kenjones-cisco (2017/09) | +| C | @zhemant (2018/11) @ityuhui (2019/12) @michelealbano (2020/03) | +| C++ | @ravinikam (2017/07) @stkrwork (2017/07) @etherealjoy (2018/02) @martindelille (2018/03) @muttleyxd (2019/08) | +| C# | @mandrean (2017/08) @frankyjuang (2019/09) @shibayan (2020/02) @Blackclaws (2021/03) @lucamazzanti (2021/05) | +| Clojure | | +| Crystal | @cyangle (2021/01) | +| Dart | @jaumard (2018/09) @josh-burton (2019/12) @amondnet (2019/12) @sbu-WBT (2020/12) @kuhnroyal (2020/12) @agilob (2020/12) @ahmednfwela (2021/08) | +| Eiffel | @jvelilla (2017/09) | +| Elixir | @mrmstn (2018/12) | +| Elm | @eriktim (2018/09) | +| Erlang | @tsloughter (2017/11) @jfacorro (2018/10) @robertoaloi (2018/10) | +| F# | @nmfisher (2019/05) | +| Go | @antihax (2017/11) @grokify (2018/07) @kemokemo (2018/09) @jirikuncar (2021/01) @ph4r5h4d (2021/04) | +| GraphQL | @renepardon (2018/12) | +| Groovy | | +| Haskell | | +| Java | @bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10) | +| Java Spring | @cachescrubber (2022/02) @welshm (2022/02) @MelleD (2022/02) @atextor (2022/02) @manedev79 (2022/02) @javisst (2022/02) @borsch (2022/02) @banlevente (2022/02) @Zomzog (2022/09) | +| JMeter | @kannkyo (2021/01) | +| Jetbrains HTTP Client | @jlengrand (2023/01) | +| Julia | @tanmaykm (2023/01) | +| Kotlin | @jimschubert (2017/09) [:heart:](https://www.patreon.com/jimschubert), @dr4ke616 (2018/08) @karismann (2019/03) @Zomzog (2019/04) @andrewemery (2019/10) @4brunu (2019/11) @yutaka0m (2020/03) | +| Lua | @daurnimator (2017/08) | +| Nim | | +| NodeJS/Javascript | @CodeNinjai (2017/07) @frol (2017/07) @cliffano (2017/07) | +| ObjC | | +| OCaml | @cgensoul (2019/08) | +| Perl | @wing328 (2017/07) [:heart:](https://www.patreon.com/wing328) @yue9944882 (2019/06) | +| PHP | @jebentier (2017/07), @dkarlovi (2017/07), @mandrean (2017/08), @jfastnacht (2017/09), [@ybelenko](https://github.com/ybelenko) (2018/07), @renepardon (2018/12) | +| PowerShell | @wing328 (2020/05) | +| Python | @spacether (2019/11) [:heart:][spacether sponsorship] | +| R | @Ramanth (2019/07) @saigiridhar21 (2019/07) | +| Ruby | @cliffano (2017/07) @zlx (2017/09) @autopp (2019/02) | +| Rust | @frol (2017/07) @farcaller (2017/08) @richardwhiuk (2019/07) @paladinzh (2020/05) @jacob-pro (2022/10) | +| Scala | @clasnake (2017/07), @jimschubert (2017/09) [:heart:](https://www.patreon.com/jimschubert), @shijinkui (2018/01), @ramzimaalej (2018/03), @chameleon82 (2020/03), @Bouillie (2020/04) | +| Swift | @jgavris (2017/07) @ehyche (2017/08) @Edubits (2017/09) @jaz-ah (2017/09) @4brunu (2019/11) | +| TypeScript | @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) | Past Members of Technical Committee: diff --git a/bin/configs/jetbrains-http-client-petstore-new.yaml b/bin/configs/jetbrains-http-client-petstore-new.yaml new file mode 100644 index 000000000000..72c5012b9725 --- /dev/null +++ b/bin/configs/jetbrains-http-client-petstore-new.yaml @@ -0,0 +1,6 @@ +generatorName: jetbrains-http-client +outputDir: samples/client/petstore/jetbrains/http/client +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +templateDir: modules/openapi-generator/src/main/resources/jetbrains-http-client +additionalProperties: + hideGenerationTimestamp: "true" diff --git a/docs/generators.md b/docs/generators.md index e2ac7adb5df3..a21693e18e04 100644 --- a/docs/generators.md +++ b/docs/generators.md @@ -39,6 +39,7 @@ The following generators are available: * [javascript-closure-angular](generators/javascript-closure-angular.md) * [javascript-flowtyped](generators/javascript-flowtyped.md) * [jaxrs-cxf-client](generators/jaxrs-cxf-client.md) +* [jetbrains-http-client (experimental)](generators/jetbrains-http-client.md) * [jmeter](generators/jmeter.md) * [julia-client (beta)](generators/julia-client.md) * [k6 (beta)](generators/k6.md) diff --git a/docs/generators/jetbrains-http-client.md b/docs/generators/jetbrains-http-client.md new file mode 100644 index 000000000000..44da9dc66317 --- /dev/null +++ b/docs/generators/jetbrains-http-client.md @@ -0,0 +1,167 @@ +--- +title: Documentation for the jetbrains-http-client Generator +--- + +## METADATA + +| Property | Value | Notes | +| -------- | ----- | ----- | +| generator name | jetbrains-http-client | pass this to the generate command after -g | +| generator stability | EXPERIMENTAL | | +| generator type | CLIENT | | +| generator language | Jetbrains HTTP Client (HTTP/REST) | | +| generator default templating engine | mustache | | +| helpTxt | Generates a jetbrains-http client. See https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html | | + +## CONFIG OPTIONS +These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details. + +| Option | Description | Values | Default | +| ------ | ----------- | ------ | ------- | +|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| +|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|
**false**
The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.
**true**
Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.
|true| +|ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| +|enumUnknownDefaultCase|If the server adds new enum cases, that are unknown by an old spec/client, the client will fail to parse the network response.With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the server sends an enum case that is not known by the client/spec, they can safely fallback to this case.|
**false**
No changes to the enum's are made, this is the default option.
**true**
With this option enabled, each enum will have a new case, 'unknown_default_open_api', so that when the enum case sent by the server is not known by the client/spec, can safely be decoded to this case.
|false| +|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C#have this enabled by default).|
**true**
The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.
**false**
The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing.
|true| +|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false| +|sortModelPropertiesByRequiredFlag|Sort model properties to place required parameters before optional parameters.| |true| +|sortParamsByRequiredFlag|Sort method arguments to place required parameters before optional parameters.| |true| + +## IMPORT MAPPING + +| Type/Alias | Imports | +| ---------- | ------- | + + +## INSTANTIATION TYPES + +| Type/Alias | Instantiated By | +| ---------- | --------------- | + + +## LANGUAGE PRIMITIVES + + + +## RESERVED WORDS + + + +## FEATURE SET + + +### Client Modification Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|BasePath|✗|ToolingExtension +|Authorizations|✗|ToolingExtension +|UserAgent|✗|ToolingExtension +|MockServer|✗|ToolingExtension + +### Data Type Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Custom|✗|OAS2,OAS3 +|Int32|✓|OAS2,OAS3 +|Int64|✓|OAS2,OAS3 +|Float|✓|OAS2,OAS3 +|Double|✓|OAS2,OAS3 +|Decimal|✓|ToolingExtension +|String|✓|OAS2,OAS3 +|Byte|✓|OAS2,OAS3 +|Binary|✓|OAS2,OAS3 +|Boolean|✓|OAS2,OAS3 +|Date|✓|OAS2,OAS3 +|DateTime|✓|OAS2,OAS3 +|Password|✓|OAS2,OAS3 +|File|✓|OAS2 +|Uuid|✗| +|Array|✓|OAS2,OAS3 +|Null|✗|OAS3 +|AnyType|✗|OAS2,OAS3 +|Object|✓|OAS2,OAS3 +|Maps|✓|ToolingExtension +|CollectionFormat|✓|OAS2 +|CollectionFormatMulti|✓|OAS2 +|Enum|✓|OAS2,OAS3 +|ArrayOfEnum|✓|ToolingExtension +|ArrayOfModel|✓|ToolingExtension +|ArrayOfCollectionOfPrimitives|✓|ToolingExtension +|ArrayOfCollectionOfModel|✓|ToolingExtension +|ArrayOfCollectionOfEnum|✓|ToolingExtension +|MapOfEnum|✓|ToolingExtension +|MapOfModel|✓|ToolingExtension +|MapOfCollectionOfPrimitives|✓|ToolingExtension +|MapOfCollectionOfModel|✓|ToolingExtension +|MapOfCollectionOfEnum|✓|ToolingExtension + +### Documentation Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Readme|✗|ToolingExtension +|Model|✓|ToolingExtension +|Api|✓|ToolingExtension + +### Global Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Host|✓|OAS2,OAS3 +|BasePath|✓|OAS2,OAS3 +|Info|✓|OAS2,OAS3 +|Schemes|✗|OAS2,OAS3 +|PartialSchemes|✓|OAS2,OAS3 +|Consumes|✓|OAS2 +|Produces|✓|OAS2 +|ExternalDocumentation|✓|OAS2,OAS3 +|Examples|✓|OAS2,OAS3 +|XMLStructureDefinitions|✗|OAS2,OAS3 +|MultiServer|✗|OAS3 +|ParameterizedServer|✗|OAS3 +|ParameterStyling|✗|OAS3 +|Callbacks|✓|OAS3 +|LinkObjects|✗|OAS3 + +### Parameter Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Path|✓|OAS2,OAS3 +|Query|✓|OAS2,OAS3 +|Header|✓|OAS2,OAS3 +|Body|✓|OAS2 +|FormUnencoded|✓|OAS2 +|FormMultipart|✓|OAS2 +|Cookie|✓|OAS3 + +### Schema Support Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|Simple|✓|OAS2,OAS3 +|Composite|✓|OAS2,OAS3 +|Polymorphism|✓|OAS2,OAS3 +|Union|✗|OAS3 +|allOf|✗|OAS2,OAS3 +|anyOf|✗|OAS3 +|oneOf|✗|OAS3 +|not|✗|OAS3 + +### Security Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|BasicAuth|✓|OAS2,OAS3 +|ApiKey|✓|OAS2,OAS3 +|OpenIDConnect|✗|OAS3 +|BearerToken|✓|OAS3 +|OAuth2_Implicit|✓|OAS2,OAS3 +|OAuth2_Password|✓|OAS2,OAS3 +|OAuth2_ClientCredentials|✓|OAS2,OAS3 +|OAuth2_AuthorizationCode|✓|OAS2,OAS3 + +### Wire Format Feature +| Name | Supported | Defined By | +| ---- | --------- | ---------- | +|JSON|✓|OAS2,OAS3 +|XML|✓|OAS2,OAS3 +|PROTOBUF|✗|ToolingExtension +|Custom|✗|OAS2,OAS3 diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/GeneratorLanguage.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/GeneratorLanguage.java index abdd0ce46419..e6959a4adaf3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/GeneratorLanguage.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/GeneratorLanguage.java @@ -28,7 +28,7 @@ public enum GeneratorLanguage { DART("Dart"), EIFFEL("Eiffel"), ELIXIR("Elixir"), ELM("Elm"), ERLANG("Erlang"), FLASH("Flash"), F_SHARP("F#"), GO("Go"), JAVASCRIPT("Javascript"), GRAPH_QL("GraphQL"), GROOVY("Groovy"), - HASKELL("Haskell"), TYPESCRIPT("Typescript"), K_SIX("k6"), KOTLIN("Kotlin"), + HASKELL("Haskell"), HTTP("Jetbrains HTTP Client (HTTP/REST)"), TYPESCRIPT("Typescript"), K_SIX("k6"), KOTLIN("Kotlin"), KTORM("Ktorm"), LUA("Lua"), MYSQL("Mysql"), NIM("Nim"), OBJECTIVE_C("Objective-C"), OCAML("OCaml"), PERL("Perl"), PHP("PHP"), POWERSHELL("PowerShell"), PROTOBUF("Protocol Buffers (Protobuf)"), PYTHON("Python"), diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JetbrainsHttpClientClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JetbrainsHttpClientClientCodegen.java new file mode 100644 index 000000000000..e0f3e683ba7d --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JetbrainsHttpClientClientCodegen.java @@ -0,0 +1,102 @@ +package org.openapitools.codegen.languages; + +import com.google.common.collect.ImmutableMap; +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import org.openapitools.codegen.*; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.openapitools.codegen.meta.GeneratorMetadata; +import org.openapitools.codegen.meta.Stability; +import org.openapitools.codegen.model.ApiInfoMap; +import org.openapitools.codegen.model.ModelMap; +import org.openapitools.codegen.model.OperationMap; +import org.openapitools.codegen.model.OperationsMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JetbrainsHttpClientClientCodegen extends DefaultCodegen implements CodegenConfig { + public static final String PROJECT_NAME = "Jetbrains HTTP Client"; + + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + public String getName() { + return "jetbrains-http-client"; + } + + public String getHelp() { + return "Generates a jetbrains-http client. See https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html"; + } + + @Override + public GeneratorLanguage generatorLanguage() { + return GeneratorLanguage.HTTP; + } + + public JetbrainsHttpClientClientCodegen() { + super(); + + generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata) + .stability(Stability.EXPERIMENTAL) + .build(); + + outputFolder = "generated-code" + File.separator + "jetbrains-http-client"; + apiTemplateFiles.put("api.mustache", ".http"); + embeddedTemplateDir = templateDir = "jetbrains-http-client"; + apiPackage = "Apis"; + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + } + + @Override + protected ImmutableMap.Builder addMustacheLambdas() { + + return super.addMustacheLambdas() + .put("doubleMustache", new DoubleMustacheLambda()); + } + + public static class DoubleMustacheLambda implements Mustache.Lambda { + @Override + public void execute(Template.Fragment fragment, Writer writer) throws IOException { + String text = fragment.execute(); + writer.write(text + .replaceAll("\\{", "{{") + .replaceAll("}", "}}") + ); + } + } + + @Override + public Map postProcessSupportingFileData(Map bundle) { + + return bundle; + } + + @Override + public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List allModels) { + return super.postProcessOperationsWithModels(objs, allModels); + } + + @Override + public void postProcess() { + System.out.println("################################################################################"); + System.out.println("# Thanks for using OpenAPI Generator. #"); + System.out.println("# Please consider donation to help us maintain this project \uD83D\uDE4F #"); + System.out.println("# https://opencollective.com/openapi_generator/donate #"); + System.out.println("# #"); + System.out.println("# This generator was written by Julien Lengrand-Lambert (https://github.com/jlengrand) #"); + System.out.println("################################################################################"); + } +} 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 9a12e847a053..b3a13e797f4d 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 @@ -138,6 +138,6 @@ org.openapitools.codegen.languages.TypeScriptNodeClientCodegen org.openapitools.codegen.languages.TypeScriptReduxQueryClientCodegen org.openapitools.codegen.languages.TypeScriptRxjsClientCodegen org.openapitools.codegen.languages.WsdlSchemaCodegen - +org.openapitools.codegen.languages.JetbrainsHttpClientClientCodegen org.openapitools.codegen.languages.JuliaClientCodegen org.openapitools.codegen.languages.JuliaServerCodegen diff --git a/modules/openapi-generator/src/main/resources/jetbrains-http-client/README.mustache b/modules/openapi-generator/src/main/resources/jetbrains-http-client/README.mustache new file mode 100644 index 000000000000..1fee3edb01d8 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/jetbrains-http-client/README.mustache @@ -0,0 +1,22 @@ +# {{appName}} - Jetbrains API Client + +## OpenAPI File description + +{{#appDescription}}{{appDescription}}{{/appDescription}} + +* API basepath : [{{basePath}}]({{basePath}}) +* Version : {{version}} + +## Documentation for API Endpoints + +{{#generateApiDocs}} +All URIs are relative to *{{{basePath}}}*, but will link to the `.http` file that contains the endpoint definition + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**](Apis/{{apiDocPath}}{{classname}}.http#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{{summary}}}{{/summary}} +{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} +{{/generateApiDocs}} + + +_This client was generated by the jetbrains-http-client of OpenAPI Generator_ \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/jetbrains-http-client/api.mustache b/modules/openapi-generator/src/main/resources/jetbrains-http-client/api.mustache new file mode 100644 index 000000000000..43b1c2416b69 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/jetbrains-http-client/api.mustache @@ -0,0 +1,11 @@ +## {{classname}} +{{#operations}} +{{#operation}} + +### {{#summary}}{{summary}}{{/summary}} +# @name {{operationId}} +{{httpMethod}} {{basePath}}{{#lambda.doubleMustache}}{{path}}{{/lambda.doubleMustache}} +{{#consumes}}Content-Type: {{{mediaType}}} +{{/consumes}} +{{/operation}} +{{/operations}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenModelTest.java new file mode 100644 index 000000000000..417b61c26c14 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenModelTest.java @@ -0,0 +1,29 @@ +package org.openapitools.codegen.jetbrains.http.client; + +import org.openapitools.codegen.*; +import org.openapitools.codegen.languages.JetbrainsHttpClientClientCodegen; +import io.swagger.models.*; +import io.swagger.models.properties.*; + +import org.testng.Assert; +import org.testng.annotations.Test; + +@SuppressWarnings("static-method") +public class JetbrainsHttpClientClientCodegenModelTest { + + @Test(description = "convert a simple java model") + public void simpleModelTest() { + final Model model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .required("id") + .required("name"); + final DefaultCodegen codegen = new JetbrainsHttpClientClientCodegen(); + + // TODO: Complete this test. +// Assert.fail("Not implemented."); + } + +} + diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenTest.java new file mode 100644 index 000000000000..006da2439c1c --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/jetbrains/http/client/JetbrainsHttpClientClientCodegenTest.java @@ -0,0 +1,19 @@ +package org.openapitools.codegen.jetbrains.http.client; + +import org.openapitools.codegen.*; +import org.openapitools.codegen.languages.JetbrainsHttpClientClientCodegen; +import io.swagger.models.*; +import io.swagger.parser.SwaggerParser; +import org.testng.Assert; +import org.testng.annotations.Test; + +public class JetbrainsHttpClientClientCodegenTest { + + JetbrainsHttpClientClientCodegen codegen = new JetbrainsHttpClientClientCodegen(); + + @Test + public void shouldSucceed() throws Exception { + // TODO: Complete this test. +// Assert.fail("Not implemented."); + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/JetbrainsHttpClientClientCodegenOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/JetbrainsHttpClientClientCodegenOptionsProvider.java new file mode 100644 index 000000000000..bcc397589cbb --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/JetbrainsHttpClientClientCodegenOptionsProvider.java @@ -0,0 +1,31 @@ +package org.openapitools.codegen.options; + +import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.languages.JetbrainsHttpClientClientCodegen; + +import com.google.common.collect.ImmutableMap; + +import java.util.Map; + +public class JetbrainsHttpClientClientCodegenOptionsProvider implements OptionsProvider { + public static final String PROJECT_NAME_VALUE = "OpenAPI"; + + @Override + public String getLanguage() { + return "jetbrains-http-client"; + } + + @Override + public Map createOptions() { + ImmutableMap.Builder builder = new ImmutableMap.Builder(); + return builder + .put(JetbrainsHttpClientClientCodegen.PROJECT_NAME, PROJECT_NAME_VALUE) + .build(); + } + + @Override + public boolean isServer() { + return false; + } +} + diff --git a/samples/client/petstore/jetbrains/http/client/.openapi-generator-ignore b/samples/client/petstore/jetbrains/http/client/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/client/petstore/jetbrains/http/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/jetbrains/http/client/.openapi-generator/FILES b/samples/client/petstore/jetbrains/http/client/.openapi-generator/FILES new file mode 100644 index 000000000000..9df0ac6af973 --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/.openapi-generator/FILES @@ -0,0 +1,4 @@ +Apis/PetApi.http +Apis/StoreApi.http +Apis/UserApi.http +README.md diff --git a/samples/client/petstore/jetbrains/http/client/.openapi-generator/VERSION b/samples/client/petstore/jetbrains/http/client/.openapi-generator/VERSION new file mode 100644 index 000000000000..d6b4ec4aa783 --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/.openapi-generator/VERSION @@ -0,0 +1 @@ +6.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/jetbrains/http/client/Apis/PetApi.http b/samples/client/petstore/jetbrains/http/client/Apis/PetApi.http new file mode 100644 index 000000000000..10da21d8154e --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/Apis/PetApi.http @@ -0,0 +1,39 @@ +## PetApi + +### Add a new pet to the store +# @name addPet +POST http://petstore.swagger.io/v2/pet +Content-Type: application/json +Content-Type: application/xml + +### Deletes a pet +# @name deletePet +DELETE http://petstore.swagger.io/v2/pet/{{petId}} + +### Finds Pets by status +# @name findPetsByStatus +GET http://petstore.swagger.io/v2/pet/findByStatus + +### Finds Pets by tags +# @name findPetsByTags +GET http://petstore.swagger.io/v2/pet/findByTags + +### Find pet by ID +# @name getPetById +GET http://petstore.swagger.io/v2/pet/{{petId}} + +### Update an existing pet +# @name updatePet +PUT http://petstore.swagger.io/v2/pet +Content-Type: application/json +Content-Type: application/xml + +### Updates a pet in the store with form data +# @name updatePetWithForm +POST http://petstore.swagger.io/v2/pet/{{petId}} +Content-Type: application/x-www-form-urlencoded + +### uploads an image +# @name uploadFile +POST http://petstore.swagger.io/v2/pet/{{petId}}/uploadImage +Content-Type: multipart/form-data diff --git a/samples/client/petstore/jetbrains/http/client/Apis/StoreApi.http b/samples/client/petstore/jetbrains/http/client/Apis/StoreApi.http new file mode 100644 index 000000000000..2878adaa7daa --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/Apis/StoreApi.http @@ -0,0 +1,18 @@ +## StoreApi + +### Delete purchase order by ID +# @name deleteOrder +DELETE http://petstore.swagger.io/v2/store/order/{{orderId}} + +### Returns pet inventories by status +# @name getInventory +GET http://petstore.swagger.io/v2/store/inventory + +### Find purchase order by ID +# @name getOrderById +GET http://petstore.swagger.io/v2/store/order/{{orderId}} + +### Place an order for a pet +# @name placeOrder +POST http://petstore.swagger.io/v2/store/order +Content-Type: application/json diff --git a/samples/client/petstore/jetbrains/http/client/Apis/UserApi.http b/samples/client/petstore/jetbrains/http/client/Apis/UserApi.http new file mode 100644 index 000000000000..ab0a9e7c9138 --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/Apis/UserApi.http @@ -0,0 +1,37 @@ +## UserApi + +### Create user +# @name createUser +POST http://petstore.swagger.io/v2/user +Content-Type: application/json + +### Creates list of users with given input array +# @name createUsersWithArrayInput +POST http://petstore.swagger.io/v2/user/createWithArray +Content-Type: application/json + +### Creates list of users with given input array +# @name createUsersWithListInput +POST http://petstore.swagger.io/v2/user/createWithList +Content-Type: application/json + +### Delete user +# @name deleteUser +DELETE http://petstore.swagger.io/v2/user/{{username}} + +### Get user by user name +# @name getUserByName +GET http://petstore.swagger.io/v2/user/{{username}} + +### Logs user into the system +# @name loginUser +GET http://petstore.swagger.io/v2/user/login + +### Logs out current logged in user session +# @name logoutUser +GET http://petstore.swagger.io/v2/user/logout + +### Updated user +# @name updateUser +PUT http://petstore.swagger.io/v2/user/{{username}} +Content-Type: application/json diff --git a/samples/client/petstore/jetbrains/http/client/README.md b/samples/client/petstore/jetbrains/http/client/README.md new file mode 100644 index 000000000000..da31cb298d47 --- /dev/null +++ b/samples/client/petstore/jetbrains/http/client/README.md @@ -0,0 +1,39 @@ +# OpenAPI Petstore - Jetbrains API Client + +## OpenAPI File description + +This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + +* API basepath : [http://petstore.swagger.io/v2](http://petstore.swagger.io/v2) +* Version : 1.0.0 + +## Documentation for API Endpoints + +All URIs are relative to *http://petstore.swagger.io/v2*, but will link to the `.http` file that contains the endpoint definition + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*PetApi* | [**addPet**](Apis/PetApi.http#addpet) | **POST** /pet | Add a new pet to the store +*PetApi* | [**deletePet**](Apis/PetApi.http#deletepet) | **DELETE** /pet/{petId} | Deletes a pet +*PetApi* | [**findPetsByStatus**](Apis/PetApi.http#findpetsbystatus) | **GET** /pet/findByStatus | Finds Pets by status +*PetApi* | [**findPetsByTags**](Apis/PetApi.http#findpetsbytags) | **GET** /pet/findByTags | Finds Pets by tags +*PetApi* | [**getPetById**](Apis/PetApi.http#getpetbyid) | **GET** /pet/{petId} | Find pet by ID +*PetApi* | [**updatePet**](Apis/PetApi.http#updatepet) | **PUT** /pet | Update an existing pet +*PetApi* | [**updatePetWithForm**](Apis/PetApi.http#updatepetwithform) | **POST** /pet/{petId} | Updates a pet in the store with form data +*PetApi* | [**uploadFile**](Apis/PetApi.http#uploadfile) | **POST** /pet/{petId}/uploadImage | uploads an image +*StoreApi* | [**deleteOrder**](Apis/StoreApi.http#deleteorder) | **DELETE** /store/order/{orderId} | Delete purchase order by ID +*StoreApi* | [**getInventory**](Apis/StoreApi.http#getinventory) | **GET** /store/inventory | Returns pet inventories by status +*StoreApi* | [**getOrderById**](Apis/StoreApi.http#getorderbyid) | **GET** /store/order/{orderId} | Find purchase order by ID +*StoreApi* | [**placeOrder**](Apis/StoreApi.http#placeorder) | **POST** /store/order | Place an order for a pet +*UserApi* | [**createUser**](Apis/UserApi.http#createuser) | **POST** /user | Create user +*UserApi* | [**createUsersWithArrayInput**](Apis/UserApi.http#createuserswitharrayinput) | **POST** /user/createWithArray | Creates list of users with given input array +*UserApi* | [**createUsersWithListInput**](Apis/UserApi.http#createuserswithlistinput) | **POST** /user/createWithList | Creates list of users with given input array +*UserApi* | [**deleteUser**](Apis/UserApi.http#deleteuser) | **DELETE** /user/{username} | Delete user +*UserApi* | [**getUserByName**](Apis/UserApi.http#getuserbyname) | **GET** /user/{username} | Get user by user name +*UserApi* | [**loginUser**](Apis/UserApi.http#loginuser) | **GET** /user/login | Logs user into the system +*UserApi* | [**logoutUser**](Apis/UserApi.http#logoutuser) | **GET** /user/logout | Logs out current logged in user session +*UserApi* | [**updateUser**](Apis/UserApi.http#updateuser) | **PUT** /user/{username} | Updated user + + + +_This client was generated by the jetbrains-http-client of OpenAPI Generator_ \ No newline at end of file