tree_haver v3.2.1 released!
3.2.1 - 2025-12-31
- TAG: v3.2.1
- COVERAGE: 94.75% – 2075/2190 lines in 22 files
- BRANCH COVERAGE: 81.35% – 733/901 branches in 22 files
- 90.14% documented
Added
TreeHaver::LibraryPathUtilsmodule for consistent path parsing across all backendsderive_symbol_from_path(path)- derives tree-sitter symbol (e.g.,tree_sitter_toml) from library pathderive_language_name_from_path(path)- derives language name (e.g.,toml) from library pathderive_language_name_from_symbol(symbol)- stripstree_sitter_prefix from symbol- Handles various naming conventions:
libtree-sitter-toml.so,libtree_sitter_toml.so,tree-sitter-toml.so,toml.so
- Isolated backend RSpec tags for running tests without loading conflicting backends
:ffi_backend_only- runs FFI tests without triggeringmri_backend_available?check:mri_backend_only- runs MRI tests without triggeringffi_available?check- Uses
TreeHaver::Backends::BLOCKED_BYto dynamically determine which availability checks to skip - Enables
rake ffi_specsto run FFI tests before MRI is loaded
DependencyTags.ffi_backend_only_available?- checks FFI availability without loading MRIDependencyTags.mri_backend_only_available?- checks MRI availability without checking FFI
Changed
- All backends now use shared
LibraryPathUtilsfor path parsing- MRI, Rust, FFI, and Java backends updated for consistency
- Ensures identical behavior across all tree-sitter backends
TreeHaver::Languageclass extracted tolib/tree_haver/language.rb- No API changes, just file organization
- Loaded via autoload for lazy loading
TreeHaver::Parserclass extracted tolib/tree_haver/parser.rb- No API changes, just file organization
- Loaded via autoload for lazy loading
- Backend availability exclusions in
dependency_tags.rbare now dynamic- Uses
TreeHaver::Backends::BLOCKED_BYto skip availability checks for blocked backends - When running with
--tag ffi_backend_only, MRI availability is not checked - Prevents MRI from being loaded before FFI tests can run
- Uses
- Rakefile
ffi_specstask now uses:ffi_backend_onlytag- Ensures FFI tests run without loading MRI backend first
Fixed
- Rakefile now uses correct RSpec tags for FFI isolation
- The
ffi_specstask uses:ffi_backend_onlyto prevent MRI from loading - The
remaining_specstask excludes:ffi_backend_onlytests - Tags in Rakefile align with canonical tags from
dependency_tags.rb
- The
TreeHaver::RSpec::DependencyTags.mri_backend_available?now uses correct require path- Was:
require "ruby_tree_sitter"(wrong - causes LoadError) - Now:
require "tree_sitter"(correct - gem name is ruby_tree_sitter but require path is tree_sitter) - This fix ensures the MRI backend is correctly detected as available in CI environments
- Was:
TreeHaver::Backends::MRI::Language.from_librarynow properly derives symbol from path- Previously, calling
from_library(path)withoutsymbol:would fail becauselanguage_namewas nil - Now delegates to private
from_pathafter deriving symbol, ensuring proper language name derivation from_pathis now private (but still accessible viasendfor testing if needed)- Extracts language name from paths like
/usr/lib/libtree-sitter-toml.so→tree_sitter_toml - Handles both dash and underscore separators in filenames
- Handles simple language names like
toml.so→tree_sitter_toml
- Previously, calling
TreeHaver::Backends::MRI::Parser#language=now unwrapsTreeHaver::Backends::MRI::Languagewrappers- Accepts both raw
TreeSitter::Languageand wrappedTreeHaver::Backends::MRI::Language
- Accepts both raw
TreeHaver::GrammarFinder.tree_sitter_runtime_usable?no longer referencesFFI::NotFoundErrordirectly- Prevents
NameErrorwhen FFI gem is not loaded
- Prevents
TreeHaver::Parser#initializeno longer referencesFFI::NotFoundErrordirectly in rescue clause- Uses
defined?(::FFI::NotFoundError)check to safely handle FFI errors when FFI is loaded - Prevents
NameError: uninitialized constant TreeHaver::Parser::FFIwhen FFI gem is not available - Extracted error handling to
handle_parser_creation_failureprivate method for clarity
- Uses
- RSpec
dependency_tags.rbnow correctly detects--tagoptions during configuration- RSpec’s
config.inclusion_filter.rulesis empty during configuration phase - Now parses
ARGVdirectly to detect--tag ffi_backend_onlyand similar tags - Skips grammar availability checks (which load MRI) when running isolated backend tests
- Skips full dependency summary in
before(:suite)when backends are blocked
- RSpec’s
TreeHaver::Backends::FFI.reset!now uses consistent pattern with other backends- Was using
@ffi_gem_availablewithdefined?()check, which returned truthy afterreset!set it to nil - Now uses
@load_attempted/@loadedpattern like MRI, Rust, Citrus, Prism, Psych, etc. - This fixes FFI tests failing after the first test when
reset!was called inafterblocks
- Was using
TreeHaver::Language.method_missingno longer referencesFFI::NotFoundErrordirectly in rescue clause- Uses
defined?(::FFI::NotFoundError)check to safely handle FFI errors when FFI is loaded - Prevents
NameErrorwhen FFI gem is not available but tree-sitter backends are used - Extracted Citrus fallback logic to
handle_tree_sitter_load_failureprivate method
- Uses
Many paths lead to being a sponsor or a backer of this project. Are you on such a path?