ast-merge 2.0.9 → 2.0.10

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: b3751d56fac80906392c20aabf12c17f7dfc658b677a26866c42d842666e51f6
4
- data.tar.gz: 41d59c958a7f0edae861bb0b3c5516f1b7120c85b4dc240880c5e9179017d210
3
+ metadata.gz: 9659c263184e27b07b7fa51f976e398c82f5da9610411fbe867e2a7319042ba8
4
+ data.tar.gz: 5dda81d19a9deb7bc2c9cfad0a8ab28b348cfb243ced1b453495bdef232d446f
5
5
  SHA512:
6
- metadata.gz: 70ae22f513f5de125cbdea642483dbbc9c073f9133dd45b7b78d1a3dc0892757c3007fc252a9eb38b0d61e0423595976b1fb6f4581ff225792d5d12cf133138f
7
- data.tar.gz: 802ed0bb804cbd92f1d85250726a573e953783e325debba0a87d5fc344cef48bac5b2f15d585e91d789a11f9d6fb02230d1d3971f40172aab5d01217a55c8138
6
+ metadata.gz: 129fb9114b909bf56c1adacbf0b0f3b1527a006d12ad4df61f8f209fee482f681a18f67f4cea21f994fac7ee268ac032ef567ff3fb4dec5ed178f88506c122c5
7
+ data.tar.gz: 671afd9a6960261dd3918577a8111e05bd71ecd9291388938e93baeb62b29002036e3e36d23e78e8bada44f0cd47d8e385df6052d252281cd4ea1b49bb057b9c
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,25 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.0.10] - 2026-01-04
34
+
35
+ - TAG: [v2.0.10][2.0.10t]
36
+ - COVERAGE: 97.10% -- 2642/2721 lines in 48 files
37
+ - BRANCH COVERAGE: 89.57% -- 893/997 branches in 48 files
38
+ - 98.72% documented
39
+
40
+ ### Added
41
+
42
+ - Dependency tags for `rbs_merge` and `not_rbs_merge`
43
+
44
+ ### Changed
45
+
46
+ - Upgraded to `tree_haver` v3.2.4 (major new features, and bug fixes, see [release notes](https://github.com/kettle-rb/tree_haver/releases/tag/v3.2.4))
47
+
48
+ ### Fixed
49
+
50
+ - `PartialTemplateMerger#build_merged_content` previously always injected an extra newline between parts, now join is context-aware
51
+
33
52
  ## [2.0.9] - 2026-01-02
34
53
 
35
54
  - TAG: [v2.0.9][2.0.9t]
@@ -444,7 +463,9 @@ Please file a bug if you notice a violation of semantic versioning.
444
463
 
445
464
  - Initial release
446
465
 
447
- [Unreleased]: https://github.com/kettle-rb/ast-merge/compare/v2.0.9...HEAD
466
+ [Unreleased]: https://github.com/kettle-rb/ast-merge/compare/v2.0.10...HEAD
467
+ [2.0.10]: https://github.com/kettle-rb/ast-merge/compare/v2.0.9...v2.0.10
468
+ [2.0.10t]: https://github.com/kettle-rb/ast-merge/releases/tag/v2.0.10
448
469
  [2.0.9]: https://github.com/kettle-rb/ast-merge/compare/v2.0.8...v2.0.9
449
470
  [2.0.9t]: https://github.com/kettle-rb/ast-merge/releases/tag/v2.0.9
450
471
  [2.0.8]: https://github.com/kettle-rb/ast-merge/compare/v2.0.7...v2.0.8
data/README.md CHANGED
@@ -55,26 +55,25 @@
55
55
 
56
56
  Ast::Merge is **not typically used directly** - instead, use one of the format-specific gems built on top of it.
57
57
 
58
-
59
58
  ### The `*-merge` Gem Family
60
59
 
61
60
  The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
62
61
 
63
- | Gem | Format | Parser Backend(s) | Description |
64
- |------------------------------------------|----------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
65
- | [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) |
66
- | [ast-merge][ast-merge] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
67
- | [prism-merge][prism-merge] | Ruby | [Prism][prism] | Smart merge for Ruby source files |
68
- | [psych-merge][psych-merge] | YAML | [Psych][psych] | Smart merge for YAML files |
69
- | [json-merge][json-merge] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
70
- | [jsonc-merge][jsonc-merge] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
71
- | [bash-merge][bash-merge] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
72
- | [rbs-merge][rbs-merge] | RBS | [RBS][rbs] | Smart merge for Ruby type signatures |
73
- | [dotenv-merge][dotenv-merge] | Dotenv | internal | Smart merge for `.env` files |
74
- | [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 |
75
- | [markdown-merge][markdown-merge] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver) | **Foundation**: Shared base for Markdown mergers with inner code block merging |
76
- | [markly-merge][markly-merge] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
77
- | [commonmarker-merge][commonmarker-merge] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
62
+ | Gem | Language<br>/ Format | Parser Backend(s) | Description |
63
+ |------------------------------------------|----------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
64
+ | [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) |
65
+ | [ast-merge][ast-merge] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
66
+ | [bash-merge][bash-merge] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
67
+ | [commonmarker-merge][commonmarker-merge] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
68
+ | [dotenv-merge][dotenv-merge] | Dotenv | internal | Smart merge for `.env` files |
69
+ | [json-merge][json-merge] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
70
+ | [jsonc-merge][jsonc-merge] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
71
+ | [markdown-merge][markdown-merge] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver) | **Foundation**: Shared base for Markdown mergers with inner code block merging |
72
+ | [markly-merge][markly-merge] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
73
+ | [prism-merge][prism-merge] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
74
+ | [psych-merge][psych-merge] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
75
+ | [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 |
76
+ | [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 |
78
77
 
79
78
  **Example implementations** for the gem templating use case:
80
79
 
@@ -381,12 +380,16 @@ The maintainers of this and thousands of other packages are working with Tidelif
381
380
  [![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-ast-merge?utm_source=rubygems-ast-merge&utm_medium=referral&utm_campaign=readme)
382
381
 
383
382
  - 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
383
+
384
384
  - 💡Tidelift is part of [Sonar](https://blog.tidelift.com/tidelift-joins-sonar)
385
+
385
386
  - 💡Tidelift pays maintainers to maintain the software you depend on\!<br/>📊`@`Pointy Haired Boss: An [enterprise support](https://tidelift.com/subscription/pkg/rubygems-ast-merge?utm_source=rubygems-ast-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
386
- Alternatively:
387
+ Alternatively:
387
388
 
388
389
  - [![Live Chat on Discord](https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord)](https://discord.gg/3qme4XHNKN)
390
+
389
391
  - [![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)
392
+
390
393
  - [![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)
391
394
  </details>
392
395
 
@@ -547,7 +550,6 @@ A freeze block consists of:
547
550
  - A **start marker** comment (e.g., `# mytoken:freeze`)
548
551
  - The protected content
549
552
  - An **end marker** comment (e.g., `# mytoken:unfreeze`)
550
-
551
553
  <!-- end list -->
552
554
  ``` ruby
553
555
  # In a Ruby file with prism-merge:
@@ -599,7 +601,6 @@ preferences for different types of nodes (e.g., prefer template for linter confi
599
601
 
600
602
  - `:default` key for the fallback preference
601
603
  - Custom keys matching the `merge_type` values from your `node_typing`
602
-
603
604
  <!-- end list -->
604
605
  ``` ruby
605
606
  # Example: Prefer template for lint gem configs, destination for everything else
@@ -1032,7 +1033,7 @@ Thanks for RTFM. ☺️
1032
1033
  [📌gitmoji]: https://gitmoji.dev
1033
1034
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1034
1035
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1035
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.716-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1036
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.721-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1036
1037
  [🔐security]: SECURITY.md
1037
1038
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1038
1039
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -358,25 +358,34 @@ module Ast
358
358
  end
359
359
 
360
360
  def build_merged_content(before, section, after)
361
- parts = []
361
+ result = +""
362
362
 
363
363
  # Before content
364
364
  unless before.nil? || before.strip.empty?
365
- parts << before.chomp
365
+ result << before.chomp("\n")
366
366
  end
367
367
 
368
- # Merged section
368
+ # Merged section - ensure exactly one blank line before it if there's content before
369
369
  unless section.nil? || section.strip.empty?
370
- parts << section.chomp
370
+ unless result.empty?
371
+ # Ensure exactly one blank line between before and section
372
+ result << "\n" unless result.end_with?("\n")
373
+ result << "\n" unless result.end_with?("\n\n")
374
+ end
375
+ result << section.chomp("\n")
371
376
  end
372
377
 
373
- # After content
378
+ # After content - ensure exactly one blank line before it if there's content before
374
379
  unless after.nil? || after.strip.empty?
375
- parts << after.chomp
380
+ unless result.empty?
381
+ # Ensure exactly one blank line between section and after
382
+ result << "\n" unless result.end_with?("\n")
383
+ result << "\n" unless result.end_with?("\n\n")
384
+ end
385
+ result << after.chomp("\n")
376
386
  end
377
387
 
378
- result = parts.join("\n\n")
379
- result += "\n" unless result.end_with?("\n")
388
+ result << "\n" unless result.empty? || result.end_with?("\n")
380
389
  result
381
390
  end
382
391
 
@@ -49,6 +49,9 @@
49
49
  # [:psych_merge]
50
50
  # psych-merge gem is available and functional.
51
51
  #
52
+ # [:rbs_merge]
53
+ # rbs-merge gem is available and functional.
54
+ #
52
55
  # [:any_markdown_merge]
53
56
  # At least one markdown merge gem (markly-merge or commonmarker-merge) is available.
54
57
  #
@@ -57,7 +60,7 @@
57
60
  # All positive tags have negated versions prefixed with `not_`:
58
61
  # - :not_markly_merge, :not_commonmarker_merge, :not_markdown_merge
59
62
  # - :not_prism_merge, :not_json_merge, :not_jsonc_merge
60
- # - :not_toml_merge, :not_bash_merge, :not_psych_merge
63
+ # - :not_toml_merge, :not_bash_merge, :not_psych_merge, :not_rbs_merge
61
64
  # - :not_any_markdown_merge
62
65
 
63
66
  module Ast
@@ -142,6 +145,14 @@ module Ast
142
145
  return @psych_merge_available if defined?(@psych_merge_available)
143
146
  @psych_merge_available = merge_gem_works?("psych/merge", "Psych::Merge::SmartMerger", "key: value")
144
147
  end
148
+
149
+ # Check if rbs-merge is available and functional
150
+ #
151
+ # @return [Boolean] true if rbs-merge works
152
+ def rbs_merge_available?
153
+ return @rbs_merge_available if defined?(@rbs_merge_available)
154
+ @rbs_merge_available = merge_gem_works?("rbs/merge", "Rbs::Merge::SmartMerger", "class Foo end")
155
+ end
145
156
  # rubocop:enable ThreadSafety/ClassInstanceVariable
146
157
 
147
158
  # Check if at least one markdown merge gem is available
@@ -169,6 +180,7 @@ module Ast
169
180
  toml_merge: toml_merge_available?,
170
181
  bash_merge: bash_merge_available?,
171
182
  psych_merge: psych_merge_available?,
183
+ rbs_merge: rbs_merge_available?,
172
184
  any_markdown_merge: any_markdown_merge_available?,
173
185
  }
174
186
  end
@@ -233,6 +245,7 @@ RSpec.configure do |config|
233
245
  config.filter_run_excluding(toml_merge: true) unless deps.toml_merge_available?
234
246
  config.filter_run_excluding(bash_merge: true) unless deps.bash_merge_available?
235
247
  config.filter_run_excluding(psych_merge: true) unless deps.psych_merge_available?
248
+ config.filter_run_excluding(rbs_merge: true) unless deps.rbs_merge_available?
236
249
  config.filter_run_excluding(any_markdown_merge: true) unless deps.any_markdown_merge_available?
237
250
 
238
251
  # ============================================================
@@ -248,5 +261,6 @@ RSpec.configure do |config|
248
261
  config.filter_run_excluding(not_toml_merge: true) if deps.toml_merge_available?
249
262
  config.filter_run_excluding(not_bash_merge: true) if deps.bash_merge_available?
250
263
  config.filter_run_excluding(not_psych_merge: true) if deps.psych_merge_available?
264
+ config.filter_run_excluding(not_rbs_merge: true) if deps.rbs_merge_available?
251
265
  config.filter_run_excluding(not_any_markdown_merge: true) if deps.any_markdown_merge_available?
252
266
  end
@@ -5,7 +5,7 @@ module Ast
5
5
  # Version information for Ast::Merge
6
6
  module Version
7
7
  # Current version of the ast-merge gem
8
- VERSION = "2.0.9"
8
+ VERSION = "2.0.10"
9
9
  end
10
10
  VERSION = Version::VERSION # traditional location
11
11
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ast-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.9
4
+ version: 2.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -356,10 +356,10 @@ licenses:
356
356
  - MIT
357
357
  metadata:
358
358
  homepage_uri: https://ast-merge.galtzo.com/
359
- source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v2.0.9
360
- changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v2.0.9/CHANGELOG.md
359
+ source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v2.0.10
360
+ changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v2.0.10/CHANGELOG.md
361
361
  bug_tracker_uri: https://github.com/kettle-rb/ast-merge/issues
362
- documentation_uri: https://www.rubydoc.info/gems/ast-merge/2.0.9
362
+ documentation_uri: https://www.rubydoc.info/gems/ast-merge/2.0.10
363
363
  funding_uri: https://github.com/sponsors/pboling
364
364
  wiki_uri: https://github.com/kettle-rb/ast-merge/wiki
365
365
  news_uri: https://www.railsbling.com/tags/ast-merge
metadata.gz.sig CHANGED
Binary file