Skip to content

Repository files navigation

diffx

日本語

CICrates.iodocs.rsLicense: MIT

Semantic diff tool for structured data (JSON/YAML/TOML/XML/INI/CSV). Ignores key ordering and whitespace, shows only meaningful changes.

Why diffx?

Traditional diff doesn't understand structure:

$ diff config_v1.json config_v2.json
< {
<"name": "myapp",
<"version": "1.0"< }
> {
>"version": "1.1",
>"name": "myapp"> }

A simple key reordering shows every line as changed.

diffx shows only semantic changes:

$ diffx config_v1.json config_v2.json
~ version: "1.0" ->"1.1"

Installation

# As CLI tool
cargo install diffx
# As library (Cargo.toml)
[dependencies]
diffx-core = "0.6"

Usage

# Basic
diffx file1.json file2.json
# Output example~ version: "1.0" ->"1.1"
+ features[0]: "new-feature"
- deprecated: "old-value"

Supported Formats

JSON, YAML, TOML, XML, INI, CSV (auto-detected by extension, use --format to override)

Main Options

--output json|yaml # Machine-readable output
--quiet # Return only exit code (0: same, 1: diff found)
--ignore-keys-regex RE # Ignore keys matching regex
--array-id-key KEY # Identify array elements by KEY for comparison
--epsilon N # Float comparison tolerance
--ignore-case # Case-insensitive comparison
--ignore-whitespace # Ignore whitespace differences
-r, --recursive # Recursive directory comparison

Output Symbols

  • + Added
  • - Removed
  • ~ Modified
  • ! Type changed

CI/CD Usage

# Detect config changesif! diffx config/prod.json config/staging.json --quiet;thenecho"Config has changed"
diffx config/prod.json config/staging.json --output json > changes.json
fi# Compare ignoring timestamps and metadata
diffx api_v1.json api_v2.json --ignore-keys-regex "^(timestamp|updated_at)$"

Examples

See diffx-cli/tests/cmd/ for executable examples:

Documentation

License

MIT

About

Semantic diff for structured data (JSON, YAML, TOML, XML, INI, CSV) — compares meaning, not text

Topics

Resources

Stars

87 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages