forked from loafle/openapi-generator-original
2 Commits
Author | SHA1 | Message | Date | |
---|---|---|---|---|
|
194d421d83
|
Further Elixir Client Improvements (#12775)
* Further Elixir Client Improvements Resolves #12731 and is the completion of the work that I started with #12751. The changes here are extensive and likely resolve an issue that I have seen with the Ory SDK (ory/sdk#194). I have also been unable to run the integration suite for Elixir as I am (trying) to run everything in Docker (`./run-in-docker.sh`) as I *do not* have a suitable Java development environment set up, and do not do enough Java work to really justify it. - Updated the README for Elixir projects. Aside from some improved readability of the template by use of link references instead of inline links, I have also fixed the examples: - The `deps` example should have been putting a version constraint related to `appVersion`. - The `config` example should have been using `packageName` instead of `appName`. This particular issue repeats. - In all Elixir files: - Changed the function `@docs` formatting: - changed the ehading level for `Parameters` and `Returns` to h3 (`###` instead of `##`). This will make somewhat better looking documentation that does not over-emphasize these details (which are *not* documented in a normal Elixir way, but this is somewhat to be expected with a code generator.) It may be desirable, after testing, to change this to `h4` instead of `h3`. - Put parameter names and most return types in in-line code blocks (`` `hello` ``). - Put return types, when there are multiple types, in a Markdown list. - Fixed a lot of the spacing. Most files will be *closer* to Elixir standard formatting than they were. Because of the limitations of Mustache, it is still recommended that people who generate Elixir clients run `mix format` at least once on their codebase. - `api.mustache`: - Removed an awkward function pipeline call. If we specified at least Elixir 1.12 (something that I do not recommend as we have recently jumped from requiring Elixir 1.6 to Elixir 1.10), there is a better way to specify this now with `Kernel.then/2`. In the meantime, assigning the constructed request structure to a variable and then making a separate pipeline for the request execution and handling makes for *much* easier to read generated code. - Fixed the extra space issue with `evaluate_response` call tuple values; `{{=<% %>=}}` changes the tag types, so this change is intentional. - In `config.exs.mustache`, `runtime.exs.mustache`, `mix.exs.mustache`, and `connection.ex.mustache`, use `packageName` instead of `appName` for configuration specification. If `packageName` and `appName` differed, we would end up with cases like ory/sdk#194. - `connection.ex.mustache` has been almost entirely rewritten. The changes started in order to eliminate a `@doc` compile-time warning, but shifted to remove the old way of building Tesla client structs with `use Tesla`. It works, but is no longer the recommended way of building Tesla clients. - The *recommended* way of building a Tesla Client would now be `Tesla.client(Connection.middleware(), Connection.adapter())`. - Exposed both `Connection.adapter/0` and `Connection.middleware/1` for use. `Connection.middleware/1` has special handling for the cases where OAuth2 or HTTP Basic Auth are defined in the application, but do not currently handle any other auth methods. - `deserializer.ex.mustache` has mostly been reformatted. There are things that I do not like about it (I do not like pipelines with one line), and I have expanded one function capture into an anonymous function for readability. - `request_builder.ex.mustache` has been updated with better function and parameter descriptions and names. Please note that if `request |> method(:delete) |> method(:post)` is supposed to produce a `POST` operation, we will need to change from `Map.put_new/3` to `Map.put/3`. - Reordered `evaluate_response/2` so that it is the function documented, and made `decode/2` and `response_mapping/3` private functions. As far as I can tell, I have *not* changed the functionality. * Address issues found in code review - The example dependency code in the README had dropped the opening brace for the tuple. This has been resolved. - The default formatting of the API pipelines has been adjusted to minimize possible changes from `mix format`. * Update modules/openapi-generator/src/main/resources/elixir/api.mustache Co-authored-by: Michael Ramstein <633688+mrmstn@users.noreply.github.com> * Update modules/openapi-generator/src/main/resources/elixir/connection.ex.mustache Co-authored-by: Michael Ramstein <633688+mrmstn@users.noreply.github.com> * Update modules/openapi-generator/src/main/resources/elixir/connection.ex.mustache Co-authored-by: Michael Ramstein <633688+mrmstn@users.noreply.github.com> * Update templates based on review comments Co-authored-by: Michael Ramstein <633688+mrmstn@users.noreply.github.com> |
||
|
18a07eab37
|
Improved Elixir Code Generation (#12751)
* Bump the minimum version of Elixir supported The previous minimum version of Elixir is several years EOL. The current minimum version of Elixir is also EOL, but is the minimum version required to support some upcoming changes to the config templates. * Bump the minimum version fo Tesla Keep the dependencies up to date * Add a default .formatter.exs * Add two Elixir-specific mustache lambdas - The `atom` lambda results in the proper quoting of an atom depending on the safe contents of the atom text, per the Elixir language specification. That is, `{{#atom}}foo{{/atom}}` will be turned into `:foo` and `{{#atom}foo.bar{{/atom}}` will be turned into `:"foo.bar"`. - The `env_var` lambda results in the treatment of the identifier provided being capitalized as an environment variable would be. `{{#env_var}}apiVersion{{/env_var}}` would become `ENV_VAR`. * Use modern Elixir configuration - This includes runtime configuration - It depends on the `env_var` lambda. * Fix a Language Server Warning This change is *optional*, but removes a LS warning that was raised. * Regenerated openapi_petstore for Elixir * Add ex_doc as a default dependency Fixes #12484 * Refine the regular expression for atoms The original regex incorrectly matched `123Number` (unquoted atoms cannot begin with numbers) and would incorrectly quote atoms ending in `?` or `!`. Through testing with `iex`, it also turns out that the atom `:-` is legal. The following atoms will now not be quoted that would have been incorrectly quoted: - `:-` - `:declawed?` - `:neutered!` The following atoms will be quoted that were incorrectly unquoted: - `:"123Number"` * Improve regex (again), remove files not generated - The previous commit resulted in a number of warnings that were still present and so I played with the regular expression. This did not solve the problem, but the resulting regular expression is *much* better than the previous one, so I'm keeping it. - The problem was that the configuration (`bin/configs/elixir.yaml`) is generated using a 3.0 input spec: ```yaml inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml ``` Which means that there were 16 files committed which were no longer being generated. When I tested with the 2.0 input spec: ```yaml inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml ``` The files were generated again. I *believe* that the correct change here is to switch back to the 2.0 input spec, as it tests more code generation, but I wanted to check in before I did this. The following files are deleted: - `elixir/lib/openapi_petstore/model/additional_properties_any_type.ex` - `elixir/lib/openapi_petstore/model/additional_properties_array.ex` - `elixir/lib/openapi_petstore/model/additional_properties_boolean.ex` - `elixir/lib/openapi_petstore/model/additional_properties_integer.ex` - `elixir/lib/openapi_petstore/model/additional_properties_number.ex` - `elixir/lib/openapi_petstore/model/additional_properties_object.ex` - `elixir/lib/openapi_petstore/model/additional_properties_string.ex` - `elixir/lib/openapi_petstore/model/big_cat.ex` - `elixir/lib/openapi_petstore/model/big_cat_all_of.ex` - `elixir/lib/openapi_petstore/model/inline_response_default.ex` - `elixir/lib/openapi_petstore/model/special_model_name.ex` - `elixir/lib/openapi_petstore/model/type_holder_default.ex` - `elixir/lib/openapi_petstore/model/type_holder_example.ex` - `elixir/lib/openapi_petstore/model/xml_item.ex` - `elixir/pom.xml` - `elixir/test/pet_test.exs` In the interim, I have removed those files from the commit. |