bash-merge 2.0.2 → 2.0.3

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: ca7ede63c1590df94f22fdbffb07c06f1313ae2e09aab64b6b9d1d6174de9077
4
+ data.tar.gz: 885fb700fab46e68b0c614fa936518c0674cb7c3d50ca4466b943ec84dcd25f9
5
5
  SHA512:
6
- metadata.gz: c4bc5517fcd343dc237f1f61d666a31d64fce859177f8822a1a8a292adc27cda106f9f8ef3a36f75c1a7a8b000a2023ed496ace5e8a7dcc0d9c2d6ec3086dc27
7
- data.tar.gz: d236e4fe72a0487a325c2f0846a7b3486f5d3c9b2f656502b3eacf555d7d0e5b724fb99285ab50bea85b0d1f38c470b1292796efdb6110488471a75de92c97b2
6
+ metadata.gz: d6d6b14002558067c7234de6e46a027ad47224289f4bc7b93ac64d40e335e4a786d82bda7f78be56381d8fa7ba6b4e2bd9623309ae5a1895247bb4e8151b6a02
7
+ data.tar.gz: 06a3659679935d65f0f389ed492e92b4f1446c2ebd0d527d6d4a5a3f9c3477757396de637067e0ff4b268c2606ba5c55ea5ea9a9b9ead4d35a6791ba777819b0
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,18 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.3] - 2026-01-11
34
+
35
+ - TAG: [v2.0.3][2.0.3t]
36
+ - COVERAGE: 96.16% -- 501/521 lines in 11 files
37
+ - BRANCH COVERAGE: 76.22% -- 125/164 branches in 11 files
38
+ - 96.33% documented
39
+
40
+ ### Changed
41
+
42
+ - ast-merge v4.0.2
43
+ - tree_haver v5.0.1
44
+
33
45
  ## [2.0.2] - 2026-01-09
34
46
 
35
47
  - TAG: [v2.0.2][2.0.2t]
@@ -125,7 +137,9 @@ Please file a bug if you notice a violation of semantic versioning.
125
137
 
126
138
  ### Security
127
139
 
128
- [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...HEAD
140
+ [Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.3...HEAD
141
+ [2.0.3]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...v2.0.3
142
+ [2.0.3t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.3
129
143
  [2.0.2]: https://github.com/kettle-rb/bash-merge/compare/v2.0.1...v2.0.2
130
144
  [2.0.2t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.2
131
145
  [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,21 +104,21 @@ 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 | 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
 
@@ -130,7 +132,8 @@ tree_haver supports multiple parsing backends, but not all backends work on all
130
132
  | **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
131
133
  | **Prism** | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
132
134
  | **Psych** | ✅ | ✅ | ✅ | YAML parsing, stdlib |
133
- | **Citrus** | ✅ | ✅ | ✅ | Pure Ruby, no native dependencies |
135
+ | **Citrus** | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
136
+ | **Parslet** | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
134
137
  | **Commonmarker** | ✅ | ❌ | ❓ | Rust extension for Markdown |
135
138
  | **Markly** | ✅ | ❌ | ❓ | C extension for Markdown |
136
139
 
@@ -164,6 +167,66 @@ 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
169
232
  [ts-json]: https://github.com/tree-sitter/tree-sitter-json
@@ -174,6 +237,7 @@ tree_haver supports multiple parsing backends, but not all backends work on all
174
237
  [dotenv]: https://github.com/bkeepers/dotenv
175
238
  [rbs]: https://github.com/ruby/rbs
176
239
  [toml-rb]: https://github.com/emancu/toml-rb
240
+ [toml]: https://github.com/jm/toml
177
241
  [markly]: https://github.com/ioquatix/markly
178
242
  [commonmarker]: https://github.com/gjtorikian/commonmarker
179
243
  [ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
@@ -182,18 +246,18 @@ tree_haver supports multiple parsing backends, but not all backends work on all
182
246
 
183
247
  ## 💡 Info you can shake a stick at
184
248
 
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) |
249
+ | Tokens to Remember | [![Gem name][⛳️name-img]][bash-merge-gem] [![Gem namespace][⛳️namespace-img]][bash-merge] |
186
250
  | --- | --- |
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) |
251
+ | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][bash-merge-ci] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
252
+ | 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] |
253
+ | 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] |
254
+ | 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] |
255
+ | 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] |
256
+ | 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] |
257
+ | 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] |
258
+ | 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] |
259
+ | 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] |
260
+ | `...` 💖 | [![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
261
 
198
262
  ### Compatibility
199
263
 
@@ -201,25 +265,25 @@ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRu
201
265
 
202
266
  | 🚚 *Amazing* test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
203
267
  | --- | --- |
204
- | 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2](https://github.com/appraisal-rb/appraisal2) ✨ |
268
+ | 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
205
269
 
206
270
  ### Federated DVCS
207
271
 
208
272
  <details markdown="1">
209
273
  <summary>Find this repo on federated forges (Coming soon!)</summary>
210
274
 
211
- | Federated [DVCS](https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/) Repository | Status | Issues | PRs | Wiki | CI | Discussions |
275
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
212
276
  | --- | --- | --- | --- | --- | --- | --- |
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) |
277
+ | 🧪 [kettle-rb/bash-merge on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
278
+ | 🧊 [kettle-rb/bash-merge on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
279
+ | 🐙 [kettle-rb/bash-merge on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
280
+ | 🎮️ [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
281
 
218
282
  </details>
219
283
 
220
284
  [gh-discussions]: https://github.com/kettle-rb/bash-merge/discussions
221
285
 
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)
286
+ ### Enterprise Support [![Tidelift](https://tidelift.com/badges/package/rubygems/bash-merge)][🏙️entsup-tidelift]
223
287
 
224
288
  Available as part of the Tidelift Subscription.
225
289
 
@@ -228,33 +292,30 @@ Available as part of the Tidelift Subscription.
228
292
 
229
293
  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
294
 
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
295
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
234
296
 
235
- - 💡Tidelift is part of [Sonar](https://blog.tidelift.com/tidelift-joins-sonar)
297
+ - 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
298
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
299
+ - 💡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
300
+ Alternatively:
236
301
 
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:
302
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
303
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
304
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
239
305
 
240
- - [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN)
241
-
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
306
  </details>
246
307
 
247
308
  ## ✨ Installation
248
309
 
249
310
  Install the gem and add to the application's Gemfile by executing:
250
311
 
251
- ``` console
312
+ ```console
252
313
  bundle add bash-merge
253
314
  ```
254
315
 
255
316
  If bundler is not being used to manage dependencies, install the gem by executing:
256
317
 
257
- ``` console
318
+ ```console
258
319
  gem install bash-merge
259
320
  ```
260
321
 
@@ -263,19 +324,19 @@ gem install bash-merge
263
324
  <details markdown="1">
264
325
  <summary>For Medium or High Security Installations</summary>
265
326
 
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
327
+ This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
328
+ [stone\_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
268
329
  by following the instructions below.
269
330
 
270
331
  Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
271
332
 
272
- ``` console
333
+ ```console
273
334
  gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
274
335
  ```
275
336
 
276
337
  You only need to do that once. Then proceed to install with:
277
338
 
278
- ``` console
339
+ ```console
279
340
  gem install bash-merge -P HighSecurity
280
341
  ```
281
342
 
@@ -283,7 +344,7 @@ The `HighSecurity` trust profile will verify signed gems, and not allow the inst
283
344
 
284
345
  If you want to up your security game full-time:
285
346
 
286
- ``` console
347
+ ```console
287
348
  bundle config set --global trust-policy MediumSecurity
288
349
  ```
289
350
 
@@ -304,7 +365,8 @@ Bash syntax parsing capabilities.
304
365
  Download pre-built parsers from [Faveod/tree-sitter-parsers](https://github.com/Faveod/tree-sitter-parsers/releases):
305
366
 
306
367
  **Linux (x64):**
307
- ``` console
368
+
369
+ ```console
308
370
  # Download and extract
309
371
  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
372
  tar -xzf parsers.tar.gz
@@ -320,13 +382,15 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.s
320
382
  ```
321
383
 
322
384
  **Debian/Ubuntu (amd64):**
323
- ``` console
385
+
386
+ ```console
324
387
  curl -Lo parsers.deb https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-amd64.deb
325
388
  sudo dpkg -i parsers.deb
326
389
  ```
327
390
 
328
391
  **macOS (Apple Silicon):**
329
- ``` console
392
+
393
+ ```console
330
394
  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
395
  tar -xzf parsers.tar.gz
332
396
 
@@ -338,7 +402,7 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.d
338
402
 
339
403
  #### Option 2: Build from Source
340
404
 
341
- ``` console
405
+ ```console
342
406
  git clone https://github.com/tree-sitter/tree-sitter-bash.git
343
407
  cd tree-sitter-bash
344
408
  make
@@ -352,7 +416,8 @@ sudo cp libtree-sitter-bash.dylib /usr/local/lib/ # macOS
352
416
  Some package managers provide tree-sitter parsers:
353
417
 
354
418
  **Fedora Atomic (Silverblue, Kinoite, Bazzite, Aurora, etc.):**
355
- ``` console
419
+
420
+ ```console
356
421
  # Install via rpm-ostree (requires reboot)
357
422
  rpm-ostree install libtree-sitter-bash
358
423
 
@@ -362,12 +427,14 @@ export TREE_SITTER_BASH_PATH="/usr/lib64/libtree-sitter-bash.so"
362
427
  ```
363
428
 
364
429
  **Fedora (traditional):**
365
- ``` console
430
+
431
+ ```console
366
432
  sudo dnf install libtree-sitter-bash
367
433
  ```
368
434
 
369
435
  **Arch Linux:**
370
- ``` console
436
+
437
+ ```console
371
438
  # Check AUR for tree-sitter-bash
372
439
  yay -S tree-sitter-bash
373
440
  ```
@@ -377,16 +444,18 @@ yay -S tree-sitter-bash
377
444
  If the parser is not in a standard location (`/usr/lib/`, `/usr/lib64/`, `/usr/local/lib/`),
378
445
  set the `TREE_SITTER_BASH_PATH` environment variable to point to the parser library:
379
446
 
380
- ``` console
447
+ ```console
381
448
  export TREE_SITTER_BASH_PATH="/path/to/libtree-sitter-bash.so"
382
449
  ```
383
450
 
384
451
  **Note:** Some distributions install the library with a version number suffix
385
452
  (e.g., `libtree-sitter-bash.so.14` instead of `libtree-sitter-bash.so`).
386
453
  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.
454
+
455
+ - Set `TREE_SITTER_BASH_PATH` to the full versioned path, or
456
+ - Create a symlink: `sudo ln -s /usr/lib64/libtree-sitter-bash.so.14 /usr/lib64/libtree-sitter-bash.so`
457
+ Add this to your shell profile (`.bashrc`, `.zshrc`, etc.) for persistence.
458
+
390
459
  ### 💎 Ruby Interface Gems
391
460
 
392
461
  In addition to the tree-sitter parser library, you need a Ruby gem that provides
@@ -394,9 +463,9 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
394
463
 
395
464
  | Gem | Ruby Support | Description |
396
465
  | --- | --- | --- |
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) |
466
+ | [ruby\_tree\_sitter][ruby_tree_sitter] | MRI only | C extension bindings (recommended for MRI) |
467
+ | [tree\_stump][tree_stump] | MRI (maybe JRuby) | Rust-based bindings via Rutie |
468
+ | [ffi][ffi] | MRI, JRuby, TruffleRuby | Generic FFI bindings (used by tree\_haver's FFI backend) |
400
469
 
401
470
  [ruby_tree_sitter]: https://github.com/Faveod/ruby_tree_sitter
402
471
  [tree_stump]: https://github.com/nickstenning/tree_stump
@@ -404,25 +473,25 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
404
473
 
405
474
  #### For MRI Ruby (Recommended)
406
475
 
407
- ``` console
476
+ ```console
408
477
  gem install ruby_tree_sitter
409
478
  ```
410
479
 
411
480
  Or add to your Gemfile:
412
481
 
413
- ``` ruby
482
+ ```ruby
414
483
  gem "ruby_tree_sitter", "~> 2.0"
415
484
  ```
416
485
 
417
486
  #### For JRuby or TruffleRuby
418
487
 
419
- ``` console
488
+ ```console
420
489
  gem install ffi
421
490
  ```
422
491
 
423
492
  Or add to your Gemfile:
424
493
 
425
- ``` ruby
494
+ ```ruby
426
495
  gem "ffi"
427
496
  ```
428
497
 
@@ -434,7 +503,7 @@ you must use the FFI backend.
434
503
 
435
504
  ## ⚙️ Configuration
436
505
 
437
- ``` ruby
506
+ ```ruby
438
507
  merger = Bash::Merge::SmartMerger.new(
439
508
  template_content,
440
509
  dest_content,
@@ -463,7 +532,7 @@ merger = Bash::Merge::SmartMerger.new(
463
532
 
464
533
  ### Simple Merge
465
534
 
466
- ``` ruby
535
+ ```ruby
467
536
  require "bash/merge"
468
537
 
469
538
  # Template defines the structure
@@ -524,7 +593,7 @@ puts result.to_bash
524
593
 
525
594
  Freeze blocks protect sections from being overwritten during merge:
526
595
 
527
- ``` bash
596
+ ```bash
528
597
  #!/bin/bash
529
598
 
530
599
  # Configuration
@@ -548,7 +617,7 @@ Content between `# bash-merge:freeze` and `# bash-merge:unfreeze` markers is pre
548
617
 
549
618
  ### Adding Template-Only Nodes
550
619
 
551
- ``` ruby
620
+ ```ruby
552
621
  merger = Bash::Merge::SmartMerger.new(
553
622
  template,
554
623
  destination,
@@ -565,17 +634,17 @@ Raising a monthly budget of... "dollars" would make the project more sustainable
565
634
 
566
635
  We welcome both individual and corporate sponsors\! We also offer a
567
636
  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).
637
+ (although currently [Open Collective][🖇osc] is our preferred funding platform).
569
638
 
570
639
  **If you're working in a company that's making significant use of kettle-rb tools we'd
571
640
  appreciate it if you suggest to your company to become a kettle-rb sponsor.**
572
641
 
573
642
  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).
643
+ [GitHub Sponsors][🖇sponsor],
644
+ [Liberapay][⛳liberapay],
645
+ [PayPal][🖇paypal],
646
+ [Open Collective][🖇osc]
647
+ and [Tidelift][🏙️entsup-tidelift].
579
648
 
580
649
  | 📍 NOTE |
581
650
  | --- |
@@ -583,22 +652,26 @@ and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_sou
583
652
 
584
653
  ### Open Collective for Individuals
585
654
 
586
- Support us with a monthly donation and help us continue our activities. \[[Become a backer](https://opencollective.com/kettle-rb#backer)\]
655
+ Support us with a monthly donation and help us continue our activities. \[[Become a backer][🖇osc-backers]\]
587
656
 
588
- NOTE: [kettle-readme-backers](https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.
657
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
589
658
 
590
659
  <!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
660
+
591
661
  No backers yet. Be the first!
662
+
592
663
  <!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
593
664
 
594
665
  ### Open Collective for Organizations
595
666
 
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)\]
667
+ Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][🖇osc-sponsors]\]
597
668
 
598
- NOTE: [kettle-readme-backers](https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers) updates this list every day, automatically.
669
+ NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
599
670
 
600
671
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
672
+
601
673
  No sponsors yet. Be the first!
674
+
602
675
  <!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
603
676
 
604
677
  [kettle-readme-backers]: https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers
@@ -609,48 +682,49 @@ I’m driven by a passion to foster a thriving open-source community – a space
609
682
 
610
683
  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
684
 
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.
685
+ 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
686
 
614
- **[Floss-Funding.dev](https://floss-funding.dev): 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
687
+ **[Floss-Funding.dev]
688
+ [🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
615
689
 
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)
690
+ [![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
691
 
618
692
  ## 🔐 Security
619
693
 
620
- See [SECURITY.md](SECURITY.md).
694
+ See [SECURITY.md][🔐security].
621
695
 
622
696
  ## 🤝 Contributing
623
697
 
624
698
  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),
699
+ or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
626
700
  or use the gem and think about how it could be better.
627
701
 
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.
702
+ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
629
703
 
630
- See [CONTRIBUTING.md](CONTRIBUTING.md) for more detailed instructions.
704
+ See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
631
705
 
632
706
  ### 🚀 Release Instructions
633
707
 
634
- See [CONTRIBUTING.md](CONTRIBUTING.md).
708
+ See [CONTRIBUTING.md][🤝contributing].
635
709
 
636
710
  ### Code Coverage
637
711
 
638
- [![Coverage Graph](https://codecov.io/gh/kettle-rb/bash-merge/graphs/tree.svg)](https://codecov.io/gh/kettle-rb/bash-merge)
712
+ [![Coverage Graph][🏀codecov-g]][🏀codecov]
639
713
 
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)
714
+ [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
641
715
 
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)
716
+ [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
643
717
 
644
718
  ### 🪇 Code of Conduct
645
719
 
646
720
  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).
721
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
648
722
 
649
723
  ## 🌈 Contributors
650
724
 
651
- [![Contributors](https://contrib.rocks/image?repo=kettle-rb/bash-merge)](https://github.com/kettle-rb/bash-merge/graphs/contributors)
725
+ [![Contributors][🖐contributors-img]][🖐contributors]
652
726
 
653
- Made with [contributors-img](https://contrib.rocks).
727
+ Made with [contributors-img][🖐contrib-rocks].
654
728
 
655
729
  Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/main>
656
730
 
@@ -669,23 +743,23 @@ Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/
669
743
 
670
744
  ## 📌 Versioning
671
745
 
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).
746
+ This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
673
747
  Violations of this scheme should be reported as bugs.
674
748
  Specifically, if a minor or patch version is released that breaks backward compatibility,
675
749
  a new version should be immediately released that restores compatibility.
676
750
  Breaking changes to the public API will only be introduced with new major versions.
677
751
 
678
752
  > 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)
753
+ > —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
680
754
 
681
755
  I understand that policy doesn't work universally ("exceptions to every rule\!"),
682
756
  but it is the policy here.
683
757
  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.
758
+ the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
685
759
 
686
760
  For example:
687
761
 
688
- ``` ruby
762
+ ```ruby
689
763
  spec.add_dependency("bash-merge", "~> 1.0")
690
764
  ```
691
765
 
@@ -698,16 +772,17 @@ is a *breaking change* to an API, and for that reason the bike shedding is endle
698
772
  To get a better understanding of how SemVer is intended to work over a project's lifetime,
699
773
  read this article from the creator of SemVer:
700
774
 
701
- - ["Major Version Numbers are Not Sacred"](https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html)
775
+ - ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
776
+
702
777
  </details>
703
778
 
704
- See [CHANGELOG.md](CHANGELOG.md) for a list of releases.
779
+ See [CHANGELOG.md][📌changelog] for a list of releases.
705
780
 
706
781
  ## 📄 License
707
782
 
708
783
  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).
784
+ the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
785
+ See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
711
786
 
712
787
  ### © Copyright
713
788
 
@@ -734,11 +809,11 @@ Please consider sponsoring me or the project.
734
809
 
735
810
  To join the community or get help 👇️ Join the Discord.
736
811
 
737
- [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN)
812
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
738
813
 
739
814
  To say "thanks\!" ☝️ Join the Discord or 👇️ send money.
740
815
 
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)
816
+ [![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
817
 
743
818
  ### Please give the project a star ⭐ ♥.
744
819
 
@@ -779,7 +854,6 @@ Thanks for RTFM. ☺️
779
854
  [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
780
855
  [✉️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
856
  [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
782
-
783
857
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
784
858
  [⛳️gem-namespace]: https://github.com/kettle-rb/bash-merge
785
859
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Bash::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
@@ -903,7 +977,7 @@ Thanks for RTFM. ☺️
903
977
  [📌gitmoji]: https://gitmoji.dev
904
978
  [📌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
979
  [🧮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
980
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-0.521-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
907
981
  [🔐security]: SECURITY.md
908
982
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
909
983
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -923,6 +997,3 @@ Thanks for RTFM. ☺️
923
997
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
924
998
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
925
999
  [💎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.3"
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.3
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.1
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.1
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.2
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.2
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.3
319
+ changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.3/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.3
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