tree_haver v5.0.1 released!
5.0.1 - 2026-01-11
- TAG: v5.0.1
- COVERAGE: 90.79% – 2308/2542 lines in 30 files
- BRANCH COVERAGE: 78.09% – 930/1191 branches in 30 files
- 94.76% documented
Added
TreeHaver::RSpec::TestableNode- A testable node class for creating mock TreeHaver::Node instances in tests without requiring an actual parser backend. Available viarequire "tree_haver/rspec/testable_node"or automatically when usingrequire "tree_haver/rspec".TestableNode.create(type:, text:, ...)- Create a single test nodeTestableNode.create_list(...)- Create multiple test nodesMockInnerNode- The underlying mock that simulates backend-specific nodes- Top-level
TestableNodeconstant for convenience in specs
- Fully Dynamic Tag Registration in
TreeHaver::BackendRegistry:register_tag(tag_name, category:, backend_name:, require_path:)- Register a complete dependency tag with lazy loading support. External gems can now get full RSpec tag support without any hardcoded knowledge in tree_haver.tag_available?(tag_name)- Check if a tag’s dependency is available, with automatic lazy loading via the registeredrequire_pathregistered_tags- Get all registered tag namestags_by_category(category)- Get tags filtered by category (:backend, :gem, :parsing, :grammar, :engine, :other)tag_metadata(tag_name)- Get full metadata for a registered tagtag_summary- Get availability status of all registered tags
Changed
- Fully Dynamic Backend Availability in
BackendRegistryandDependencyTags:register_tagnow dynamically defines*_available?methods onDependencyTagsat registration time- External gems automatically get availability methods when they call
register_tag - No changes to tree_haver are needed for new external backend gems
- Built-in backends (prism, psych, citrus, parslet) retain explicit methods
summarymethod dynamically includes registered backends from BackendRegistrybackend_availability_methodsandbackend_tagshashes are built dynamically
- RSpec exclusion filters for backend tags are configured dynamically from BackendRegistry
Fixed
TreeHaver::Parser#unwrap_languagebug fix for MRI and Rust backends:mriand:rustcases were not returning the unwrapped language value- The code called
lang.to_language/lang.inner_language/lang.namebut didn’treturnthe result - Now properly returns the unwrapped language for all backend types
any_markdown_backend_available?now usesBackendRegistry.tag_available?instead of callingmarkly_available?andcommonmarker_available?directly. This fixesNoMethodErrorwhen the external markdown backend gems haven’t registered their tags yet.
Many paths lead to being a sponsor or a backer of this project. Are you on such a path?