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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e10cc78b855b0a28a19d476767d5cb49b880e0101b940a8846be8cb01c736882
4
- data.tar.gz: 03dde93b3c46ceec1859268a538c917162f3737eb719a2138e9923fe4f3b05e6
3
+ metadata.gz: 79568b485368737ba2d8ca559d968d4183e79f855f01a7dff784679829f0ecf2
4
+ data.tar.gz: e8a2c6775409fdafdc4c7c10dd35d1ebdc85b23d38a876dd8658fb3017bd1d7e
5
5
  SHA512:
6
- metadata.gz: 5e0715a8946d00becd61e3e8cf6418f6fcb57b89d735dacf60728e62db78e9ea95691fe55b96c30bb7e7bb14255de1919bb4962af4bef2e66460988db9242bd9
7
- data.tar.gz: 04f7fde08c4419a7b5fa086d0575bf4cdbe5bcd748519eda89dcb7c161a8b6aa322521bbe5d9ca008dc1875186c0a2795b5976621449c8c864ca2b6640b6209b
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.4...HEAD
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 | Version | CI | | Language<br>/ Format | Parser Backend(s) | Description |
64
- |------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|-------------|
65
- | [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver) | **Foundation**: Shared base for Markdown mergers with inner code block merging |
73
- | [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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] | [![Version][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 |
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
@@ -5,7 +5,7 @@ module Ast
5
5
  # Version information for Ast::Merge
6
6
  module Version
7
7
  # Current version of the ast-merge gem
8
- VERSION = "4.0.4"
8
+ VERSION = "4.0.5"
9
9
  end
10
10
  VERSION = Version::VERSION # traditional location
11
11
  end
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
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.2
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.2
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.4
389
- changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v4.0.4/CHANGELOG.md
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.4
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.4
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