forked from loafle/openapi-generator-original
55 lines
64 KiB
HTML
55 lines
64 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width">
|
|
<meta name="generator" content="Docusaurus">
|
|
<link rel="preconnect" href="https://www.google-analytics.com">
|
|
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-132927057-1","auto"),ga("send","pageview")</script>
|
|
<script async src="https://www.google-analytics.com/analytics.js"></script>
|
|
<link rel="preconnect" href="https://www.google-analytics.com">
|
|
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-132927057-1","auto"),ga("send","pageview")</script>
|
|
<script async src="https://www.google-analytics.com/analytics.js"></script>
|
|
<script src="https://buttons.github.io/buttons.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script>
|
|
<script src="/js/code-block-buttons.js"></script>
|
|
|
|
<title data-react-helmet="true">Create a New Generator</title>
|
|
|
|
<meta data-react-helmet="true" http-equiv="x-ua-compatible" content="ie=edge"><meta data-react-helmet="true" property="og:title" content="OpenAPI Generator · Generate clients, servers, and documentation from OpenAPI 2.0/3.x documents"><meta data-react-helmet="true" property="og:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-react-helmet="true" property="twitter:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-react-helmet="true" name="twitter:image:alt" content="Image for OpenAPI Generator · Generate clients, servers, and documentation from OpenAPI 2.0/3.x documents"><meta data-react-helmet="true" name="twitter:card" content="summary"><meta data-react-helmet="true" name="description" content="Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We've created a helper script to bootstrap the operation. Let's look at the files necessary to create a new generator, then an example of bootstrapping a generator using the `new.sh` script in the root of the repository."><meta data-react-helmet="true" property="og:description" content="Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We've created a helper script to bootstrap the operation. Let's look at the files necessary to create a new generator, then an example of bootstrapping a generator using the `new.sh` script in the root of the repository."><meta data-react-helmet="true" property="og:url" content="https://openapi-generator.tech/docs/new-generator">
|
|
|
|
<link data-react-helmet="true" rel="shortcut icon" href="/img/favicon.png">
|
|
|
|
|
|
<link rel="stylesheet" href="/styles.62ba095c.css">
|
|
|
|
</head>
|
|
<body>
|
|
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}function e(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}var n=window.matchMedia("(prefers-color-scheme: dark)");n.addListener((function(n){null===e()&&t(n.matches?"dark":"")}));var a=e();null!==a?t(a):n.matches&&t("dark")}()</script>
|
|
<div id="__docusaurus">
|
|
<nav class="navbar navbar--light navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></div><a aria-current="page" class="navbar__brand active" href="/"><img class="navbar__logo" src="/img/mono-logo.svg" alt="OpenAPI Tools logo"><strong>OpenAPI Generator</strong></a><a class="navbar__item navbar__link" href="/docs/installation">Getting Started</a><a class="navbar__item navbar__link" href="/docs/generators">Generators</a><a class="navbar__item navbar__link" href="/docs/roadmap">Roadmap</a><a class="navbar__item navbar__link" href="/docs/faq">FAQ</a><a class="navbar__item navbar__link" href="/team">Team</a><a class="navbar__item navbar__link" href="/blog">Blog</a><a class="navbar__item navbar__link" activeclassname="navbar__link--active" to="https://api.openapi-generator.tech" href="https://api.openapi-generator.tech">API</a></div><div class="navbar__items navbar__items--right"><div class="react-toggle react-toggle--disabled displayOnlyInLargeViewport_1gtM"><div class="react-toggle-track"><div class="react-toggle-track-check"><span class="toggle_keGJ moon_1gwN"></span></div><div class="react-toggle-track-x"><span class="toggle_keGJ sun_3CPA"></span></div></div><div class="react-toggle-thumb"></div><input type="checkbox" disabled="" aria-label="Dark mode toggle" class="react-toggle-screenreader-only"></div><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input type="search" id="search_input_react" placeholder="Search" aria-label="Search" class="navbar__search-input search-bar"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div><div class="navbar-sidebar"><div class="navbar-sidebar__brand"><a aria-current="page" class="navbar__brand active" href="/"><img class="navbar__logo" src="/img/mono-logo.svg" alt="OpenAPI Tools logo"><strong>OpenAPI Generator</strong></a></div><div class="navbar-sidebar__items"><div class="menu"><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/installation">Getting Started</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/generators">Generators</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/roadmap">Roadmap</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/faq">FAQ</a></li><li class="menu__list-item"><a class="menu__link" href="/team">Team</a></li><li class="menu__list-item"><a class="menu__link" href="/blog">Blog</a></li><li class="menu__list-item"><a class="menu__link" activeclassname="navbar__link--active" to="https://api.openapi-generator.tech" href="https://api.openapi-generator.tech">API</a></li></ul></div></div></div></nav><div class="main-wrapper"><div class="docPage_1kjD"><div class="docSidebarContainer_1cYp"><div class="sidebar_1kLs"><div class="menu menu--responsive"><button aria-label="Open Menu" class="button button--secondary button--sm menu__button" type="button"><svg class="sidebarMenuIcon_2vk4" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 32 32" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><ul class="menu__list"><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Getting Started</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/installation">CLI Installation</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/plugins">Plugins</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/online">Online</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/usage">Usage</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/globals">Global Properties</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/configuration">Configuration Options</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/file-post-processing">File post-processing</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Extending</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/templating">Using Templates</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/customization">Customization</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/debugging">Debugging</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/integrations">Workflow Integrations</a></li></ul></li><li class="menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#!">Contributing</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/contributing">Guidelines</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/code-of-conduct">Code of Conduct</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/contribute-building">Building the code</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link menu__link--active" href="/docs/new-generator">Create a New Generator</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">About</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/roadmap">Roadmap</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/swagger-codegen-migration">Migrating from Swagger Codegen</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/fork-qna">Swagger Codegen Fork: Q&A</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Releases</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/release-summary">Release Summary</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/release-3-0-0">Release Notes: 3.0.0</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">API</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/generators">Generators List</a></li></ul></li></ul></div></div></div><main class="docMainContainer_FFX1"><div class="padding-vert--lg"><div class="container"><div class="row"><div class="col"><div class="docItemContainer_2cwg"><article><header><h1 class="docTitle_1vWb">Create a New Generator</h1></header><div class="markdown"><p>Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We've created a helper script to bootstrap the operation. Let's look at the files necessary to create a new generator, then an example of bootstrapping a generator using the <code>new.sh</code> script in the root of the repository.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor" id="required-files"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#required-files" title="Direct link to heading">#</a>Required Files</h2><p>The minimum set of files required to create a new generator are:</p><ul><li>A "Codegen" file<ul><li>exists under <code>modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/</code></li><li>defines language options</li><li>defines framework options</li><li>determines OpenAPI feature set</li><li>extends the generation workflow</li></ul></li><li>SPI registration<ul><li>Above class must be referenced in <code>modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig</code></li><li>Tells the generator that this class exists</li><li>Allows for classpath extension (addition) of generators</li></ul></li><li>A minimal template<ul><li>Should include a README explaining usage</li><li>Must include an <code>api.mustache</code></li><li>Exists under <code>modules/openapi-generator/src/main/resources/</code> (plus <code>embeddedTemplate</code> dir value, see below)</li></ul></li><li>Config file under <code>./bin/configs</code><ul><li>Gives users a "real life" example of generated output</li><li>Samples are used by CI to verify generators and test for regressions in some cases</li></ul></li></ul><p>Now, let's generate an example generator and then walk through the pieces. At the end, we'll touch on some known sticking points for new generator authors and provide some suggestions.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor" id="newsh"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#newsh" title="Direct link to heading">#</a>new.sh</h2><p>The <code>new.sh</code> script in the root of the project is meant to simplify this process. Run <code>./new.sh --help</code>.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-text codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Stubs out files for new generators</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Usage:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh [options]</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Options:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -n Required. Specify generator name, should be kebab-cased.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -c Create a client generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -s Create a server generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -d Create a documentation generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -H Create a schema generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -f Create a config generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -t When specified, creates test file(s) for the generator.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -h Display help.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Examples:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a server generator for ktor:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n kotlin -s</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/kotlin-server-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a generic C# server generator:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n csharp -s -t</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CsharpServerCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/csharp-server-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenModelTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenOptionsTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/options/CsharpServerCodegenOptionsProvider.java</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This script allows us to define a client, server, schema, or documentation generator. We'll focus on the simplest generator (documentation). The other generator types may require heavy extension of the "Config" base class, and these docs could very quickly become outdated. When creating a new generator, please review existing generators as a guideline for implementation.</p><p>Create a new Markdown generator, specifying CommonMark as the name to avoid conflicting with the built-in Markdown generator.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh -n common-mark -d</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>You should see output similar to the following:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CommonMarkDocumentationCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating bin/configs/common-mark-documentation-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Finished.</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="review-generated-config"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#review-generated-config" title="Direct link to heading">#</a>Review Generated Config</h3><p>Beginning with the "Codegen" file (<code>CommonMarkDocumentationCodegen.java</code>), the constructor was created:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">CommonMarkDocumentationCodegen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">super</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> outputFolder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"generated-code"</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"common-mark"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modelTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"model.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".zz"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> apiTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"api.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".zz"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> embeddedTemplateDir </span><span class="token operator">=</span><span class="token plain"> templateDir </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"common-mark-documentation"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> apiPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apis"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modelPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Models"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> supportingFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">SupportingFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"README.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"README.md"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// TODO: Fill this out.</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>These options are some defaults which may require updating. Let's look line-by-line at the config.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">outputFolder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"generated-code"</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"common-mark"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This is the default output location. This will be <code>generated-code/common-mark</code> on non-Windows machines and <code>generated-code\common-mark</code> on Windows. You may change this to any value you'd like, but a user will almost always provide an output directory.</p><blockquote><p>When joining paths, always use <code>File.seperator</code></p></blockquote><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">modelTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"model.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".zz"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>The <code>model.mustache</code> file is registered as the template for model generation. The <code>new.sh</code> script doesn't have a way to know your intended file extension, so we default to a <code>.zz</code> extension. This <em>must</em> be changed (unless your generator's target extension is <code>.zz</code>). For this example, you'd change <code>.zz</code> to <code>.md</code> or <code>.markdown</code>, depending on your preference.</p><p>This model template registration will use <code>model.mustache</code> to generate a new file for every model defined in your API's specification document.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">apiTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"api.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".zz"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This is the template used for generating API related files. Similar to the above model template, you'll want to change <code>.zz</code> to <code>.md</code> or <code>.markdown</code>.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">embeddedTemplateDir </span><span class="token operator">=</span><span class="token plain"> templateDir </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"common-mark-documentation"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This line sets the embedded and template directories to <code>common-mark-documentation</code>. The <code>embeddedTemplateDir</code> refers to the directory which will exist under <code>modules/openapi-generator/src/main/resources</code> and will be published with every release in which your new generator is present.</p><p>The <code>templateDir</code> variable refers to the "current" template directory setting, as defined by the user. That is, the user may invoke with <code>-t</code> or <code>--template-directory</code> (or plugin option variants), and override this directory.</p><p>Both of these variables exist because the generator will fallback to files under <code>embeddedTemplateDir</code> if they are not defined in the user's custom template directory.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">apiPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apis"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This sets the "package" location for anything considered an API document. You might want to change this setting if, for instance, your language doesn't support uppercase letters in the path. We don't need to worry about that here.</p><p>Every templated output from <code>api.mustache</code> (registered via <code>apiTemplateFiles</code> above) will end up in the directory defined by <code>apiPackage</code> here.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">modelPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Models"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>Similarly, this sets the package for <code>Models</code>.</p><p>Every templated output from <code>model.mustache</code> (registered via <code>modelTemplateFiles</code> above) will end up in the directory defined by <code>modelPackage</code> here.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">supportingFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">SupportingFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"README.mustache"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"README.md"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>A "supporting file" is an extra file which isn't created once for every operation or model defined in your specification document. It is a single file which may or may not be templated (determined by the extension of the filename).</p><p>A supporting file only passes through the Mustache template processor if the filename ends in <code>.mustache</code>.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><blockquote><p>If you want your readme to be generic (not templated), just rename the file to README.md and change <code>README.mustache</code> to <code>README.md</code> above.</p></blockquote><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="create-templates"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#create-templates" title="Direct link to heading">#</a>Create templates</h3><p>The <code>new.sh</code> created our three required files. Let's start filling out each of these files.</p><h4><a aria-hidden="true" tabindex="-1" class="anchor" id="readmemustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#readmemustache" title="Direct link to heading">#</a>README.mustache</h4><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Documentation for {{appName}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateApiDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"><a name="documentation-for-api-endpoints"></a></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for API Endpoints</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{{basePath}}}*</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Class | Method | HTTP request | Description</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**](Apis/{{apiDocPath}}{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{{summary}}}{{/summary}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateApiDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateModelDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"><a name="documentation-for-models"></a></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Models</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}{{#model}} - [{{{modelPackage}}}.{{{classname}}}](Models/{{modelDocPath}}{{{classname}}}.md)</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}{{/models}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">No model defined in this package</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateModelDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"><a name="documentation-for-authorization"></a>{{! TODO: optional documentation for authorization? }}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Authorization</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All endpoints do not require authorization.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Authentication schemes defined for the API:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"><a name="{{name}}"></a></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### {{name}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isApiKey}}- **Type**: API key</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **API key parameter name**: {{keyParamName}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isApiKey}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isBasic}}- **Type**: HTTP basic authentication</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isBasic}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isOAuth}}- **Type**: OAuth</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Flow**: {{flow}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Authorization URL**: {{authorizationUrl}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Scopes**: {{^scopes}}N/A{{/scopes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#scopes}} - {{scope}}: {{description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/scopes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isOAuth}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>Let's not focus too much on the contents of this file. You may refer to <a href="/docs/templating">templating</a> for more details on the variables bound to these files and to <a href="/docs/debugging">debugging</a> how to debug the structures. Of note here is that we're generating structures in markdown as defined by the objects constructed by our new "Config" class.</p><h4><a aria-hidden="true" tabindex="-1" class="anchor" id="apimustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#apimustache" title="Direct link to heading">#</a>api.mustache</h4><p>The API documentation might look like this:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># {{classname}}{{#description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{description}}{{/description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{basePath}}*</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Method | HTTP request | Description</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | -------------</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}{{#operation}}[**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operation}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"><a name="{{operationId}}"></a></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># **{{operationId}}**</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">> {{#returnType}}{{returnType}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{summary}}{{#notes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{notes}}{{/notes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Parameters</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | ------------- | -------------{{/-last}}{{/allParams}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#allParams}} **{{paramName}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isFile}}**{{dataType}}**{{/isFile}}{{^isFile}}{{#generateModelDocs}}[**{{dataType}}**]({{baseType}}.md){{/generateModelDocs}}{{^generateModelDocs}}**{{dataType}}**{{/generateModelDocs}}{{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{#defaultValue}} [default to {{defaultValue}}]{{/defaultValue}}{{#allowableValues}} [enum: {{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}]{{/allowableValues}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/allParams}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Return type</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#returnType}}{{#returnTypeIsPrimitive}}**{{returnType}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{#generateModelDocs}}[**{{returnType}}**]({{returnBaseType}}.md){{/generateModelDocs}}{{^generateModelDocs}}**{{returnType}}**{{/generateModelDocs}}{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}null (empty response body){{/returnType}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Authorization</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### HTTP request headers</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operations}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h4><a aria-hidden="true" tabindex="-1" class="anchor" id="modelmustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#modelmustache" title="Direct link to heading">#</a>model.mustache</h4><p>The models file could resemble the following.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#model}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># {{{packageName}}}.{{modelPackage}}.{{{classname}}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Properties</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parent}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parentVars}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">**{{name}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{dataType}}**]({{complexType}}.md){{/isPrimitiveType}} | {{description}} | {{^required}}[optional] {{/required}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{{.}}}]{{/defaultValue}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parentVars}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parent}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#vars}}**{{name}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{dataType}}**]({{complexType}}.md){{/isPrimitiveType}} | {{description}} | {{^required}}[optional] {{/required}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{{.}}}]{{/defaultValue}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/vars}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/models}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="build-it"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#build-it" title="Direct link to heading">#</a>Build it</h3><p>To compile quickly to test this out, you can run <code>mvn clean package -DskipTests</code>.</p><blockquote><p>When implementing a more robust generator, you'll want to run all tests as well: <code>mvn clean package</code></p></blockquote><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="compile-sample"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#compile-sample" title="Direct link to heading">#</a>Compile Sample</h3><p>The <code>new.sh</code> script created the generation config file <code>bin/configs/common-mark-documentation-petstore-new.yaml</code>:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">generatorName: common-mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">outputDir: samples/documentation/petstore/common/mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">templateDir: modules/openapi-generator/src/main/resources/common-mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">additionalProperties:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> hideGenerationTimestamp: </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This configuration file is passed to the generator's CLI tool during continuous integration builds, and many outputs are compiled and tested as a regression test on every build. Contributors are also asked to run <code>./bin/utils/ensure-up-to-date</code> before opening a pull request to regenerate all samples defined under <code>./bin/configs</code>. This allows maintainers to quickly verify whether changes impact other generators.</p><p>Configuration based examples allow us to test the same samples in each tooling option (CLI, Gradle Plugin, Maven Plugin, etc.). </p><p>You can compile your generator by running:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">./bin/generate-samples.sh bin/configs/common-mark-documentation-petstore-new.yaml</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>This configuration file can be used to demonstrate the default options for generation. A common option in most of these configs is to define the template directory as the generator's directory under <code>resources</code>. This allows template maintainers to modify and test out template changes which don't require recompilation of the entire project. You'd still need to recompile the project in full if you add or modify behaviors to the generator (such as adding a <code>CliOption</code>).</p><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="verify-output"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#verify-output" title="Direct link to heading">#</a>Verify output</h3><p>Creating a new generator will be an iterative task. Once you've generated the sample, you'll want to try it out. For compiled client/server outputs, this would mean running the code or creating a small sample project to consume your artifact just to make sure it works.</p><p>For markdown, you can open in Visual Studio Code or any other editor with a markdown preview. Not all editors support relative links to other markdown documents. To test the output in this guide, install <code>markserv</code>:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> --global markserv</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>Now, you can serve the output directory directly and test your links:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">markserv samples/documentation/petstore/common/markdown</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>That's it! You've created your first generator!</p></div></article><div class="margin-vert--xl"><div class="row"><div class="col"><a href="https://github.com/OpenAPITools/openapi-generator/edit/master/website/../docs/new-generator.md" target="_blank" rel="noreferrer noopener"><svg fill="currentColor" height="1.2em" width="1.2em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 40 40" style="margin-right:0.3em;vertical-align:sub"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col text--right"><em><small>Last updated on <time datetime="2021-02-23T16:31:43.000Z" class="docLastUpdatedAt_1sqk">2/23/2021</time> by <strong>William Cheng</strong></small></em></div></div></div><div class="margin-vert--lg"><nav class="pagination-nav"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/docs/contribute-building"><h5 class="pagination-nav__link--sublabel">Previous</h5><h4 class="pagination-nav__link--label">« Building the code</h4></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/docs/roadmap"><h5 class="pagination-nav__link--sublabel">Next</h5><h4 class="pagination-nav__link--label">Roadmap »</h4></a></div></nav></div></div></div><div class="col col--3"><div class="tableOfContents_TbNY"><ul class="contents contents__left-border"><li><a href="#required-files" class="contents__link">Required Files</a></li><li><a href="#newsh" class="contents__link">new.sh</a><ul><li><a href="#review-generated-config" class="contents__link">Review Generated Config</a></li><li><a href="#create-templates" class="contents__link">Create templates</a></li><li><a href="#build-it" class="contents__link">Build it</a></li><li><a href="#compile-sample" class="contents__link">Compile Sample</a></li><li><a href="#verify-output" class="contents__link">Verify output</a></li></ul></li></ul></div></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container"><div class="row footer__links"><div class="col footer__col"><h4 class="footer__title">Docs</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/docs/customization">Customizing Generators</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/installation">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/integrations">Workflow Integrations</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">Community</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/users">User Showcase</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/openapi-generator">Stack Overflow</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM">Chat Room</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://twitter.com/oas_generator">Twitter</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">More</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://github.com/OpenAPITools/openapi-generator">GitHub</a></li></ul></div></div><div class="text--center"><div class="margin-bottom--sm"><a href="https://openapi-generator.tech/" target="_blank" rel="noopener noreferrer" class="footerLogoLink_1Wg7"><img class="footer__logo" alt="OpenAPI Tools" src="/img/mono-logo.svg"></a></div>Copyright © 2021 OpenAPI-Generator Contributors (https://openapi-generator.tech)</div></div></footer>
|
|
</div>
|
|
|
|
<script src="/styles.376d7561.js"></script>
|
|
|
|
<script src="/runtime~main.b6330a72.js"></script>
|
|
|
|
<script src="/main.e67007e6.js"></script>
|
|
|
|
<script src="/1.e3f0ae73.js"></script>
|
|
|
|
<script src="/2.2314cd3c.js"></script>
|
|
|
|
<script src="/3.07edd713.js"></script>
|
|
|
|
<script src="/1be78505.1826e09b.js"></script>
|
|
|
|
<script src="/20ac7829.73c16132.js"></script>
|
|
|
|
<script src="/17896441.e7e6966c.js"></script>
|
|
|
|
<script src="/10211c0a.4008a6c1.js"></script>
|
|
|
|
|
|
</body>
|
|
</html> |