Open6
巨大な OpenAPI の YAML ファイルを修正したときの備忘録
required
を付与
全てのスキーマに すべて誤って省略可能として宣言されてしまっていたときに一括で修正
yq -y '.components.schemas[] |= (
. as $schema
| $schema.required
|= ($schema.properties | keys)
)'
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
但し,すでに 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回コミットしておく。残った差分をクリアしてから本題に着手
nullable
が一切使われておらず,
「required
になっていないものが nullable
」
という書き方がされた YAML ファイルだった。しかし required
と nullable
は異なる概念であるため,正しい仕様に直すためには
「required
に列挙されていないものを全て nullable
にした後,全フィールドを required
にする」
というステップが必要になることが判明
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
)
)'
-
required
に列挙されていないものを全てnullable
にする - 全てのスキーマに
required
を付与
の順に実行して目的は達成できた。 git add
するときに欲しい差分だけをフィルタリングするのが結構面倒だけど,ここも半自動化できてよかった