JSON Hyper-SchemaからOpenAPI3に変換するスクリプトを作った

JSON Hyper-SchemaからOpenAPI3に変換するスクリプトを作りました。 一旦はOpenAPI3でエラーのない状態に変換できます

残念ながらこの2つの仕様には完全な互換性はありません。 そのため、手元のJSON Hyper-Schemaデータに特化したいくつかの前提条件をおいています。 他の環境下ではこの前提条件が崩れる可能性があり、その場合はうまく変換できないのでご留意ください。

なお、現状ではまだ変換したファイルを使い込んでいないため、今後よりきちんと変換機能を作り込んでいく可能性はあります。

Objectに関する制約事項

Path Item Objectへの自動変換

JSON Hyper-SchemaにはOpenAPI3のPath Item Objectは存在しません。 そのため、Hyper-Schemaのobjectがhref属性を持つならば、それをPath Item Objectに対応するものとして変換します。 また、それ以外に関してはすべてSchema Objectとみなし、comonents/schemas以下に配置します。 なお、このときのリファレンス名はHyper-Schemaのidとプロパティ名から自動で生成します。

Nullableの自動付与

以下のように、Hyper-SchemaではanyOfを利用してnullableを表現できます。

"cursor": {
  "anyOf": [
    {
      "$ref": "#/definitions/v1_posts/definitions/cursor_id"
    },
    {
      "type": "null"
    }
  ]
},

OpenAPI3ではObjectにnullableを設定するようになったため、この表現はできません。 そのため、変換時にanyOfの他のObjectに対してnullableを付与して回避しています。 ただし、複数のところからreferenceされており、かつ場所によってnull/非nullになる場合、強制的にすべてnullableになりますのでご注意ください。

"non_null_cursor": {
  "$ref": "#/definitions/v1_posts/definitions/cursor_id"
},
"cursor": {
  "anyOf": [
    {
      "$ref": "#/definitions/v1_posts/definitions/cursor_id"
    },
    {
      "type": "null"
    }
  ]
}

このような場合、上では非null、下ではnullableですが変換すると対象のオブジェクトにnullable属性が付与されるため、どちらもnullableになります。

anyOf以外は未サポート

allOfとかは使ってなかったのでサポートしていません。

Path Item Objectに関する制約

同じhref属性を持つものは存在しない

JSON Hyper-Schemaは自由に定義を書けるため同じhrefに対して二重に定義できてしまいますが、OpenAPI3では定義できるhrefは一つのみになります。 そのため、複数あった場合はエラーにしています。

レスポンスはapplication/jsonのみ

です

レスポンスボディは常にある

href属性を持ち、かつtargetSchemaがない場合にエラーになります。 この場合は、空っぽのobjecを追加してください

パスパラメータを別途用意する

OpenAPI3ではパスパラメータの定義をしっかりと書かないといけませんが、JSON Hyper-Schemaでは書かなくても問題ありません。 そのため、パスパラメータの情報が足りず、どうやっても変換できないため、以下のother_data.ymlにパスとパラメータの情報を追加する必要があります。

私の手元にあるファイルでは一応エラーのないOpenAPI3形式に変換はできました。
ただし、これを活用できるようにまだ整えられていないため、今後もう少し改良が入る可能性はあります。