swagger-api / swagger-api/swagger-codegen

[PYTHON] Cannot build client with custom README.mustache template

Open
#10,998 0 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Mustache
Stars
17.8k
Forks
6k
PR merge metrics
No merged PRs in 30d

Description

Description

Python client is not being built when using default README.mustache as a custom template.

Swagger-codegen version

3.0.25

Swagger declaration file content or url

https://github.com/OAI/OpenAPI-Specification/blob/main/examples/v3.0/petstore.yaml

Command line used for generation
java -jar swagger-codegen-cli.jar generate -i petstore.yaml -l python --template-dir /tmp/custom_tpl  -o /tmp/client
Steps to reproduce

When running without -t --template-dir switch it works as expected.
When I simply copy swagger-codegen/modules/swagger-codegen/src/main/resources/python/README.mustache file into a folder and provide it using -t it throws an exception

cp ~/Code/swagger-codegen/modules/swagger-codegen/src/main/resources/python/README.mustache /tmp/custom_tpl
java -jar swagger-codegen-cli.jar generate -i petstore.yaml -l python --template-dir /tmp/custom_tpl  -o /tmp/client

Exception in thread "Thread-0" java.lang.RuntimeException: Could not generate supporting file 'SupportingFile:
    templateFile: README.mustache
    folder:
    destinationFilename: README.md
'
    at io.swagger.codegen.v3.DefaultGenerator.generateSupportingFiles(DefaultGenerator.java:663)
    at io.swagger.codegen.v3.DefaultGenerator.generate(DefaultGenerator.java:786)
    at io.swagger.codegen.v3.cli.cmd.Generate.run(Generate.java:378)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: com.github.jknack.handlebars.HandlebarsException: /tmp/custom_tpl/README.mustache:61:24: found: '-first', expected: 'id'
{{#apiInfo}}{{#apis}}{{#-first}}{{#operations}}{{#operation}}{{#-first}}{{#hasAuthMethods}}{{#authMethods}}{{#isBasic}}
                        ^
    at com.github.jknack.handlebars.internal.HbsErrorReporter.syntaxError(HbsErrorReporter.java:93)
    at com.github.jknack.handlebars.internal.antlr.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
    at com.github.jknack.handlebars.internal.antlr.Parser.notifyErrorListeners(Parser.java:544)
    at com.github.jknack.handlebars.internal.HbsErrorStrategy.reportInputMismatch(HbsErrorStrategy.java:186)
    at com.github.jknack.handlebars.internal.antlr.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:139)
    at com.github.jknack.handlebars.internal.HbsParser.sexpr(HbsParser.java:922)
    at com.github.jknack.handlebars.internal.HbsParser.block(HbsParser.java:659)
    at com.github.jknack.handlebars.internal.HbsParser.statement(HbsParser.java:337)
    at com.github.jknack.handlebars.internal.HbsParser.body(HbsParser.java:222)
    at com.github.jknack.handlebars.internal.HbsParser.block(HbsParser.java:673)
    at com.github.jknack.handlebars.internal.HbsParser.statement(HbsParser.java:337)
    at com.github.jknack.handlebars.internal.HbsParser.body(HbsParser.java:222)
    at com.github.jknack.handlebars.internal.HbsParser.block(HbsParser.java:673)
    at com.github.jknack.handlebars.internal.HbsParser.statement(HbsParser.java:337)
    at com.github.jknack.handlebars.internal.HbsParser.body(HbsParser.java:222)
    at com.github.jknack.handlebars.internal.HbsParser.template(HbsParser.java:165)
    at com.github.jknack.handlebars.internal.HbsParserFactory$1.parse(HbsParserFactory.java:86)
    at com.github.jknack.handlebars.cache.NullTemplateCache.get(NullTemplateCache.java:54)
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:513)
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:438)
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:419)
    at io.swagger.codegen.v3.templates.HandlebarTemplateEngine.getHandlebars(HandlebarTemplateEngine.java:52)
    at io.swagger.codegen.v3.templates.HandlebarTemplateEngine.getRendered(HandlebarTemplateEngine.java:25)
    at io.swagger.codegen.v3.DefaultGenerator.generateSupportingFiles(DefaultGenerator.java:634)

It's worth noticing that the exception comes from handlebars generator, not mustache.
When I explicitly set the template engine to mustache, a different exception is being thrown:

java -jar swagger-codegen-cli.jar generate -i petstore.yaml -l python --template-engine 'mustache' --template-dir /tmp/custom_tpl  -o /tmp/

Exception in thread "Thread-0" java.lang.RuntimeException: Could not generate model 'Error'
    at io.swagger.codegen.v3.DefaultGenerator.generateModels(DefaultGenerator.java:451)
    at io.swagger.codegen.v3.DefaultGenerator.generate(DefaultGenerator.java:779)
    at io.swagger.codegen.v3.cli.cmd.Generate.run(Generate.java:378)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: com.samskivert.mustache.MustacheParseException: Section close tag with mismatched open tag 'each' != 'each discriminator.mapping' @ line 62
    at com.samskivert.mustache.Mustache$Accumulator.requireSameName(Mustache.java:671)
    at com.samskivert.mustache.Mustache$Accumulator$1.addCloseSectionSegment(Mustache.java:603)
    at com.samskivert.mustache.Mustache$Accumulator.addTagSegment(Mustache.java:629)
    at com.samskivert.mustache.Mustache$Parser.parseChar(Mustache.java:498)
    at com.samskivert.mustache.Mustache$Parser.parse(Mustache.java:396)
    at com.samskivert.mustache.Mustache.compile(Mustache.java:314)
    at com.samskivert.mustache.Mustache$Compiler.compile(Mustache.java:87)
    at com.samskivert.mustache.Mustache$Compiler.compile(Mustache.java:82)
    at io.swagger.codegen.v3.templates.MustacheTemplateEngine.getRendered(MustacheTemplateEngine.java:43)
    at io.swagger.codegen.v3.DefaultGenerator.processTemplateToFile(DefaultGenerator.java:795)
    at io.swagger.codegen.v3.DefaultGenerator.generateModels(DefaultGenerator.java:438)

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

Reproduce the report with petstore.yaml, the Python generator, and the copied README.mustache template, then inspect DefaultGenerator and the HandlebarTemplateEngine and MustacheTemplateEngine paths shown in the stack traces. Done means a custom copy of the Python README.mustache generates the client successfully with the reported command and template engine behavior is consistent.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, python
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.