Skip to content

Commit 1f97f09

Browse files
committed
✨ Ast::Merge::RSpec::MergeGemRegistry.register_known_gems
- **`Ast::Merge::RSpec::MergeGemRegistry.register_known_gems`**: Selective registration of known merge gems for RSpec dependency tags - Allows test suites to explicitly register only the merge gems they need, avoiding overhead of registering all known gems - Usage in `spec/config/tree_haver.rb`: `MergeGemRegistry.register_known_gems(:prism_merge, :commonmarker_merge)` - Enables proper RSpec tag-based test skipping for optional merge gem dependencies - Example: Tests tagged with `:prism_merge` are automatically skipped when prism-merge isn't available - **RSpec dependency tag load order pattern**: Merge gems now load tree_haver and dependency tags early via `spec/config/tree_haver.rb` - Ensures `TreeHaver::RSpec::DependencyTags` is loaded before gems register themselves - Pattern: Load tree_haver/rspec → Load ast/merge/rspec → Register known gems → Load library - Applied to markdown-merge and markly-merge; other merge gems should follow this pattern
1 parent 9d8979c commit 1f97f09

File tree

6 files changed

+87
-13
lines changed

6 files changed

+87
-13
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,19 @@ Please file a bug if you notice a violation of semantic versioning.
2020

2121
### Added
2222

23+
- **`Ast::Merge::RSpec::MergeGemRegistry.register_known_gems`**: Selective registration of known merge gems for RSpec dependency tags
24+
- Allows test suites to explicitly register only the merge gems they need, avoiding overhead of registering all known gems
25+
- Usage in `spec/config/tree_haver.rb`: `MergeGemRegistry.register_known_gems(:prism_merge, :commonmarker_merge)`
26+
- Enables proper RSpec tag-based test skipping for optional merge gem dependencies
27+
- Example: Tests tagged with `:prism_merge` are automatically skipped when prism-merge isn't available
28+
2329
### Changed
2430

2531
- Upgrade to [tree_haver v5.0.2](https://github.com/kettle-rb/tree_haver/releases/tag/v5.0.2)
32+
- **RSpec dependency tag load order pattern**: Merge gems now load tree_haver and dependency tags early via `spec/config/tree_haver.rb`
33+
- Ensures `TreeHaver::RSpec::DependencyTags` is loaded before gems register themselves
34+
- Pattern: Load tree_haver/rspec → Load ast/merge/rspec → Register known gems → Load library
35+
- Applied to markdown-merge and markly-merge; other merge gems should follow this pattern
2636

2737
### Deprecated
2838

README.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ The `*-merge` gem family provides intelligent, AST-based merging for various fil
6262

6363
| Gem | Version | CI | | Language<br>/ Format | Parser Backend(s) | Description |
6464
|------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|-------------|
65-
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] | [![Version][tree_haver-ci-i]][tree_haver-ci] | Multi | MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
65+
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] | [![Version][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
6666
| [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] | [![Version][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
6767
| [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] | [![Version][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
6868
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] | [![Version][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
@@ -80,18 +80,18 @@ The `*-merge` gem family provides intelligent, AST-based merging for various fil
8080

8181
tree_haver supports multiple parsing backends, but not all backends work on all Ruby platforms:
8282

83-
| Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
84-
|------------------------------------------------|:---:|:-----:|:-----------:|-----------------------------------------------------|
85-
| **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) |||| C extension, MRI only |
86-
| **Rust** ([tree_stump][tree_stump]) |||| Rust extension via magnus/rb-sys, MRI only |
87-
| **FFI** |||| TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
88-
| **Java** ([jtreesitter][jtreesitter]) |||| JRuby only, requires grammar JARs |
89-
| **Prism** |||| Ruby parsing, stdlib in Ruby 3.4+ |
90-
| **Psych** | | | | YAML parsing, stdlib |
91-
| **Citrus** ||| | Pure Ruby PEG parser, no native dependencies |
92-
| **Parslet** || | | Pure Ruby PEG parser, no native dependencies |
93-
| **Commonmarker** |||| Rust extension for Markdown |
94-
| **Markly** |||| C extension for Markdown |
83+
| Platform 👉️<br> TreeHaver Backend 👇️ | MRI | JRuby | TruffleRuby | Notes |
84+
|-------------------------------------------------|:---:|:-----:|:-----------:|----------------------------------------------------------------------------|
85+
| **MRI** ([ruby_tree_sitter][ruby_tree_sitter]) |||| C extension, MRI only |
86+
| **Rust** ([tree_stump][tree_stump]) |||| Rust extension via magnus/rb-sys, MRI only |
87+
| **FFI** ([ffi][ffi]) |||| TruffleRuby's FFI doesn't support `STRUCT_BY_VALUE` |
88+
| **Java** ([jtreesitter][jtreesitter]) |||| JRuby only, requires grammar JARs |
89+
| **Prism** ([prism][prism]) |||| Ruby parsing, stdlib in Ruby 3.4+ |
90+
| **Psych** ([psych][psych]) || | | YAML parsing, stdlib |
91+
| **Citrus** ([citrus][citrus]) || | | Pure Ruby PEG parser, no native dependencies |
92+
| **Parslet** ([parslet][parslet]) || | | Pure Ruby PEG parser, no native dependencies |
93+
| **Commonmarker** ([commonmarker][commonmarker]) |||| Rust extension for Markdown (via [commonmarker-merge][commonmarker-merge]) |
94+
| **Markly** ([markly][markly]) |||| C extension for Markdown (via [markly-merge][markly-merge]) |
9595

9696
**Legend**: ✅ = Works, ❌ = Does not work, ❓ = Untested
9797

@@ -185,6 +185,7 @@ tree_haver supports multiple parsing backends, but not all backends work on all
185185
[kettle-jem-ci]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml
186186
[prism]: https://github.com/ruby/prism
187187
[psych]: https://github.com/ruby/psych
188+
[ffi]: https://github.com/ffi/ffi
188189
[ts-json]: https://github.com/tree-sitter/tree-sitter-json
189190
[ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
190191
[ts-bash]: https://github.com/tree-sitter/tree-sitter-bash
@@ -199,6 +200,8 @@ tree_haver supports multiple parsing backends, but not all backends work on all
199200
[ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
200201
[tree_stump]: https://github.com/joker1007/tree_stump
201202
[jtreesitter]: https://central.sonatype.com/artifact/io.github.tree-sitter/jtreesitter
203+
[citrus]: https://github.com/mjackson/citrus
204+
[parslet]: https://github.com/kschiess/parslet
202205

203206
### Architecture: tree\_haver + ast-merge
204207

lib/ast/merge/rspec/dependency_tags.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ def reset!
8484
end
8585
end
8686

87+
# NOTE: Known merge gems (KNOWN_GEMS) are NOT automatically registered here.
88+
# Each test suite should explicitly register only the gems it needs in its
89+
# spec/config/tree_haver.rb file using:
90+
#
91+
# Ast::Merge::RSpec::MergeGemRegistry.register_known_gems(:gem1, :gem2, ...)
92+
#
93+
# This avoids wasting time registering gems that aren't needed for a particular
94+
# test suite. Only the gems that are actually required for testing should be registered.
95+
#
96+
# Example for a gem that needs to test with optional markdown backends:
97+
# Ast::Merge::RSpec::MergeGemRegistry.register_known_gems(
98+
# :commonmarker_merge,
99+
# :markly_merge
100+
# )
101+
87102
# Configure RSpec with dependency-based exclusion filters
88103
RSpec.configure do |config|
89104
deps = Ast::Merge::RSpec::DependencyTags

lib/ast/merge/rspec/merge_gem_registry.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,48 @@ def registered?(tag_name)
253253
end
254254
end
255255

256+
# Register one or more known gems for RSpec dependency tag support
257+
#
258+
# This allows test suites to explicitly register only the merge gems they need
259+
# for their tests, avoiding the overhead of registering all known gems.
260+
#
261+
# @param gem_names [Array<Symbol>] list of gem names from KNOWN_GEMS to register
262+
# @return [void]
263+
#
264+
# @example In spec/config/tree_haver.rb
265+
# # Only register the markdown merge gems that markly-merge tests depend on
266+
# Ast::Merge::RSpec::MergeGemRegistry.register_known_gems(:prism_merge)
267+
#
268+
# @example Register multiple gems
269+
# Ast::Merge::RSpec::MergeGemRegistry.register_known_gems(
270+
# :commonmarker_merge,
271+
# :markly_merge
272+
# )
273+
def register_known_gems(*gem_names)
274+
gem_names.each do |tag_name|
275+
tag_sym = tag_name.to_sym
276+
277+
# Skip if not in KNOWN_GEMS
278+
unless KNOWN_GEMS.key?(tag_sym)
279+
warn "Unknown gem: #{tag_name}. Available: #{KNOWN_GEMS.keys.join(", ")}"
280+
next
281+
end
282+
283+
# Skip if already registered
284+
next if registered?(tag_sym)
285+
286+
metadata = KNOWN_GEMS[tag_sym]
287+
register(
288+
tag_sym,
289+
require_path: metadata[:require_path],
290+
merger_class: metadata[:merger_class],
291+
test_source: metadata[:test_source],
292+
category: metadata[:category],
293+
skip_instantiation: metadata[:skip_instantiation]
294+
)
295+
end
296+
end
297+
256298
# Get all registered gem tag names (including pre-configured known gems)
257299
#
258300
# @return [Array<Symbol>] list of registered tag names

spec/config/tree_haver.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# TreeHaver needs to be loaded early, so we can make the DependencyTags available
2+
require "tree_haver"
3+
require "tree_haver/rspec"

spec/spec_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
# Internal ENV config
1010
require_relative "config/debug"
11+
require_relative "config/tree_haver"
1112

1213
# Config for development dependencies of this library
1314
# i.e., not configured by this library

0 commit comments

Comments
 (0)