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 +7 -0
- data/Cargo.toml +22 -0
- data/extconf.rb +12 -0
- data/lib/tree_sitter_language_pack.rb +7 -0
- data/src/lib.rs +96 -0
- metadata +64 -0
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
|
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: []
|