- A Concurrent Affair - https://www.concurrentaffair.org -

swagger-codegen 2.3.0 Breaks Inheritance?

For a hack day at work, I’ve been trying to integrate our code generator into the online Swagger editor and generator [1]. Of course, I’ve been trying to use the latest version, which appears to be 2.3.0-SNAPSHOT [2] (although I just saw there’s also a 3.0.0 branch).

Unfortunately, it seems like inheritance (which is kind of a big deal for actual software systems) is fundamentally broken in 2.3.0.

Here’s my sample spec in YAML:


swagger: "2.0"
info:
description: "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters."
version: "1.0.0"
title: "Swagger Petstore"
termsOfService: "http://swagger.io/terms/"
contact:
email: "apiteam@swagger.io"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
host: "petstore.swagger.io"
basePath: "/v2"
tags:
- name: "pet"
description: "Everything about your Pets"
externalDocs:
description: "Find out more"
url: "http://swagger.io"
- name: "store"
description: "Access to Petstore orders"
- name: "user"
description: "Operations about user"
externalDocs:
description: "Find out more about our store"
url: "http://swagger.io"
schemes:
- "http"
paths:
/pet/:
get:
tags:
- "pet"
summary: "Find pet by ID"
description: "Returns a single pet"
operationId: "getPet"
produces:
- "application/xml"
- "application/json"
responses:
200:
description: "successful operation"
schema:
$ref: "#/definitions/Pet"
400:
description: "Invalid ID supplied"
404:
description: "Pet not found"
definitions:
Pet:
discriminator: petType
required:
- name
- petType # required for inheritance to work
properties:
name:
type: string
petType:
type: string
Cat:
allOf:
- $ref: '#/definitions/Pet' # Cat has all properties of a Pet
- properties: # extra properties only for cats
huntingSkill:
type: string
default: lazy
enum:
- lazy
- aggressive
Dog:
allOf:
- $ref: '#/definitions/Pet' # Dog has all properties of a Pet
- properties: # extra properties only for dogs
packSize:
description: The size of the pack the dog is from
type: integer

Cat and Dog extend Pet. Very simple.

The older swagger editor, which reports a version number of 2.10.4 for the swagger-api/swagger-editor GitHub project [3], understands this and generates the expected code:

swagger-editor 2.10.4 models [4]

swagger-editor 2.10.4 models

public class Cat extends Pet {
...

The latest editor [1], unfortunately, does not!

Broken Swagger Editor 2.3.0 models [5]

Broken Swagger Editor 2.3.0 models

public class Cat {

You gotta be kidding, right?

[6] [7]Share [8]