tree_haver v4.0.0 released!
4.0.0 - 2026-01-08
- TAG: v4.0.0
- COVERAGE: 95.31% – 2031/2131 lines in 28 files
- BRANCH COVERAGE: 84.21% – 805/956 branches in 28 files
- 95.48% documented
Added
- BackendRegistry: New
TreeHaver::BackendRegistrymodule for registering backend availability checkers- Allows external gems (like
commonmarker-merge,markly-merge,rbs-merge) to register their availability checkers register_availability_checker(backend_name, &block)- Register a callable that returns true if backend is availableavailable?(backend_name)- Check if a backend is available (results are cached)registered?(backend_name)- Check if a checker is registeredregistered_backends- Get all registered backend names- Used by
TreeHaver::RSpec::DependencyTagsfor dynamic backend detection
- Allows external gems (like
- Plugin System:
commonmarker-mergeandmarkly-mergenow provide their own backends viaTreeHaver’s registry system, removing them fromTreeHavercore. - Backend Architecture Documentation: Added comprehensive documentation to base classes and all tree-sitter backends explaining the two backend categories:
- Tree-sitter backends (MRI, Rust, FFI, Java): Use
TreeHaver::TreeandTreeHaver::Nodewrappers for raw tree-sitter objects - Pure-Ruby/Plugin backends (Citrus, Prism, Psych, Commonmarker, Markly): Define own
Backend::X::TreeandBackend::X::Nodeclasses
- Tree-sitter backends (MRI, Rust, FFI, Java): Use
Changed
- Base Class Inheritance:
TreeHaver::TreeandTreeHaver::Nodenow properly inherit from their respectiveBase::classesTreeHaver::Tree < Base::Tree- inheritsinner_tree,source,linesattributes and default implementationsTreeHaver::Node < Base::Node- inheritsinner_node,source,linesattributes and API contract- Base classes document the API contract; subclasses document divergence
- Base::Node#initialize: Now accepts keyword arguments
source:andlines:instead of positional for consistency with subclasses - DependencyTags: Now uses
BackendRegistry.available?(:backend_name)instead of hardcodedTreeHaver::Backends::*checks - TreeHaver:
commonmarkerandmarklybackends are no longer built-in. Usecommonmarker-mergeandmarkly-mergegems which register themselves. - All backends: Now register their availability checkers with
BackendRegistrywhen loaded (MRI, Rust, FFI, Java, Prism, Psych, Citrus)
Removed
- TreeHaver: Removed
TreeHaver::Backends::CommonmarkerandTreeHaver::Backends::Marklymodules. These implementations have moved to their respective gems.
Many paths lead to being a sponsor or a backer of this project. Are you on such a path?