lambdaisland / lambdaisland/deep-diff2
Prettyprinted diff mangled when using advanced compilation in cljs
まだ誰も着手していません。
- 主要言語
- Clojure
- スター
- 326
- フォーク
- 18
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Thanks for the awesome tool! We are currently using it in an internal web-based integration testing tool. It's working great right up until trying to display a pretty printed version of diffs.
It seems the pretty printer messes up the diff when compiled with advanced optimizations.
Here is a shell session demonstrating the problem:
❯ tree
.
├── deps.edn
└── src
└── ddiff_bug
└── core.cljs
3 directories, 2 files
❯ bat deps.edn
1 {:paths ["src"]
2 :deps { org.clojure/clojurescript {:mvn/version "1.11.132"}
3 lambdaisland/deep-diff2 {:mvn/version "2.11.216"}}}
❯ bat src/ddiff_bug/core.cljs
1 (ns ddiff-bug.core
2 (:require [lambdaisland.deep-diff2 :as ddiff]))
3
4
5 (enable-console-print!)
6
7 (defn diff-view
8 [a b]
9 (let [diff (ddiff/diff a b)
10 diffstr (with-out-str (ddiff/pretty-print diff))]
11 (println "\nDocument A")
12 (println a)
13 (println "\nDocument B")
14 (println b)
15 (println "\nDiff")
16 (println diff)
17 (println "\nPretty printed diff")
18 (println diffstr)))
19
20 (defn -main
21 [& args]
22 (diff-view {"Hi" {:foo 424128, :bar 22140, :baz 243000}}
23 {"Ho" {:foo 424128, :bar 22140, :baz 243000}}))
24
25
26 (-main)
27
❯ clj -M --main cljs.main --target node --output-to main-dev.js --optimizations none --compile ddiff-bug.core
❯ clj -M --main cljs.main --target node --output-to main-prod.js --optimizations advanced --compile ddiff-bug.core
❯ node main-dev.js
Document A
{Hi {:foo 424128, :bar 22140, :baz 243000}}
Document B
{Ho {:foo 424128, :bar 22140, :baz 243000}}
Diff
{#lambdaisland.deep-diff2.diff-impl.Deletion{:- Hi} {:foo 424128, :bar 22140, :baz 243000}, #lambdaisland.deep-diff2.diff-impl.Insertion{:+ Ho} {:foo 424128, :bar 22140, :baz 243000}}
Pretty printed diff
{+"Ho" {:bar 22140, :baz 243000, :foo 424128}, -"Hi" {:bar 22140, :baz 243000, :foo 424128}}
❯ node main-prod.js
Document A
{Hi {:foo 424128, :bar 22140, :baz 243000}}
Document B
{Ho {:foo 424128, :bar 22140, :baz 243000}}
Diff
{#lambdaisland.deep-diff2.diff-impl.Deletion{:- Hi} {:foo 424128, :bar 22140, :baz 243000}, #lambdaisland.deep-diff2.diff-impl.Insertion{:+ Ho} {:foo 424128, :bar 22140, :baz 243000}}
Pretty printed diff
{#Xo {:+ "Ho"} {:bar 22140, :baz 243000, :foo 424128},
#Wo {:- "Hi"} {:bar 22140, :baz 243000, :foo 424128}}
It seems minimized names (as seen in the Xo and Wo tags here) are confusing the printer. The two tags seen here are minimized versions of $lambdaisland$deep_diff2$diff_impl$Insertion$$ and $lambdaisland$deep_diff2$diff_impl$Deletion$$
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
src/ddiff_bug/core.cljs と deps.edn から始め、次に --optimizations none と advanced を指定して 2 つの cljs.main コマンドを実行し、差異を再現します。ddiff/pretty-print のエントリーポイントを追跡し、得られた出力を比較します。advanced ビルドが非最適化ビルドと同じ読みやすい挿入タグと削除タグを出力すれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- clojure
- 領域
- tooling
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100