OpenAPITools / OpenAPITools/openapi-generator

[BUG] x-enum-varnames is underspecified

Open
#3,246 3 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Client: Java Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Description

Support for the x-enum-varnames extension was added in #917 to support specifying variable names for enumeration values (e.g. for numeric values, as in https://github.com/OpenAPITools/openapi-generator/issues/893#issuecomment-416617460). The documentation from #2010 suggests that the names will undergo language-specific normalization (as enum values would), but they do not, which can result in broken code.

openapi-generator version

The issue has been present since #917 was merged. Tested on master.

OpenAPI declaration file content or url
openapi: '3.0.2'
info:
  title: x-enum-varnames example
  version: '1.0.0'
components:
  schemas:
    WeatherType:
      type: integer
      enum:
      - 0
      - 1
      - 2
      x-enum-varnames:
      - Sunny
      - Partly Cloudy
      - Rainy
paths:
  /weather:
    get:
      responses:
        default:
          description: Current weather
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WeatherType'
Command line used for generation

openapi-generator-cli.jar generate -i openapi.yaml -g java -o bad-x-enum-varnames-java

Steps to reproduce
  1. Run the above command.
  2. Try to compile the generated code, which will fail due to Partly Cloudy being an invalid variable name.
Suggest a fix

The appropriate fix depends on the desired semantics of x-enum-varnames:

  1. If x-enum-varnames should be a natural language name, then the values should be converted to identifiers in the same way as enum values (as suggested in the documentation), which would fix the above example.
  2. If x-enum-varnames must be a valid identifier (in every language which can be generated) then the documentation should be updated to clarify that. (Ideally the code generation would also fail more gracefully.)

A problem with the first option is that it prevents an existing use case of overriding the generator convention, as described in https://github.com/swagger-api/swagger-codegen/issues/7466#issuecomment-483602884, and could change the generated API by changing the generated names (depending on how identifier normalization is done).

A problem with the second option is that different languages have different casing conventions for enumeration values and there's no way to satisfy them all. Should the spec use PARTLY_CLOUDY, PartlyCloudy, or partlyCloudy for x-enum-varnames? Any choice will be unconventional in several languages. Also, different languages have different rules for valid identifiers and requiring spec authors to comply with all of them is burdensome.

Thanks for considering,
Kevin

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Read the x-enum-varnames support introduced by #917 and the documentation referenced from #2010; reproduce the issue with the supplied YAML and Java generation command. Compare the generated WeatherType enum with the existing enum-value normalization. Done requires an agreed semantic choice, corresponding behavior or documentation, and compilable generated output.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, openapi
Domain
api, tooling
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.