tree_haver 5.0.2 → 5.0.3
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +25 -1
- data/README.md +19 -19
- data/SECURITY.md +1 -1
- data/lib/tree_haver/grammar_finder.rb +3 -2
- data/lib/tree_haver/rspec/dependency_tags.rb +48 -10
- data/lib/tree_haver/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +7 -7
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 90eec58fbce0b938c367ef85c66f381c47c209595463b85a9c257d0a00dff5b1
|
|
4
|
+
data.tar.gz: 975775bd407c82f5e429a3dcf92801f54ed343709e931adae238e323887316e5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fd4dde827d3fed70c8705be882be72809b489d80b97e5a1e05ae3d92f97d9a81b69ab676964444a34fc4c0bca9aedddbc5fbdf2d5bf88d9aa40f157b2dd3ecbd
|
|
7
|
+
data.tar.gz: f7f9e60fd544f25722652d76eee5f3e70faad8ff74643dee58ff59cc7817989c2b8b8b8974a8f262d15003903db5d5510412cf2d5f5028623d0a1b6ba0776f23
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,28 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [5.0.3] - 2026-01-30
|
|
34
|
+
|
|
35
|
+
- TAG: [v5.0.3][5.0.3t]
|
|
36
|
+
- COVERAGE: 83.68% -- 2128/2543 lines in 30 files
|
|
37
|
+
- BRANCH COVERAGE: 72.50% -- 862/1189 branches in 30 files
|
|
38
|
+
- 94.78% documented
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- test against Prism v1.9.0
|
|
43
|
+
- CI updated to use latest version of ore
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
|
|
47
|
+
- **Improved dependency handling and test robustness**:
|
|
48
|
+
- Added missing RSpec backend tags (`:parslet_backend`, `:citrus_backend`, etc.) to ensure tests are skipped when dependencies are unavailable.
|
|
49
|
+
- Enhanced `GrammarFinder` to support both `ENV.key?` and `ENV[var]` checks, fixing issues with environment stubbing in tests.
|
|
50
|
+
- Improved `GrammarFinder` spec reliability by using `allow(File).to receive(:exist?).and_call_original`.
|
|
51
|
+
- Configured RSpec to mark grammar-dependent tests as `pending` with helpful instructions when shared libraries are missing.
|
|
52
|
+
- Renamed `:toml_rb` tag to `:toml_rb_gem` for consistency across the codebase.
|
|
53
|
+
- Documentation fixes related to gem family section
|
|
54
|
+
|
|
33
55
|
## [5.0.2] - 2026-01-13
|
|
34
56
|
|
|
35
57
|
- TAG: [v5.0.2][5.0.2t]
|
|
@@ -1282,7 +1304,9 @@ Despite the major version bump to 3.0.0 (following semver due to the breaking `L
|
|
|
1282
1304
|
|
|
1283
1305
|
- Initial release
|
|
1284
1306
|
|
|
1285
|
-
[Unreleased]: https://github.com/kettle-rb/tree_haver/compare/v5.0.
|
|
1307
|
+
[Unreleased]: https://github.com/kettle-rb/tree_haver/compare/v5.0.3...HEAD
|
|
1308
|
+
[5.0.3]: https://github.com/kettle-rb/tree_haver/compare/v5.0.2...v5.0.3
|
|
1309
|
+
[5.0.3t]: https://github.com/kettle-rb/tree_haver/releases/tag/v5.0.3
|
|
1286
1310
|
[5.0.2]: https://github.com/kettle-rb/tree_haver/compare/v5.0.1...v5.0.2
|
|
1287
1311
|
[5.0.2t]: https://github.com/kettle-rb/tree_haver/releases/tag/v5.0.2
|
|
1288
1312
|
[5.0.1]: https://github.com/kettle-rb/tree_haver/compare/v5.0.0...v5.0.1
|
data/README.md
CHANGED
|
@@ -148,7 +148,7 @@ The Rust backend uses [tree\_stump][tree_stump], which is a Rust native extensio
|
|
|
148
148
|
|
|
149
149
|
```ruby
|
|
150
150
|
# Add to your Gemfile for Rust backend (MRI only)
|
|
151
|
-
gem "tree_stump", github: "
|
|
151
|
+
gem "tree_stump", github: "pboling/tree_stump", branch: "feat/upgrade-tree-sitter"
|
|
152
152
|
```
|
|
153
153
|
|
|
154
154
|
#### FFI Backend
|
|
@@ -319,21 +319,21 @@ tree-sitter is a powerful parser generator that creates incremental parsers for
|
|
|
319
319
|
|
|
320
320
|
The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
|
|
321
321
|
|
|
322
|
-
| Gem |
|
|
323
|
-
|
|
324
|
-
| [tree_haver][tree_haver] |
|
|
325
|
-
| [ast-merge][ast-merge] |
|
|
326
|
-
| [bash-merge][bash-merge] |
|
|
327
|
-
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem]
|
|
328
|
-
| [dotenv-merge][dotenv-merge] |
|
|
329
|
-
| [json-merge][json-merge] |
|
|
330
|
-
| [jsonc-merge][jsonc-merge] |
|
|
331
|
-
| [markdown-merge][markdown-merge] |
|
|
332
|
-
| [markly-merge][markly-merge] |
|
|
333
|
-
| [prism-merge][prism-merge] |
|
|
334
|
-
| [psych-merge][psych-merge] |
|
|
335
|
-
| [rbs-merge][rbs-merge] |
|
|
336
|
-
| [toml-merge][toml-merge] |
|
|
322
|
+
| Gem | Version / CI | Language<br>/ Format | Parser Backend(s) | Description |
|
|
323
|
+
|------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:|----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
324
|
+
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] <br/> [![CI][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
|
|
325
|
+
| [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] <br/> [![CI][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
|
|
326
|
+
| [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] <br/> [![CI][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
|
|
327
|
+
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] <br/> [![CI][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
|
|
328
|
+
| [dotenv-merge][dotenv-merge] | [![Version][dotenv-merge-gem-i]][dotenv-merge-gem] <br/> [![CI][dotenv-merge-ci-i]][dotenv-merge-ci] | Dotenv | internal | Smart merge for `.env` files |
|
|
329
|
+
| [json-merge][json-merge] | [![Version][json-merge-gem-i]][json-merge-gem] <br/> [![CI][json-merge-ci-i]][json-merge-ci] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
|
|
330
|
+
| [jsonc-merge][jsonc-merge] | [![Version][jsonc-merge-gem-i]][jsonc-merge-gem] <br/> [![CI][jsonc-merge-ci-i]][jsonc-merge-ci] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
|
|
331
|
+
| [markdown-merge][markdown-merge] | [![Version][markdown-merge-gem-i]][markdown-merge-gem] <br/> [![CI][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver), [Parslet][parslet] | **Foundation**: Shared base for Markdown mergers with inner code block merging |
|
|
332
|
+
| [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] <br/> [![CI][markly-merge-ci-i]][markly-merge-ci] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
|
|
333
|
+
| [prism-merge][prism-merge] | [![Version][prism-merge-gem-i]][prism-merge-gem] <br/> [![CI][prism-merge-ci-i]][prism-merge-ci] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
|
|
334
|
+
| [psych-merge][psych-merge] | [![Version][psych-merge-gem-i]][psych-merge-gem] <br/> [![CI][psych-merge-ci-i]][psych-merge-ci] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
|
|
335
|
+
| [rbs-merge][rbs-merge] | [![Version][rbs-merge-gem-i]][rbs-merge-gem] <br/> [![CI][rbs-merge-ci-i]][rbs-merge-ci] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
|
|
336
|
+
| [toml-merge][toml-merge] | [![Version][toml-merge-gem-i]][toml-merge-gem] <br/> [![CI][toml-merge-ci-i]][toml-merge-ci] | TOML | [Parslet + toml][toml], [Citrus + toml-rb][toml-rb], [tree-sitter-toml][ts-toml] (all via tree_haver) | Smart merge for TOML files |
|
|
337
337
|
|
|
338
338
|
#### Backend Platform Compatibility
|
|
339
339
|
|
|
@@ -2003,7 +2003,7 @@ Support us with a monthly donation and help us continue our activities. \[[Becom
|
|
|
2003
2003
|
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
2004
2004
|
|
|
2005
2005
|
<!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
|
|
2006
|
-
No backers yet. Be the first
|
|
2006
|
+
No backers yet. Be the first!
|
|
2007
2007
|
<!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
|
|
2008
2008
|
|
|
2009
2009
|
### Open Collective for Organizations
|
|
@@ -2013,7 +2013,7 @@ Become a sponsor and get your logo on our README on GitHub with a link to your s
|
|
|
2013
2013
|
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
2014
2014
|
|
|
2015
2015
|
<!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
|
|
2016
|
-
No sponsors yet. Be the first
|
|
2016
|
+
No sponsors yet. Be the first!
|
|
2017
2017
|
<!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
|
|
2018
2018
|
|
|
2019
2019
|
[kettle-readme-backers]: https://github.com/kettle-rb/tree_haver/blob/main/exe/kettle-readme-backers
|
|
@@ -2318,7 +2318,7 @@ Thanks for RTFM. ☺️
|
|
|
2318
2318
|
[📌gitmoji]: https://gitmoji.dev
|
|
2319
2319
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
2320
2320
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
2321
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-2.
|
|
2321
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-2.543-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
2322
2322
|
[🔐security]: SECURITY.md
|
|
2323
2323
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
2324
2324
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
data/SECURITY.md
CHANGED
|
@@ -147,8 +147,9 @@ module TreeHaver
|
|
|
147
147
|
def find_library_path
|
|
148
148
|
# Check environment variable first (highest priority)
|
|
149
149
|
# Use key? to distinguish between "not set" and "set to empty"
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
env_var = env_var_name
|
|
151
|
+
if ENV[env_var] || ENV.key?(env_var)
|
|
152
|
+
env_path = ENV[env_var]
|
|
152
153
|
|
|
153
154
|
# :nocov: defensive - ENV.key? true with nil value is rare edge case
|
|
154
155
|
if env_path.nil?
|
|
@@ -1004,6 +1004,20 @@ module TreeHaver
|
|
|
1004
1004
|
end
|
|
1005
1005
|
end
|
|
1006
1006
|
|
|
1007
|
+
# NOTE: Availability methods for dynamically registered backends (like markly, commonmarker)
|
|
1008
|
+
# are defined by BackendRegistry.define_availability_method when the backend registers via
|
|
1009
|
+
# register_tag. This happens automatically when gems like markly-merge load, AFTER this file
|
|
1010
|
+
# has been required. The define_availability_method in BackendRegistry checks if DependencyTags
|
|
1011
|
+
# is loaded and defines the *_available? method at registration time.
|
|
1012
|
+
#
|
|
1013
|
+
# Example flow for markly-merge:
|
|
1014
|
+
# 1. spec_helper loads tree_haver/rspec (this file) - DependencyTags module now exists
|
|
1015
|
+
# 2. spec_helper loads markly/merge - calls BackendRegistry.register_tag(:markly_backend)
|
|
1016
|
+
# 3. register_tag calls define_availability_method(:markly, :markly_backend)
|
|
1017
|
+
# 4. define_availability_method defines TreeHaver::RSpec::DependencyTags.markly_available?
|
|
1018
|
+
#
|
|
1019
|
+
# This means by the time RSpec.configure runs below, the methods are already defined.
|
|
1020
|
+
|
|
1007
1021
|
# Configure RSpec with dependency-based exclusion filters
|
|
1008
1022
|
RSpec.configure do |config|
|
|
1009
1023
|
deps = TreeHaver::RSpec::DependencyTags
|
|
@@ -1266,12 +1280,25 @@ RSpec.configure do |config|
|
|
|
1266
1280
|
# When TREE_HAVER_BACKEND is explicitly set (but not using *_backend_only tags),
|
|
1267
1281
|
# grammar checks are fine because TreeHaver.parser_for respects the env var.
|
|
1268
1282
|
unless isolated_test_mode
|
|
1269
|
-
config.
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1283
|
+
config.before(:each) do |example|
|
|
1284
|
+
grammar_tags = {
|
|
1285
|
+
bash_grammar: [:tree_sitter_bash_available?, "tree-sitter-bash"],
|
|
1286
|
+
toml_grammar: [:tree_sitter_toml_available?, "tree-sitter-toml"],
|
|
1287
|
+
json_grammar: [:tree_sitter_json_available?, "tree-sitter-json"],
|
|
1288
|
+
jsonc_grammar: [:tree_sitter_jsonc_available?, "tree-sitter-jsonc"],
|
|
1289
|
+
rbs_grammar: [:tree_sitter_rbs_available?, "tree-sitter-rbs"],
|
|
1290
|
+
libtree_sitter: [:libtree_sitter_available?, "libtree-sitter"],
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
grammar_tags.each do |tag, (method, name)|
|
|
1294
|
+
next unless example.metadata[tag]
|
|
1295
|
+
unless deps.public_send(method)
|
|
1296
|
+
env_var = "TREE_SITTER_#{tag.to_s.sub("_grammar", "").upcase}_PATH"
|
|
1297
|
+
env_var = "TREE_SITTER_RUNTIME_LIB" if tag == :libtree_sitter
|
|
1298
|
+
skip "#{name} grammar not available. Set #{env_var} to the path of the shared library."
|
|
1299
|
+
end
|
|
1300
|
+
end
|
|
1301
|
+
end
|
|
1275
1302
|
end
|
|
1276
1303
|
|
|
1277
1304
|
# ============================================================
|
|
@@ -1287,10 +1314,21 @@ RSpec.configure do |config|
|
|
|
1287
1314
|
# triggers grammar_works? and loads MRI. Skip when running isolated tests.
|
|
1288
1315
|
|
|
1289
1316
|
unless isolated_test_mode
|
|
1290
|
-
config.
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1317
|
+
config.before(:each) do |example|
|
|
1318
|
+
parsing_tags = {
|
|
1319
|
+
toml_parsing: [:any_toml_backend_available?, "TOML"],
|
|
1320
|
+
markdown_parsing: [:any_markdown_backend_available?, "Markdown"],
|
|
1321
|
+
rbs_parsing: [:any_rbs_backend_available?, "RBS"],
|
|
1322
|
+
native_parsing: [:any_native_grammar_available?, "Native"],
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
parsing_tags.each do |tag, (method, name)|
|
|
1326
|
+
next unless example.metadata[tag]
|
|
1327
|
+
unless deps.public_send(method)
|
|
1328
|
+
skip "#{name} parsing capability not available."
|
|
1329
|
+
end
|
|
1330
|
+
end
|
|
1331
|
+
end
|
|
1294
1332
|
end
|
|
1295
1333
|
|
|
1296
1334
|
# ============================================================
|
data/lib/tree_haver/version.rb
CHANGED
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: 5.0.
|
|
4
|
+
version: 5.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -162,7 +162,7 @@ dependencies:
|
|
|
162
162
|
version: '1.0'
|
|
163
163
|
- - ">="
|
|
164
164
|
- !ruby/object:Gem::Version
|
|
165
|
-
version: 1.0.
|
|
165
|
+
version: 1.0.7
|
|
166
166
|
type: :development
|
|
167
167
|
prerelease: false
|
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -172,7 +172,7 @@ dependencies:
|
|
|
172
172
|
version: '1.0'
|
|
173
173
|
- - ">="
|
|
174
174
|
- !ruby/object:Gem::Version
|
|
175
|
-
version: 1.0.
|
|
175
|
+
version: 1.0.7
|
|
176
176
|
- !ruby/object:Gem::Dependency
|
|
177
177
|
name: ruby-progressbar
|
|
178
178
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -300,10 +300,10 @@ licenses:
|
|
|
300
300
|
- MIT
|
|
301
301
|
metadata:
|
|
302
302
|
homepage_uri: https://tree-haver.galtzo.com/
|
|
303
|
-
source_code_uri: https://github.com/kettle-rb/tree_haver/tree/v5.0.
|
|
304
|
-
changelog_uri: https://github.com/kettle-rb/tree_haver/blob/v5.0.
|
|
303
|
+
source_code_uri: https://github.com/kettle-rb/tree_haver/tree/v5.0.3
|
|
304
|
+
changelog_uri: https://github.com/kettle-rb/tree_haver/blob/v5.0.3/CHANGELOG.md
|
|
305
305
|
bug_tracker_uri: https://github.com/kettle-rb/tree_haver/issues
|
|
306
|
-
documentation_uri: https://www.rubydoc.info/gems/tree_haver/5.0.
|
|
306
|
+
documentation_uri: https://www.rubydoc.info/gems/tree_haver/5.0.3
|
|
307
307
|
funding_uri: https://github.com/sponsors/pboling
|
|
308
308
|
wiki_uri: https://github.com/kettle-rb/tree_haver/wiki
|
|
309
309
|
news_uri: https://www.railsbling.com/tags/tree_haver
|
|
@@ -333,7 +333,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
333
333
|
- !ruby/object:Gem::Version
|
|
334
334
|
version: '0'
|
|
335
335
|
requirements: []
|
|
336
|
-
rubygems_version: 4.0.
|
|
336
|
+
rubygems_version: 4.0.5
|
|
337
337
|
specification_version: 4
|
|
338
338
|
summary: "\U0001F334 Cross-Ruby adapter for AST parsing libraries, like tree-sitter,
|
|
339
339
|
citrus, & parslet; works on MRI, JRuby, and TruffleRuby"
|
metadata.gz.sig
CHANGED
|
Binary file
|