日本語

開発者ツール · 構文コンバーター

ノルウェーの問題: YAML 1.1 対 1.2 と NO が false になる理由

· 背景

yaml データ形式 デバッグ

従来のブール パスが取り消し線で囲まれている間、テキスト NO は文字列のままです
オリジナル ToolAcre ベクトル イラスト

YAML 1.1 では、引用符で囲まれていない値 NO はブール値です。これにより、ノルウェーが国のリストから消えます。この投稿では、YAML の暗黙的型付けの歴史、1.2 仕様の変更点、および今日のツールで問題が解決しない理由について説明します。

1 つが欠落している国のリスト — NO は false として解析され、オスロ オフィスからのバグ レポート

典型的なバグは、引用符で囲まれていない国コード `NO` が false になることです。 ToolAcre のテストでは、ここではそのようなことが起こらないことが証明されています。どちらのスキーマ オプションも、`NO`、yes、no、on、off を文字列として保持します。ノルウェーがこのパネル内に消えることでストーリーが始まると、実装と矛盾します。

この例は、互換性の警告として役立ちます。別の YAML コンシューマーがレガシー ルールを使用する場合、ToolAcre のライターはあいまいな文字列を引用し、ダウンストリームのリーダーがそれらを再解釈しないようにします。リーダーとライターは、アウトラインで説明されているまさにその失敗を防ぐように構成されています。

このコンバータではノルウェーは消えません: NO はテキストのままです

このリポジトリは、js-yaml の制限された JSON とコア スキーマ、およびそれらの観察されたスカラー動作を文書化します。 YAML の 2001 の起源、作者の意図、または歴史的なデザインの議論に関する情報源は含まれていません。これらの主張は記憶から再構築されるのではなく、省略されています。

現在のメカニズムは実用的なガイドとしては十分です。単純なスカラー解決は、選択したスキーマの下で行われます。引用符で囲まれた値はテキストのままです。サポートされていないタグは拒否されます。コードに関する証拠を、出典のない標準の歴史に拡張すべきではありません。

リポジトリの証拠は、YAML の元の履歴ではなく、現在のパーサー構成をカバーします

YAML 1.1 は通常、yes、no、on、off のバリアントをブール値として扱います。これは、ノルウェー問題が一部の生態系に存在する理由を説明します。 ToolAcre は 1.1 スイッチを公開せず、そのようなモードでの 60 進数または従来の 8 進数変換を示しません。

ハザードは、このパネルを予測するためではなく、外部パーサー出力を確認するために使用します。別のツールが false を生成した場合は、そのライブラリとスキーマを記録します。 ToolAcre の結果は、対照的な YAML 1.2 の読み取り値として機能しますが、他の実装がそのコントラクトに対して正しく構成されていないことの証拠としては機能しません。

レガシー YAML 1.1 ブール値は危険性を説明しますが、ここでは有効になっていません

厳密な JSON スキーマは、JSON と互換性のあるスカラー スペルのみを認識します。さらに、コアはチルダと空の値を null、16 進数、または `0o` 整数、および非有限数に解決します。どちらもブール演算の語彙を true と false を超えて拡大するものではありません。

Core Infinity と NaN は、JSON にはそれらの表現がないため、後で JSON で null になり、警告が表示されます。したがって、ノルウェーの価値自体は安定しているにもかかわらず、スキーマ オプション間の違いは目に見えて損失が生じる場合があります。

出荷されたオプションはどちらも YAML 1.2 スキーマです

従来の動作は、パーサーのデフォルトまたはアプリケーション規約がそれを保持する場合はどこでも存続します。コンバーターは、リポジトリの証拠からこれらのライブラリまたはバージョンをインベントリすることはできません。あいまいな単語や類似した数値を含むフィクスチャを使用して実際の消費者をテストします。

ToolAcre の YAML ライターは、`NO`、`yes`、`1.0`、`0755`、日付を示すテキストなど、古い読者が異なる方法で入力する可能性がある文字列の周囲に保護引用符を追加します。この互換性の出力は測定可能であり、最新のパーサーの採用に関する包括的な声明よりも安全です。

この危険性は他のパーサーでも存続します。このツールから一般化するのではなく、それらを検証してください

`countries: [SE, NO, DK]`、`answers: [yes, no, on, off]`、`mode: 0755`、`octal: 0o755`、`version: 1.10`、`empty:` を変換します。 strict では、JSON ネイティブ値を除くすべての値は文字列のままになります。 Core では、8 進数は 493 になり、空の場合は null になります。国と答えの単語は文字列のままです。

テキストを強制するには、すべてのトークンを引用符で囲みます。次に、JSON の結果を YAML に書き込み、シリアライザーが選択した引用符を検査します。このコード精度の比較により、存在しない YAML 1.1 モードを実行するふりをすることなく、ツールのルールが明らかになります。

作業例: 2 つの出荷されたスキーマの下の国コードとスカラー類似コード

言語固有のパーサー スイッチ、バージョンのデフォルト、およびフレームワーク ラッパーは、この実装の範囲外です。彼らの名前と行動は独立して変化します。構成を使用するコンポーネントを調べてテストします。

パネルはアプリケーションのセマンティクスも検証しません。国コードでは `NO` を文字列として保持する必要がありますが、`NO` が特定のスキーマで許可される値であることを証明することはできません。

要点: 文字列を引用符で囲み、パーサーのバージョンを把握し、ブラウザーで YAML を JSON に変換することで暗黙的な型付けがどのように表示されるかを知る

再入力できるテキストを引用し、実際に使用されているスキーマを把握し、コンシューマをテストします。 ToolAcre の 2 つの YAML 1.2 オプションは、限定的な違いを可視化し、従来のブール トラップを意図的に回避します。

この教訓は、すべてのパーサーが一方向に動作するわけではないということです。それは、暗黙的な型付けが構成であり、コンバーターはその構成を明示する必要があるということです。ここでの証拠は、ノルウェーが`"NO"`のままであることを示しています。

構成がシステムをまたがる場合は、ドメインが許可するすべてのあいまいなトークンを含む相互運用フィクスチャを追加します。実際の各コンシューマで変換または解析し、YAML としてレンダリングされるのではなく、型指定された値を比較します。これにより、国リストまたは許可モードが運用環境に到達する前に、従来のブール テーブル、8 進数ルール、または空の値の違いが捕捉されます。既知の文字列を引用することは、環境のデフォルトに依存するのではなく文書に意図を記録するため、依然として最も単純な移植可能な防御手段です。