tree_haver 3.2.6 → 4.0.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.
@@ -531,18 +531,22 @@ module TreeHaver
531
531
 
532
532
  # Check if commonmarker gem is available
533
533
  #
534
+ # Uses BackendRegistry which allows commonmarker-merge to register its checker.
535
+ #
534
536
  # @return [Boolean] true if commonmarker gem is available
535
537
  def commonmarker_available?
536
538
  return @commonmarker_available if defined?(@commonmarker_available)
537
- @commonmarker_available = TreeHaver::Backends::Commonmarker.available?
539
+ @commonmarker_available = TreeHaver::BackendRegistry.available?(:commonmarker)
538
540
  end
539
541
 
540
542
  # Check if markly gem is available
541
543
  #
544
+ # Uses BackendRegistry which allows markly-merge to register its checker.
545
+ #
542
546
  # @return [Boolean] true if markly gem is available
543
547
  def markly_available?
544
548
  return @markly_available if defined?(@markly_available)
545
- @markly_available = TreeHaver::Backends::Markly.available?
549
+ @markly_available = TreeHaver::BackendRegistry.available?(:markly)
546
550
  end
547
551
 
548
552
  # Check if prism gem is available
@@ -550,7 +554,7 @@ module TreeHaver
550
554
  # @return [Boolean] true if Prism is available
551
555
  def prism_available?
552
556
  return @prism_available if defined?(@prism_available)
553
- @prism_available = TreeHaver::Backends::Prism.available?
557
+ @prism_available = TreeHaver::BackendRegistry.available?(:prism)
554
558
  end
555
559
 
556
560
  # Check if psych is available (stdlib, should always be true)
@@ -558,7 +562,7 @@ module TreeHaver
558
562
  # @return [Boolean] true if Psych is available
559
563
  def psych_available?
560
564
  return @psych_available if defined?(@psych_available)
561
- @psych_available = TreeHaver::Backends::Psych.available?
565
+ @psych_available = TreeHaver::BackendRegistry.available?(:psych)
562
566
  end
563
567
 
564
568
  # Check if Citrus backend is available
@@ -568,7 +572,7 @@ module TreeHaver
568
572
  # @return [Boolean] true if Citrus backend is available
569
573
  def citrus_available?
570
574
  return @citrus_available if defined?(@citrus_available)
571
- @citrus_available = TreeHaver::Backends::Citrus.available?
575
+ @citrus_available = TreeHaver::BackendRegistry.available?(:citrus)
572
576
  end
573
577
 
574
578
  # ============================================================
@@ -52,7 +52,7 @@ module TreeHaver
52
52
  #
53
53
  # # Or explicitly via inner_tree
54
54
  # tree.inner_tree.some_backend_specific_method
55
- class Tree
55
+ class Tree < Base::Tree
56
56
  # The wrapped backend-specific tree object
57
57
  #
58
58
  # This provides direct access to the underlying backend tree for advanced usage
@@ -66,20 +66,19 @@ module TreeHaver
66
66
  # tree.inner_tree.print_dot_graph(f)
67
67
  # end
68
68
  # end
69
- attr_reader :inner_tree
69
+ # NOTE: inner_tree is inherited from Base::Tree
70
70
 
71
71
  # The source text
72
72
  #
73
73
  # Stored to enable text extraction from nodes via byte offsets.
74
74
  #
75
75
  # @return [String] The original source code
76
- attr_reader :source
76
+ # NOTE: source is inherited from Base::Tree
77
77
 
78
78
  # @param tree [Object] Backend-specific tree object
79
79
  # @param source [String] Source text for node text extraction
80
80
  def initialize(tree, source: nil)
81
- @inner_tree = tree
82
- @source = source
81
+ super(tree, source: source)
83
82
  end
84
83
 
85
84
  # Get the root node of the tree
@@ -9,8 +9,8 @@ module TreeHaver
9
9
  module Version
10
10
  # Current version of the tree_haver gem
11
11
  #
12
- # @return [String] the version string (e.g., "3.0.0")
13
- VERSION = "3.2.6"
12
+ # @return [String] the version string
13
+ VERSION = "4.0.0"
14
14
  end
15
15
 
16
16
  # Traditional location for VERSION constant
data/lib/tree_haver.rb CHANGED
@@ -109,6 +109,10 @@ module TreeHaver
109
109
  autoload :LibraryPathUtils, File.join(__dir__, "tree_haver", "library_path_utils")
110
110
  autoload :LanguageRegistry, File.join(__dir__, "tree_haver", "language_registry")
111
111
  autoload :BackendAPI, File.join(__dir__, "tree_haver", "backend_api")
112
+ autoload :BackendRegistry, File.join(__dir__, "tree_haver", "backend_registry")
113
+
114
+ # Base classes for backend implementations
115
+ autoload :Base, File.join(__dir__, "tree_haver", "base")
112
116
 
113
117
  # Base error class for TreeHaver exceptions
114
118
  # @see https://github.com/Faveod/ruby-tree-sitter/pull/83 for inherit from Exception reasoning
@@ -181,8 +185,6 @@ module TreeHaver
181
185
  # - {Backends::Citrus} - Uses Citrus PEG parser (pure Ruby, portable)
182
186
  # - {Backends::Prism} - Uses Ruby's built-in Prism parser (Ruby-only, stdlib in 3.4+)
183
187
  # - {Backends::Psych} - Uses Ruby's built-in Psych parser (YAML-only, stdlib)
184
- # - {Backends::Commonmarker} - Uses commonmarker gem (Markdown)
185
- # - {Backends::Markly} - Uses markly gem (Markdown/GFM)
186
188
  module Backends
187
189
  autoload :MRI, File.join(__dir__, "tree_haver", "backends", "mri")
188
190
  autoload :Rust, File.join(__dir__, "tree_haver", "backends", "rust")
@@ -191,11 +193,7 @@ module TreeHaver
191
193
  autoload :Citrus, File.join(__dir__, "tree_haver", "backends", "citrus")
192
194
  autoload :Prism, File.join(__dir__, "tree_haver", "backends", "prism")
193
195
  autoload :Psych, File.join(__dir__, "tree_haver", "backends", "psych")
194
- autoload :Commonmarker, File.join(__dir__, "tree_haver", "backends", "commonmarker")
195
- autoload :Markly, File.join(__dir__, "tree_haver", "backends", "markly")
196
196
 
197
- # Known backend conflicts
198
- #
199
197
  # Maps each backend to an array of backends that block it from working.
200
198
  # For example, :ffi is blocked by :mri because once ruby_tree_sitter loads,
201
199
  # FFI calls to ts_parser_set_language will segfault.
@@ -209,8 +207,6 @@ module TreeHaver
209
207
  citrus: [],
210
208
  prism: [], # Prism has no conflicts with other backends
211
209
  psych: [], # Psych has no conflicts with other backends
212
- commonmarker: [], # Commonmarker has no conflicts with other backends
213
- markly: [], # Markly has no conflicts with other backends
214
210
  }.freeze
215
211
 
216
212
  # Pure Ruby backends that parse specific languages
@@ -220,8 +216,6 @@ module TreeHaver
220
216
  PURE_RUBY_BACKENDS = {
221
217
  prism: {language: :ruby, module_name: "Prism"},
222
218
  psych: {language: :yaml, module_name: "Psych"},
223
- commonmarker: {language: :markdown, module_name: "Commonmarker"},
224
- markly: {language: :markdown, module_name: "Markly"},
225
219
  }.freeze
226
220
  end
227
221
 
@@ -744,13 +738,13 @@ module TreeHaver
744
738
  Backends::Prism
745
739
  when :psych
746
740
  Backends::Psych
747
- when :commonmarker
748
- Backends::Commonmarker
749
- when :markly
750
- Backends::Markly
751
741
  when :auto
752
742
  backend_module # Fall back to normal resolution for :auto
753
743
  else
744
+ # Check if this is a registered plugin backend
745
+ registered = registered_backend(requested)
746
+ return registered if registered
747
+
754
748
  # Unknown backend name - return nil to trigger error in caller
755
749
  nil
756
750
  end
@@ -885,10 +879,6 @@ module TreeHaver
885
879
  Backends::Prism
886
880
  when :psych
887
881
  Backends::Psych
888
- when :commonmarker
889
- Backends::Commonmarker
890
- when :markly
891
- Backends::Markly
892
882
  else
893
883
  # auto-select: prefer native/fast backends, fall back to pure Ruby (Citrus)
894
884
  # Each backend must be both allowed (by ENV) and available (gem installed)
@@ -1049,6 +1039,28 @@ module TreeHaver
1049
1039
  nil
1050
1040
  end
1051
1041
 
1042
+ # Register a backend module
1043
+ #
1044
+ # Allows external gems to register their backend implementation so it can be
1045
+ # found by TreeHaver.backend = :name and other lookup methods.
1046
+ #
1047
+ # @param name [Symbol] backend name (e.g. :rbs, :commonmarker)
1048
+ # @param mod [Module] the backend module
1049
+ # @return [void]
1050
+ def register_backend(name, mod)
1051
+ @backend_registry ||= {}
1052
+ @backend_registry[name.to_sym] = mod
1053
+ end
1054
+
1055
+ # Get a registered backend module
1056
+ #
1057
+ # @param name [Symbol] backend name
1058
+ # @return [Module, nil] registered backend module
1059
+ def registered_backend(name)
1060
+ @backend_registry ||= {}
1061
+ @backend_registry[name.to_sym]
1062
+ end
1063
+
1052
1064
  # Fetch a registered language entry
1053
1065
  #
1054
1066
  # @api private
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tree_haver
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.6
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -261,15 +261,20 @@ files:
261
261
  - SECURITY.md
262
262
  - lib/tree_haver.rb
263
263
  - lib/tree_haver/backend_api.rb
264
+ - lib/tree_haver/backend_registry.rb
264
265
  - lib/tree_haver/backends/citrus.rb
265
- - lib/tree_haver/backends/commonmarker.rb
266
266
  - lib/tree_haver/backends/ffi.rb
267
267
  - lib/tree_haver/backends/java.rb
268
- - lib/tree_haver/backends/markly.rb
269
268
  - lib/tree_haver/backends/mri.rb
270
269
  - lib/tree_haver/backends/prism.rb
271
270
  - lib/tree_haver/backends/psych.rb
272
271
  - lib/tree_haver/backends/rust.rb
272
+ - lib/tree_haver/base.rb
273
+ - lib/tree_haver/base/language.rb
274
+ - lib/tree_haver/base/node.rb
275
+ - lib/tree_haver/base/parser.rb
276
+ - lib/tree_haver/base/point.rb
277
+ - lib/tree_haver/base/tree.rb
273
278
  - lib/tree_haver/citrus_grammar_finder.rb
274
279
  - lib/tree_haver/compat.rb
275
280
  - lib/tree_haver/grammar_finder.rb
@@ -293,10 +298,10 @@ licenses:
293
298
  - MIT
294
299
  metadata:
295
300
  homepage_uri: https://tree-haver.galtzo.com/
296
- source_code_uri: https://github.com/kettle-rb/tree_haver/tree/v3.2.6
297
- changelog_uri: https://github.com/kettle-rb/tree_haver/blob/v3.2.6/CHANGELOG.md
301
+ source_code_uri: https://github.com/kettle-rb/tree_haver/tree/v4.0.0
302
+ changelog_uri: https://github.com/kettle-rb/tree_haver/blob/v4.0.0/CHANGELOG.md
298
303
  bug_tracker_uri: https://github.com/kettle-rb/tree_haver/issues
299
- documentation_uri: https://www.rubydoc.info/gems/tree_haver/3.2.6
304
+ documentation_uri: https://www.rubydoc.info/gems/tree_haver/4.0.0
300
305
  funding_uri: https://github.com/sponsors/pboling
301
306
  wiki_uri: https://github.com/kettle-rb/tree_haver/wiki
302
307
  news_uri: https://www.railsbling.com/tags/tree_haver
metadata.gz.sig CHANGED
Binary file