bash-merge 2.0.4 → 2.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: 537268a1e7226b74f86d72b94a17fd1a5da6c5a995fd6f6d6623949c9436f048
4
- data.tar.gz: 0d5d29f36d35e1c4b56597f97f563d8da1345e380d23a9a2a5be350342c1f5b1
3
+ metadata.gz: 143070616b47ff572ec71a20ce9e8be2549fbdaac8e00fb703de16598b143770
4
+ data.tar.gz: e11406b8fc7e8adf42b5f473c22fa5761e46ed13a300715b3012765753e1b472
5
5
  SHA512:
6
- metadata.gz: 5557dbf95b0dfacbd1fbeb899ea20b7b03eda1453ffd5e16912667e5b033c020291772bfff5d25cceea8bd8733e6b3aed3244d495465c3266d6cce55d1cf86e3
7
- data.tar.gz: 0acf658b9e0f0b9754866564fb99133511d6a96fc008bc5e9949a43fe3274baa0b5492af1c7c5df8f70dca4dbbb3166c940552caaf005c9c12870a375a72bd41
6
+ metadata.gz: fb3bd78f3e13caddb7eee63fd32fa62d180ee99ede3d2a138ceb125e23df5ceb3e93dc2393413efc3fb5d3c38faa7136aca9584357ef1e85f435f315d99574ba
7
+ data.tar.gz: a1c7c1cf94ae0c103993356d525418384a6d2f13d5c878800487cd1839a3ce3e52206e9abb2b6b3ff8ba603dbe50af6c6eca75decc0e8b1ce3b06519ba1448e6
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,22 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.5] - 2026-02-01
34
+
35
+ - TAG: [v2.0.5][2.0.5t]
36
+ - COVERAGE: 96.10% -- 518/539 lines in 11 files
37
+ - BRANCH COVERAGE: 74.72% -- 133/178 branches in 11 files
38
+ - 96.33% documented
39
+
40
+ ### Added
41
+
42
+ - ConflictResolver now applies per-node-type preferences via `node_typing`.
43
+
44
+ ### Changed
45
+
46
+ - tree_haver v5.0.3
47
+ - ast-merge v4.0.5
48
+
33
49
  ## [2.0.4] - 2026-01-20
34
50
 
35
51
  - TAG: [v2.0.4][2.0.4t]
@@ -149,7 +165,9 @@ Please file a bug if you notice a violation of semantic versioning.
149
165
 
150
166
  ### Security
151
167
 
152
- [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.4...HEAD
168
+ [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.5...HEAD
169
+ [2.0.5]: https://github.com/kettle-rb/bash-merge/compare/v2.0.4...v2.0.5
170
+ [2.0.5t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.5
153
171
  [2.0.4]: https://github.com/kettle-rb/bash-merge/compare/v2.0.3...v2.0.4
154
172
  [2.0.4t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.4
155
173
  [2.0.3]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...v2.0.3
data/README.md CHANGED
@@ -104,21 +104,21 @@ File.write("merged.sh", result.to_bash)
104
104
 
105
105
  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.
106
106
 
107
- | Gem | Version | CI | | Language<br>/ Format | Parser Backend(s) | Description |
108
- |------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|-------------|
109
- | [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) |
110
- | [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 |
111
- | [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 |
112
- | [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) |
113
- | [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 |
114
- | [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 |
115
- | [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 |
116
- | [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 |
117
- | [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) |
118
- | [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 |
119
- | [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 |
120
- | [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 |
121
- | [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 |
107
+ | Gem | Version / CI | Language<br>/ Format | Parser Backend(s) | Description |
108
+ |------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:|----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
109
+ | [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) |
110
+ | [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 |
111
+ | [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 |
112
+ | [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) |
113
+ | [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 |
114
+ | [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 |
115
+ | [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 |
116
+ | [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 |
117
+ | [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) |
118
+ | [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 |
119
+ | [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 |
120
+ | [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 |
121
+ | [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 |
122
122
 
123
123
  #### Backend Platform Compatibility
124
124
 
@@ -976,7 +976,7 @@ Thanks for RTFM. ☺️
976
976
  [📌gitmoji]: https://gitmoji.dev
977
977
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
978
978
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
979
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.025-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
979
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.539-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
980
980
  [🔐security]: SECURITY.md
981
981
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
982
982
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -13,14 +13,16 @@ module Bash
13
13
  #
14
14
  # @param template_analysis [FileAnalysis] Analyzed template file
15
15
  # @param dest_analysis [FileAnalysis] Analyzed destination file
16
- # @param preference [Symbol] Which version to prefer when
16
+ # @param preference [Symbol, Hash] Which version to prefer when
17
17
  # nodes have matching signatures:
18
18
  # - :destination (default) - Keep destination version (customizations)
19
19
  # - :template - Use template version (updates)
20
20
  # @param add_template_only_nodes [Boolean] Whether to add nodes only in template
21
21
  # @param match_refiner [#call, nil] Optional match refiner for fuzzy matching
22
22
  # @param options [Hash] Additional options for forward compatibility
23
- def initialize(template_analysis, dest_analysis, preference: :destination, add_template_only_nodes: false, match_refiner: nil, **options)
23
+ # @param node_typing [Hash{Symbol,String => #call}, nil] Node typing configuration
24
+ # for per-node-type preferences
25
+ def initialize(template_analysis, dest_analysis, preference: :destination, add_template_only_nodes: false, match_refiner: nil, node_typing: nil, **options)
24
26
  super(
25
27
  strategy: :batch,
26
28
  preference: preference,
@@ -30,6 +32,7 @@ module Bash
30
32
  match_refiner: match_refiner,
31
33
  **options
32
34
  )
35
+ @node_typing = node_typing
33
36
  @emitter = Emitter.new
34
37
  end
35
38
 
@@ -98,11 +101,7 @@ module Bash
98
101
  template_node = template_info[:node]
99
102
 
100
103
  # Decide which to emit based on preference
101
- if @preference == :destination
102
- emit_node(dest_node, @dest_analysis)
103
- else
104
- emit_node(template_node, @template_analysis)
105
- end
104
+ emit_preferred_node(template_node, dest_node)
106
105
 
107
106
  processed_dest_sigs << dest_sig
108
107
  processed_template_sigs << dest_sig
@@ -131,6 +130,40 @@ module Bash
131
130
  end
132
131
  end
133
132
 
133
+ def emit_preferred_node(template_node, dest_node)
134
+ if preference_for_pair(template_node, dest_node) == :destination
135
+ emit_node(dest_node, @dest_analysis)
136
+ else
137
+ emit_node(template_node, @template_analysis)
138
+ end
139
+ end
140
+
141
+ def preference_for_pair(template_node, dest_node)
142
+ return @preference unless @preference.is_a?(Hash)
143
+
144
+ typed_template = apply_node_typing(template_node)
145
+ typed_dest = apply_node_typing(dest_node)
146
+
147
+ if Ast::Merge::NodeTyping.typed_node?(typed_template)
148
+ merge_type = Ast::Merge::NodeTyping.merge_type_for(typed_template)
149
+ return @preference.fetch(merge_type) { default_preference } if merge_type
150
+ end
151
+
152
+ if Ast::Merge::NodeTyping.typed_node?(typed_dest)
153
+ merge_type = Ast::Merge::NodeTyping.merge_type_for(typed_dest)
154
+ return @preference.fetch(merge_type) { default_preference } if merge_type
155
+ end
156
+
157
+ default_preference
158
+ end
159
+
160
+ def apply_node_typing(node)
161
+ return node unless @node_typing
162
+ return node unless node
163
+
164
+ Ast::Merge::NodeTyping.process(node, @node_typing)
165
+ end
166
+
134
167
  # Emit a single node to the emitter
135
168
  # @param node [NodeWrapper] Node to emit
136
169
  # @param analysis [FileAnalysis] Analysis for accessing source
@@ -176,6 +176,7 @@ module Bash
176
176
  @dest_analysis,
177
177
  preference: @preference,
178
178
  add_template_only_nodes: @add_template_only_nodes,
179
+ node_typing: @node_typing,
179
180
  )
180
181
  end
181
182
 
@@ -5,7 +5,7 @@ module Bash
5
5
  # Version information for Bash::Merge
6
6
  module Version
7
7
  # Current version of the bash-merge gem
8
- VERSION = "2.0.4"
8
+ VERSION = "2.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: bash-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -46,7 +46,7 @@ dependencies:
46
46
  version: '5.0'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 5.0.2
49
+ version: 5.0.3
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
@@ -56,7 +56,7 @@ dependencies:
56
56
  version: '5.0'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 5.0.2
59
+ version: 5.0.3
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: ast-merge
62
62
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '4.0'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 4.0.3
69
+ version: 4.0.5
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '4.0'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 4.0.3
79
+ version: 4.0.5
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: version_gem
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -315,10 +315,10 @@ licenses:
315
315
  - MIT
316
316
  metadata:
317
317
  homepage_uri: https://bash-merge.galtzo.com/
318
- source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v2.0.4
319
- changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.4/CHANGELOG.md
318
+ source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v2.0.5
319
+ changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.5/CHANGELOG.md
320
320
  bug_tracker_uri: https://github.com/kettle-rb/bash-merge/issues
321
- documentation_uri: https://www.rubydoc.info/gems/bash-merge/2.0.4
321
+ documentation_uri: https://www.rubydoc.info/gems/bash-merge/2.0.5
322
322
  funding_uri: https://github.com/sponsors/pboling
323
323
  wiki_uri: https://github.com/kettle-rb/bash-merge/wiki
324
324
  news_uri: https://www.railsbling.com/tags/bash-merge
@@ -347,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
347
347
  - !ruby/object:Gem::Version
348
348
  version: '0'
349
349
  requirements: []
350
- rubygems_version: 4.0.3
350
+ rubygems_version: 4.0.5
351
351
  specification_version: 4
352
352
  summary: "☯️ Intelligent Bash script merging using tree-sitter AST analysis"
353
353
  test_files: []
metadata.gz.sig CHANGED
Binary file