JSONの$refを見て1つのファイルにまとめるコマンドを部分的に使えるようにした。

github.com

JSON$refを見て1つのファイルにまとめるコマンドを部分的に使えるようにした。OpenAPI documentなどを書くときに使う。

いままでは全部をまとめた形でしか使えなかった。

# いままで
$ jsonknife bundle --src main.yaml
$ jsonknife bundle --src team.yaml

# これから
$ jsonknife bundle --src main.yaml
$ jsonknife bundle --src "main.yaml#/definitions/person"
$ jsonknife bundle --src "main.yaml#/definitions/team"
$ jsonknife bundle --src "person.yaml" --ref "#/definitions/people"

詳細

例えば以下の様なファイルがあり。

$ tree
.
├── main.yaml
├── person.yaml
└── team.yaml

0 directories, 3 files

ファイルの内容が以下の様な場合

main.yaml

definitions:
  person:
    $ref: "person.yaml#/definitions/person"
  team:
    $ref: "team.yaml#/definitions/team"

person.yaml

definitions:
  person:
    type: object
    properties:
      name:
        type: string
      age:
        type: int
  people:
    type: array
    items:
      $ref: "#/definitions/person"

team.yaml

definitions:
  team:
    type: object
    properties:
      name:
        type: string
      members:
        type: array
        items:
          $ref: "person.yaml#/definitions/person"

main.yamlのdefinitionsから一部だけを取り出せるようになった。

$ jsonknife bundle --src "main.yaml#/definitions/person"
definitions:
  person:
    type: object
    properties:
      name:
        type: string
      age:
        type: int

依存しているものがあれば再帰的に取り出される(例が単純すぎて分かりづらいかもだけれど)

$ jsonknife bundle --src "main.yaml#/definitions/team"
definitions:
  team:
    type: object
    properties:
      name:
        type: string
      members:
        type: array
        items:
          $ref: '#/definitions/person'
  person:
    type: object
    properties:
      name:
        type: string
      age:
        type: int

このとき余分なものは取り出されない(e.g. peron.yamlのpeople)。

--ref オプションで指定しても良い。

$ jsonknife bundle --src "person.yaml" --ref "#/definitions/people"
definitions:
  people:
    type: array
    items:
      $ref: '#/definitions/person'
  person:
    type: object
    properties:
      name:
        type: string
      age:
        type: int

まだpypiに対応したバージョンは上げていない。