guokr / swagger-py-codegen

a Python web framework generator supports Flask, Tornado, Falcon, Sanic
554 stars 154 forks source link

Nested self reference to a definition, results in circular dependency error #117

Open abatilo opened 6 years ago

abatilo commented 6 years ago

The YAML in question

  Person:
    required:
      - name
      - children
    properties:
      name:
        type: string
      children:
        type: array
        items:
          $ref: '#/definitions/Person'

I believe my issue is similar to https://github.com/guokr/swagger-py-codegen/issues/62

Trying to generate code from a model definition such as above will result in the following error:

ValueError: $ref circular references found!

Full yaml:

swagger: '2.0'
info:
  version: 1.0.0
  title: Swagger Petstore
  license:
    name: MIT
host: petstore.swagger.io
basePath: "/v1"
schemes:
- http
consumes:
- application/json
produces:
- application/json
paths:
  "/persons":
    get:
      summary: List all persons
      operationId: listPersons
      tags:
      - persons
      responses:
        '200':
          description: An paged array of persons
          schema:
            "$ref": "#/definitions/Person"
        default:
          description: unexpected error
          schema:
            "$ref": "#/definitions/Error"
    post:
      summary: Add a person
      operationId: addPerson
      tags:
      - persons
      parameters:
      - in: body
        name: body
        required: true
        schema:
          "$ref": "#/definitions/Person"
      responses:
        '201':
          description: person was created
          schema:
            "$ref": "#/definitions/Person"
        default:
          description: unexpected error
          schema:
            "$ref": "#/definitions/Error"
definitions:
  Person:
    required:
    - name
    - children
    properties:
      name:
        type: string
      children:
        type: array
        items:
          "$ref": "#/definitions/Person"
  Error:
    required:
    - code
    - message
    properties:
      code:
        type: integer
        format: int32
      message:
        type: string

However, if I run the same yaml through swagger-codegen, valid Python code is generated.