OpenAPITools / OpenAPITools/openapi-diff

[bug] [polymorphism] Changes in child schema are ignored when only parent schema is directly referenced

オープン
#571 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
Java
スター
1.1k
フォーク
190
PR マージ指標
30日以内にマージされた PR はありません

説明

When using AllOf for polymorphism, when a property references a parent schema using ref and a change is done to a child schema which is not referenced directly anywhere in the OAS file, changes done to child schema are ignored in the differ output.

Example schema:

openapi: 3.0.0
servers:
  - url: 'http://petstore.swagger.io/v2'
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'
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'
paths:
  /pet/findByStatus:
    get:
      tags:
        - pet
      summary: Finds Pets by status
      description: Multiple status values can be provided with comma separated strings
      operationId: findPetsByStatus
      parameters:
        - name: status
          in: query
          description: Status values that need to be considered for filter
          required: true
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - available
                - pending
                - sold
              default: available
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                type: object
                properties:
                  pets:
                    type: array
                    items:
                      $ref: '#/components/schemas/Pet'
        '400':
          description: Invalid status value
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'
components:
  requestBodies:
    Pet:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Pet'
      description: Pet object that needs to be added to the store
      required: true
  securitySchemes:
    petstore_auth:
      type: oauth2
      flows:
        implicit:
          authorizationUrl: 'http://petstore.swagger.io/oauth/dialog'
          scopes:
            'write:pets': modify pets in your account
            'read:pets': read your pets
    api_key:
      type: apiKey
      name: api_key
      in: header
  schemas:
    BasePet:
      type: object
      properties:
        pet_color:
          type: string
    Pet:
      allOf:
      - $ref: '#/components/schemas/BasePet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Dog'
          cat: '#/components/schemas/Cat'
      required:
      - pet_type
      properties:
        pet_type:
          nullable: false
          allOf:
          - type: string
    Cat:
      description: Cat class
      allOf:
      - $ref: '#/components/schemas/Pet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Cat'
      properties:
        name:
          type: string
        toy:
          $ref: '#/components/schemas/Toy'
    Dog:
      description: Dog class
      allOf:
      - $ref: '#/components/schemas/Pet'
      type: object
      discriminator:
        propertyName: pet_type
        mapping:
          dog: '#/components/schemas/Cat'
      properties:
        bark:
          type: string
    Toy:
      description: Toy class
      type: object
      discriminator:
        propertyName: toy_type
        mapping:
          ball: '#/components/schemas/Ball'
      properties:
        toy_type:
          type: string
        price:
          type: number
    Ball:
      description: Ball class
      allOf:
        - $ref: '#/components/schemas/Toy'
        - type: object
          properties:
            size:
              type: string
      discriminator:
        propertyName: toy_type
        mapping:
          ball: '#/components/schemas/Ball'

If I add new property material to Ball, I would expect to see changes in GET /pet/findByStatus operation, while the actual situation is, that the changes are ignored.

Tested with 2.1.0-SNAPSHOT.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、提供された OpenAPI ドキュメントで報告されたケースを再現し、Ball.material を追加した後の differ の出力を比較します。GET /pet/findByStatus の参照がどのようにポリモーフィックなスキーマに到達するかを追跡し、間接的に参照される子スキーマの変更が含まれることを確認します。出力が Ball の変更を報告し、このシナリオを対象とする回帰テストがあることをもって完了とします。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java, openapi
領域
api
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。