Open6

巨大な OpenAPI の YAML ファイルを修正したときの備忘録

mpywmpyw

全てのスキーマに required を付与

すべて誤って省略可能として宣言されてしまっていたときに一括で修正

yq -y '.components.schemas[] |= (
  . as $schema
  | $schema.required
  |= ($schema.properties | keys)
)'
mpywmpyw

required 部分以外の余分な差分を除外して add

YAML のフォーマッティングも入ってしまうので,そういうものは除外して git add する

# check that the regex search correctly matches the changes you want.
git diff -U0 | grepdiff 'required:' --output-matching=hunk  

# then apply the changes to the index
git diff -U0 | grepdiff 'required:' --output-matching=hunk | git apply --cached --unidiff-zero 
mpywmpyw

但し,すでに required: が書かれてしまっているときは捉えきれない hunk が存在してしまう。少々工夫が必要

最初に yq で del(.components.schemas[].required) をかけてコミットしてしまっておくのが得策か?

yq -y 'del(.components.schemas[].required)'

これの後

git diff -U0 | grepdiff 'required:' --output-matching=hunk | git apply --cached --unidiff-zero 

で出た差分を1回コミットしておく。残った差分をクリアしてから本題に着手

mpywmpyw

nullable が一切使われておらず,

required になっていないものが nullable

という書き方がされた YAML ファイルだった。しかし requirednullable は異なる概念であるため,正しい仕様に直すためには

required に列挙されていないものを全て nullable にした後,全フィールドを required にする」

というステップが必要になることが判明

mpywmpyw

required に列挙されていないものを全て nullable にする

但し $ref を持っているものは除外

 yq -y '.components.schemas[] |= (
  . as $schema
  | $schema.properties
  |= (
    to_entries
    | map(
      .key as $key
      | if
          ($schema.required//[]|any(. == $key)) or (.value | has("$ref"))
        then
          .
        else
          .value.nullable |= true
        end
    )
    | from_entries
  )
)'
mpywmpyw
  1. required に列挙されていないものを全て nullable にする
  2. 全てのスキーマに required を付与

の順に実行して目的は達成できた。 git add するときに欲しい差分だけをフィルタリングするのが結構面倒だけど,ここも半自動化できてよかった