ast-merge 4.0.4 → 4.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +21 -1
- data/README.md +15 -15
- data/lib/ast/merge/rspec/shared_examples/conflict_resolver_base.rb +74 -0
- data/lib/ast/merge/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +7 -7
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 79568b485368737ba2d8ca559d968d4183e79f855f01a7dff784679829f0ecf2
|
|
4
|
+
data.tar.gz: e8a2c6775409fdafdc4c7c10dd35d1ebdc85b23d38a876dd8658fb3017bd1d7e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4069151d47cd524740fb23cfd86a1d9de044d5b779afce7faadf2e4c096a393c8ea1b7c30b81f798da966f917029db2bc15f4251c034c811567ea5864e9a8fbd
|
|
7
|
+
data.tar.gz: 9f0d68f5a0050d1b796f3865491efd436d2737aac07a59e1274d8ab80f1f53502e76be020cb4010d7f009e1fd4cae3942926409ff8fec89bdf854ae72af0109d
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,26 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [4.0.5] - 2026-02-01
|
|
34
|
+
|
|
35
|
+
- TAG: [v4.0.5][4.0.5t]
|
|
36
|
+
- COVERAGE: 96.37% -- 2552/2648 lines in 50 files
|
|
37
|
+
- BRANCH COVERAGE: 87.22% -- 812/931 branches in 50 files
|
|
38
|
+
- 98.81% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- More shared examples for ConflictResolverBase
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- tree_haver v5.0.3
|
|
47
|
+
- improve robustness of tests
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- Documentation fixes related to gem family section
|
|
52
|
+
|
|
33
53
|
## [4.0.4] - 2026-01-20
|
|
34
54
|
|
|
35
55
|
- TAG: [v4.0.4][4.0.4t]
|
|
@@ -733,7 +753,7 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
733
753
|
|
|
734
754
|
- Initial release
|
|
735
755
|
|
|
736
|
-
[Unreleased]: https://github.com/kettle-rb/ast-merge/compare/v4.0.
|
|
756
|
+
[Unreleased]: https://github.com/kettle-rb/ast-merge/compare/v4.0.5...HEAD
|
|
737
757
|
[4.0.5]: https://github.com/kettle-rb/ast-merge/compare/v4.0.4...v4.0.5
|
|
738
758
|
[4.0.5t]: https://github.com/kettle-rb/ast-merge/releases/tag/v4.0.5
|
|
739
759
|
[4.0.4]: https://github.com/kettle-rb/ast-merge/compare/v4.0.3...v4.0.4
|
data/README.md
CHANGED
|
@@ -60,21 +60,21 @@ Ast::Merge is **not typically used directly** - instead, use one of the format-s
|
|
|
60
60
|
|
|
61
61
|
The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
|
|
62
62
|
|
|
63
|
-
| Gem |
|
|
64
|
-
|
|
65
|
-
| [tree_haver][tree_haver] |
|
|
66
|
-
| [ast-merge][ast-merge] |
|
|
67
|
-
| [bash-merge][bash-merge] |
|
|
68
|
-
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem]
|
|
69
|
-
| [dotenv-merge][dotenv-merge] |
|
|
70
|
-
| [json-merge][json-merge] |
|
|
71
|
-
| [jsonc-merge][jsonc-merge] |
|
|
72
|
-
| [markdown-merge][markdown-merge] |
|
|
73
|
-
| [markly-merge][markly-merge] |
|
|
74
|
-
| [prism-merge][prism-merge] |
|
|
75
|
-
| [psych-merge][psych-merge] |
|
|
76
|
-
| [rbs-merge][rbs-merge] |
|
|
77
|
-
| [toml-merge][toml-merge] |
|
|
63
|
+
| Gem | Version / CI | Language<br>/ Format | Parser Backend(s) | Description |
|
|
64
|
+
|------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:|----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
65
|
+
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] <br/> [![CI][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
|
|
66
|
+
| [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] <br/> [![CI][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
|
|
67
|
+
| [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] <br/> [![CI][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
|
|
68
|
+
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] <br/> [![CI][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
|
|
69
|
+
| [dotenv-merge][dotenv-merge] | [![Version][dotenv-merge-gem-i]][dotenv-merge-gem] <br/> [![CI][dotenv-merge-ci-i]][dotenv-merge-ci] | Dotenv | internal | Smart merge for `.env` files |
|
|
70
|
+
| [json-merge][json-merge] | [![Version][json-merge-gem-i]][json-merge-gem] <br/> [![CI][json-merge-ci-i]][json-merge-ci] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
|
|
71
|
+
| [jsonc-merge][jsonc-merge] | [![Version][jsonc-merge-gem-i]][jsonc-merge-gem] <br/> [![CI][jsonc-merge-ci-i]][jsonc-merge-ci] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
|
|
72
|
+
| [markdown-merge][markdown-merge] | [![Version][markdown-merge-gem-i]][markdown-merge-gem] <br/> [![CI][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver), [Parslet][parslet] | **Foundation**: Shared base for Markdown mergers with inner code block merging |
|
|
73
|
+
| [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] <br/> [![CI][markly-merge-ci-i]][markly-merge-ci] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
|
|
74
|
+
| [prism-merge][prism-merge] | [![Version][prism-merge-gem-i]][prism-merge-gem] <br/> [![CI][prism-merge-ci-i]][prism-merge-ci] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
|
|
75
|
+
| [psych-merge][psych-merge] | [![Version][psych-merge-gem-i]][psych-merge-gem] <br/> [![CI][psych-merge-ci-i]][psych-merge-ci] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
|
|
76
|
+
| [rbs-merge][rbs-merge] | [![Version][rbs-merge-gem-i]][rbs-merge-gem] <br/> [![CI][rbs-merge-ci-i]][rbs-merge-ci] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
|
|
77
|
+
| [toml-merge][toml-merge] | [![Version][toml-merge-gem-i]][toml-merge-gem] <br/> [![CI][toml-merge-ci-i]][toml-merge-ci] | TOML | [Parslet + toml][toml], [Citrus + toml-rb][toml-rb], [tree-sitter-toml][ts-toml] (all via tree_haver) | Smart merge for TOML files |
|
|
78
78
|
|
|
79
79
|
#### Backend Platform Compatibility
|
|
80
80
|
|
|
@@ -155,6 +155,18 @@ RSpec.shared_examples("Ast::Merge::ConflictResolverBase") do
|
|
|
155
155
|
it "has #add_template_only_nodes reader" do
|
|
156
156
|
expect(resolver).to(respond_to(:add_template_only_nodes))
|
|
157
157
|
end
|
|
158
|
+
|
|
159
|
+
it "has #remove_template_missing_nodes reader" do
|
|
160
|
+
expect(resolver).to(respond_to(:remove_template_missing_nodes))
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "has #recursive reader" do
|
|
164
|
+
expect(resolver).to(respond_to(:recursive))
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "has #match_refiner reader" do
|
|
168
|
+
expect(resolver).to(respond_to(:match_refiner))
|
|
169
|
+
end
|
|
158
170
|
end
|
|
159
171
|
|
|
160
172
|
describe "#resolve" do
|
|
@@ -199,6 +211,68 @@ RSpec.shared_examples("Ast::Merge::ConflictResolverBase") do
|
|
|
199
211
|
expect(resolver.freeze_node?(node)).to(be(false))
|
|
200
212
|
end
|
|
201
213
|
end
|
|
214
|
+
|
|
215
|
+
describe "per-node-type preferences" do
|
|
216
|
+
let(:template_analysis) { build_mock_analysis.call }
|
|
217
|
+
let(:dest_analysis) { build_mock_analysis.call }
|
|
218
|
+
|
|
219
|
+
context "with hash preferences" do
|
|
220
|
+
let(:resolver) do
|
|
221
|
+
build_conflict_resolver.call(
|
|
222
|
+
preference: {default: :destination, special: :template},
|
|
223
|
+
template_analysis: template_analysis,
|
|
224
|
+
dest_analysis: dest_analysis,
|
|
225
|
+
)
|
|
226
|
+
end
|
|
227
|
+
let(:typed_template_node) { Ast::Merge::NodeTyping.with_merge_type(Object.new, :special) }
|
|
228
|
+
let(:typed_dest_node) { Ast::Merge::NodeTyping.with_merge_type(Object.new, :special) }
|
|
229
|
+
let(:untyped_node) { Object.new }
|
|
230
|
+
|
|
231
|
+
it "reports per-type preference enabled" do
|
|
232
|
+
expect(resolver.per_type_preference?).to(be(true))
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "returns default preference for untyped nodes" do
|
|
236
|
+
expect(resolver.preference_for_node(untyped_node)).to(eq(:destination))
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
it "returns per-type preference for typed nodes" do
|
|
240
|
+
expect(resolver.preference_for_node(typed_template_node)).to(eq(:template))
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "prefers typed template nodes when configured" do
|
|
244
|
+
resolution = resolver.send(:preference_resolution, template_node: typed_template_node, dest_node: untyped_node)
|
|
245
|
+
expect(resolution[:source]).to(eq(:template))
|
|
246
|
+
expect(resolution[:decision]).to(eq(conflict_resolver_class::DECISION_TEMPLATE))
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "prefers typed destination nodes when configured" do
|
|
250
|
+
resolver_with_dest = build_conflict_resolver.call(
|
|
251
|
+
preference: {default: :template, special: :destination},
|
|
252
|
+
template_analysis: template_analysis,
|
|
253
|
+
dest_analysis: dest_analysis,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
resolution = resolver_with_dest.send(:preference_resolution, template_node: untyped_node, dest_node: typed_dest_node)
|
|
257
|
+
expect(resolution[:source]).to(eq(:destination))
|
|
258
|
+
expect(resolution[:decision]).to(eq(conflict_resolver_class::DECISION_DESTINATION))
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
context "with scalar preference" do
|
|
263
|
+
let(:resolver) do
|
|
264
|
+
build_conflict_resolver.call(
|
|
265
|
+
preference: :template,
|
|
266
|
+
template_analysis: template_analysis,
|
|
267
|
+
dest_analysis: dest_analysis,
|
|
268
|
+
)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "reports per-type preference disabled" do
|
|
272
|
+
expect(resolver.per_type_preference?).to(be(false))
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
202
276
|
end
|
|
203
277
|
|
|
204
278
|
RSpec.shared_examples("Ast::Merge::ConflictResolverBase validation") do
|
data/lib/ast/merge/version.rb
CHANGED
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ast-merge
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.0.
|
|
4
|
+
version: 4.0.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -66,7 +66,7 @@ dependencies:
|
|
|
66
66
|
version: '5.0'
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 5.0.
|
|
69
|
+
version: 5.0.3
|
|
70
70
|
type: :runtime
|
|
71
71
|
prerelease: false
|
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -76,7 +76,7 @@ dependencies:
|
|
|
76
76
|
version: '5.0'
|
|
77
77
|
- - ">="
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
|
-
version: 5.0.
|
|
79
|
+
version: 5.0.3
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: kettle-dev
|
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -385,10 +385,10 @@ licenses:
|
|
|
385
385
|
- MIT
|
|
386
386
|
metadata:
|
|
387
387
|
homepage_uri: https://ast-merge.galtzo.com/
|
|
388
|
-
source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v4.0.
|
|
389
|
-
changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v4.0.
|
|
388
|
+
source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v4.0.5
|
|
389
|
+
changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v4.0.5/CHANGELOG.md
|
|
390
390
|
bug_tracker_uri: https://github.com/kettle-rb/ast-merge/issues
|
|
391
|
-
documentation_uri: https://www.rubydoc.info/gems/ast-merge/4.0.
|
|
391
|
+
documentation_uri: https://www.rubydoc.info/gems/ast-merge/4.0.5
|
|
392
392
|
funding_uri: https://github.com/sponsors/pboling
|
|
393
393
|
wiki_uri: https://github.com/kettle-rb/ast-merge/wiki
|
|
394
394
|
news_uri: https://www.railsbling.com/tags/ast-merge
|
|
@@ -417,7 +417,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
417
417
|
- !ruby/object:Gem::Version
|
|
418
418
|
version: '0'
|
|
419
419
|
requirements: []
|
|
420
|
-
rubygems_version: 4.0.
|
|
420
|
+
rubygems_version: 4.0.5
|
|
421
421
|
specification_version: 4
|
|
422
422
|
summary: "☯️ Shared infrastructure for the *-merge gem family"
|
|
423
423
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|