tree_sitter_language_pack 1.0.0-arm64-darwin

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: 692ab4df38284f349c7f6a8b35223d0067ec72692eb6ead8b3110239b6370edc
4
+ data.tar.gz: f8df307b5ad2f9529e223c24f82dfe838deb7781a13db891a2f278757606fffd
5
+ SHA512:
6
+ metadata.gz: f816c015cba03389470e157957cae207e8387a5ec5d3a145ec5816adebce0eea82db146964177c29c26686b5ab56ad5d7ad7a5262c7b7025c2fceda009c17860
7
+ data.tar.gz: ce9ce22fa28fd03cb06287e0a4f3c82a4f8aeb04e8be93ba4a3915c30aba43a4f3609174d29207415b326b02177f5628a86d6d07ec8f70cb893c3b7d81724c00
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", "download"] }
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"]
@@ -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,174 @@
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
+ /// Initialize the language pack with configuration.
79
+ ///
80
+ /// Accepts a JSON string with optional fields:
81
+ /// - `cache_dir` (string): override default cache directory
82
+ /// - `languages` (array): language names to pre-download
83
+ /// - `groups` (array): language groups to pre-download
84
+ fn rb_init(ruby: &Ruby, config_json: String) -> Result<(), Error> {
85
+ let config: tree_sitter_language_pack::PackConfig = serde_json::from_str(&config_json)
86
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("invalid config JSON: {e}")))?;
87
+
88
+ tree_sitter_language_pack::init(&config).map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
89
+ }
90
+
91
+ /// Configure the language pack without downloading.
92
+ ///
93
+ /// Accepts a JSON string with optional fields:
94
+ /// - `cache_dir` (string): override default cache directory
95
+ fn rb_configure(ruby: &Ruby, config_json: String) -> Result<(), Error> {
96
+ let config: tree_sitter_language_pack::PackConfig = serde_json::from_str(&config_json)
97
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("invalid config JSON: {e}")))?;
98
+
99
+ tree_sitter_language_pack::configure(&config)
100
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
101
+ }
102
+
103
+ /// Download specific languages to the cache.
104
+ ///
105
+ /// Returns the number of newly downloaded languages.
106
+ fn rb_download(ruby: &Ruby, names: Vec<String>) -> Result<usize, Error> {
107
+ let refs: Vec<&str> = names.iter().map(String::as_str).collect();
108
+ tree_sitter_language_pack::download(&refs).map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
109
+ }
110
+
111
+ /// Download all available languages from the remote manifest.
112
+ ///
113
+ /// Returns the number of newly downloaded languages.
114
+ fn rb_download_all(ruby: &Ruby) -> Result<usize, Error> {
115
+ tree_sitter_language_pack::download_all().map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
116
+ }
117
+
118
+ /// Get all language names available in the remote manifest.
119
+ fn rb_manifest_languages(ruby: &Ruby) -> Result<Vec<String>, Error> {
120
+ tree_sitter_language_pack::manifest_languages()
121
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
122
+ }
123
+
124
+ /// Get all languages that are already downloaded and cached locally.
125
+ fn rb_downloaded_languages() -> Vec<String> {
126
+ tree_sitter_language_pack::downloaded_languages()
127
+ }
128
+
129
+ /// Delete all cached parser shared libraries.
130
+ fn rb_clean_cache(ruby: &Ruby) -> Result<(), Error> {
131
+ tree_sitter_language_pack::clean_cache().map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
132
+ }
133
+
134
+ /// Get the effective cache directory path as a string.
135
+ fn rb_cache_dir(ruby: &Ruby) -> Result<String, Error> {
136
+ tree_sitter_language_pack::cache_dir()
137
+ .map_err(|e| Error::new(ruby.exception_runtime_error(), format!("{e}")))
138
+ .and_then(|path| {
139
+ path.to_str()
140
+ .ok_or_else(|| Error::new(ruby.exception_runtime_error(), "cache path is not valid UTF-8"))
141
+ .map(|s| s.to_string())
142
+ })
143
+ }
144
+
145
+ #[magnus::init]
146
+ fn init(ruby: &Ruby) -> Result<(), Error> {
147
+ let module = ruby.define_module("TreeSitterLanguagePack")?;
148
+
149
+ // Registry and parsing functions
150
+ module.define_module_function("available_languages", function!(available_languages, 0))?;
151
+ module.define_module_function("has_language", function!(has_language, 1))?;
152
+ module.define_module_function("language_count", function!(language_count, 0))?;
153
+ module.define_module_function("get_language_ptr", function!(get_language_ptr, 1))?;
154
+ module.define_module_function("parse_string", function!(parse_string, 2))?;
155
+ module.define_module_function("process", function!(process, 2))?;
156
+
157
+ // Download API functions
158
+ module.define_module_function("init", function!(rb_init, 1))?;
159
+ module.define_module_function("configure", function!(rb_configure, 1))?;
160
+ module.define_module_function("download", function!(rb_download, 1))?;
161
+ module.define_module_function("download_all", function!(rb_download_all, 0))?;
162
+ module.define_module_function("manifest_languages", function!(rb_manifest_languages, 0))?;
163
+ module.define_module_function("downloaded_languages", function!(rb_downloaded_languages, 0))?;
164
+ module.define_module_function("clean_cache", function!(rb_clean_cache, 0))?;
165
+ module.define_module_function("cache_dir", function!(rb_cache_dir, 0))?;
166
+
167
+ let tree_class = module.define_class("Tree", ruby.class_object())?;
168
+ tree_class.define_method("root_node_type", method!(TreeWrapper::root_node_type, 0))?;
169
+ tree_class.define_method("root_child_count", method!(TreeWrapper::root_child_count, 0))?;
170
+ tree_class.define_method("contains_node_type", method!(TreeWrapper::contains_node_type, 1))?;
171
+ tree_class.define_method("has_error_nodes", method!(TreeWrapper::has_error_nodes, 0))?;
172
+
173
+ Ok(())
174
+ }
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tree_sitter_language_pack
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: arm64-darwin
6
+ authors:
7
+ - kreuzberg.dev
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: 170+ pre-compiled tree-sitter language parsers with Ruby bindings via
13
+ Magnus native extensions.
14
+ email:
15
+ - dev@kreuzberg.dev
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - Cargo.toml
21
+ - lib/tree_sitter_language_pack.rb
22
+ - lib/tree_sitter_language_pack/ts_pack_ruby.bundle
23
+ - src/lib.rs
24
+ homepage: https://github.com/kreuzberg-dev/tree-sitter-language-pack
25
+ licenses:
26
+ - MIT
27
+ metadata:
28
+ cargo_crate_name: ts-pack-ruby
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 3.4.0
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubygems_version: 3.6.9
44
+ specification_version: 4
45
+ summary: Ruby bindings for tree-sitter-language-pack
46
+ test_files: []