bash-merge 2.0.2 → 2.0.4

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: 8cb1f588d16bc16abaf8a038d6500557c5f0ce073e49a263150fbd14494e70b0
4
- data.tar.gz: f0ab410cf98764e952b3f8ccfdd3e2c0e68b59b5a3e6d55d1a7cefb550e85fd6
3
+ metadata.gz: 537268a1e7226b74f86d72b94a17fd1a5da6c5a995fd6f6d6623949c9436f048
4
+ data.tar.gz: 0d5d29f36d35e1c4b56597f97f563d8da1345e380d23a9a2a5be350342c1f5b1
5
5
  SHA512:
6
- metadata.gz: c4bc5517fcd343dc237f1f61d666a31d64fce859177f8822a1a8a292adc27cda106f9f8ef3a36f75c1a7a8b000a2023ed496ace5e8a7dcc0d9c2d6ec3086dc27
7
- data.tar.gz: d236e4fe72a0487a325c2f0846a7b3486f5d3c9b2f656502b3eacf555d7d0e5b724fb99285ab50bea85b0d1f38c470b1292796efdb6110488471a75de92c97b2
6
+ metadata.gz: 5557dbf95b0dfacbd1fbeb899ea20b7b03eda1453ffd5e16912667e5b033c020291772bfff5d25cceea8bd8733e6b3aed3244d495465c3266d6cce55d1cf86e3
7
+ data.tar.gz: 0acf658b9e0f0b9754866564fb99133511d6a96fc008bc5e9949a43fe3274baa0b5492af1c7c5df8f70dca4dbbb3166c940552caaf005c9c12870a375a72bd41
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,30 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.4] - 2026-01-20
34
+
35
+ - TAG: [v2.0.4][2.0.4t]
36
+ - COVERAGE: 100.00% -- 25/25 lines in 1 files
37
+ - BRANCH COVERAGE: 100.00% -- 4/4 branches in 1 files
38
+ - 96.33% documented
39
+
40
+ ### Changed
41
+
42
+ - Upgrade to [ast-merge v4.0.3](https://github.com/kettle-rb/ast-merge/releases/tag/v4.0.3)
43
+ - Upgrade to [tree_haver v5.0.2](https://github.com/kettle-rb/tree_haver/releases/tag/v5.0.2)
44
+
45
+ ## [2.0.3] - 2026-01-11
46
+
47
+ - TAG: [v2.0.3][2.0.3t]
48
+ - COVERAGE: 96.16% -- 501/521 lines in 11 files
49
+ - BRANCH COVERAGE: 76.22% -- 125/164 branches in 11 files
50
+ - 96.33% documented
51
+
52
+ ### Changed
53
+
54
+ - ast-merge v4.0.2
55
+ - tree_haver v5.0.1
56
+
33
57
  ## [2.0.2] - 2026-01-09
34
58
 
35
59
  - TAG: [v2.0.2][2.0.2t]
@@ -125,7 +149,11 @@ Please file a bug if you notice a violation of semantic versioning.
125
149
 
126
150
  ### Security
127
151
 
128
- [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...HEAD
152
+ [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.4...HEAD
153
+ [2.0.4]: https://github.com/kettle-rb/bash-merge/compare/v2.0.3...v2.0.4
154
+ [2.0.4t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.4
155
+ [2.0.3]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...v2.0.3
156
+ [2.0.3t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.3
129
157
  [2.0.2]: https://github.com/kettle-rb/bash-merge/compare/v2.0.1...v2.0.2
130
158
  [2.0.2t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.2
131
159
  [2.0.1]: https://github.com/kettle-rb/bash-merge/compare/v2.0.0...v2.0.1
data/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  | 📍 NOTE |
2
2
  | --- |
3
- | RubyGems (the [GitHub org](https://github.com/rubygems/), not the website) [suffered](https://joel.drapper.me/p/ruby-central-security-measures/) a [hostile takeover](https://pup-e.com/blog/goodbye-rubygems/) in September 2025. |
4
- | Ultimately [4 maintainers](https://www.reddit.com/r/ruby/s/gOk42POCaV) were [hard removed](https://bsky.app/profile/martinemde.com/post/3m3occezxxs2q) and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
- | It is a [complicated story](https://joel.drapper.me/p/ruby-central-takeover/) which is difficult to [parse quickly](https://joel.drapper.me/p/ruby-central-fact-check/). |
6
- | Simply put - there was active policy for adding or removing maintainers/owners of [rubygems](https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196) and [bundler](https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/bundler/playbooks/TEAM_CHANGES.md), and those [policies were not followed](https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/). |
7
- | I'm adding notes like this to gems because I [don't condone theft](https://joel.drapper.me/p/ruby-central/) of repositories or gems from their rightful owners. |
3
+ | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
+ | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
+ | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
+ | Simply put - there was active policy for adding or removing maintainers/owners of [rubygems][rubygems-maint-policy] and [bundler][bundler-maint-policy], and those [policies were not followed][policy-fail]. |
7
+ | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
8
8
  | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
9
- | Disenfranchised former-maintainers have started [gem.coop](https://gem.coop). |
9
+ | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
10
10
  | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
11
- | The ["Technology for Humans: Joel Draper"](https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6) podcast episode by [reinteractive](https://reinteractive.com/ruby-on-rails) is the most cogent summary I'm aware of. |
12
- | See [here](https://github.com/gem-coop/gem.coop/issues/12), [here](https://gem.coop) and [here](https://martinemde.com/2025/10/05/announcing-gem-coop.html) for more info on what comes next. |
13
- | What I'm doing: A (WIP) proposal for [bundler/gem scopes](https://github.com/galtzo-floss/bundle-namespace), and a (WIP) proposal for a federated [gem server](https://github.com/galtzo-floss/gem-server). |
11
+ | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
12
+ | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
13
+ | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
14
14
 
15
15
  [rubygems-org]: https://github.com/rubygems/
16
16
  [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
@@ -31,7 +31,7 @@
31
31
  [rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
32
32
  [policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
33
33
 
34
- [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0](https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg)](https://discord.gg/3qme4XHNKN) [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5](https://logos.galtzo.com/assets/images/ruby-lang/avatar-192px.svg)](https://www.ruby-lang.org/) [![kettle-rb Logo by Aboling0, CC BY-SA 4.0](https://logos.galtzo.com/assets/images/kettle-rb/avatar-192px.svg)](https://github.com/kettle-rb)
34
+ [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-rb Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-rb-i]][🖼️kettle-rb]
35
35
 
36
36
  [🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
37
37
  [🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
@@ -42,35 +42,37 @@
42
42
 
43
43
  # ☯️ Bash::Merge
44
44
 
45
- [![Version](https://img.shields.io/gem/v/bash-merge.svg)](https://bestgems.org/gems/bash-merge) [![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/kettle-rb/bash-merge.svg)](http://github.com/kettle-rb/bash-merge/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-259D6C.svg)](https://opensource.org/licenses/MIT) [![Downloads Rank](https://img.shields.io/gem/rd/bash-merge.svg)](https://bestgems.org/gems/bash-merge) [![Open Source Helpers](https://www.codetriage.com/kettle-rb/bash-merge/badges/users.svg)](https://www.codetriage.com/kettle-rb/bash-merge) [![CodeCov Test Coverage](https://codecov.io/gh/kettle-rb/bash-merge/graph/badge.svg)](https://codecov.io/gh/kettle-rb/bash-merge) [![Coveralls Test Coverage](https://coveralls.io/repos/github/kettle-rb/bash-merge/badge.svg?branch=main)](https://coveralls.io/github/kettle-rb/bash-merge?branch=main) [![QLTY Test Coverage](https://qlty.sh/gh/kettle-rb/projects/bash-merge/coverage.svg)](https://qlty.sh/gh/kettle-rb/projects/bash-merge/metrics/code?sort=coverageRating) [![QLTY Maintainability](https://qlty.sh/gh/kettle-rb/projects/bash-merge/maintainability.svg)](https://qlty.sh/gh/kettle-rb/projects/bash-merge) [![CI Heads](https://github.com/kettle-rb/bash-merge/actions/workflows/heads.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/heads.yml) [![CI Runtime Dependencies @ HEAD](https://github.com/kettle-rb/bash-merge/actions/workflows/dep-heads.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/dep-heads.yml) [![CI Current](https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml) [![CI Truffle Ruby](https://github.com/kettle-rb/bash-merge/actions/workflows/truffle.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/truffle.yml) [![Deps Locked](https://github.com/kettle-rb/bash-merge/actions/workflows/locked_deps.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/locked_deps.yml) [![Deps Unlocked](https://github.com/kettle-rb/bash-merge/actions/workflows/unlocked_deps.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/unlocked_deps.yml) [![CI Supported](https://github.com/kettle-rb/bash-merge/actions/workflows/supported.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/supported.yml) [![CI Test Coverage](https://github.com/kettle-rb/bash-merge/actions/workflows/coverage.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/coverage.yml) [![CI Style](https://github.com/kettle-rb/bash-merge/actions/workflows/style.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/style.yml) [![CodeQL](https://github.com/kettle-rb/bash-merge/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/security/code-scanning) [![Apache SkyWalking Eyes License Compatibility Check](https://github.com/kettle-rb/bash-merge/actions/workflows/license-eye.yml/badge.svg)](https://github.com/kettle-rb/bash-merge/actions/workflows/license-eye.yml)
45
+ [![Version][👽versioni]][bash-merge-gem] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][bash-merge-gem] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][bash-merge-ci] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
46
46
 
47
- `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know](https://discord.gg/3qme4XHNKN), as I may have missed the [discord notification](https://discord.gg/3qme4XHNKN).
47
+ `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
48
48
 
49
49
  -----
50
+
50
51
  `if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
51
52
 
52
- [![OpenCollective Backers](https://opencollective.com/kettle-rb/backers/badge.svg?style=flat)](https://opencollective.com/kettle-rb#backer) [![OpenCollective Sponsors](https://opencollective.com/kettle-rb/sponsors/badge.svg?style=flat)](https://opencollective.com/kettle-rb#sponsor) [![Sponsor Me on Github](https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github)](https://github.com/sponsors/pboling) [![Liberapay Goal Progress](https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat)](https://liberapay.com/pboling/donate) [![Donate on PayPal](https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal)](https://www.paypal.com/paypalme/peterboling) [![Buy me a coffee](https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat)](https://www.buymeacoffee.com/pboling) [![Donate on Polar](https://img.shields.io/badge/polar-donate-a51611.svg?style=flat)](https://polar.sh/pboling) [![Donate at ko-fi.com](https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat)](https://ko-fi.com/O5O86SNP4)
53
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
53
54
 
54
55
  ## 🌻 Synopsis
55
56
 
56
- Bash::Merge is a standalone Ruby module that intelligently merges two versions of a Bash script using tree-sitter AST analysis. It's like a smart "git merge" specifically designed for shell scripts. Built on top of [ast-merge](https://github.com/kettle-rb/ast-merge), it shares the same architecture as [prism-merge](https://github.com/kettle-rb/prism-merge) for Ruby source files.
57
+ Bash::Merge is a standalone Ruby module that intelligently merges two versions of a Bash script using tree-sitter AST analysis. It's like a smart "git merge" specifically designed for shell scripts. Built on top of [ast-merge][ast-merge], it shares the same architecture as [prism-merge][prism-merge] for Ruby source files.
57
58
 
58
59
  ### Key Features
59
60
 
60
- - **Tree-Sitter Powered**: Uses tree-sitter-bash for accurate AST parsing
61
- - **Script-Aware**: Understands Bash syntax including functions, variables, and commands
62
- - **Intelligent**: Matches functions and variable assignments by name
63
- - **Comment-Preserving**: Comments are preserved in their context
64
- - **Shebang Handling**: Properly handles `#!/bin/bash` and similar shebangs
65
- - **Freeze Block Support**: Respects freeze markers (default: `bash-merge:freeze` / `bash-merge:unfreeze`) for merge control - customizable to match your project's conventions
66
- - **Full Provenance**: Tracks origin of every node
67
- - **Standalone**: Minimal dependencies - just `ast-merge` and `ruby_tree_sitter`
68
- - **Customizable**:
69
- - `signature_generator` - callable custom signature generators
70
- - `preference` - setting of `:template`, `:destination`, or a Hash for per-node-type preferences
71
- - `node_splitter` - Hash mapping node types to callables for per-node-type merge customization (see [ast-merge](https://github.com/kettle-rb/ast-merge) docs)
72
- - `add_template_only_nodes` - setting to retain nodes that do not exist in destination
73
- - `freeze_token` - customize freeze block markers (default: `"bash-merge"`)
61
+ - **Tree-Sitter Powered**: Uses tree-sitter-bash for accurate AST parsing
62
+ - **Script-Aware**: Understands Bash syntax including functions, variables, and commands
63
+ - **Intelligent**: Matches functions and variable assignments by name
64
+ - **Comment-Preserving**: Comments are preserved in their context
65
+ - **Shebang Handling**: Properly handles `#!/bin/bash` and similar shebangs
66
+ - **Freeze Block Support**: Respects freeze markers (default: `bash-merge:freeze` / `bash-merge:unfreeze`) for merge control - customizable to match your project's conventions
67
+ - **Full Provenance**: Tracks origin of every node
68
+ - **Standalone**: Minimal dependencies - just `ast-merge` and `ruby_tree_sitter`
69
+ - **Customizable**:
70
+ - `signature_generator` - callable custom signature generators
71
+ - `preference` - setting of `:template`, `:destination`, or a Hash for per-node-type preferences
72
+ - `node_splitter` - Hash mapping node types to callables for per-node-type merge customization (see [ast-merge][ast-merge] docs)
73
+ - `add_template_only_nodes` - setting to retain nodes that do not exist in destination
74
+ - `freeze_token` - customize freeze block markers (default: `"bash-merge"`)
75
+
74
76
  ### Supported Node Types
75
77
 
76
78
  | Node Type | Signature Format | Matching Behavior |
@@ -86,7 +88,7 @@ Bash::Merge is a standalone Ruby module that intelligently merges two versions o
86
88
 
87
89
  ### Example
88
90
 
89
- ``` ruby
91
+ ```ruby
90
92
  require "bash/merge"
91
93
 
92
94
  template = File.read("template.sh")
@@ -102,37 +104,38 @@ File.write("merged.sh", result.to_bash)
102
104
 
103
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.
104
106
 
105
- | Gem | Language<br>/ Format | Parser Backend(s) | Description |
106
- |------------------------------------------|----------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
107
- | [tree_haver][tree_haver] | Multi | MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
108
- | [ast-merge][ast-merge] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
109
- | [bash-merge][bash-merge] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
110
- | [commonmarker-merge][commonmarker-merge] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
111
- | [dotenv-merge][dotenv-merge] | Dotenv | internal | Smart merge for `.env` files |
112
- | [json-merge][json-merge] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
113
- | [jsonc-merge][jsonc-merge] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
114
- | [markdown-merge][markdown-merge] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver) | **Foundation**: Shared base for Markdown mergers with inner code block merging |
115
- | [markly-merge][markly-merge] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
116
- | [prism-merge][prism-merge] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
117
- | [psych-merge][psych-merge] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
118
- | [rbs-merge][rbs-merge] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
119
- | [toml-merge][toml-merge] | TOML | [Citrus + toml-rb][toml-rb] (default, via tree_haver), [tree-sitter-toml][ts-toml] (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] | [![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 |
120
122
 
121
123
  #### Backend Platform Compatibility
122
124
 
123
125
  tree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:
124
126
 
125
- | Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
126
- |------------------------------------------------|:---:|:-----:|:-----------:|-----------------------------------------------------|
127
- | **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) | ✅ | ❌ | ❌ | C extension, MRI only |
128
- | **Rust** ([tree_stump][tree_stump]) | ✅ | ❌ | ❌ | Rust extension via magnus/rb-sys, MRI only |
129
- | **FFI** | ✅ | ✅ | ❌ | TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
130
- | **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
131
- | **Prism** | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
132
- | **Psych** | ✅ | ✅ | ✅ | YAML parsing, stdlib |
133
- | **Citrus** | ✅ | ✅ | ✅ | Pure Ruby, no native dependencies |
134
- | **Commonmarker** | ✅ | | | Rust extension for Markdown |
135
- | **Markly** | ✅ | ❌ | ❓ | C extension for Markdown |
127
+ | Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
128
+ |-------------------------------------------------|:---:|:-----:|:-----------:|----------------------------------------------------------------------------|
129
+ | **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) | ✅ | ❌ | ❌ | C extension, MRI only |
130
+ | **Rust** ([tree_stump][tree_stump]) | ✅ | ❌ | ❌ | Rust extension via magnus/rb-sys, MRI only |
131
+ | **FFI** ([ffi][ffi]) | ✅ | ✅ | ❌ | TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
132
+ | **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
133
+ | **Prism** ([prism][prism]) | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
134
+ | **Psych** ([psych][psych]) | ✅ | ✅ | ✅ | YAML parsing, stdlib |
135
+ | **Citrus** ([citrus][citrus]) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
136
+ | **Parslet** ([parslet][parslet]) | ✅ | | | Pure Ruby PEG parser, no native dependencies |
137
+ | **Commonmarker** ([commonmarker][commonmarker]) | ✅ | ❌ | ❓ | Rust extension for Markdown (via [commonmarker-merge][commonmarker-merge]) |
138
+ | **Markly** ([markly][markly]) | ✅ | ❌ | ❓ | C extension for Markdown (via [markly-merge][markly-merge]) |
136
139
 
137
140
  **Legend**: ✅ = Works, ❌ = Does not work, ❓ = Untested
138
141
 
@@ -164,8 +167,69 @@ tree_haver supports multiple parsing backends, but not all backends work on all
164
167
  [commonmarker-merge]: https://github.com/kettle-rb/commonmarker-merge
165
168
  [kettle-dev]: https://github.com/kettle-rb/kettle-dev
166
169
  [kettle-jem]: https://github.com/kettle-rb/kettle-jem
170
+ [tree_haver-gem]: https://bestgems.org/gems/tree_haver
171
+ [ast-merge-gem]: https://bestgems.org/gems/ast-merge
172
+ [prism-merge-gem]: https://bestgems.org/gems/prism-merge
173
+ [psych-merge-gem]: https://bestgems.org/gems/psych-merge
174
+ [json-merge-gem]: https://bestgems.org/gems/json-merge
175
+ [jsonc-merge-gem]: https://bestgems.org/gems/jsonc-merge
176
+ [bash-merge-gem]: https://bestgems.org/gems/bash-merge
177
+ [rbs-merge-gem]: https://bestgems.org/gems/rbs-merge
178
+ [dotenv-merge-gem]: https://bestgems.org/gems/dotenv-merge
179
+ [toml-merge-gem]: https://bestgems.org/gems/toml-merge
180
+ [markdown-merge-gem]: https://bestgems.org/gems/markdown-merge
181
+ [markly-merge-gem]: https://bestgems.org/gems/markly-merge
182
+ [commonmarker-merge-gem]: https://bestgems.org/gems/commonmarker-merge
183
+ [kettle-dev-gem]: https://bestgems.org/gems/kettle-dev
184
+ [kettle-jem-gem]: https://bestgems.org/gems/kettle-jem
185
+ [tree_haver-gem-i]: https://img.shields.io/gem/v/tree_haver.svg
186
+ [ast-merge-gem-i]: https://img.shields.io/gem/v/ast-merge.svg
187
+ [prism-merge-gem-i]: https://img.shields.io/gem/v/prism-merge.svg
188
+ [psych-merge-gem-i]: https://img.shields.io/gem/v/psych-merge.svg
189
+ [json-merge-gem-i]: https://img.shields.io/gem/v/json-merge.svg
190
+ [jsonc-merge-gem-i]: https://img.shields.io/gem/v/jsonc-merge.svg
191
+ [bash-merge-gem-i]: https://img.shields.io/gem/v/bash-merge.svg
192
+ [rbs-merge-gem-i]: https://img.shields.io/gem/v/rbs-merge.svg
193
+ [dotenv-merge-gem-i]: https://img.shields.io/gem/v/dotenv-merge.svg
194
+ [toml-merge-gem-i]: https://img.shields.io/gem/v/toml-merge.svg
195
+ [markdown-merge-gem-i]: https://img.shields.io/gem/v/markdown-merge.svg
196
+ [markly-merge-gem-i]: https://img.shields.io/gem/v/markly-merge.svg
197
+ [commonmarker-merge-gem-i]: https://img.shields.io/gem/v/commonmarker-merge.svg
198
+ [kettle-dev-gem-i]: https://img.shields.io/gem/v/kettle-dev.svg
199
+ [kettle-jem-gem-i]: https://img.shields.io/gem/v/kettle-jem.svg
200
+ [tree_haver-ci-i]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml/badge.svg
201
+ [ast-merge-ci-i]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml/badge.svg
202
+ [prism-merge-ci-i]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml/badge.svg
203
+ [psych-merge-ci-i]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml/badge.svg
204
+ [json-merge-ci-i]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml/badge.svg
205
+ [jsonc-merge-ci-i]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml/badge.svg
206
+ [bash-merge-ci-i]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml/badge.svg
207
+ [rbs-merge-ci-i]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml/badge.svg
208
+ [dotenv-merge-ci-i]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml/badge.svg
209
+ [toml-merge-ci-i]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml/badge.svg
210
+ [markdown-merge-ci-i]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml/badge.svg
211
+ [markly-merge-ci-i]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml/badge.svg
212
+ [commonmarker-merge-ci-i]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml/badge.svg
213
+ [kettle-dev-ci-i]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml/badge.svg
214
+ [kettle-jem-ci-i]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml/badge.svg
215
+ [tree_haver-ci]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml
216
+ [ast-merge-ci]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml
217
+ [prism-merge-ci]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml
218
+ [psych-merge-ci]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml
219
+ [json-merge-ci]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml
220
+ [jsonc-merge-ci]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml
221
+ [bash-merge-ci]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml
222
+ [rbs-merge-ci]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml
223
+ [dotenv-merge-ci]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml
224
+ [toml-merge-ci]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml
225
+ [markdown-merge-ci]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml
226
+ [markly-merge-ci]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml
227
+ [commonmarker-merge-ci]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml
228
+ [kettle-dev-ci]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml
229
+ [kettle-jem-ci]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml
167
230
  [prism]: https://github.com/ruby/prism
168
231
  [psych]: https://github.com/ruby/psych
232
+ [ffi]: https://github.com/ffi/ffi
169
233
  [ts-json]: https://github.com/tree-sitter/tree-sitter-json
170
234
  [ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
171
235
  [ts-bash]: https://github.com/tree-sitter/tree-sitter-bash
@@ -174,26 +238,29 @@ tree_haver supports multiple parsing backends, but not all backends work on all
174
238
  [dotenv]: https://github.com/bkeepers/dotenv
175
239
  [rbs]: https://github.com/ruby/rbs
176
240
  [toml-rb]: https://github.com/emancu/toml-rb
241
+ [toml]: https://github.com/jm/toml
177
242
  [markly]: https://github.com/ioquatix/markly
178
243
  [commonmarker]: https://github.com/gjtorikian/commonmarker
179
244
  [ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
180
245
  [tree_stump]: https://github.com/joker1007/tree_stump
181
246
  [jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter
247
+ [citrus]: https://github.com/mjackson/citrus
248
+ [parslet]: https://github.com/kschiess/parslet
182
249
 
183
250
  ## 💡 Info you can shake a stick at
184
251
 
185
- | Tokens to Remember | [![Gem name](https://img.shields.io/badge/name-bash--merge-3C2D2D.svg?style=square&logo=rubygems&logoColor=red)](https://bestgems.org/gems/bash-merge) [![Gem namespace](https://img.shields.io/badge/namespace-Bash::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white)](https://github.com/kettle-rb/bash-merge) |
252
+ | Tokens to Remember | [![Gem name][⛳️name-img]][bash-merge-gem] [![Gem namespace][⛳️namespace-img]][bash-merge] |
186
253
  | --- | --- |
187
- | Works with JRuby | [![JRuby 10.0 Compat](https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green)](https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml) [![JRuby HEAD Compat](https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue)](https://github.com/kettle-rb/bash-merge/actions/workflows/heads.yml) |
188
- | Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat](https://img.shields.io/badge/Truffle_Ruby-23.1-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink)](https://github.com/kettle-rb/bash-merge/actions/workflows/truffle.yml) [![Truffle Ruby 24.1 Compat](https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green)](https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml) |
189
- | Works with MRI Ruby 3 | [![Ruby 3.2 Compat](https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white)](https://github.com/kettle-rb/bash-merge/actions/workflows/supported.yml) [![Ruby 3.3 Compat](https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white)](https://github.com/kettle-rb/bash-merge/actions/workflows/supported.yml) [![Ruby 3.4 Compat](https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green)](https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml) [![Ruby HEAD Compat](https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue)](https://github.com/kettle-rb/bash-merge/actions/workflows/heads.yml) |
190
- | Support & Community | [![Join Me on Daily.dev's RubyFriends](https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white)](https://app.daily.dev/squads/rubyfriends) [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN) [![Get help from me on Upwork](https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white)](https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share) [![Get help from me on Codementor](https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white)](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github) |
191
- | Source | [![Source on GitLab.com](https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange)](https://gitlab.com/kettle-rb/bash-merge/) [![Source on CodeBerg.org](https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue)](https://codeberg.org/kettle-rb/bash-merge) [![Source on Github.com](https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green)](https://github.com/kettle-rb/bash-merge) [![The best SHA: dQw4w9WgXcQ\!](https://img.shields.io/badge/KLOC-4.308-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue)](https://www.youtube.com/watch?v=dQw4w9WgXcQ) |
192
- | Documentation | [![Current release on RubyDoc.info](https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white)](http://rubydoc.info/gems/bash-merge) [![YARD on Galtzo.com](https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white)](https://bash-merge.galtzo.com) [![Maintainer Blog](https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange)](http://www.railsbling.com/tags/bash-merge) [![GitLab Wiki](https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white)](https://gitlab.com/kettle-rb/bash-merge/-/wikis/home) [![GitHub Wiki](https://img.shields.io/badge/wiki-examples-943CD2.svg?style=for-the-badge&logo=github&logoColor=white)](https://github.com/kettle-rb/bash-merge/wiki) |
193
- | Compliance | [![License: MIT](https://img.shields.io/badge/License-MIT-259D6C.svg)](https://opensource.org/licenses/MIT) [![Compatible with Apache Software Projects: Verified by SkyWalking Eyes](https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache)](https://dev.to/galtzo/how-to-check-license-compatibility-41h0) [![📄ilo-declaration-img](https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat)](https://www.ilo.org/declaration/lang--en/index.htm) [![Security Policy](https://img.shields.io/badge/security-policy-259D6C.svg?style=flat)](SECURITY.md) [![Contributor Covenant 2.1](https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg)](CODE_OF_CONDUCT.md) [![SemVer 2.0.0](https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat)](https://semver.org/spec/v2.0.0.html) |
194
- | Style | [![Enforced Code Style Linter](https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white)](https://github.com/rubocop-lts/rubocop-lts) [![Keep-A-Changelog 1.0.0](https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat)](https://keepachangelog.com/en/1.0.0/) [![Gitmoji Commits](https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square)](https://gitmoji.dev) [![Compatibility appraised by: appraisal2](https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white)](https://github.com/appraisal-rb/appraisal2) |
195
- | Maintainer 🎖️ | [![Follow Me on LinkedIn](https://img.shields.io/badge/PeterBoling-LinkedIn-0B66C2?style=flat&logo=newjapanprowrestling)](http://www.linkedin.com/in/peterboling) [![Follow Me on Ruby.Social](https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo)](https://ruby.social/@galtzo) [![Follow Me on Bluesky](https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white)](https://bsky.app/profile/galtzo.com) [![Contact Maintainer](https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red)](http://www.railsbling.com/contact) [![My technical writing](https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white)](https://dev.to/galtzo) |
196
- | `...` 💖 | [![Find Me on WellFound:](https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound)](https://wellfound.com/u/peter-boling) [![Find Me on CrunchBase](https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase)](https://www.crunchbase.com/person/peter-boling) [![My LinkTree](https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree)](https://linktr.ee/galtzo) [![More About Me](https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white)](https://about.me/peter.boling) [🧊](https://codeberg.org/pboling) [🐙](https://github.org/pboling) [🛖](https://sr.ht/~galtzo/) [🧪](https://gitlab.com/pboling) |
254
+ | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][bash-merge-ci] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
255
+ | Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][bash-merge-ci] |
256
+ | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][bash-merge-ci] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
257
+ | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
258
+ | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][bash-merge] [![The best SHA: dQw4w9WgXcQ\!](https://img.shields.io/badge/KLOC-4.308-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue)][🧮kloc] |
259
+ | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
260
+ | Compliance | [![License: MIT][📄license-img]][📄license-ref] [![Compatible with Apache Software Projects: Verified by SkyWalking Eyes][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img][📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
261
+ | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
262
+ | Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] |
263
+ | `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
197
264
 
198
265
  ### Compatibility
199
266
 
@@ -201,25 +268,25 @@ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRu
201
268
 
202
269
  | 🚚 *Amazing* test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
203
270
  | --- | --- |
204
- | 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2](https://github.com/appraisal-rb/appraisal2) ✨ |
271
+ | 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
205
272
 
206
273
  ### Federated DVCS
207
274
 
208
275
  <details markdown="1">
209
276
  <summary>Find this repo on federated forges (Coming soon!)</summary>
210
277
 
211
- | Federated [DVCS](https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/) Repository | Status | Issues | PRs | Wiki | CI | Discussions |
278
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
212
279
  | --- | --- | --- | --- | --- | --- | --- |
213
- | 🧪 [kettle-rb/bash-merge on GitLab](https://gitlab.com/kettle-rb/bash-merge/) | The Truth | [💚](https://gitlab.com/kettle-rb/bash-merge/-/issues) | [💚](https://gitlab.com/kettle-rb/bash-merge/-/merge_requests) | [💚](https://gitlab.com/kettle-rb/bash-merge/-/wikis/home) | 🐭 Tiny Matrix | ➖ |
214
- | 🧊 [kettle-rb/bash-merge on CodeBerg](https://codeberg.org/kettle-rb/bash-merge) | An Ethical Mirror ([Donate](https://donate.codeberg.org/)) | [💚](https://codeberg.org/kettle-rb/bash-merge/issues) | [💚](https://codeberg.org/kettle-rb/bash-merge/pulls) | ➖ | ⭕️ No Matrix | ➖ |
215
- | 🐙 [kettle-rb/bash-merge on GitHub](https://github.com/kettle-rb/bash-merge) | Another Mirror | [💚](https://github.com/kettle-rb/bash-merge/issues) | [💚](https://github.com/kettle-rb/bash-merge/pulls) | [💚](https://github.com/kettle-rb/bash-merge/wiki) | 💯 Full Matrix | [💚](https://github.com/kettle-rb/bash-merge/discussions) |
216
- | 🎮️ [Discord Server](https://discord.gg/3qme4XHNKN) | [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN) | [Let's](https://discord.gg/3qme4XHNKN) | [talk](https://discord.gg/3qme4XHNKN) | [about](https://discord.gg/3qme4XHNKN) | [this](https://discord.gg/3qme4XHNKN) | [library\!](https://discord.gg/3qme4XHNKN) |
280
+ | 🧪 [kettle-rb/bash-merge on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
281
+ | 🧊 [kettle-rb/bash-merge on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
282
+ | 🐙 [kettle-rb/bash-merge on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
283
+ | 🎮️ [Discord Server][🖼️galtzo-discord] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord] | [Let's][🖼️galtzo-discord] | [talk][🖼️galtzo-discord] | [about][🖼️galtzo-discord] | [this][🖼️galtzo-discord] | [library\!][🖼️galtzo-discord] |
217
284
 
218
285
  </details>
219
286
 
220
287
  [gh-discussions]: https://github.com/kettle-rb/bash-merge/discussions
221
288
 
222
- ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/bash-merge)](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_source=rubygems-bash-merge&utm_medium=referral&utm_campaign=readme)
289
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/bash-merge)][🏙️entsup-tidelift]
223
290
 
224
291
  Available as part of the Tidelift Subscription.
225
292
 
@@ -228,33 +295,30 @@ Available as part of the Tidelift Subscription.
228
295
 
229
296
  The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
230
297
 
231
- [![Get help from me on Tidelift](https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white)](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_source=rubygems-bash-merge&utm_medium=referral&utm_campaign=readme)
232
-
233
- - 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
234
-
235
- - 💡Tidelift is part of [Sonar](https://blog.tidelift.com/tidelift-joins-sonar)
298
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
236
299
 
237
- - 💡Tidelift pays maintainers to maintain the software you depend on\!<br/>📊`@`Pointy Haired Boss: An [enterprise support](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_source=rubygems-bash-merge&utm_medium=referral&utm_campaign=readme) subscription is "[never gonna let you down](https://www.youtube.com/watch?v=dQw4w9WgXcQ)", and *supports* open source maintainers
238
- Alternatively:
300
+ - 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
301
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
302
+ - 💡Tidelift pays maintainers to maintain the software you depend on\!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
303
+ Alternatively:
239
304
 
240
- - [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN)
305
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
306
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
307
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
241
308
 
242
- - [![Get help from me on Upwork](https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white)](https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share)
243
-
244
- - [![Get help from me on Codementor](https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white)](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github)
245
309
  </details>
246
310
 
247
311
  ## ✨ Installation
248
312
 
249
313
  Install the gem and add to the application's Gemfile by executing:
250
314
 
251
- ``` console
315
+ ```console
252
316
  bundle add bash-merge
253
317
  ```
254
318
 
255
319
  If bundler is not being used to manage dependencies, install the gem by executing:
256
320
 
257
- ``` console
321
+ ```console
258
322
  gem install bash-merge
259
323
  ```
260
324
 
@@ -263,19 +327,19 @@ gem install bash-merge
263
327
  <details markdown="1">
264
328
  <summary>For Medium or High Security Installations</summary>
265
329
 
266
- This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512](https://gitlab.com/kettle-rb/bash-merge/-/tree/main/checksums) checksums by
267
- [stone\_checksums](https://github.com/galtzo-floss/stone_checksums). Be sure the gem you install hasn’t been tampered with
330
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
331
+ [stone\_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
268
332
  by following the instructions below.
269
333
 
270
334
  Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
271
335
 
272
- ``` console
336
+ ```console
273
337
  gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
274
338
  ```
275
339
 
276
340
  You only need to do that once. Then proceed to install with:
277
341
 
278
- ``` console
342
+ ```console
279
343
  gem install bash-merge -P HighSecurity
280
344
  ```
281
345
 
@@ -283,7 +347,7 @@ The `HighSecurity` trust profile will verify signed gems, and not allow the inst
283
347
 
284
348
  If you want to up your security game full-time:
285
349
 
286
- ``` console
350
+ ```console
287
351
  bundle config set --global trust-policy MediumSecurity
288
352
  ```
289
353
 
@@ -304,7 +368,8 @@ Bash syntax parsing capabilities.
304
368
  Download pre-built parsers from [Faveod/tree-sitter-parsers](https://github.com/Faveod/tree-sitter-parsers/releases):
305
369
 
306
370
  **Linux (x64):**
307
- ``` console
371
+
372
+ ```console
308
373
  # Download and extract
309
374
  curl -Lo parsers.tar.gz https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-linux-x64.tar.gz
310
375
  tar -xzf parsers.tar.gz
@@ -320,13 +385,15 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.s
320
385
  ```
321
386
 
322
387
  **Debian/Ubuntu (amd64):**
323
- ``` console
388
+
389
+ ```console
324
390
  curl -Lo parsers.deb https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-amd64.deb
325
391
  sudo dpkg -i parsers.deb
326
392
  ```
327
393
 
328
394
  **macOS (Apple Silicon):**
329
- ``` console
395
+
396
+ ```console
330
397
  curl -Lo parsers.tar.gz https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-macos-arm64.tar.gz
331
398
  tar -xzf parsers.tar.gz
332
399
 
@@ -338,7 +405,7 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.d
338
405
 
339
406
  #### Option 2: Build from Source
340
407
 
341
- ``` console
408
+ ```console
342
409
  git clone https://github.com/tree-sitter/tree-sitter-bash.git
343
410
  cd tree-sitter-bash
344
411
  make
@@ -352,7 +419,8 @@ sudo cp libtree-sitter-bash.dylib /usr/local/lib/ # macOS
352
419
  Some package managers provide tree-sitter parsers:
353
420
 
354
421
  **Fedora Atomic (Silverblue, Kinoite, Bazzite, Aurora, etc.):**
355
- ``` console
422
+
423
+ ```console
356
424
  # Install via rpm-ostree (requires reboot)
357
425
  rpm-ostree install libtree-sitter-bash
358
426
 
@@ -362,12 +430,14 @@ export TREE_SITTER_BASH_PATH="/usr/lib64/libtree-sitter-bash.so"
362
430
  ```
363
431
 
364
432
  **Fedora (traditional):**
365
- ``` console
433
+
434
+ ```console
366
435
  sudo dnf install libtree-sitter-bash
367
436
  ```
368
437
 
369
438
  **Arch Linux:**
370
- ``` console
439
+
440
+ ```console
371
441
  # Check AUR for tree-sitter-bash
372
442
  yay -S tree-sitter-bash
373
443
  ```
@@ -377,16 +447,18 @@ yay -S tree-sitter-bash
377
447
  If the parser is not in a standard location (`/usr/lib/`, `/usr/lib64/`, `/usr/local/lib/`),
378
448
  set the `TREE_SITTER_BASH_PATH` environment variable to point to the parser library:
379
449
 
380
- ``` console
450
+ ```console
381
451
  export TREE_SITTER_BASH_PATH="/path/to/libtree-sitter-bash.so"
382
452
  ```
383
453
 
384
454
  **Note:** Some distributions install the library with a version number suffix
385
455
  (e.g., `libtree-sitter-bash.so.14` instead of `libtree-sitter-bash.so`).
386
456
  If the gem can't find the parser, check for versioned files and either:
387
- - Set `TREE_SITTER_BASH_PATH` to the full versioned path, or
388
- - Create a symlink: `sudo ln -s /usr/lib64/libtree-sitter-bash.so.14 /usr/lib64/libtree-sitter-bash.so`
389
- Add this to your shell profile (`.bashrc`, `.zshrc`, etc.) for persistence.
457
+
458
+ - Set `TREE_SITTER_BASH_PATH` to the full versioned path, or
459
+ - Create a symlink: `sudo ln -s /usr/lib64/libtree-sitter-bash.so.14 /usr/lib64/libtree-sitter-bash.so`
460
+ Add this to your shell profile (`.bashrc`, `.zshrc`, etc.) for persistence.
461
+
390
462
  ### 💎 Ruby Interface Gems
391
463
 
392
464
  In addition to the tree-sitter parser library, you need a Ruby gem that provides
@@ -394,9 +466,9 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
394
466
 
395
467
  | Gem | Ruby Support | Description |
396
468
  | --- | --- | --- |
397
- | [ruby\_tree\_sitter](https://github.com/Faveod/ruby_tree_sitter) | MRI only | C extension bindings (recommended for MRI) |
398
- | [tree\_stump](https://github.com/nickstenning/tree_stump) | MRI (maybe JRuby) | Rust-based bindings via Rutie |
399
- | [ffi](https://github.com/ffi/ffi) | MRI, JRuby, TruffleRuby | Generic FFI bindings (used by tree\_haver's FFI backend) |
469
+ | [ruby\_tree\_sitter][ruby_tree_sitter] | MRI only | C extension bindings (recommended for MRI) |
470
+ | [tree\_stump][tree_stump] | MRI (maybe JRuby) | Rust-based bindings via Rutie |
471
+ | [ffi][ffi] | MRI, JRuby, TruffleRuby | Generic FFI bindings (used by tree\_haver's FFI backend) |
400
472
 
401
473
  [ruby_tree_sitter]: https://github.com/Faveod/ruby_tree_sitter
402
474
  [tree_stump]: https://github.com/nickstenning/tree_stump
@@ -404,25 +476,25 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
404
476
 
405
477
  #### For MRI Ruby (Recommended)
406
478
 
407
- ``` console
479
+ ```console
408
480
  gem install ruby_tree_sitter
409
481
  ```
410
482
 
411
483
  Or add to your Gemfile:
412
484
 
413
- ``` ruby
485
+ ```ruby
414
486
  gem "ruby_tree_sitter", "~> 2.0"
415
487
  ```
416
488
 
417
489
  #### For JRuby or TruffleRuby
418
490
 
419
- ``` console
491
+ ```console
420
492
  gem install ffi
421
493
  ```
422
494
 
423
495
  Or add to your Gemfile:
424
496
 
425
- ``` ruby
497
+ ```ruby
426
498
  gem "ffi"
427
499
  ```
428
500
 
@@ -434,7 +506,7 @@ you must use the FFI backend.
434
506
 
435
507
  ## ⚙️ Configuration
436
508
 
437
- ``` ruby
509
+ ```ruby
438
510
  merger = Bash::Merge::SmartMerger.new(
439
511
  template_content,
440
512
  dest_content,
@@ -463,7 +535,7 @@ merger = Bash::Merge::SmartMerger.new(
463
535
 
464
536
  ### Simple Merge
465
537
 
466
- ``` ruby
538
+ ```ruby
467
539
  require "bash/merge"
468
540
 
469
541
  # Template defines the structure
@@ -524,7 +596,7 @@ puts result.to_bash
524
596
 
525
597
  Freeze blocks protect sections from being overwritten during merge:
526
598
 
527
- ``` bash
599
+ ```bash
528
600
  #!/bin/bash
529
601
 
530
602
  # Configuration
@@ -548,7 +620,7 @@ Content between `# bash-merge:freeze` and `# bash-merge:unfreeze` markers is pre
548
620
 
549
621
  ### Adding Template-Only Nodes
550
622
 
551
- ``` ruby
623
+ ```ruby
552
624
  merger = Bash::Merge::SmartMerger.new(
553
625
  template,
554
626
  destination,
@@ -565,17 +637,17 @@ Raising a monthly budget of... "dollars" would make the project more sustainable
565
637
 
566
638
  We welcome both individual and corporate sponsors\! We also offer a
567
639
  wide array of funding channels to account for your preferences
568
- (although currently [Open Collective](https://opencollective.com/kettle-rb) is our preferred funding platform).
640
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
569
641
 
570
642
  **If you're working in a company that's making significant use of kettle-rb tools we'd
571
643
  appreciate it if you suggest to your company to become a kettle-rb sponsor.**
572
644
 
573
645
  You can support the development of kettle-rb tools via
574
- [GitHub Sponsors](https://github.com/sponsors/pboling),
575
- [Liberapay](https://liberapay.com/pboling/donate),
576
- [PayPal](https://www.paypal.com/paypalme/peterboling),
577
- [Open Collective](https://opencollective.com/kettle-rb)
578
- and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_source=rubygems-bash-merge&utm_medium=referral&utm_campaign=readme).
646
+ [GitHub Sponsors][🖇sponsor],
647
+ [Liberapay][⛳liberapay],
648
+ [PayPal][🖇paypal],
649
+ [Open Collective][🖇osc]
650
+ and [Tidelift][🏙️entsup-tidelift].
579
651
 
580
652
  | 📍 NOTE |
581
653
  | --- |
@@ -583,9 +655,9 @@ and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_sou
583
655
 
584
656
  ### Open Collective for Individuals
585
657
 
586
- Support us with a monthly donation and help us continue our activities. \[[Become a backer](https://opencollective.com/kettle-rb#backer)\]
658
+ Support us with a monthly donation and help us continue our activities. \[[Become a backer][🖇osc-backers]\]
587
659
 
588
- NOTE: [kettle-readme-backers](https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.
660
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
589
661
 
590
662
  <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
591
663
  No backers yet. Be the first!
@@ -593,9 +665,9 @@ No backers yet. Be the first!
593
665
 
594
666
  ### Open Collective for Organizations
595
667
 
596
- Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor](https://opencollective.com/kettle-rb#sponsor)\]
668
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][🖇osc-sponsors]\]
597
669
 
598
- NOTE: [kettle-readme-backers](https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.
670
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
599
671
 
600
672
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
601
673
  No sponsors yet. Be the first!
@@ -609,48 +681,49 @@ I’m driven by a passion to foster a thriving open-source community – a space
609
681
 
610
682
  If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
611
683
 
612
- I’m developing a new library, [floss\_funding](https://github.com/galtzo-floss/floss_funding), designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
684
+ I’m developing a new library, [floss\_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
613
685
 
614
- **[Floss-Funding.dev](https://floss-funding.dev): 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
686
+ **[Floss-Funding.dev]
687
+ [🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
615
688
 
616
- [![OpenCollective Backers](https://opencollective.com/kettle-rb/backers/badge.svg?style=flat)](https://opencollective.com/kettle-rb#backer) [![OpenCollective Sponsors](https://opencollective.com/kettle-rb/sponsors/badge.svg?style=flat)](https://opencollective.com/kettle-rb#sponsor) [![Sponsor Me on Github](https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github)](https://github.com/sponsors/pboling) [![Liberapay Goal Progress](https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat)](https://liberapay.com/pboling/donate) [![Donate on PayPal](https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal)](https://www.paypal.com/paypalme/peterboling) [![Buy me a coffee](https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat)](https://www.buymeacoffee.com/pboling) [![Donate on Polar](https://img.shields.io/badge/polar-donate-a51611.svg?style=flat)](https://polar.sh/pboling) [![Donate to my FLOSS efforts at ko-fi.com](https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat)](https://ko-fi.com/O5O86SNP4) [![Donate to my FLOSS efforts using Patreon](https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat)](https://patreon.com/galtzo)
689
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
617
690
 
618
691
  ## 🔐 Security
619
692
 
620
- See [SECURITY.md](SECURITY.md).
693
+ See [SECURITY.md][🔐security].
621
694
 
622
695
  ## 🤝 Contributing
623
696
 
624
697
  If you need some ideas of where to help, you could work on adding more code coverage,
625
- or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues](https://github.com/kettle-rb/bash-merge/issues), or [PRs](https://github.com/kettle-rb/bash-merge/pulls),
698
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
626
699
  or use the gem and think about how it could be better.
627
700
 
628
- We [![Keep A Changelog](https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat)](https://keepachangelog.com/en/1.0.0/) so if you make changes, remember to update it.
701
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
629
702
 
630
- See [CONTRIBUTING.md](CONTRIBUTING.md) for more detailed instructions.
703
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
631
704
 
632
705
  ### 🚀 Release Instructions
633
706
 
634
- See [CONTRIBUTING.md](CONTRIBUTING.md).
707
+ See [CONTRIBUTING.md][🤝contributing].
635
708
 
636
709
  ### Code Coverage
637
710
 
638
- [![Coverage Graph](https://codecov.io/gh/kettle-rb/bash-merge/graphs/tree.svg)](https://codecov.io/gh/kettle-rb/bash-merge)
711
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
639
712
 
640
- [![Coveralls Test Coverage](https://coveralls.io/repos/github/kettle-rb/bash-merge/badge.svg?branch=main)](https://coveralls.io/github/kettle-rb/bash-merge?branch=main)
713
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
641
714
 
642
- [![QLTY Test Coverage](https://qlty.sh/gh/kettle-rb/projects/bash-merge/coverage.svg)](https://qlty.sh/gh/kettle-rb/projects/bash-merge/metrics/code?sort=coverageRating)
715
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
643
716
 
644
717
  ### 🪇 Code of Conduct
645
718
 
646
719
  Everyone interacting with this project's codebases, issue trackers,
647
- chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1](https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg)](CODE_OF_CONDUCT.md).
720
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
648
721
 
649
722
  ## 🌈 Contributors
650
723
 
651
- [![Contributors](https://contrib.rocks/image?repo=kettle-rb/bash-merge)](https://github.com/kettle-rb/bash-merge/graphs/contributors)
724
+ [![Contributors][🖐contributors-img]][🖐contributors]
652
725
 
653
- Made with [contributors-img](https://contrib.rocks).
726
+ Made with [contributors-img][🖐contrib-rocks].
654
727
 
655
728
  Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/main>
656
729
 
@@ -669,23 +742,23 @@ Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/
669
742
 
670
743
  ## 📌 Versioning
671
744
 
672
- This Library adheres to [![Semantic Versioning 2.0.0](https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat)](https://semver.org/spec/v2.0.0.html).
745
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
673
746
  Violations of this scheme should be reported as bugs.
674
747
  Specifically, if a minor or patch version is released that breaks backward compatibility,
675
748
  a new version should be immediately released that restores compatibility.
676
749
  Breaking changes to the public API will only be introduced with new major versions.
677
750
 
678
751
  > dropping support for a platform is both obviously and objectively a breaking change <br/>
679
- > —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716](https://github.com/semver/semver/issues/716#issuecomment-869336139)
752
+ > —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
680
753
 
681
754
  I understand that policy doesn't work universally ("exceptions to every rule\!"),
682
755
  but it is the policy here.
683
756
  As such, in many cases it is good to specify a dependency on this library using
684
- the [Pessimistic Version Constraint](http://guides.rubygems.org/patterns/#pessimistic-version-constraint) with two digits of precision.
757
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
685
758
 
686
759
  For example:
687
760
 
688
- ``` ruby
761
+ ```ruby
689
762
  spec.add_dependency("bash-merge", "~> 1.0")
690
763
  ```
691
764
 
@@ -698,16 +771,17 @@ is a *breaking change* to an API, and for that reason the bike shedding is endle
698
771
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
699
772
  read this article from the creator of SemVer:
700
773
 
701
- - ["Major Version Numbers are Not Sacred"](https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html)
774
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
775
+
702
776
  </details>
703
777
 
704
- See [CHANGELOG.md](CHANGELOG.md) for a list of releases.
778
+ See [CHANGELOG.md][📌changelog] for a list of releases.
705
779
 
706
780
  ## 📄 License
707
781
 
708
782
  The gem is available as open source under the terms of
709
- the [MIT License](LICENSE.txt) [![License: MIT](https://img.shields.io/badge/License-MIT-259D6C.svg)](https://opensource.org/licenses/MIT).
710
- See [LICENSE.txt](LICENSE.txt) for the official [Copyright Notice](https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year).
783
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
784
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
711
785
 
712
786
  ### © Copyright
713
787
 
@@ -734,11 +808,11 @@ Please consider sponsoring me or the project.
734
808
 
735
809
  To join the community or get help 👇️ Join the Discord.
736
810
 
737
- [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN)
811
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
738
812
 
739
813
  To say "thanks\!" ☝️ Join the Discord or 👇️ send money.
740
814
 
741
- [![Sponsor kettle-rb/bash-merge on Open Source Collective](https://img.shields.io/opencollective/all/kettle-rb?style=for-the-badge)](https://opencollective.com/kettle-rb) 💌 [![Sponsor me on GitHub Sponsors](https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github)](https://github.com/sponsors/pboling) 💌 [![Sponsor me on Liberapay](https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611)](https://liberapay.com/pboling/donate) 💌 [![Donate on PayPal](https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A)](https://www.paypal.com/paypalme/peterboling)
815
+ [![Sponsor kettle-rb/bash-merge on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
742
816
 
743
817
  ### Please give the project a star ⭐ ♥.
744
818
 
@@ -779,7 +853,6 @@ Thanks for RTFM. ☺️
779
853
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
780
854
  [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
781
855
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
782
-
783
856
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
784
857
  [⛳️gem-namespace]: https://github.com/kettle-rb/bash-merge
785
858
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Bash::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
@@ -903,7 +976,7 @@ Thanks for RTFM. ☺️
903
976
  [📌gitmoji]: https://gitmoji.dev
904
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
905
978
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
906
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.519-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
979
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.025-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
907
980
  [🔐security]: SECURITY.md
908
981
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
909
982
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -923,6 +996,3 @@ Thanks for RTFM. ☺️
923
996
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
924
997
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
925
998
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
926
-
927
- [ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
928
- [dotenv]: https://github.com/bkeepers/dotenv
@@ -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.2"
8
+ VERSION = "2.0.4"
9
9
  end
10
10
  VERSION = Version::VERSION # traditional location
11
11
  end
data/lib/bash/merge.rb CHANGED
@@ -113,6 +113,18 @@ module Bash
113
113
  end
114
114
  end
115
115
 
116
+ # Register with ast-merge's MergeGemRegistry for RSpec dependency tags
117
+ # Only register if MergeGemRegistry is loaded (i.e., in test environment)
118
+ if defined?(Ast::Merge::RSpec::MergeGemRegistry)
119
+ Ast::Merge::RSpec::MergeGemRegistry.register(
120
+ :bash_merge,
121
+ require_path: "bash/merge",
122
+ merger_class: "Bash::Merge::SmartMerger",
123
+ test_source: "#!/bin/bash\necho hello",
124
+ category: :code,
125
+ )
126
+ end
127
+
116
128
  Bash::Merge::Version.class_eval do
117
129
  extend VersionGem::Basic
118
130
  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.2
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,40 +43,40 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '4.0'
46
+ version: '5.0'
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 4.0.5
49
+ version: 5.0.2
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: '4.0'
56
+ version: '5.0'
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 4.0.5
59
+ version: 5.0.2
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: ast-merge
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '3.1'
66
+ version: '4.0'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 3.1.0
69
+ version: 4.0.3
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '3.1'
76
+ version: '4.0'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 3.1.0
79
+ version: 4.0.3
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.2
319
- changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.2/CHANGELOG.md
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
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.2
321
+ documentation_uri: https://www.rubydoc.info/gems/bash-merge/2.0.4
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
metadata.gz.sig CHANGED
Binary file