tree_sitter_language_pack 1.0.0.rc.7

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e0e70fba75e85bf3ca744874c8b278fe3fa821bfe35998495f5826b50f94c4c0
4
+ data.tar.gz: e77f82f0394870ae8a02718e0d52a0193379eff0696bb874571c1c61159e133f
5
+ SHA512:
6
+ metadata.gz: 97b9ef50b06634a695a6dbf2f14abe459a13dac86453e7543fb4f8aeaff580a0833f5940d4d0431d4afd152d5f2c45b18714da3b738f1bc87b621c79a71da2c6
7
+ data.tar.gz: e3b8796578f971068923eea849d7323f9df5d444d786fd6e3cf798af3317dbac282b2c84c4ce812352b846a129680ecbdb524faef68a67d3c4b536a53ce33b22
data/Cargo.toml ADDED
@@ -0,0 +1,22 @@
1
+ [package]
2
+ name = "ts-pack-ruby"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ repository.workspace = true
7
+ description = "Ruby Magnus bindings for tree-sitter language pack"
8
+ publish = false
9
+
10
+ [lib]
11
+ name = "ts_pack_ruby"
12
+ crate-type = ["cdylib"]
13
+
14
+ [dependencies]
15
+ tree-sitter-language-pack = { workspace = true, features = ["serde"] }
16
+ serde_json = { workspace = true }
17
+ tree-sitter = { workspace = true }
18
+ magnus = "0.8"
19
+ rb-sys = "0.9"
20
+
21
+ [package.metadata.cargo-machete]
22
+ ignored = ["rb-sys"]
data/extconf.rb ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mkmf'
4
+ require 'rb_sys/mkmf'
5
+
6
+ # Use a separate target dir to avoid lockfile collision with the workspace
7
+ ENV['CARGO_TARGET_DIR'] ||= File.expand_path('target', __dir__)
8
+
9
+ create_rust_makefile('ts_pack_ruby/ts_pack_ruby') do |r|
10
+ r.profile = ENV.fetch('CARGO_PROFILE', 'release').to_sym
11
+ r.ext_dir = File.expand_path('.', __dir__)
12
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'tree_sitter_language_pack/ts_pack_ruby'
4
+
5
+ # Ruby bindings for the tree-sitter language pack.
6
+ module TreeSitterLanguagePack
7
+ end
data/src/lib.rs ADDED
@@ -0,0 +1,96 @@
1
+ use magnus::{Error, Ruby, function, method, prelude::*};
2
+ use std::sync::Mutex;
3
+
4
+ /// Wraps a tree-sitter Tree for safe sharing across the Ruby boundary.
5
+ #[magnus::wrap(class = "TreeSitterLanguagePack::Tree")]
6
+ struct TreeWrapper(Mutex<tree_sitter::Tree>);
7
+
8
+ /// Helper to create a runtime error from instance methods where `&Ruby` is not available.
9
+ fn lock_error() -> Error {
10
+ // SAFETY: This is called from Ruby-invoked methods, so the Ruby VM is active.
11
+ let ruby = unsafe { Ruby::get_unchecked() };
12
+ Error::new(ruby.exception_runtime_error(), "lock poisoned")
13
+ }
14
+
15
+ impl TreeWrapper {
16
+ fn root_node_type(&self) -> Result<String, Error> {
17
+ let guard = self.0.lock().map_err(|_| lock_error())?;
18
+ Ok(guard.root_node().kind().to_string())
19
+ }
20
+
21
+ fn root_child_count(&self) -> Result<usize, Error> {
22
+ let guard = self.0.lock().map_err(|_| lock_error())?;
23
+ Ok(guard.root_node().named_child_count())
24
+ }
25
+
26
+ fn contains_node_type(&self, node_type: String) -> Result<bool, Error> {
27
+ let guard = self.0.lock().map_err(|_| lock_error())?;
28
+ Ok(tree_sitter_language_pack::tree_contains_node_type(&guard, &node_type))
29
+ }
30
+
31
+ fn has_error_nodes(&self) -> Result<bool, Error> {
32
+ let guard = self.0.lock().map_err(|_| lock_error())?;
33
+ Ok(tree_sitter_language_pack::tree_has_error_nodes(&guard))
34
+ }
35
+ }
36
+
37
+ fn available_languages() -> Vec<String> {
38
+ tree_sitter_language_pack::available_languages()
39
+ }
40
+
41
+ fn has_language(name: String) -> bool {
42
+ tree_sitter_language_pack::has_language(&name)
43
+ }
44
+
45
+ fn language_count() -> usize {
46
+ tree_sitter_language_pack::language_count()
47
+ }
48
+
49
+ fn get_language_ptr(ruby: &Ruby, name: String) -> Result<u64, Error> {
50
+ let language = tree_sitter_language_pack::get_language(&name)
51
+ .map_err(|_| Error::new(ruby.exception_runtime_error(), format!("language not found: {name}")))?;
52
+ let raw_ptr = language.into_raw();
53
+ Ok(raw_ptr as u64)
54
+ }
55
+
56
+ fn parse_string(ruby: &Ruby, language: String, source: String) -> Result<TreeWrapper, Error> {
57
+ let tree = tree_sitter_language_pack::parse_string(&language, source.as_bytes())
58
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))?;
59
+ Ok(TreeWrapper(Mutex::new(tree)))
60
+ }
61
+
62
+ /// Unified process method that accepts a JSON config string and returns a JSON result string.
63
+ ///
64
+ /// The config JSON must contain at least `"language"`. Optional fields:
65
+ /// - `structure`, `imports`, `exports`, `comments`, `docstrings`, `symbols`, `diagnostics` (booleans, default true)
66
+ /// - `chunk_max_size` (integer or null, default null meaning no chunking)
67
+ fn process(ruby: &Ruby, source: String, config_json: String) -> Result<String, Error> {
68
+ let core_config: tree_sitter_language_pack::ProcessConfig = serde_json::from_str(&config_json)
69
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("invalid config JSON: {e}")))?;
70
+
71
+ let result = tree_sitter_language_pack::process(&source, &core_config)
72
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))?;
73
+
74
+ serde_json::to_string(&result)
75
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("serialization failed: {e}")))
76
+ }
77
+
78
+ #[magnus::init]
79
+ fn init(ruby: &Ruby) -> Result<(), Error> {
80
+ let module = ruby.define_module("TreeSitterLanguagePack")?;
81
+
82
+ module.define_module_function("available_languages", function!(available_languages, 0))?;
83
+ module.define_module_function("has_language", function!(has_language, 1))?;
84
+ module.define_module_function("language_count", function!(language_count, 0))?;
85
+ module.define_module_function("get_language_ptr", function!(get_language_ptr, 1))?;
86
+ module.define_module_function("parse_string", function!(parse_string, 2))?;
87
+ module.define_module_function("process", function!(process, 2))?;
88
+
89
+ let tree_class = module.define_class("Tree", ruby.class_object())?;
90
+ tree_class.define_method("root_node_type", method!(TreeWrapper::root_node_type, 0))?;
91
+ tree_class.define_method("root_child_count", method!(TreeWrapper::root_child_count, 0))?;
92
+ tree_class.define_method("contains_node_type", method!(TreeWrapper::contains_node_type, 1))?;
93
+ tree_class.define_method("has_error_nodes", method!(TreeWrapper::has_error_nodes, 0))?;
94
+
95
+ Ok(())
96
+ }
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tree_sitter_language_pack
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.rc.7
5
+ platform: ruby
6
+ authors:
7
+ - kreuzberg.dev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-03-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rb_sys
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.9'
27
+ description: 170+ pre-compiled tree-sitter language parsers with Ruby bindings via
28
+ Magnus native extensions.
29
+ email:
30
+ - dev@kreuzberg.dev
31
+ executables: []
32
+ extensions:
33
+ - extconf.rb
34
+ extra_rdoc_files: []
35
+ files:
36
+ - Cargo.toml
37
+ - extconf.rb
38
+ - lib/tree_sitter_language_pack.rb
39
+ - src/lib.rs
40
+ homepage: https://github.com/kreuzberg-dev/tree-sitter-language-pack
41
+ licenses:
42
+ - MIT
43
+ metadata:
44
+ cargo_crate_name: ts-pack-ruby
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 3.2.0
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubygems_version: 3.5.22
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: Ruby bindings for tree-sitter-language-pack
64
+ test_files: []