Libelektra: YAJL:プラグインはマウントポイントのすぐ下の値を保存しません

作成日 2018年07月27日  ·  17コメント  ·  ソース: ElektraInitiative/libelektra

問題を再現する手順

kdb mount config.json user/tests/yajl yajl
kdb set user/tests/yajl 'This May Be the Year I Disappear'
kdb ls user/tests/yajl
#> user/tests/yajl
kdb get user/tests/yajl 

期待される結果

最後のコマンドは、テキストThis May Be the Year I Disappearます。

実結果

最後のコマンドは空の行を出力します。

システムインフォメーション

  • エレクトラバージョン:マスター
  • OS:macOS 10.13.6
bug good first issue usability

全てのコメント17件

問題を報告していただきありがとうございます!

そのようなJSONドキュメントはどのように見えますか? 親キーのみを含む構成ファイルの特別なセマンティクスに関するドキュメントも必要です。

そのようなJSONドキュメントはどのように見えますか?

この場合、ドキュメントには文字列のみが含まれます。

"This May Be the Year I Disappear"

。 構成ファイルを上記のコンテンツに置き換えると、プラグインはすでに正しい値を読み取ります。

printf '"This May Be the Year I Disappear"' > (kdb file user/tests/yajl/)
kdb get user/tests/yajl
#> This May Be the Year I Disappear

だからセットだけを修正する必要がありますか? これはとても簡単に聞こえます!

だからセットだけを修正する必要がありますか?

私の知る限り、そうです。

私はこれを私の最初の問題として調べることができると思います。 @ markus2330を探し始める場所をいくつか教えていただけますか? ありがとう。

ソースはsrc / plugins / yajl /yajl_gen.cおよびsrc / plugins / yajl /yajl_parse.cにあります

幸い、 @ sanssecoursは、ストレージプラグインの動作を説明する優れたチュートリアルを作成しました(doc / tutorials / storage-plugins.mdを参照)。 したがって、次の問題#2132(#2477はおそらくこれの結果です)およびその他のyajl関連の問題として取り上げることができます。 主な作業は、yajlプラグインでの配列の検証、または外部プラグインとしての検証です(#1862を参照)。

空のjsonドキュメント( {}のみが含まれていることを意味します)をマウントすると、 kdb set system/lvas/cm/yajl "test"を呼び出すと次のようになります。
elektraYajlSetは、値としてjus (system/lvas/cm/yajl,test)を持つKeySetで呼び出されます。

elektraGenEmptyの呼び出しでは、KeySetのサイズが1であるため、2番目の句が実行されます。
parentKeyの値がキーセットの最後のキーと同じであるため、strcmpも成功します。

空のマップが生成され、elektraYajlSetが終了します。 したがって、関数は値を受け取りますが、それに対して何もしません。

したがって、空のマップが生成されるその時点で、 @ sanssecours説明されているように、キーの値をjsonドキュメントに出力するコードを追加でき
kdb getがその値を正しく読み取り、 kdb set system/lvas/cm/yajl/second "hi"ような呼び出しが、この{"__dirdata": "test", "second": "hi"}ようなjsonドキュメントを生成し、期待どおりにキーをマップするため、これは機能します。

このソリューションは機能すると思いますが、jsonドキュメントを直接{"__dirdata": "test"}に設定できれば、よりクリーンになります。これは意味的には同じです。

しかし、どうすればよいかわかりません。 正しい方法は、directoryvalueプラグインがelektraYajlSetが受け取るキーセットを変更することだと思います。 または、elektraYajlSetでKeySetを自分で変更できると思います。

@ markus2330の提案はありますか?

はい、directoryvalueは、elektraYajlSetが受け取るKeySetを変更します。 ただし、これは、parentKeyのみが存在する場合は発生しません(「ディレクトリ」とは見なされないため)。したがって、すでにわかっているように、親キーのみを設定すると、elektraGenEmptyが実行され、strcmpが実行されます。成功します。

しかし、elektraGenEmptyには、現在は真実ではないいくつかの仮定があります(directoryvalueが存在する前に書き込まれました)。 したがって、他のバグがあります。例:#2132

このソリューションは機能すると思いますが、jsonドキュメントを直接{"__dirdata": "test"}に設定できれば、よりクリーンになります。これは意味的には同じです。

{"": "test"}は、単一の値を説明する最小限のドキュメントではないでしょうか。 これも「camel」プラグインの動作のようです。

@sanssecours storage-tutorialを拡張して、parentKeysと「空のキー」(%)(または少なくとも今のところTODO)についても説明できますか?

storage-tutorialを拡張して、parentKeysについても説明できますか?

プラグインチュートリアルはすでに説明していると思います

  • 親キーの値(ファイルパス)、および
  • その親キーは、エラーおよび警告情報を発行するために使用されます

。 親キーに関して特別なことは他に何も知りません。

および「空のキー」(%)(または少なくとも今のところTODOとして)?

空の鍵について聞いたのはこれが初めてなので、私はそれをするのにふさわしい人物ではないと思います。

ここで@sanssecours説明されているように、キーの値をjsonドキュメントに出力するコードを追加でき

有効なJSONドキュメントには常に最上位の配列またはオブジェクトが必要であると思われるため、これがYAJLが問題を処理するための正しい方法であるかどうかはわかりません。

親キーに関して特別なことは他に何も知りません。

また、一部の構成ファイル形式には、キーなしで値を単純に記述する方法がないことを除いて、特別なことは何もありません。

「空のキー」(%)

空のキーを使用すると、 {"root": {"": "something"}}ようなドキュメントをマップできます。 これを現在KeySetにどのようにマッピングしますか?

有効なJSONドキュメントには常に最上位の配列またはオブジェクトが必要であると思われるため、これがYAJLが問題を処理するための正しい方法であるかどうかはわかりません。

これは変更されたようです: https

https://www.ietf.org/rfc/rfc7159.txtには、「値のみ」が許可されていることを示す例もあります。 しかし、yajlはこれをサポートしていないようです...(yajl 2.1.0-2 + b3はエラーExpected “{” but found “"”生成します)

RFC 7159の機能を使用すると、次のようにマッピングできます。

"some value" ->親= "何らかの値"
{"", "some value"} ->親/%= "何らかの値"

ただし、yajlを回避する必要があります...(ChangeLogは、この機能が後で追加されたことも示していません)。

空のキーを使用すると、{"root":{"": "something"}}のようなドキュメントをマップできます。 これを現在KeySetにどのようにマッピングしますか?

YAMLCPPはこのデータを適切に処理しているようです。

kdb mount config.yaml user/tests/yaml yamlcpp
printf '{"root": {"": "something"}}' > "$(kdb file user/tests/yaml)"
kdb ls user/tests/yaml
#> user/tests/yaml/root/%
kdb get user/tests/yaml/root/%
#> something

。 ただし、プラグインを空のキーに適合させませんでした。 この機能をサポートするには、正しい文字列値( "" )を使用して、ストレージプラグインでsetBaseNameを呼び出すだけで十分です。

これが特別な処理なしですぐに機能することを確認できてうれしいです:+1:

@sanssecours RFC 7159をサポートしたいですか? parentKeyのみが設定されている場合、プラグインは何をしますか?

RFC 7159をサポートしますか?

私の意見では、トップレベルですべてのデータ型をサポートすることは理にかなっています。

parentKeyのみが設定されている場合、プラグインは何をしますか?

それらはテキストを(キーなしで)保存するだけです:

kdb mount config.yaml user/tests/yaml yamlcpp
kdb set user/tests/yaml value
kdb file user/tests/yaml | xargs cat
#> value

このコミットでトップレベルの特別な処理を追加しました。
これはyajlモジュールのテストに失敗しますが、最初にチェックインしたいものを修正する前に、それが許容できる解決策であるかどうか@ markus2330?

少し詳しく説明します。KeySetのサイズが1の場合、最上位のキーのみが含まれていると確信できます。 次に、そのキーの値を生成します。 ただし、その場合、 elektraGenOpenValueが呼び出されないようにする必要があります。そうしないと、キーが文字列として生成されるためです。

YAMLCPPはこのデータを適切に処理しているようです。
..。

この例は、yajlで機能します。 私は何かが足りないのですか?

それはyajlモジュールのテストを破ります

どのテスト? (以下も参照)

それが許容できる解決策であるかどうか、私は最初にチェックインしたかった

次の場合、何かが許容できる解決策であるかどうかを簡単に確認できます。

  • PRを作成しました(すべてのテストケースを実行します)
  • テストと例を使用して、実装する動作を説明します

この例は、yajlで機能します。 私は何かが足りないのですか?

いいえ、この例は、 {"", "some value"}がparentKeyの値を表す理想的な方法ではないことを示しているだけです。

RFC 7159をサポートしますか?
私の意見では、トップレベルですべてのデータ型をサポートすることは理にかなっています。

私は完全に同意します。

それらはテキストを(キーなしで)保存するだけです:

それでは、yajlで同じことを実装しましょう。

今では完璧に機能します!

このページは役に立ちましたか?
0 / 5 - 0 評価