tree_haver 3.1.2 → 3.2.0

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.
@@ -49,45 +49,45 @@
49
49
  # # This test only runs when Psych is available
50
50
  # end
51
51
  #
52
- # it "requires Commonmarker backend", :commonmarker do
52
+ # it "requires Commonmarker backend", :commonmarker_backend do
53
53
  # # This test only runs when commonmarker gem is available
54
54
  # end
55
55
  #
56
- # it "requires Markly backend", :markly do
56
+ # it "requires Markly backend", :markly_backend do
57
57
  # # This test only runs when markly gem is available
58
58
  # end
59
59
  #
60
- # it "requires Citrus TOML grammar", :citrus_toml do
61
- # # This test only runs when toml-rb with Citrus grammar is available
60
+ # it "requires Citrus backend", :citrus_backend do
61
+ # # This test only runs when Citrus gem is available
62
62
  # end
63
63
  #
64
64
  # @example Language-specific grammar tags (for *-merge gems)
65
- # it "requires tree-sitter-bash", :tree_sitter_bash do
65
+ # it "requires tree-sitter-bash", :bash_grammar do
66
66
  # # This test only runs when bash grammar is available and parsing works
67
67
  # end
68
68
  #
69
- # it "requires tree-sitter-json", :tree_sitter_json do
69
+ # it "requires tree-sitter-json", :json_grammar do
70
70
  # # This test only runs when json grammar is available and parsing works
71
71
  # end
72
72
  #
73
- # @example Inner-merge dependencies (for markdown-merge CodeBlockMerger)
74
- # it "requires toml-merge", :toml_merge do
75
- # # This test only runs when toml-merge is fully functional
76
- # end
73
+ # == Available Tags
77
74
  #
78
- # it "requires prism-merge", :prism_merge do
79
- # # This test only runs when prism-merge is fully functional
80
- # end
75
+ # === Naming Conventions
81
76
  #
82
- # == Available Tags
77
+ # - `*_backend` = TreeHaver backends (mri, rust, ffi, java, prism, psych, commonmarker, markly, citrus)
78
+ # - `*_engine` = Ruby engines (mri, jruby, truffleruby)
79
+ # - `*_grammar` = tree-sitter grammar files (.so)
80
+ # - `*_parsing` = any parsing capability for a language (combines multiple backends/grammars)
81
+ # - `*_merge` = ast-merge family gems (toml-merge, json-merge, etc.)
83
82
  #
84
83
  # === Positive Tags (run when dependency IS available)
85
84
  #
86
- # ==== TreeHaver Backend Tags
85
+ # ==== TreeHaver Backend Tags (*_backend)
87
86
  #
88
- # [:ffi]
87
+ # [:ffi_backend]
89
88
  # FFI backend is available. Checked dynamically per-test because FFI becomes
90
89
  # unavailable after MRI backend is used (due to libtree-sitter runtime conflicts).
90
+ # Legacy alias: :ffi
91
91
  #
92
92
  # [:mri_backend]
93
93
  # ruby_tree_sitter gem is available.
@@ -104,83 +104,66 @@
104
104
  # [:psych_backend]
105
105
  # Psych is available (stdlib, should always be true).
106
106
  #
107
- # [:commonmarker]
107
+ # [:commonmarker_backend]
108
108
  # commonmarker gem is available.
109
109
  #
110
- # [:markly]
110
+ # [:markly_backend]
111
111
  # markly gem is available.
112
112
  #
113
- # [:citrus_toml]
114
- # toml-rb gem with Citrus grammar is available.
113
+ # [:citrus_backend]
114
+ # Citrus gem is available.
115
115
  #
116
- # ==== Ruby Engine Tags
116
+ # ==== Ruby Engine Tags (*_engine)
117
117
  #
118
- # [:jruby]
118
+ # [:mri_engine]
119
+ # Running on MRI (CRuby).
120
+ #
121
+ # [:jruby_engine]
119
122
  # Running on JRuby.
120
123
  #
121
- # [:truffleruby]
124
+ # [:truffleruby_engine]
122
125
  # Running on TruffleRuby.
123
126
  #
124
- # [:mri]
125
- # Running on MRI (CRuby).
126
- #
127
- # ==== Grammar/Library Tags
127
+ # ==== Tree-Sitter Grammar Tags (*_grammar)
128
128
  #
129
129
  # [:libtree_sitter]
130
130
  # libtree-sitter.so is loadable via FFI.
131
131
  #
132
- # [:toml_grammar]
133
- # A TOML grammar library is available (via TREE_SITTER_TOML_PATH env var).
134
- #
135
- # [:native_parsing]
136
- # Both libtree_sitter and toml_grammar are available.
137
- #
138
- # ==== Language-Specific Grammar Tags (for *-merge gems)
139
- #
140
- # [:tree_sitter_bash]
132
+ # [:bash_grammar]
141
133
  # tree-sitter-bash grammar is available and parsing works.
142
134
  #
143
- # [:tree_sitter_toml]
135
+ # [:toml_grammar]
144
136
  # tree-sitter-toml grammar is available and parsing works.
145
137
  #
146
- # [:tree_sitter_json]
138
+ # [:json_grammar]
147
139
  # tree-sitter-json grammar is available and parsing works.
148
140
  #
149
- # [:tree_sitter_jsonc]
141
+ # [:jsonc_grammar]
150
142
  # tree-sitter-jsonc grammar is available and parsing works.
151
143
  #
152
- # [:toml_rb]
153
- # toml-rb gem is available (Citrus backend for TOML).
154
- #
155
- # [:toml_backend]
156
- # At least one TOML backend (tree-sitter or toml-rb) is available.
144
+ # ==== Language Parsing Capability Tags (*_parsing)
157
145
  #
158
- # [:markdown_backend]
159
- # At least one markdown backend (markly or commonmarker) is available.
146
+ # [:toml_parsing]
147
+ # At least one TOML parser (tree-sitter-toml OR toml-rb/Citrus) is available.
160
148
  #
161
- # ==== Inner-Merge Dependency Tags (for markdown-merge CodeBlockMerger)
149
+ # [:markdown_parsing]
150
+ # At least one markdown parser (commonmarker OR markly) is available.
162
151
  #
163
- # [:toml_merge]
164
- # toml-merge gem is available and functional.
165
- #
166
- # [:json_merge]
167
- # json-merge gem is available and functional.
152
+ # [:native_parsing]
153
+ # A native tree-sitter backend and grammar are available.
168
154
  #
169
- # [:prism_merge]
170
- # prism-merge gem is available and functional.
155
+ # ==== Specific Library Tags
171
156
  #
172
- # [:psych_merge]
173
- # psych-merge gem is available and functional.
157
+ # [:toml_rb]
158
+ # toml-rb gem is available (Citrus backend for TOML).
174
159
  #
175
160
  # === Negated Tags (run when dependency is NOT available)
176
161
  #
177
162
  # All positive tags have negated versions prefixed with `not_`:
178
- # - :not_mri_backend, :not_rust_backend, :not_java_backend
179
- # - :not_jruby, :not_truffleruby, :not_mri
180
- # - :not_libtree_sitter, :not_toml_grammar
181
- # - :not_tree_sitter_bash, :not_tree_sitter_toml, :not_tree_sitter_json, :not_tree_sitter_jsonc
182
- # - :not_toml_rb, :not_toml_backend, :not_markdown_backend
183
- # - :not_toml_merge, :not_json_merge, :not_prism_merge, :not_psych_merge
163
+ # - :not_mri_backend, :not_rust_backend, :not_java_backend, etc.
164
+ # - :not_mri_engine, :not_jruby_engine, :not_truffleruby_engine
165
+ # - :not_libtree_sitter, :not_bash_grammar, :not_toml_grammar, etc.
166
+ # - :not_toml_parsing, :not_markdown_parsing
184
167
  #
185
168
  # == Backend Conflict Protection
186
169
  #
@@ -225,6 +208,10 @@ module TreeHaver
225
208
  #
226
209
  # @return [Boolean] true if FFI backend is usable
227
210
  def ffi_available?
211
+ # TruffleRuby's FFI doesn't support STRUCT_BY_VALUE return types
212
+ # (used by ts_tree_root_node, ts_node_child, ts_node_start_point, etc.)
213
+ return false if truffleruby?
214
+
228
215
  # Try to actually use the FFI backend
229
216
  path = find_toml_grammar_path
230
217
  return false unless path && File.exist?(path)
@@ -235,10 +222,14 @@ module TreeHaver
235
222
  true
236
223
  rescue TreeHaver::BackendConflict, TreeHaver::NotAvailable, LoadError
237
224
  false
225
+ rescue StandardError
226
+ # Catch any other FFI-related errors (e.g., Polyglot::ForeignException)
227
+ false
238
228
  end
239
229
 
240
230
  # Check if ruby_tree_sitter gem is available (MRI backend)
241
231
  #
232
+ # The MRI backend only works on MRI Ruby (C extension).
242
233
  # When this returns true, it also records MRI backend usage with
243
234
  # TreeHaver.record_backend_usage(:mri). This is critical for conflict
244
235
  # detection - without it, FFI would not know that MRI has been loaded.
@@ -246,6 +237,10 @@ module TreeHaver
246
237
  # @return [Boolean] true if ruby_tree_sitter gem is available
247
238
  def mri_backend_available?
248
239
  return @mri_backend_available if defined?(@mri_backend_available)
240
+
241
+ # ruby_tree_sitter is a C extension that only works on MRI
242
+ return @mri_backend_available = false unless mri?
243
+
249
244
  @mri_backend_available = begin
250
245
  require "ruby_tree_sitter"
251
246
  # Record that MRI backend is now loaded - this is critical for
@@ -259,9 +254,15 @@ module TreeHaver
259
254
 
260
255
  # Check if tree_stump gem is available (Rust backend)
261
256
  #
257
+ # The Rust backend only works on MRI Ruby (magnus uses MRI's C API).
258
+ #
262
259
  # @return [Boolean] true if tree_stump gem is available
263
260
  def rust_backend_available?
264
261
  return @rust_backend_available if defined?(@rust_backend_available)
262
+
263
+ # tree_stump uses magnus which requires MRI's C API
264
+ return @rust_backend_available = false unless mri?
265
+
265
266
  @rust_backend_available = begin
266
267
  require "tree_stump"
267
268
  true
@@ -289,6 +290,10 @@ module TreeHaver
289
290
  true
290
291
  rescue TreeHaver::NotAvailable, LoadError
291
292
  false
293
+ rescue StandardError
294
+ # TruffleRuby raises Polyglot::ForeignException when FFI
295
+ # encounters unsupported types like STRUCT_BY_VALUE
296
+ false
292
297
  end
293
298
  end
294
299
 
@@ -343,22 +348,14 @@ module TreeHaver
343
348
  @psych_available = TreeHaver::Backends::Psych.available?
344
349
  end
345
350
 
346
- # Check if toml-rb with Citrus grammar is available
351
+ # Check if Citrus backend is available
347
352
  #
348
- # @return [Boolean] true if toml-rb gem with Citrus grammar is available
349
- def citrus_toml_available?
350
- return @citrus_toml_available if defined?(@citrus_toml_available)
351
- @citrus_toml_available = begin
352
- require "toml-rb"
353
- finder = TreeHaver::CitrusGrammarFinder.new(
354
- language: :toml,
355
- gem_name: "toml-rb",
356
- grammar_const: "TomlRB::Document",
357
- )
358
- finder.available?
359
- rescue LoadError, NameError
360
- false
361
- end
353
+ # This checks if the citrus gem is installed and the backend works.
354
+ #
355
+ # @return [Boolean] true if Citrus backend is available
356
+ def citrus_available?
357
+ return @citrus_available if defined?(@citrus_available)
358
+ @citrus_available = TreeHaver::Backends::Citrus.available?
362
359
  end
363
360
 
364
361
  # ============================================================
@@ -423,16 +420,20 @@ module TreeHaver
423
420
  @tree_sitter_jsonc_available = grammar_works?(:jsonc, '{"key": "value" /* comment */}')
424
421
  end
425
422
 
426
- # Check if toml-rb gem is available (Citrus backend for TOML)
423
+ # Check if toml-rb gem is available and functional (Citrus backend for TOML)
427
424
  #
428
- # @return [Boolean] true if toml-rb gem is available
425
+ # @return [Boolean] true if toml-rb gem is available and can parse TOML
429
426
  def toml_rb_available?
430
427
  return @toml_rb_available if defined?(@toml_rb_available)
431
428
  @toml_rb_available = begin
432
429
  require "toml-rb"
430
+ # Verify it can actually parse - just requiring isn't enough
431
+ TomlRB.parse('key = "value"')
433
432
  true
434
433
  rescue LoadError
435
434
  false
435
+ rescue StandardError
436
+ false
436
437
  end
437
438
  end
438
439
 
@@ -450,41 +451,13 @@ module TreeHaver
450
451
  markly_available? || commonmarker_available?
451
452
  end
452
453
 
453
- # ============================================================
454
- # Inner-Merge Dependencies (for markdown-merge CodeBlockMerger)
455
- # These check both gem availability AND backend functionality
456
- # ============================================================
457
-
458
- # Check if toml-merge is available and functional
459
- #
460
- # @return [Boolean] true if toml-merge works
461
- def toml_merge_available?
462
- return @toml_merge_available if defined?(@toml_merge_available)
463
- @toml_merge_available = inner_merge_works?("toml/merge", "Toml::Merge::SmartMerger", "key = 'test'")
464
- end
465
-
466
- # Check if json-merge is available and functional
467
- #
468
- # @return [Boolean] true if json-merge works
469
- def json_merge_available?
470
- return @json_merge_available if defined?(@json_merge_available)
471
- @json_merge_available = inner_merge_works?("json/merge", "Json::Merge::SmartMerger", '{"a":1}')
472
- end
473
-
474
- # Check if prism-merge is available and functional
475
- #
476
- # @return [Boolean] true if prism-merge works
477
- def prism_merge_available?
478
- return @prism_merge_available if defined?(@prism_merge_available)
479
- @prism_merge_available = inner_merge_works?("prism/merge", "Prism::Merge::SmartMerger", "puts 1")
480
- end
481
-
482
- # Check if psych-merge is available and functional
483
- #
484
- # @return [Boolean] true if psych-merge works
485
- def psych_merge_available?
486
- return @psych_merge_available if defined?(@psych_merge_available)
487
- @psych_merge_available = inner_merge_works?("psych/merge", "Psych::Merge::SmartMerger", "key: value")
454
+ def any_native_grammar_available?
455
+ libtree_sitter_available? && (
456
+ tree_sitter_bash_available? ||
457
+ tree_sitter_toml_available? ||
458
+ tree_sitter_json_available? ||
459
+ tree_sitter_jsonc_available?
460
+ )
488
461
  end
489
462
 
490
463
  # ============================================================
@@ -496,37 +469,33 @@ module TreeHaver
496
469
  # @return [Hash{Symbol => Boolean}] map of dependency name to availability
497
470
  def summary
498
471
  {
499
- # TreeHaver backends
500
- ffi: ffi_available?,
472
+ # TreeHaver backends (*_backend)
473
+ ffi_backend: ffi_available?,
501
474
  mri_backend: mri_backend_available?,
502
475
  rust_backend: rust_backend_available?,
503
476
  java_backend: java_backend_available?,
504
- prism: prism_available?,
505
- psych: psych_available?,
506
- commonmarker: commonmarker_available?,
507
- markly: markly_available?,
508
- citrus_toml: citrus_toml_available?,
509
- # Libraries
510
- libtree_sitter: libtree_sitter_available?,
511
- toml_grammar: toml_grammar_available?,
512
- # Ruby engines
477
+ prism_backend: prism_available?,
478
+ psych_backend: psych_available?,
479
+ commonmarker_backend: commonmarker_available?,
480
+ markly_backend: markly_available?,
481
+ citrus_backend: citrus_available?,
482
+ # Ruby engines (*_engine)
513
483
  ruby_engine: RUBY_ENGINE,
514
- jruby: jruby?,
515
- truffleruby: truffleruby?,
516
- mri: mri?,
517
- # Language grammars
518
- tree_sitter_bash: tree_sitter_bash_available?,
519
- tree_sitter_toml: tree_sitter_toml_available?,
520
- tree_sitter_json: tree_sitter_json_available?,
521
- tree_sitter_jsonc: tree_sitter_jsonc_available?,
484
+ mri_engine: mri?,
485
+ jruby_engine: jruby?,
486
+ truffleruby_engine: truffleruby?,
487
+ # Tree-sitter grammars (*_grammar)
488
+ libtree_sitter: libtree_sitter_available?,
489
+ bash_grammar: tree_sitter_bash_available?,
490
+ toml_grammar: tree_sitter_toml_available?,
491
+ json_grammar: tree_sitter_json_available?,
492
+ jsonc_grammar: tree_sitter_jsonc_available?,
493
+ any_native_grammar: any_native_grammar_available?,
494
+ # Language parsing capabilities (*_parsing)
495
+ toml_parsing: any_toml_backend_available?,
496
+ markdown_parsing: any_markdown_backend_available?,
497
+ # Specific libraries
522
498
  toml_rb: toml_rb_available?,
523
- any_toml_backend: any_toml_backend_available?,
524
- any_markdown_backend: any_markdown_backend_available?,
525
- # Inner-merge dependencies
526
- toml_merge: toml_merge_available?,
527
- json_merge: json_merge_available?,
528
- prism_merge: prism_merge_available?,
529
- psych_merge: psych_merge_available?,
530
499
  }
531
500
  end
532
501
 
@@ -598,21 +567,6 @@ module TreeHaver
598
567
  end
599
568
  false
600
569
  end
601
-
602
- # Generic helper to check if an inner-merge gem is available and functional
603
- #
604
- # @param require_path [String] the require path for the gem
605
- # @param merger_class [String] the full class name of the SmartMerger
606
- # @param test_source [String] sample source code to test merging
607
- # @return [Boolean] true if the merger can be instantiated
608
- def inner_merge_works?(require_path, merger_class, test_source)
609
- require require_path
610
- klass = Object.const_get(merger_class)
611
- klass.new(test_source, test_source)
612
- true
613
- rescue LoadError, NameError, TreeHaver::Error, TreeHaver::NotAvailable
614
- false
615
- end
616
570
  end
617
571
  end
618
572
  end
@@ -649,10 +603,16 @@ RSpec.configure do |config|
649
603
  # ============================================================
650
604
  # TreeHaver Backend Tags
651
605
  # ============================================================
606
+ # Tags: *_backend - require a specific TreeHaver backend to be available
607
+ #
608
+ # Native backends (load .so files):
609
+ # :ffi_backend, :mri_backend, :rust_backend, :java_backend
610
+ # Pure-Ruby backends:
611
+ # :prism_backend, :psych_backend, :commonmarker_backend, :markly_backend, :citrus_backend
652
612
 
653
613
  # FFI availability is checked dynamically per-test (not at load time)
654
614
  # because FFI becomes unavailable after MRI backend is used.
655
- config.before(:each, :ffi) do
615
+ config.before(:each, :ffi_backend) do
656
616
  skip "FFI backend not available (MRI backend may have been used)" unless deps.ffi_available?
657
617
  end
658
618
 
@@ -661,52 +621,60 @@ RSpec.configure do |config|
661
621
  config.filter_run_excluding(java_backend: true) unless deps.java_backend_available?
662
622
  config.filter_run_excluding(prism_backend: true) unless deps.prism_available?
663
623
  config.filter_run_excluding(psych_backend: true) unless deps.psych_available?
664
- config.filter_run_excluding(commonmarker: true) unless deps.commonmarker_available?
665
- config.filter_run_excluding(markly: true) unless deps.markly_available?
666
- config.filter_run_excluding(citrus_toml: true) unless deps.citrus_toml_available?
624
+ config.filter_run_excluding(commonmarker_backend: true) unless deps.commonmarker_available?
625
+ config.filter_run_excluding(markly_backend: true) unless deps.markly_available?
626
+ config.filter_run_excluding(citrus_backend: true) unless deps.citrus_available?
667
627
 
668
628
  # ============================================================
669
629
  # Ruby Engine Tags
670
630
  # ============================================================
631
+ # Tags: *_engine - require a specific Ruby engine
632
+ # :mri_engine, :jruby_engine, :truffleruby_engine
671
633
 
672
- config.filter_run_excluding(jruby: true) unless deps.jruby?
673
- config.filter_run_excluding(truffleruby: true) unless deps.truffleruby?
674
- config.filter_run_excluding(mri: true) unless deps.mri?
634
+ config.filter_run_excluding(mri_engine: true) unless deps.mri?
635
+ config.filter_run_excluding(jruby_engine: true) unless deps.jruby?
636
+ config.filter_run_excluding(truffleruby_engine: true) unless deps.truffleruby?
675
637
 
676
638
  # ============================================================
677
- # Library/Grammar Tags
639
+ # Tree-Sitter Grammar Tags
678
640
  # ============================================================
641
+ # Tags: *_grammar - require a specific tree-sitter grammar (.so file)
642
+ # :bash_grammar, :toml_grammar, :json_grammar, :jsonc_grammar
643
+ #
644
+ # Also: :libtree_sitter - requires the libtree-sitter runtime library
679
645
 
680
646
  config.filter_run_excluding(libtree_sitter: true) unless deps.libtree_sitter_available?
681
- config.filter_run_excluding(toml_grammar: true) unless deps.toml_grammar_available?
682
- config.filter_run_excluding(native_parsing: true) unless deps.libtree_sitter_available? && deps.toml_grammar_available?
647
+ config.filter_run_excluding(bash_grammar: true) unless deps.tree_sitter_bash_available?
648
+ config.filter_run_excluding(toml_grammar: true) unless deps.tree_sitter_toml_available?
649
+ config.filter_run_excluding(json_grammar: true) unless deps.tree_sitter_json_available?
650
+ config.filter_run_excluding(jsonc_grammar: true) unless deps.tree_sitter_jsonc_available?
683
651
 
684
652
  # ============================================================
685
- # Language-Specific Grammar Tags
653
+ # Language Parsing Capability Tags
686
654
  # ============================================================
655
+ # Tags: *_parsing - require ANY parser for a language (any backend that can parse it)
656
+ # :toml_parsing - any TOML parser (tree-sitter-toml OR toml-rb/Citrus)
657
+ # :markdown_parsing - any Markdown parser (commonmarker OR markly)
658
+ # :native_parsing - any native tree-sitter backend + grammar
687
659
 
688
- config.filter_run_excluding(tree_sitter_bash: true) unless deps.tree_sitter_bash_available?
689
- config.filter_run_excluding(tree_sitter_toml: true) unless deps.tree_sitter_toml_available?
690
- config.filter_run_excluding(tree_sitter_json: true) unless deps.tree_sitter_json_available?
691
- config.filter_run_excluding(tree_sitter_jsonc: true) unless deps.tree_sitter_jsonc_available?
692
- config.filter_run_excluding(toml_rb: true) unless deps.toml_rb_available?
693
- config.filter_run_excluding(toml_backend: true) unless deps.any_toml_backend_available?
694
- config.filter_run_excluding(markdown_backend: true) unless deps.any_markdown_backend_available?
660
+ config.filter_run_excluding(toml_parsing: true) unless deps.any_toml_backend_available?
661
+ config.filter_run_excluding(markdown_parsing: true) unless deps.any_markdown_backend_available?
662
+ config.filter_run_excluding(native_parsing: true) unless deps.any_native_grammar_available?
695
663
 
696
664
  # ============================================================
697
- # Inner-Merge Dependency Tags
665
+ # Specific Library Tags
698
666
  # ============================================================
667
+ # Tags for specific gems/libraries (not backends, but dependencies)
668
+ # :toml_rb - the toml-rb gem (Citrus-based TOML parser)
699
669
 
700
- config.filter_run_excluding(toml_merge: true) unless deps.toml_merge_available?
701
- config.filter_run_excluding(json_merge: true) unless deps.json_merge_available?
702
- config.filter_run_excluding(prism_merge: true) unless deps.prism_merge_available?
703
- config.filter_run_excluding(psych_merge: true) unless deps.psych_merge_available?
670
+ config.filter_run_excluding(toml_rb: true) unless deps.toml_rb_available?
704
671
 
705
672
  # ============================================================
706
673
  # Negated Tags (run when dependency is NOT available)
707
674
  # ============================================================
675
+ # Prefix: not_* - exclude tests when the dependency IS available
708
676
 
709
- # NOTE: :not_ffi tag is not provided because FFI availability is dynamic.
677
+ # NOTE: :not_ffi_backend tag is not provided because FFI availability is dynamic.
710
678
 
711
679
  # TreeHaver backends
712
680
  config.filter_run_excluding(not_mri_backend: true) if deps.mri_backend_available?
@@ -714,31 +682,26 @@ RSpec.configure do |config|
714
682
  config.filter_run_excluding(not_java_backend: true) if deps.java_backend_available?
715
683
  config.filter_run_excluding(not_prism_backend: true) if deps.prism_available?
716
684
  config.filter_run_excluding(not_psych_backend: true) if deps.psych_available?
717
- config.filter_run_excluding(not_commonmarker: true) if deps.commonmarker_available?
718
- config.filter_run_excluding(not_markly: true) if deps.markly_available?
719
- config.filter_run_excluding(not_citrus_toml: true) if deps.citrus_toml_available?
685
+ config.filter_run_excluding(not_commonmarker_backend: true) if deps.commonmarker_available?
686
+ config.filter_run_excluding(not_markly_backend: true) if deps.markly_available?
687
+ config.filter_run_excluding(not_citrus_backend: true) if deps.citrus_available?
720
688
 
721
689
  # Ruby engines
722
- config.filter_run_excluding(not_jruby: true) if deps.jruby?
723
- config.filter_run_excluding(not_truffleruby: true) if deps.truffleruby?
724
- config.filter_run_excluding(not_mri: true) if deps.mri?
690
+ config.filter_run_excluding(not_mri_engine: true) if deps.mri?
691
+ config.filter_run_excluding(not_jruby_engine: true) if deps.jruby?
692
+ config.filter_run_excluding(not_truffleruby_engine: true) if deps.truffleruby?
725
693
 
726
- # Libraries/grammars
694
+ # Tree-sitter grammars
727
695
  config.filter_run_excluding(not_libtree_sitter: true) if deps.libtree_sitter_available?
728
- config.filter_run_excluding(not_toml_grammar: true) if deps.toml_grammar_available?
696
+ config.filter_run_excluding(not_bash_grammar: true) if deps.tree_sitter_bash_available?
697
+ config.filter_run_excluding(not_toml_grammar: true) if deps.tree_sitter_toml_available?
698
+ config.filter_run_excluding(not_json_grammar: true) if deps.tree_sitter_json_available?
699
+ config.filter_run_excluding(not_jsonc_grammar: true) if deps.tree_sitter_jsonc_available?
700
+
701
+ # Language parsing capabilities
702
+ config.filter_run_excluding(not_toml_parsing: true) if deps.any_toml_backend_available?
703
+ config.filter_run_excluding(not_markdown_parsing: true) if deps.any_markdown_backend_available?
729
704
 
730
- # Language grammars
731
- config.filter_run_excluding(not_tree_sitter_bash: true) if deps.tree_sitter_bash_available?
732
- config.filter_run_excluding(not_tree_sitter_toml: true) if deps.tree_sitter_toml_available?
733
- config.filter_run_excluding(not_tree_sitter_json: true) if deps.tree_sitter_json_available?
734
- config.filter_run_excluding(not_tree_sitter_jsonc: true) if deps.tree_sitter_jsonc_available?
705
+ # Specific libraries
735
706
  config.filter_run_excluding(not_toml_rb: true) if deps.toml_rb_available?
736
- config.filter_run_excluding(not_toml_backend: true) if deps.any_toml_backend_available?
737
- config.filter_run_excluding(not_markdown_backend: true) if deps.any_markdown_backend_available?
738
-
739
- # Inner-merge dependencies
740
- config.filter_run_excluding(not_toml_merge: true) if deps.toml_merge_available?
741
- config.filter_run_excluding(not_json_merge: true) if deps.json_merge_available?
742
- config.filter_run_excluding(not_prism_merge: true) if deps.prism_merge_available?
743
- config.filter_run_excluding(not_psych_merge: true) if deps.psych_merge_available?
744
707
  end
@@ -10,7 +10,7 @@ module TreeHaver
10
10
  # Current version of the tree_haver gem
11
11
  #
12
12
  # @return [String] the version string (e.g., "3.0.0")
13
- VERSION = "3.1.2"
13
+ VERSION = "3.2.0"
14
14
  end
15
15
 
16
16
  # Traditional location for VERSION constant