ast-merge 2.0.8 → 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 +4 -4
- checksums.yaml.gz.sig +1 -2
- data/CHANGELOG.md +39 -1
- data/LICENSE.txt +1 -1
- data/README.md +22 -21
- data/lib/ast/merge/navigable_statement.rb +3 -0
- data/lib/ast/merge/partial_template_merger.rb +17 -8
- data/lib/ast/merge/rspec/dependency_tags.rb +15 -1
- data/lib/ast/merge/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +6 -6
- 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: 9659c263184e27b07b7fa51f976e398c82f5da9610411fbe867e2a7319042ba8
|
|
4
|
+
data.tar.gz: 5dda81d19a9deb7bc2c9cfad0a8ab28b348cfb243ced1b453495bdef232d446f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 129fb9114b909bf56c1adacbf0b0f3b1527a006d12ad4df61f8f209fee482f681a18f67f4cea21f994fac7ee268ac032ef567ff3fb4dec5ed178f88506c122c5
|
|
7
|
+
data.tar.gz: 671afd9a6960261dd3918577a8111e05bd71ecd9291388938e93baeb62b29002036e3e36d23e78e8bada44f0cd47d8e385df6052d252281cd4ea1b49bb057b9c
|
checksums.yaml.gz.sig
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
���e5͘�K���-���x~�M���-�_px�q
|
|
1
|
+
\|�p�]ճ��o\�v�l@.�@ z9������-� �j�=7�3�7H�g�7"f��Dr �Om�(t�Ұ�P\?�t���-6O�i����ץ4�Ƅ��nS�&���0M�;)�4�x��Ŕ+RM
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,40 @@ 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
|
+
|
|
52
|
+
## [2.0.9] - 2026-01-02
|
|
53
|
+
|
|
54
|
+
- TAG: [v2.0.9][2.0.9t]
|
|
55
|
+
- COVERAGE: 97.09% -- 2637/2716 lines in 48 files
|
|
56
|
+
- BRANCH COVERAGE: 89.64% -- 883/985 branches in 48 files
|
|
57
|
+
- 98.71% documented
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- **`NavigableStatement.find_matching` now returns empty array when no criteria specified** -
|
|
62
|
+
Previously, when both `type: nil` and `text: nil` and no block was given, the method would
|
|
63
|
+
match ALL statements (since no conditions filtered anything out). This caused
|
|
64
|
+
`PartialTemplateMerger` to incorrectly report `has_section: true` when `anchor: nil` was passed.
|
|
65
|
+
Now returns an empty array when no criteria are specified.
|
|
66
|
+
|
|
33
67
|
## [2.0.8] - 2026-01-01
|
|
34
68
|
|
|
35
69
|
- TAG: [v2.0.8][2.0.8t]
|
|
@@ -429,7 +463,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
429
463
|
|
|
430
464
|
- Initial release
|
|
431
465
|
|
|
432
|
-
[Unreleased]: https://github.com/kettle-rb/ast-merge/compare/v2.0.
|
|
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
|
|
469
|
+
[2.0.9]: https://github.com/kettle-rb/ast-merge/compare/v2.0.8...v2.0.9
|
|
470
|
+
[2.0.9t]: https://github.com/kettle-rb/ast-merge/releases/tag/v2.0.9
|
|
433
471
|
[2.0.8]: https://github.com/kettle-rb/ast-merge/compare/v2.0.7...v2.0.8
|
|
434
472
|
[2.0.8t]: https://github.com/kettle-rb/ast-merge/releases/tag/v2.0.8
|
|
435
473
|
[2.0.7]: https://github.com/kettle-rb/ast-merge/compare/v2.0.6...v2.0.7
|
data/LICENSE.txt
CHANGED
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
|
|
64
|
-
|
|
65
|
-
| [tree_haver][tree_haver] | Multi
|
|
66
|
-
| [ast-merge][ast-merge] | Text
|
|
67
|
-
| [
|
|
68
|
-
| [
|
|
69
|
-
| [
|
|
70
|
-
| [
|
|
71
|
-
| [
|
|
72
|
-
| [
|
|
73
|
-
| [
|
|
74
|
-
| [
|
|
75
|
-
| [
|
|
76
|
-
| [
|
|
77
|
-
| [
|
|
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
|
[](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
|
- [](https://discord.gg/3qme4XHNKN)
|
|
390
|
+
|
|
389
391
|
- [](https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share)
|
|
392
|
+
|
|
390
393
|
- [](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
|
|
@@ -842,7 +843,7 @@ See [LICENSE.txt](LICENSE.txt) for the official [Copyright Notice](https://opens
|
|
|
842
843
|
|
|
843
844
|
<ul>
|
|
844
845
|
<li>
|
|
845
|
-
Copyright (c) 2025 Peter H. Boling, of
|
|
846
|
+
Copyright (c) 2025-2026 Peter H. Boling, of
|
|
846
847
|
<a href="https://discord.gg/3qme4XHNKN">
|
|
847
848
|
Galtzo.com
|
|
848
849
|
<picture>
|
|
@@ -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.
|
|
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
|
|
@@ -93,6 +93,9 @@ module Ast
|
|
|
93
93
|
# @yield [NavigableStatement] Optional block for custom matching
|
|
94
94
|
# @return [Array<NavigableStatement>] Matching statements
|
|
95
95
|
def find_matching(statements, type: nil, text: nil, &block)
|
|
96
|
+
# If no criteria specified, return empty array (nothing to match)
|
|
97
|
+
return [] if type.nil? && text.nil? && !block_given?
|
|
98
|
+
|
|
96
99
|
statements.select do |stmt|
|
|
97
100
|
matches = true
|
|
98
101
|
matches &&= stmt.type.to_s == type.to_s if type
|
|
@@ -358,25 +358,34 @@ module Ast
|
|
|
358
358
|
end
|
|
359
359
|
|
|
360
360
|
def build_merged_content(before, section, after)
|
|
361
|
-
|
|
361
|
+
result = +""
|
|
362
362
|
|
|
363
363
|
# Before content
|
|
364
364
|
unless before.nil? || before.strip.empty?
|
|
365
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
data/lib/ast/merge/version.rb
CHANGED
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.
|
|
4
|
+
version: 2.0.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -66,7 +66,7 @@ dependencies:
|
|
|
66
66
|
version: '3.2'
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 3.2.
|
|
69
|
+
version: 3.2.3
|
|
70
70
|
type: :runtime
|
|
71
71
|
prerelease: false
|
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -76,7 +76,7 @@ dependencies:
|
|
|
76
76
|
version: '3.2'
|
|
77
77
|
- - ">="
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
|
-
version: 3.2.
|
|
79
|
+
version: 3.2.3
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: kettle-dev
|
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -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.
|
|
360
|
-
changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v2.0.
|
|
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.
|
|
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
|