toml-merge 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +31 -1
- data/README.md +210 -168
- data/lib/toml/merge/debug_logger.rb +2 -2
- data/lib/toml/merge/file_analysis.rb +12 -5
- data/lib/toml/merge/node_type_normalizer.rb +41 -0
- data/lib/toml/merge/version.rb +1 -1
- data/lib/toml/merge.rb +13 -1
- data.tar.gz.sig +0 -0
- metadata +103 -17
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 02fa667fe1565c2c733dffbc730bc500f870a01e2ed503374dd8ce5d56f0443e
|
|
4
|
+
data.tar.gz: b45cad4877d489fe0ccc74d6154b3cc3585fb714ae4a4f4fcfd14cb478032aa6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ac63d8130acc5212dea6a4838de60b21ea20fa9ae61ec26e6b3fdf057aa316b12afa114008469181ffa0cb78c582570970bf214567c3d2eee9748580ee7857a0
|
|
7
|
+
data.tar.gz: 628b6ffc136d0e1e59e314f5010d956ef7e6d9a1161e4d6003d6cc18b8d54f8a63fab973fe7b247564f4e26ae2bb869b5869bc46df6bc0f886f213e3115568ae
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,36 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [2.0.1] - 2026-02-19
|
|
34
|
+
|
|
35
|
+
- TAG: [v2.0.1][2.0.1t]
|
|
36
|
+
- COVERAGE: 89.42% -- 575/643 lines in 11 files
|
|
37
|
+
- BRANCH COVERAGE: 65.23% -- 182/279 branches in 11 files
|
|
38
|
+
- 97.03% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- AGENTS.md
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- appraisal2 v3.0.6
|
|
47
|
+
- kettle-test v1.0.10
|
|
48
|
+
- stone_checksums v1.0.3
|
|
49
|
+
- [ast-merge v4.0.6](https://github.com/kettle-rb/ast-merge/releases/tag/v4.0.6)
|
|
50
|
+
- [tree_haver v5.0.5](https://github.com/kettle-rb/tree_haver/releases/tag/v5.0.5)
|
|
51
|
+
- FFI Backend improvements
|
|
52
|
+
- Error handling improvements
|
|
53
|
+
- Many new features, and more bug fixes
|
|
54
|
+
- tree_stump v0.2.0
|
|
55
|
+
- fork no longer required, updates all applied upstream
|
|
56
|
+
- **Simplified dependency_tags.rb**: Removed redundant debug code
|
|
57
|
+
- Removed `TOML_MERGE_DEBUG` env var handling (use `TREE_HAVER_DEBUG` instead)
|
|
58
|
+
- tree_haver's debug output now respects blocked backends via `compute_blocked_backends`
|
|
59
|
+
- Avoids accidentally loading MRI backend during FFI-only test runs
|
|
60
|
+
- Updated documentation on hostile takeover of RubyGems
|
|
61
|
+
- https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo
|
|
62
|
+
|
|
33
63
|
## [2.0.0] - 2026-01-09
|
|
34
64
|
|
|
35
65
|
- TAG: [v2.0.0][2.0.0t]
|
|
@@ -223,7 +253,7 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
223
253
|
- Can force Citrus backend via `TREE_HAVER_BACKEND=citrus` environment variable
|
|
224
254
|
- Added graceful error handling when neither tree-sitter-toml nor toml-rb are available
|
|
225
255
|
|
|
226
|
-
[Unreleased]: https://github.com/kettle-rb/toml-merge/compare/v2.0.
|
|
256
|
+
[Unreleased]: https://github.com/kettle-rb/toml-merge/compare/v2.0.1...HEAD
|
|
227
257
|
[2.0.1]: https://github.com/kettle-rb/toml-merge/compare/v1.0.0...v2.0.1
|
|
228
258
|
[2.0.1t]: https://github.com/kettle-rb/toml-merge/releases/tag/v2.0.1
|
|
229
259
|
[2.0.0]: https://github.com/kettle-rb/toml-merge/compare/v1.0.0...v2.0.0
|
data/README.md
CHANGED
|
@@ -1,37 +1,4 @@
|
|
|
1
|
-
|
|
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. |
|
|
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). |
|
|
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). |
|
|
14
|
-
|
|
15
|
-
[rubygems-org]: https://github.com/rubygems/
|
|
16
|
-
[draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
|
|
17
|
-
[draper-takeover]: https://joel.drapper.me/p/ruby-central-takeover/
|
|
18
|
-
[ellen-takeover]: https://pup-e.com/blog/goodbye-rubygems/
|
|
19
|
-
[simi-removed]: https://www.reddit.com/r/ruby/s/gOk42POCaV
|
|
20
|
-
[martin-removed]: https://bsky.app/profile/martinemde.com/post/3m3occezxxs2q
|
|
21
|
-
[draper-lies]: https://joel.drapper.me/p/ruby-central-fact-check/
|
|
22
|
-
[draper-theft]: https://joel.drapper.me/p/ruby-central/
|
|
23
|
-
[reinteractive]: https://reinteractive.com/ruby-on-rails
|
|
24
|
-
[gem-coop]: https://gem.coop
|
|
25
|
-
[gem-naming]: https://github.com/gem-coop/gem.coop/issues/12
|
|
26
|
-
[martin-ann]: https://martinemde.com/2025/10/05/announcing-gem-coop.html
|
|
27
|
-
[gem-scopes]: https://github.com/galtzo-floss/bundle-namespace
|
|
28
|
-
[gem-server]: https://github.com/galtzo-floss/gem-server
|
|
29
|
-
[reinteractive-podcast]: https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6
|
|
30
|
-
[bundler-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/bundler/playbooks/TEAM_CHANGES.md
|
|
31
|
-
[rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
|
|
32
|
-
[policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
|
|
33
|
-
|
|
34
|
-
[](https://discord.gg/3qme4XHNKN) [](https://www.ruby-lang.org/) [](https://github.com/kettle-rb)
|
|
1
|
+
[![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
2
|
|
|
36
3
|
[🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
|
|
37
4
|
[🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
|
|
@@ -42,63 +9,72 @@
|
|
|
42
9
|
|
|
43
10
|
# ☯️ Toml::Merge
|
|
44
11
|
|
|
45
|
-
[![Version]
|
|
12
|
+
[![Version][👽versioni]][👽dl-rank] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![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]][🚎11-c-wf] [![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
13
|
|
|
47
|
-
`if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know]
|
|
14
|
+
`if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
|
|
48
15
|
|
|
49
16
|
-----
|
|
17
|
+
|
|
50
18
|
`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
19
|
|
|
52
|
-
[![OpenCollective Backers]
|
|
20
|
+
[![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]
|
|
21
|
+
|
|
22
|
+
<details>
|
|
23
|
+
<summary>👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️</summary>
|
|
24
|
+
|
|
25
|
+
I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo).
|
|
26
|
+
|
|
27
|
+
</details>
|
|
53
28
|
|
|
54
29
|
## 🌻 Synopsis
|
|
55
30
|
|
|
56
31
|
`toml-merge` provides intelligent merging of TOML files by parsing them into
|
|
57
32
|
tree-sitter AST nodes and comparing structural elements. It supports:
|
|
58
33
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
34
|
+
- **Smart key matching** - Keys and tables are matched by their structural signatures
|
|
35
|
+
- **Table matching** - Tables are matched using a multi-factor scoring algorithm that considers
|
|
36
|
+
key similarity, value overlap, and position
|
|
37
|
+
- **Freeze blocks** - Mark sections with comments to preserve them during merges
|
|
38
|
+
- **Configurable merge strategies** - Choose whether template or destination wins for conflicts,
|
|
39
|
+
or use a Hash for per-node-type preferences with `node_splitter` (see [ast-merge][ast-merge] docs)
|
|
40
|
+
- **Full TOML support** - Works with all TOML 1.0 features including inline tables, arrays of tables, and dotted keys
|
|
66
41
|
|
|
67
42
|
### The `*-merge` Gem Family
|
|
68
43
|
|
|
69
44
|
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.
|
|
70
45
|
|
|
71
|
-
| Gem | Language<br>/ Format | Parser Backend(s)
|
|
72
|
-
|
|
73
|
-
| [tree_haver][tree_haver] | Multi | MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus
|
|
74
|
-
| [ast-merge][ast-merge] | Text | internal
|
|
75
|
-
| [bash-merge][bash-merge] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver)
|
|
76
|
-
| [commonmarker-merge][commonmarker-merge] | Markdown | [Commonmarker][commonmarker] (via tree_haver)
|
|
77
|
-
| [dotenv-merge][dotenv-merge] | Dotenv | internal
|
|
78
|
-
| [json-merge][json-merge] | JSON | [tree-sitter-json][ts-json] (via tree_haver)
|
|
79
|
-
| [jsonc-merge][jsonc-merge] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver)
|
|
80
|
-
| [markdown-merge][markdown-merge] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver)
|
|
81
|
-
| [markly-merge][markly-merge] | Markdown | [Markly][markly] (via tree_haver)
|
|
82
|
-
| [prism-merge][prism-merge] | Ruby | [Prism][prism] (`prism` std lib gem)
|
|
83
|
-
| [psych-merge][psych-merge] | YAML | [Psych][psych] (`psych` std lib gem)
|
|
84
|
-
| [rbs-merge][rbs-merge] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem)
|
|
85
|
-
| [toml-merge][toml-merge] | TOML | [Citrus + toml-rb][toml-rb]
|
|
46
|
+
| Gem | Version / CI | Language<br>/ Format | Parser Backend(s) | Description |
|
|
47
|
+
|------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:|----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
48
|
+
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] <br/> [![CI][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
|
|
49
|
+
| [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] <br/> [![CI][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
|
|
50
|
+
| [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] <br/> [![CI][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
|
|
51
|
+
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] <br/> [![CI][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
|
|
52
|
+
| [dotenv-merge][dotenv-merge] | [![Version][dotenv-merge-gem-i]][dotenv-merge-gem] <br/> [![CI][dotenv-merge-ci-i]][dotenv-merge-ci] | Dotenv | internal | Smart merge for `.env` files |
|
|
53
|
+
| [json-merge][json-merge] | [![Version][json-merge-gem-i]][json-merge-gem] <br/> [![CI][json-merge-ci-i]][json-merge-ci] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
|
|
54
|
+
| [jsonc-merge][jsonc-merge] | [![Version][jsonc-merge-gem-i]][jsonc-merge-gem] <br/> [![CI][jsonc-merge-ci-i]][jsonc-merge-ci] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
|
|
55
|
+
| [markdown-merge][markdown-merge] | [![Version][markdown-merge-gem-i]][markdown-merge-gem] <br/> [![CI][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver), [Parslet][parslet] | **Foundation**: Shared base for Markdown mergers with inner code block merging |
|
|
56
|
+
| [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] <br/> [![CI][markly-merge-ci-i]][markly-merge-ci] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
|
|
57
|
+
| [prism-merge][prism-merge] | [![Version][prism-merge-gem-i]][prism-merge-gem] <br/> [![CI][prism-merge-ci-i]][prism-merge-ci] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
|
|
58
|
+
| [psych-merge][psych-merge] | [![Version][psych-merge-gem-i]][psych-merge-gem] <br/> [![CI][psych-merge-ci-i]][psych-merge-ci] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
|
|
59
|
+
| [rbs-merge][rbs-merge] | [![Version][rbs-merge-gem-i]][rbs-merge-gem] <br/> [![CI][rbs-merge-ci-i]][rbs-merge-ci] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
|
|
60
|
+
| [toml-merge][toml-merge] | [![Version][toml-merge-gem-i]][toml-merge-gem] <br/> [![CI][toml-merge-ci-i]][toml-merge-ci] | TOML | [Parslet + toml][toml], [Citrus + toml-rb][toml-rb], [tree-sitter-toml][ts-toml] (all via tree_haver) | Smart merge for TOML files |
|
|
86
61
|
|
|
87
62
|
#### Backend Platform Compatibility
|
|
88
63
|
|
|
89
64
|
tree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:
|
|
90
65
|
|
|
91
|
-
| Platform 👉️<br> TreeHaver Backend 👇️
|
|
92
|
-
|
|
93
|
-
| **MRI** ([ruby_tree_sitter][ruby_tree_sitter])
|
|
94
|
-
| **Rust** ([tree_stump][tree_stump])
|
|
95
|
-
| **FFI**
|
|
96
|
-
| **Java** ([jtreesitter][jtreesitter])
|
|
97
|
-
| **Prism**
|
|
98
|
-
| **Psych**
|
|
99
|
-
| **Citrus**
|
|
100
|
-
| **
|
|
101
|
-
| **
|
|
66
|
+
| Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
|
|
67
|
+
|-------------------------------------------------|:---:|:-----:|:-----------:|----------------------------------------------------------------------------|
|
|
68
|
+
| **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) | ✅ | ❌ | ❌ | C extension, MRI only |
|
|
69
|
+
| **Rust** ([tree_stump][tree_stump]) | ✅ | ❌ | ❌ | Rust extension via magnus/rb-sys, MRI only |
|
|
70
|
+
| **FFI** ([ffi][ffi]) | ✅ | ✅ | ❌ | TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
|
|
71
|
+
| **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
|
|
72
|
+
| **Prism** ([prism][prism]) | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
|
|
73
|
+
| **Psych** ([psych][psych]) | ✅ | ✅ | ✅ | YAML parsing, stdlib |
|
|
74
|
+
| **Citrus** ([citrus][citrus]) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
|
|
75
|
+
| **Parslet** ([parslet][parslet]) | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
|
|
76
|
+
| **Commonmarker** ([commonmarker][commonmarker]) | ✅ | ❌ | ❓ | Rust extension for Markdown (via [commonmarker-merge][commonmarker-merge]) |
|
|
77
|
+
| **Markly** ([markly][markly]) | ✅ | ❌ | ❓ | C extension for Markdown (via [markly-merge][markly-merge]) |
|
|
102
78
|
|
|
103
79
|
**Legend**: ✅ = Works, ❌ = Does not work, ❓ = Untested
|
|
104
80
|
|
|
@@ -130,8 +106,69 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
130
106
|
[commonmarker-merge]: https://github.com/kettle-rb/commonmarker-merge
|
|
131
107
|
[kettle-dev]: https://github.com/kettle-rb/kettle-dev
|
|
132
108
|
[kettle-jem]: https://github.com/kettle-rb/kettle-jem
|
|
109
|
+
[tree_haver-gem]: https://bestgems.org/gems/tree_haver
|
|
110
|
+
[ast-merge-gem]: https://bestgems.org/gems/ast-merge
|
|
111
|
+
[prism-merge-gem]: https://bestgems.org/gems/prism-merge
|
|
112
|
+
[psych-merge-gem]: https://bestgems.org/gems/psych-merge
|
|
113
|
+
[json-merge-gem]: https://bestgems.org/gems/json-merge
|
|
114
|
+
[jsonc-merge-gem]: https://bestgems.org/gems/jsonc-merge
|
|
115
|
+
[bash-merge-gem]: https://bestgems.org/gems/bash-merge
|
|
116
|
+
[rbs-merge-gem]: https://bestgems.org/gems/rbs-merge
|
|
117
|
+
[dotenv-merge-gem]: https://bestgems.org/gems/dotenv-merge
|
|
118
|
+
[toml-merge-gem]: https://bestgems.org/gems/toml-merge
|
|
119
|
+
[markdown-merge-gem]: https://bestgems.org/gems/markdown-merge
|
|
120
|
+
[markly-merge-gem]: https://bestgems.org/gems/markly-merge
|
|
121
|
+
[commonmarker-merge-gem]: https://bestgems.org/gems/commonmarker-merge
|
|
122
|
+
[kettle-dev-gem]: https://bestgems.org/gems/kettle-dev
|
|
123
|
+
[kettle-jem-gem]: https://bestgems.org/gems/kettle-jem
|
|
124
|
+
[tree_haver-gem-i]: https://img.shields.io/gem/v/tree_haver.svg
|
|
125
|
+
[ast-merge-gem-i]: https://img.shields.io/gem/v/ast-merge.svg
|
|
126
|
+
[prism-merge-gem-i]: https://img.shields.io/gem/v/prism-merge.svg
|
|
127
|
+
[psych-merge-gem-i]: https://img.shields.io/gem/v/psych-merge.svg
|
|
128
|
+
[json-merge-gem-i]: https://img.shields.io/gem/v/json-merge.svg
|
|
129
|
+
[jsonc-merge-gem-i]: https://img.shields.io/gem/v/jsonc-merge.svg
|
|
130
|
+
[bash-merge-gem-i]: https://img.shields.io/gem/v/bash-merge.svg
|
|
131
|
+
[rbs-merge-gem-i]: https://img.shields.io/gem/v/rbs-merge.svg
|
|
132
|
+
[dotenv-merge-gem-i]: https://img.shields.io/gem/v/dotenv-merge.svg
|
|
133
|
+
[toml-merge-gem-i]: https://img.shields.io/gem/v/toml-merge.svg
|
|
134
|
+
[markdown-merge-gem-i]: https://img.shields.io/gem/v/markdown-merge.svg
|
|
135
|
+
[markly-merge-gem-i]: https://img.shields.io/gem/v/markly-merge.svg
|
|
136
|
+
[commonmarker-merge-gem-i]: https://img.shields.io/gem/v/commonmarker-merge.svg
|
|
137
|
+
[kettle-dev-gem-i]: https://img.shields.io/gem/v/kettle-dev.svg
|
|
138
|
+
[kettle-jem-gem-i]: https://img.shields.io/gem/v/kettle-jem.svg
|
|
139
|
+
[tree_haver-ci-i]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml/badge.svg
|
|
140
|
+
[ast-merge-ci-i]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml/badge.svg
|
|
141
|
+
[prism-merge-ci-i]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml/badge.svg
|
|
142
|
+
[psych-merge-ci-i]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml/badge.svg
|
|
143
|
+
[json-merge-ci-i]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml/badge.svg
|
|
144
|
+
[jsonc-merge-ci-i]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml/badge.svg
|
|
145
|
+
[bash-merge-ci-i]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml/badge.svg
|
|
146
|
+
[rbs-merge-ci-i]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml/badge.svg
|
|
147
|
+
[dotenv-merge-ci-i]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml/badge.svg
|
|
148
|
+
[toml-merge-ci-i]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml/badge.svg
|
|
149
|
+
[markdown-merge-ci-i]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml/badge.svg
|
|
150
|
+
[markly-merge-ci-i]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml/badge.svg
|
|
151
|
+
[commonmarker-merge-ci-i]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml/badge.svg
|
|
152
|
+
[kettle-dev-ci-i]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml/badge.svg
|
|
153
|
+
[kettle-jem-ci-i]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml/badge.svg
|
|
154
|
+
[tree_haver-ci]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml
|
|
155
|
+
[ast-merge-ci]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml
|
|
156
|
+
[prism-merge-ci]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml
|
|
157
|
+
[psych-merge-ci]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml
|
|
158
|
+
[json-merge-ci]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml
|
|
159
|
+
[jsonc-merge-ci]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml
|
|
160
|
+
[bash-merge-ci]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml
|
|
161
|
+
[rbs-merge-ci]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml
|
|
162
|
+
[dotenv-merge-ci]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml
|
|
163
|
+
[toml-merge-ci]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml
|
|
164
|
+
[markdown-merge-ci]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml
|
|
165
|
+
[markly-merge-ci]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml
|
|
166
|
+
[commonmarker-merge-ci]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml
|
|
167
|
+
[kettle-dev-ci]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml
|
|
168
|
+
[kettle-jem-ci]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml
|
|
133
169
|
[prism]: https://github.com/ruby/prism
|
|
134
170
|
[psych]: https://github.com/ruby/psych
|
|
171
|
+
[ffi]: https://github.com/ffi/ffi
|
|
135
172
|
[ts-json]: https://github.com/tree-sitter/tree-sitter-json
|
|
136
173
|
[ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
|
|
137
174
|
[ts-bash]: https://github.com/tree-sitter/tree-sitter-bash
|
|
@@ -140,23 +177,26 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
140
177
|
[dotenv]: https://github.com/bkeepers/dotenv
|
|
141
178
|
[rbs]: https://github.com/ruby/rbs
|
|
142
179
|
[toml-rb]: https://github.com/emancu/toml-rb
|
|
180
|
+
[toml]: https://github.com/jm/toml
|
|
143
181
|
[markly]: https://github.com/ioquatix/markly
|
|
144
182
|
[commonmarker]: https://github.com/gjtorikian/commonmarker
|
|
145
183
|
[ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
|
|
146
184
|
[tree_stump]: https://github.com/joker1007/tree_stump
|
|
147
185
|
[jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter
|
|
186
|
+
[citrus]: https://github.com/mjackson/citrus
|
|
187
|
+
[parslet]: https://github.com/kschiess/parslet
|
|
148
188
|
|
|
149
189
|
### Configuration
|
|
150
190
|
|
|
151
191
|
The tree-sitter TOML parser requires a shared library. Set the `TREE_SITTER_TOML_PATH` environment variable to point to your compiled `libtree-sitter-toml.so` (or `.dylib` on macOS):
|
|
152
192
|
|
|
153
|
-
```
|
|
193
|
+
```bash
|
|
154
194
|
export TREE_SITTER_TOML_PATH=/path/to/libtree-sitter-toml.so
|
|
155
195
|
```
|
|
156
196
|
|
|
157
197
|
### Basic Usage
|
|
158
198
|
|
|
159
|
-
```
|
|
199
|
+
```ruby
|
|
160
200
|
require "toml/merge"
|
|
161
201
|
|
|
162
202
|
template = <<~TOML
|
|
@@ -189,18 +229,18 @@ puts result.content if result.success?
|
|
|
189
229
|
|
|
190
230
|
## 💡 Info you can shake a stick at
|
|
191
231
|
|
|
192
|
-
| Tokens to Remember | [![Gem name]
|
|
232
|
+
| Tokens to Remember | [![Gem name][⛳️name-img]][👽dl-rank] [![Gem namespace][⛳️namespace-img]][📜src-gh] |
|
|
193
233
|
| --- | --- |
|
|
194
|
-
| Works with JRuby | [![JRuby 10.0 Compat]
|
|
195
|
-
| Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat]
|
|
196
|
-
| Works with MRI Ruby 3 | [![Ruby 3.2 Compat]
|
|
197
|
-
| Support & Community | [![Join Me on Daily.dev's RubyFriends]
|
|
198
|
-
| Source | [![Source on GitLab.com]
|
|
199
|
-
| Documentation | [![Current release on RubyDoc.info]
|
|
200
|
-
| Compliance | [![License: MIT]
|
|
201
|
-
| Style | [![Enforced Code Style Linter]
|
|
202
|
-
| Maintainer 🎖️ | [![Follow Me on LinkedIn]
|
|
203
|
-
| `...` 💖 | [![Find Me on WellFound:]
|
|
234
|
+
| Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][🚎11-c-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
|
|
235
|
+
| Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][🚎11-c-wf] |
|
|
236
|
+
| 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]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
|
|
237
|
+
| 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] |
|
|
238
|
+
| 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]][📜src-gh] [][🧮kloc] |
|
|
239
|
+
| 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] |
|
|
240
|
+
| 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] |
|
|
241
|
+
| 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] |
|
|
242
|
+
| 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] |
|
|
243
|
+
| `...` 💖 | [![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] |
|
|
204
244
|
|
|
205
245
|
### Compatibility
|
|
206
246
|
|
|
@@ -208,25 +248,25 @@ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRu
|
|
|
208
248
|
|
|
209
249
|
| 🚚 *Amazing* test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
|
|
210
250
|
| --- | --- |
|
|
211
|
-
| 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2]
|
|
251
|
+
| 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
|
|
212
252
|
|
|
213
253
|
### Federated DVCS
|
|
214
254
|
|
|
215
255
|
<details markdown="1">
|
|
216
256
|
<summary>Find this repo on federated forges (Coming soon!)</summary>
|
|
217
257
|
|
|
218
|
-
| Federated [DVCS]
|
|
258
|
+
| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
|
|
219
259
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
220
|
-
| 🧪 [kettle-rb/toml-merge on GitLab]
|
|
221
|
-
| 🧊 [kettle-rb/toml-merge on CodeBerg]
|
|
222
|
-
| 🐙 [kettle-rb/toml-merge on GitHub]
|
|
223
|
-
| 🎮️ [Discord Server]
|
|
260
|
+
| 🧪 [kettle-rb/toml-merge on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
|
|
261
|
+
| 🧊 [kettle-rb/toml-merge on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
|
|
262
|
+
| 🐙 [kettle-rb/toml-merge on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
|
|
263
|
+
| 🎮️ [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] |
|
|
224
264
|
|
|
225
265
|
</details>
|
|
226
266
|
|
|
227
267
|
[gh-discussions]: https://github.com/kettle-rb/toml-merge/discussions
|
|
228
268
|
|
|
229
|
-
### Enterprise Support []
|
|
269
|
+
### Enterprise Support [][🏙️entsup-tidelift]
|
|
230
270
|
|
|
231
271
|
Available as part of the Tidelift Subscription.
|
|
232
272
|
|
|
@@ -235,33 +275,34 @@ Available as part of the Tidelift Subscription.
|
|
|
235
275
|
|
|
236
276
|
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.
|
|
237
277
|
|
|
238
|
-
[![Get help from me on Tidelift]
|
|
278
|
+
[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
|
|
279
|
+
|
|
280
|
+
- 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
|
|
239
281
|
|
|
240
|
-
|
|
282
|
+
- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
|
|
241
283
|
|
|
242
|
-
|
|
284
|
+
- 💡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
|
|
285
|
+
Alternatively:
|
|
243
286
|
|
|
244
|
-
|
|
245
|
-
Alternatively:
|
|
287
|
+
- [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
|
|
246
288
|
|
|
247
|
-
|
|
289
|
+
- [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork]
|
|
248
290
|
|
|
249
|
-
|
|
291
|
+
- [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor]
|
|
250
292
|
|
|
251
|
-
- [](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github)
|
|
252
293
|
</details>
|
|
253
294
|
|
|
254
295
|
## ✨ Installation
|
|
255
296
|
|
|
256
297
|
Install the gem and add to the application's Gemfile by executing:
|
|
257
298
|
|
|
258
|
-
```
|
|
299
|
+
```console
|
|
259
300
|
bundle add toml-merge
|
|
260
301
|
```
|
|
261
302
|
|
|
262
303
|
If bundler is not being used to manage dependencies, install the gem by executing:
|
|
263
304
|
|
|
264
|
-
```
|
|
305
|
+
```console
|
|
265
306
|
gem install toml-merge
|
|
266
307
|
```
|
|
267
308
|
|
|
@@ -270,19 +311,19 @@ gem install toml-merge
|
|
|
270
311
|
<details markdown="1">
|
|
271
312
|
<summary>For Medium or High Security Installations</summary>
|
|
272
313
|
|
|
273
|
-
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512]
|
|
274
|
-
[stone\_checksums]
|
|
314
|
+
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
|
|
315
|
+
[stone\_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
|
|
275
316
|
by following the instructions below.
|
|
276
317
|
|
|
277
318
|
Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
|
|
278
319
|
|
|
279
|
-
```
|
|
320
|
+
```console
|
|
280
321
|
gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
|
|
281
322
|
```
|
|
282
323
|
|
|
283
324
|
You only need to do that once. Then proceed to install with:
|
|
284
325
|
|
|
285
|
-
```
|
|
326
|
+
```console
|
|
286
327
|
gem install toml-merge -P HighSecurity
|
|
287
328
|
```
|
|
288
329
|
|
|
@@ -290,7 +331,7 @@ The `HighSecurity` trust profile will verify signed gems, and not allow the inst
|
|
|
290
331
|
|
|
291
332
|
If you want to up your security game full-time:
|
|
292
333
|
|
|
293
|
-
```
|
|
334
|
+
```console
|
|
294
335
|
bundle config set --global trust-policy MediumSecurity
|
|
295
336
|
```
|
|
296
337
|
|
|
@@ -304,12 +345,15 @@ NOTE: Be prepared to track down certs for signed gems and add them the same way
|
|
|
304
345
|
|
|
305
346
|
### Parser Backend Options
|
|
306
347
|
|
|
307
|
-
`toml-merge` uses [tree\_haver]
|
|
348
|
+
`toml-merge` uses [tree\_haver][tree_haver] for parsing, which supports multiple backends:
|
|
308
349
|
|
|
309
350
|
**Tree-sitter backend** (default, requires native library):
|
|
310
|
-
|
|
351
|
+
|
|
352
|
+
- Set the `TREE_SITTER_TOML_PATH` environment variable to point to your compiled `libtree-sitter-toml.so` (or `.dylib` on macOS):
|
|
353
|
+
|
|
311
354
|
<!-- end list -->
|
|
312
|
-
|
|
355
|
+
|
|
356
|
+
```bash
|
|
313
357
|
export TREE_SITTER_TOML_PATH=/path/to/libtree-sitter-toml.so
|
|
314
358
|
```
|
|
315
359
|
|
|
@@ -320,35 +364,35 @@ tree-sitter. Choose **one** of the following based on your Ruby implementation:
|
|
|
320
364
|
|
|
321
365
|
| Gem | Ruby Support | Description |
|
|
322
366
|
| --- | --- | --- |
|
|
323
|
-
| [ruby\_tree\_sitter]
|
|
324
|
-
| [tree\_stump]
|
|
325
|
-
| [ffi]
|
|
367
|
+
| [ruby\_tree\_sitter][ruby_tree_sitter] | MRI only | C extension bindings (recommended for MRI) |
|
|
368
|
+
| [tree\_stump][tree_stump] | MRI (maybe JRuby) | Rust-based bindings via Rutie |
|
|
369
|
+
| [ffi][ffi] | MRI, JRuby, TruffleRuby | Generic FFI bindings (used by tree\_haver's FFI backend) |
|
|
326
370
|
|
|
327
371
|
[ruby_tree_sitter]: https://github.com/Faveod/ruby_tree_sitter
|
|
328
|
-
[tree_stump]: https://github.com/
|
|
372
|
+
[tree_stump]: https://github.com/joker1007/tree_stump
|
|
329
373
|
[ffi-gem]: https://github.com/ffi/ffi
|
|
330
374
|
|
|
331
375
|
#### For MRI Ruby (Recommended)
|
|
332
376
|
|
|
333
|
-
```
|
|
377
|
+
```console
|
|
334
378
|
gem install ruby_tree_sitter
|
|
335
379
|
```
|
|
336
380
|
|
|
337
381
|
Or add to your Gemfile:
|
|
338
382
|
|
|
339
|
-
```
|
|
383
|
+
```ruby
|
|
340
384
|
gem "ruby_tree_sitter", "~> 2.0"
|
|
341
385
|
```
|
|
342
386
|
|
|
343
387
|
#### For JRuby or TruffleRuby
|
|
344
388
|
|
|
345
|
-
```
|
|
389
|
+
```console
|
|
346
390
|
gem install ffi
|
|
347
391
|
```
|
|
348
392
|
|
|
349
393
|
Or add to your Gemfile:
|
|
350
394
|
|
|
351
|
-
```
|
|
395
|
+
```ruby
|
|
352
396
|
gem "ffi"
|
|
353
397
|
```
|
|
354
398
|
|
|
@@ -359,14 +403,16 @@ the appropriate backend based on which gems are available.
|
|
|
359
403
|
you must use the FFI backend or the Citrus backend (below).
|
|
360
404
|
|
|
361
405
|
**Citrus backend** (pure Ruby, no native dependencies):
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
406
|
+
|
|
407
|
+
- Alternative option using the [citrus][citrus] and [toml-rb][toml-rb] gems
|
|
408
|
+
- No compilation or system dependencies required
|
|
409
|
+
- Ideal for environments where native extensions are problematic
|
|
410
|
+
- Configure via tree\_haver's backend selection
|
|
411
|
+
For more details on backend configuration, see the [tree\_haver documentation][tree_haver].
|
|
412
|
+
|
|
367
413
|
### Merge Options
|
|
368
414
|
|
|
369
|
-
```
|
|
415
|
+
```ruby
|
|
370
416
|
merger = Toml::Merge::SmartMerger.new(
|
|
371
417
|
template_content,
|
|
372
418
|
dest_content,
|
|
@@ -395,7 +441,7 @@ merger = Toml::Merge::SmartMerger.new(
|
|
|
395
441
|
|
|
396
442
|
### Simple Merge
|
|
397
443
|
|
|
398
|
-
```
|
|
444
|
+
```ruby
|
|
399
445
|
require "toml/merge"
|
|
400
446
|
|
|
401
447
|
# Template defines the structure
|
|
@@ -429,7 +475,7 @@ puts result.content
|
|
|
429
475
|
|
|
430
476
|
Freeze blocks protect sections from being overwritten during merge:
|
|
431
477
|
|
|
432
|
-
```
|
|
478
|
+
```toml
|
|
433
479
|
[package]
|
|
434
480
|
name = "my-app"
|
|
435
481
|
|
|
@@ -447,7 +493,7 @@ Content between `# toml-merge:freeze` and `# toml-merge:unfreeze` markers is pre
|
|
|
447
493
|
|
|
448
494
|
### Adding Template-Only Tables
|
|
449
495
|
|
|
450
|
-
```
|
|
496
|
+
```ruby
|
|
451
497
|
merger = Toml::Merge::SmartMerger.new(
|
|
452
498
|
template,
|
|
453
499
|
destination,
|
|
@@ -464,17 +510,17 @@ Raising a monthly budget of... "dollars" would make the project more sustainable
|
|
|
464
510
|
|
|
465
511
|
We welcome both individual and corporate sponsors\! We also offer a
|
|
466
512
|
wide array of funding channels to account for your preferences
|
|
467
|
-
(although currently [Open Collective]
|
|
513
|
+
(although currently [Open Collective][🖇osc] is our preferred funding platform).
|
|
468
514
|
|
|
469
515
|
**If you're working in a company that's making significant use of kettle-rb tools we'd
|
|
470
516
|
appreciate it if you suggest to your company to become a kettle-rb sponsor.**
|
|
471
517
|
|
|
472
518
|
You can support the development of kettle-rb tools via
|
|
473
|
-
[GitHub Sponsors]
|
|
474
|
-
[Liberapay]
|
|
475
|
-
[PayPal]
|
|
476
|
-
[Open Collective]
|
|
477
|
-
and [Tidelift]
|
|
519
|
+
[GitHub Sponsors][🖇sponsor],
|
|
520
|
+
[Liberapay][⛳liberapay],
|
|
521
|
+
[PayPal][🖇paypal],
|
|
522
|
+
[Open Collective][🖇osc]
|
|
523
|
+
and [Tidelift][🏙️entsup-tidelift].
|
|
478
524
|
|
|
479
525
|
| 📍 NOTE |
|
|
480
526
|
| --- |
|
|
@@ -482,9 +528,9 @@ and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-toml-merge?utm_sou
|
|
|
482
528
|
|
|
483
529
|
### Open Collective for Individuals
|
|
484
530
|
|
|
485
|
-
Support us with a monthly donation and help us continue our activities. \[[Become a backer]
|
|
531
|
+
Support us with a monthly donation and help us continue our activities. \[[Become a backer][🖇osc-backers]\]
|
|
486
532
|
|
|
487
|
-
NOTE: [kettle-readme-backers]
|
|
533
|
+
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
488
534
|
|
|
489
535
|
<!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
|
|
490
536
|
No backers yet. Be the first!
|
|
@@ -492,9 +538,9 @@ No backers yet. Be the first!
|
|
|
492
538
|
|
|
493
539
|
### Open Collective for Organizations
|
|
494
540
|
|
|
495
|
-
Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor]
|
|
541
|
+
Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][🖇osc-sponsors]\]
|
|
496
542
|
|
|
497
|
-
NOTE: [kettle-readme-backers]
|
|
543
|
+
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
498
544
|
|
|
499
545
|
<!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
|
|
500
546
|
No sponsors yet. Be the first!
|
|
@@ -508,48 +554,48 @@ I’m driven by a passion to foster a thriving open-source community – a space
|
|
|
508
554
|
|
|
509
555
|
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`.
|
|
510
556
|
|
|
511
|
-
I’m developing a new library, [floss\_funding]
|
|
557
|
+
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.
|
|
512
558
|
|
|
513
|
-
**[Floss-Funding.dev]
|
|
559
|
+
**[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
|
|
514
560
|
|
|
515
|
-
[![OpenCollective Backers]
|
|
561
|
+
[![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]
|
|
516
562
|
|
|
517
563
|
## 🔐 Security
|
|
518
564
|
|
|
519
|
-
See [SECURITY.md]
|
|
565
|
+
See [SECURITY.md][🔐security].
|
|
520
566
|
|
|
521
567
|
## 🤝 Contributing
|
|
522
568
|
|
|
523
569
|
If you need some ideas of where to help, you could work on adding more code coverage,
|
|
524
|
-
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues]
|
|
570
|
+
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
|
|
525
571
|
or use the gem and think about how it could be better.
|
|
526
572
|
|
|
527
|
-
We [![Keep A Changelog]
|
|
573
|
+
We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
|
|
528
574
|
|
|
529
|
-
See [CONTRIBUTING.md]
|
|
575
|
+
See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
|
|
530
576
|
|
|
531
577
|
### 🚀 Release Instructions
|
|
532
578
|
|
|
533
|
-
See [CONTRIBUTING.md]
|
|
579
|
+
See [CONTRIBUTING.md][🤝contributing].
|
|
534
580
|
|
|
535
581
|
### Code Coverage
|
|
536
582
|
|
|
537
|
-
[![Coverage Graph]
|
|
583
|
+
[![Coverage Graph][🏀codecov-g]][🏀codecov]
|
|
538
584
|
|
|
539
|
-
[![Coveralls Test Coverage]
|
|
585
|
+
[![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
|
|
540
586
|
|
|
541
|
-
[![QLTY Test Coverage]
|
|
587
|
+
[![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
|
|
542
588
|
|
|
543
589
|
### 🪇 Code of Conduct
|
|
544
590
|
|
|
545
591
|
Everyone interacting with this project's codebases, issue trackers,
|
|
546
|
-
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1]
|
|
592
|
+
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
|
|
547
593
|
|
|
548
594
|
## 🌈 Contributors
|
|
549
595
|
|
|
550
|
-
[![Contributors]
|
|
596
|
+
[![Contributors][🖐contributors-img]][🖐contributors]
|
|
551
597
|
|
|
552
|
-
Made with [contributors-img]
|
|
598
|
+
Made with [contributors-img][🖐contrib-rocks].
|
|
553
599
|
|
|
554
600
|
Also see GitLab Contributors: <https://gitlab.com/kettle-rb/toml-merge/-/graphs/main>
|
|
555
601
|
|
|
@@ -568,23 +614,23 @@ Also see GitLab Contributors: <https://gitlab.com/kettle-rb/toml-merge/-/graphs/
|
|
|
568
614
|
|
|
569
615
|
## 📌 Versioning
|
|
570
616
|
|
|
571
|
-
This Library adheres to [![Semantic Versioning 2.0.0]
|
|
617
|
+
This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
|
|
572
618
|
Violations of this scheme should be reported as bugs.
|
|
573
619
|
Specifically, if a minor or patch version is released that breaks backward compatibility,
|
|
574
620
|
a new version should be immediately released that restores compatibility.
|
|
575
621
|
Breaking changes to the public API will only be introduced with new major versions.
|
|
576
622
|
|
|
577
623
|
> dropping support for a platform is both obviously and objectively a breaking change <br/>
|
|
578
|
-
> —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716]
|
|
624
|
+
> —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
|
|
579
625
|
|
|
580
626
|
I understand that policy doesn't work universally ("exceptions to every rule\!"),
|
|
581
627
|
but it is the policy here.
|
|
582
628
|
As such, in many cases it is good to specify a dependency on this library using
|
|
583
|
-
the [Pessimistic Version Constraint]
|
|
629
|
+
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
|
584
630
|
|
|
585
631
|
For example:
|
|
586
632
|
|
|
587
|
-
```
|
|
633
|
+
```ruby
|
|
588
634
|
spec.add_dependency("toml-merge", "~> 1.0")
|
|
589
635
|
```
|
|
590
636
|
|
|
@@ -597,16 +643,17 @@ is a *breaking change* to an API, and for that reason the bike shedding is endle
|
|
|
597
643
|
To get a better understanding of how SemVer is intended to work over a project's lifetime,
|
|
598
644
|
read this article from the creator of SemVer:
|
|
599
645
|
|
|
600
|
-
|
|
646
|
+
- ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
|
|
647
|
+
|
|
601
648
|
</details>
|
|
602
649
|
|
|
603
|
-
See [CHANGELOG.md]
|
|
650
|
+
See [CHANGELOG.md][📌changelog] for a list of releases.
|
|
604
651
|
|
|
605
652
|
## 📄 License
|
|
606
653
|
|
|
607
654
|
The gem is available as open source under the terms of
|
|
608
|
-
the [MIT License]
|
|
609
|
-
See [LICENSE.txt]
|
|
655
|
+
the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
|
|
656
|
+
See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
|
|
610
657
|
|
|
611
658
|
### © Copyright
|
|
612
659
|
|
|
@@ -633,11 +680,11 @@ Please consider sponsoring me or the project.
|
|
|
633
680
|
|
|
634
681
|
To join the community or get help 👇️ Join the Discord.
|
|
635
682
|
|
|
636
|
-
[![Live Chat on Discord]
|
|
683
|
+
[![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
|
|
637
684
|
|
|
638
685
|
To say "thanks\!" ☝️ Join the Discord or 👇️ send money.
|
|
639
686
|
|
|
640
|
-
[![Sponsor kettle-rb/toml-merge on Open Source Collective]
|
|
687
|
+
[![Sponsor kettle-rb/toml-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]
|
|
641
688
|
|
|
642
689
|
### Please give the project a star ⭐ ♥.
|
|
643
690
|
|
|
@@ -678,7 +725,6 @@ Thanks for RTFM. ☺️
|
|
|
678
725
|
[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
|
|
679
726
|
[✉️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
|
|
680
727
|
[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
|
|
681
|
-
|
|
682
728
|
[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
|
|
683
729
|
[⛳️gem-namespace]: https://github.com/kettle-rb/toml-merge
|
|
684
730
|
[⛳️namespace-img]: https://img.shields.io/badge/namespace-Toml::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
|
|
@@ -802,7 +848,7 @@ Thanks for RTFM. ☺️
|
|
|
802
848
|
[📌gitmoji]: https://gitmoji.dev
|
|
803
849
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
804
850
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
805
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.
|
|
851
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.643-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
806
852
|
[🔐security]: SECURITY.md
|
|
807
853
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
808
854
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -823,15 +869,12 @@ Thanks for RTFM. ☺️
|
|
|
823
869
|
[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
|
|
824
870
|
[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
|
|
825
871
|
|
|
826
|
-
|
|
827
|
-
The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree\_haver](https://github.com/kettle-rb/tree_haver), which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
|
|
828
|
-
|
|
829
|
-
|
|
872
|
+
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.
|
|
830
873
|
|
|
831
874
|
| Gem | Purpose | Description |
|
|
832
875
|
| --- | --- | --- |
|
|
833
|
-
| [kettle-dev]
|
|
834
|
-
| [kettle-jem]
|
|
876
|
+
| [kettle-dev][kettle-dev] | Gem Development | Gem templating tool using `*-merge` gems |
|
|
877
|
+
| [kettle-jem][kettle-jem] | Gem Templating | Gem template library with smart merge support |
|
|
835
878
|
|
|
836
879
|
[tree_haver]: https://github.com/kettle-rb/tree_haver
|
|
837
880
|
[ast-merge]: https://github.com/kettle-rb/ast-merge
|
|
@@ -859,4 +902,3 @@ The `*-merge` gem family provides intelligent, AST-based merging for various fil
|
|
|
859
902
|
[toml-rb]: https://github.com/emancu/toml-rb
|
|
860
903
|
[markly]: https://github.com/ioquatix/markly
|
|
861
904
|
[commonmarker]: https://github.com/gjtorikian/commonmarker
|
|
862
|
-
|
|
@@ -6,7 +6,7 @@ module Toml
|
|
|
6
6
|
# Extends the base Ast::Merge::DebugLogger with Toml-specific configuration.
|
|
7
7
|
#
|
|
8
8
|
# @example Enable debug logging
|
|
9
|
-
# ENV['
|
|
9
|
+
# ENV['TREE_HAVER_DEBUG'] = '1'
|
|
10
10
|
# DebugLogger.debug("Processing node", {type: "pair", line: 5})
|
|
11
11
|
#
|
|
12
12
|
# @example Disable debug logging (default)
|
|
@@ -15,7 +15,7 @@ module Toml
|
|
|
15
15
|
extend Ast::Merge::DebugLogger
|
|
16
16
|
|
|
17
17
|
# Toml-specific configuration
|
|
18
|
-
self.env_var_name = "
|
|
18
|
+
self.env_var_name = "TREE_HAVER_DEBUG"
|
|
19
19
|
self.log_prefix = "[Toml::Merge]"
|
|
20
20
|
|
|
21
21
|
class << self
|
|
@@ -173,16 +173,23 @@ module Toml
|
|
|
173
173
|
# TreeHaver handles everything:
|
|
174
174
|
# - Backend selection (via TREE_HAVER_BACKEND env or TreeHaver.backend)
|
|
175
175
|
# - Grammar auto-discovery
|
|
176
|
-
# - Fallback to Citrus if tree-sitter unavailable
|
|
177
|
-
# - CITRUS_DEFAULTS
|
|
176
|
+
# - Fallback to Citrus or Parslet if tree-sitter unavailable
|
|
177
|
+
# - CITRUS_DEFAULTS and PARSLET_DEFAULTS include toml configuration
|
|
178
178
|
parser_options = {}
|
|
179
179
|
parser_options[:library_path] = @parser_path if @parser_path
|
|
180
180
|
|
|
181
181
|
parser = TreeHaver.parser_for(:toml, **parser_options)
|
|
182
182
|
|
|
183
|
-
# For NodeTypeNormalizer, we
|
|
184
|
-
# All native backends (mri, rust, ffi, java) produce tree-sitter AST format
|
|
185
|
-
|
|
183
|
+
# For NodeTypeNormalizer, we care about the backend type:
|
|
184
|
+
# - All native backends (mri, rust, ffi, java) produce tree-sitter AST format
|
|
185
|
+
# - Citrus produces Citrus::Match-based nodes
|
|
186
|
+
# - Parslet produces Hash/Array/Slice-based nodes
|
|
187
|
+
backend_sym = parser.backend
|
|
188
|
+
@backend = case backend_sym
|
|
189
|
+
when :citrus then :citrus
|
|
190
|
+
when :parslet then :parslet
|
|
191
|
+
else :tree_sitter # mri, rust, ffi, java all use tree-sitter format
|
|
192
|
+
end
|
|
186
193
|
|
|
187
194
|
@ast = parser.parse(@source)
|
|
188
195
|
|
|
@@ -20,6 +20,7 @@ module Toml
|
|
|
20
20
|
# Currently supports:
|
|
21
21
|
# - `:tree_sitter` - tree-sitter-toml grammar (via ruby_tree_sitter, tree_stump, FFI)
|
|
22
22
|
# - `:citrus` - toml-rb gem with Citrus parser
|
|
23
|
+
# - `:parslet` - toml gem with Parslet parser
|
|
23
24
|
#
|
|
24
25
|
# ## Extensibility
|
|
25
26
|
#
|
|
@@ -189,6 +190,46 @@ module Toml
|
|
|
189
190
|
"}": :brace_close,
|
|
190
191
|
",": :comma,
|
|
191
192
|
}.freeze,
|
|
193
|
+
|
|
194
|
+
# Parslet/toml gem backend node types
|
|
195
|
+
# These are produced by TreeHaver's Parslet adapter wrapping the toml gem
|
|
196
|
+
# Parslet returns Hash/Array/Slice structures with keys from .as(:name) rules
|
|
197
|
+
# Reference: https://github.com/jm/toml (TOML::Parslet grammar)
|
|
198
|
+
parslet: {
|
|
199
|
+
# Document structure
|
|
200
|
+
document: :document,
|
|
201
|
+
hash: :document, # Root result is often a hash
|
|
202
|
+
table: :table,
|
|
203
|
+
table_array: :array_of_tables,
|
|
204
|
+
|
|
205
|
+
# Key-value pairs - Parslet uses :key and :value hash keys
|
|
206
|
+
key: :bare_key,
|
|
207
|
+
value: :value,
|
|
208
|
+
pair: :pair, # Synthetic type for key-value combinations
|
|
209
|
+
|
|
210
|
+
# Value types - from .as(:type) rules in TOML::Parslet
|
|
211
|
+
string: :string,
|
|
212
|
+
integer: :integer,
|
|
213
|
+
float: :float,
|
|
214
|
+
boolean: :boolean,
|
|
215
|
+
true: :boolean,
|
|
216
|
+
false: :boolean,
|
|
217
|
+
array: :array,
|
|
218
|
+
|
|
219
|
+
# Date/time types
|
|
220
|
+
datetime: :datetime,
|
|
221
|
+
datetime_rfc3339: :datetime,
|
|
222
|
+
|
|
223
|
+
# Slice types (terminal values)
|
|
224
|
+
slice: :string, # Parslet::Slice defaults to string
|
|
225
|
+
|
|
226
|
+
# Structural types from Parslet result structure
|
|
227
|
+
element: :element, # Array elements
|
|
228
|
+
array_element: :element,
|
|
229
|
+
|
|
230
|
+
# Unknown/fallback
|
|
231
|
+
unknown: :unknown,
|
|
232
|
+
}.freeze,
|
|
192
233
|
)
|
|
193
234
|
|
|
194
235
|
class << self
|
data/lib/toml/merge/version.rb
CHANGED
data/lib/toml/merge.rb
CHANGED
|
@@ -5,7 +5,7 @@ require "set"
|
|
|
5
5
|
|
|
6
6
|
# External gems
|
|
7
7
|
# TreeHaver provides a unified cross-Ruby interface to tree-sitter.
|
|
8
|
-
# It handles grammar discovery, backend selection, and
|
|
8
|
+
# It handles grammar discovery, backend selection, Citrus and Parslet fallbacks, automatically
|
|
9
9
|
# via parser_for(:toml). No manual registration needed.
|
|
10
10
|
require "tree_haver"
|
|
11
11
|
require "version_gem"
|
|
@@ -103,6 +103,18 @@ module Toml
|
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
+
# Register with ast-merge's MergeGemRegistry for RSpec dependency tags
|
|
107
|
+
# Only register if MergeGemRegistry is loaded (i.e., in test environment)
|
|
108
|
+
if defined?(Ast::Merge::RSpec::MergeGemRegistry)
|
|
109
|
+
Ast::Merge::RSpec::MergeGemRegistry.register(
|
|
110
|
+
:toml_merge,
|
|
111
|
+
require_path: "toml/merge",
|
|
112
|
+
merger_class: "Toml::Merge::SmartMerger",
|
|
113
|
+
test_source: "[section]\nkey = \"value\"",
|
|
114
|
+
category: :config,
|
|
115
|
+
)
|
|
116
|
+
end
|
|
117
|
+
|
|
106
118
|
Toml::Merge::Version.class_eval do
|
|
107
119
|
extend VersionGem::Basic
|
|
108
120
|
end
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: toml-merge
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.1
|
|
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: '
|
|
46
|
+
version: '5.0'
|
|
47
47
|
- - ">="
|
|
48
48
|
- !ruby/object:Gem::Version
|
|
49
|
-
version:
|
|
49
|
+
version: 5.0.5
|
|
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: '
|
|
56
|
+
version: '5.0'
|
|
57
57
|
- - ">="
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version:
|
|
59
|
+
version: 5.0.5
|
|
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: '
|
|
66
|
+
version: '4.0'
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version:
|
|
69
|
+
version: 4.0.6
|
|
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: '
|
|
76
|
+
version: '4.0'
|
|
77
77
|
- - ">="
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
|
-
version:
|
|
79
|
+
version: 4.0.6
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: version_gem
|
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -97,6 +97,86 @@ dependencies:
|
|
|
97
97
|
- - ">="
|
|
98
98
|
- !ruby/object:Gem::Version
|
|
99
99
|
version: 1.1.9
|
|
100
|
+
- !ruby/object:Gem::Dependency
|
|
101
|
+
name: citrus
|
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - "~>"
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '3.0'
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 3.0.2
|
|
110
|
+
type: :development
|
|
111
|
+
prerelease: false
|
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '3.0'
|
|
117
|
+
- - ">="
|
|
118
|
+
- !ruby/object:Gem::Version
|
|
119
|
+
version: 3.0.2
|
|
120
|
+
- !ruby/object:Gem::Dependency
|
|
121
|
+
name: parslet
|
|
122
|
+
requirement: !ruby/object:Gem::Requirement
|
|
123
|
+
requirements:
|
|
124
|
+
- - "~>"
|
|
125
|
+
- !ruby/object:Gem::Version
|
|
126
|
+
version: '2.0'
|
|
127
|
+
- - ">="
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: 2.0.0
|
|
130
|
+
type: :development
|
|
131
|
+
prerelease: false
|
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - "~>"
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: '2.0'
|
|
137
|
+
- - ">="
|
|
138
|
+
- !ruby/object:Gem::Version
|
|
139
|
+
version: 2.0.0
|
|
140
|
+
- !ruby/object:Gem::Dependency
|
|
141
|
+
name: toml
|
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - "~>"
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: '0.3'
|
|
147
|
+
- - ">="
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: 0.3.0
|
|
150
|
+
type: :development
|
|
151
|
+
prerelease: false
|
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
153
|
+
requirements:
|
|
154
|
+
- - "~>"
|
|
155
|
+
- !ruby/object:Gem::Version
|
|
156
|
+
version: '0.3'
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: 0.3.0
|
|
160
|
+
- !ruby/object:Gem::Dependency
|
|
161
|
+
name: toml-rb
|
|
162
|
+
requirement: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - "~>"
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '4.1'
|
|
167
|
+
- - ">="
|
|
168
|
+
- !ruby/object:Gem::Version
|
|
169
|
+
version: 4.1.0
|
|
170
|
+
type: :development
|
|
171
|
+
prerelease: false
|
|
172
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
173
|
+
requirements:
|
|
174
|
+
- - "~>"
|
|
175
|
+
- !ruby/object:Gem::Version
|
|
176
|
+
version: '4.1'
|
|
177
|
+
- - ">="
|
|
178
|
+
- !ruby/object:Gem::Version
|
|
179
|
+
version: 4.1.0
|
|
100
180
|
- !ruby/object:Gem::Dependency
|
|
101
181
|
name: kettle-dev
|
|
102
182
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -166,6 +246,9 @@ dependencies:
|
|
|
166
246
|
- - "~>"
|
|
167
247
|
- !ruby/object:Gem::Version
|
|
168
248
|
version: '3.0'
|
|
249
|
+
- - "~>"
|
|
250
|
+
- !ruby/object:Gem::Version
|
|
251
|
+
version: 3.0.6
|
|
169
252
|
type: :development
|
|
170
253
|
prerelease: false
|
|
171
254
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -173,6 +256,9 @@ dependencies:
|
|
|
173
256
|
- - "~>"
|
|
174
257
|
- !ruby/object:Gem::Version
|
|
175
258
|
version: '3.0'
|
|
259
|
+
- - "~>"
|
|
260
|
+
- !ruby/object:Gem::Version
|
|
261
|
+
version: 3.0.6
|
|
176
262
|
- !ruby/object:Gem::Dependency
|
|
177
263
|
name: kettle-test
|
|
178
264
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -182,7 +268,7 @@ dependencies:
|
|
|
182
268
|
version: '1.0'
|
|
183
269
|
- - ">="
|
|
184
270
|
- !ruby/object:Gem::Version
|
|
185
|
-
version: 1.0.
|
|
271
|
+
version: 1.0.10
|
|
186
272
|
type: :development
|
|
187
273
|
prerelease: false
|
|
188
274
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -192,7 +278,7 @@ dependencies:
|
|
|
192
278
|
version: '1.0'
|
|
193
279
|
- - ">="
|
|
194
280
|
- !ruby/object:Gem::Version
|
|
195
|
-
version: 1.0.
|
|
281
|
+
version: 1.0.10
|
|
196
282
|
- !ruby/object:Gem::Dependency
|
|
197
283
|
name: ruby-progressbar
|
|
198
284
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -216,7 +302,7 @@ dependencies:
|
|
|
216
302
|
version: '1.0'
|
|
217
303
|
- - ">="
|
|
218
304
|
- !ruby/object:Gem::Version
|
|
219
|
-
version: 1.0.
|
|
305
|
+
version: 1.0.3
|
|
220
306
|
type: :development
|
|
221
307
|
prerelease: false
|
|
222
308
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -226,7 +312,7 @@ dependencies:
|
|
|
226
312
|
version: '1.0'
|
|
227
313
|
- - ">="
|
|
228
314
|
- !ruby/object:Gem::Version
|
|
229
|
-
version: 1.0.
|
|
315
|
+
version: 1.0.3
|
|
230
316
|
- !ruby/object:Gem::Dependency
|
|
231
317
|
name: gitmoji-regex
|
|
232
318
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -294,10 +380,10 @@ licenses:
|
|
|
294
380
|
- MIT
|
|
295
381
|
metadata:
|
|
296
382
|
homepage_uri: https://toml-merge.galtzo.com/
|
|
297
|
-
source_code_uri: https://github.com/kettle-rb/toml-merge/tree/v2.0.
|
|
298
|
-
changelog_uri: https://github.com/kettle-rb/toml-merge/blob/v2.0.
|
|
383
|
+
source_code_uri: https://github.com/kettle-rb/toml-merge/tree/v2.0.1
|
|
384
|
+
changelog_uri: https://github.com/kettle-rb/toml-merge/blob/v2.0.1/CHANGELOG.md
|
|
299
385
|
bug_tracker_uri: https://github.com/kettle-rb/toml-merge/issues
|
|
300
|
-
documentation_uri: https://www.rubydoc.info/gems/toml-merge/2.0.
|
|
386
|
+
documentation_uri: https://www.rubydoc.info/gems/toml-merge/2.0.1
|
|
301
387
|
funding_uri: https://github.com/sponsors/pboling
|
|
302
388
|
wiki_uri: https://github.com/kettle-rb/toml-merge/wiki
|
|
303
389
|
news_uri: https://www.railsbling.com/tags/toml-merge
|
|
@@ -326,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
326
412
|
- !ruby/object:Gem::Version
|
|
327
413
|
version: '0'
|
|
328
414
|
requirements: []
|
|
329
|
-
rubygems_version: 4.0.
|
|
415
|
+
rubygems_version: 4.0.5
|
|
330
416
|
specification_version: 4
|
|
331
417
|
summary: "☯️ TOML file smart merge using tree-sitter AST analysis"
|
|
332
418
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|