ruby_tree_sitter 0.20.8.1-x86_64-linux → 0.20.8.2-x86_64-linux

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a6f2bbfd48e8ad005f6a1492fe5a77744d96ebbdefcfbb4444b4feb585793fa
4
- data.tar.gz: 27a035bbd5cc1ed84dd0ff0677022841f9f7a404d0bb28513fbb5ea8b1fc9626
3
+ metadata.gz: bef2d7e3652becc17fcb08340d73614e56bfd5b77147b980c979a7960714d25f
4
+ data.tar.gz: bb8c3834127f3b439bf4e6dfd531621e7802af4ac7dca7762161a9e56be02b71
5
5
  SHA512:
6
- metadata.gz: 27e3aed67258cfbc6684101d0e1c44ea2fdc852627001feb5c921353bc562a542f0c1c160d6e7f83fc7484842e69a3e1848fa55e58993b3a416832d8bfeca6aa
7
- data.tar.gz: 3ec4660b0996197367f76821fa1fc5bd4522658871eda1326a9470241fa144da3a5a4b976245147ee50bb9576dac385d043cd869e3e8cf47fd05cba584675083
6
+ metadata.gz: 70ce5e93ff22bc3631bde3d891f85d45665673852332dbc2f5bd3c448234682e26222435d7ec041d08c83fb206818fc974cae66f6bac3d8d7a216cf7bccec8aa
7
+ data.tar.gz: 1004f4ec5b4ed3819d0a32bb557f8abfb71020833f1e181070aaa48b661d14f1ae820dba79ba3ba9530dade622839c87fad17a6ec0e02cc53c70e0d5caeefb27
data/README.md CHANGED
@@ -85,24 +85,47 @@ brew install tree-sitter
85
85
 
86
86
  ## Install
87
87
 
88
- We haven't released the gem on `Rubygems` as of yet, but we'e planning on doing so.
88
+ From [rubygems](https://rubygems.org/gems/ruby_tree_sitter), in your `Gemfile`:
89
89
 
90
- Meanwhile, please install from `git` source, which will compile on installation.
90
+ ```ruby
91
+ gem 'ruby_tree_sitter', '~> 0.20.8.1'
92
+ ```
91
93
 
92
- If you don't want to install from `git`, or if you don't want to compile on
93
- install, download a native gem from this repository's
94
- [releases](https://github.com/Faveod/ruby-tree-sitter/releases), or you can
95
- compile it yourself (see [Build from
96
- source](docs/Development.md#build-from-source) .)
94
+ Or manually:
95
+
96
+ ```sh
97
+ gem install ruby_tree_sitter
98
+ ```
97
99
 
98
- ### Gemfile
100
+ Or from `git` sources, which will compile on installation:
99
101
 
100
102
  ```ruby
101
- gem 'tree_sitter', git: 'https://github.com/Faveod/ruby-tree-sitter'
103
+ gem 'ruby_tree_sitter', git: 'https://github.com/Faveod/ruby-tree-sitter'
104
+ ```
105
+
106
+ ### Disable system libraries
107
+
108
+ To install with `--disable-sys-lib`, you can either:
109
+
110
+ ```sh
111
+ gem install ruby_tree_sitter -- --disable-sys-libs
102
112
  ```
103
113
 
104
- If you chose to install a native gem, then you'd have to download it somewhere
105
- and then specify `path` as such:
114
+ Or via bundle:
115
+
116
+ ```sh
117
+ bundle config set build.ruby_tree_sitter --disable-sys-libs
118
+ ```
119
+
120
+ ### No compilation
121
+
122
+ If you don't want to install from `rubygems`, `git`, or if you don't want to
123
+ compile on install, then download a native gem from this repository's
124
+ [releases](https://github.com/Faveod/ruby-tree-sitter/releases), or you can
125
+ compile it yourself (see [Build from
126
+ source](docs/Development.md#build-from-source) .)
127
+
128
+ In that case, you'd have to point your `Gemfile` to the `gem` as such:
106
129
 
107
130
  ``` ruby
108
131
  gem 'tree_sitter', path: 'path/to/native/tree_sitter.gem'
@@ -118,6 +141,16 @@ You will have to install parsers yourself, either by:
118
141
  [Faveod/tree-sitter-parsers](https://github.com/Faveod/tree-sitter-parsers)
119
142
  which supports numerous architectures.
120
143
 
144
+ ### A note on static vs dynamic linking
145
+
146
+ This extension will statically link against a downloaded version of
147
+ `tree-sitter` when you use the `--disable-sys-lib`. So any installed version of
148
+ `tree-sitter` will not be loaded.
149
+
150
+ The native gems are also statically linked.
151
+
152
+ All other methods will dynamically link against the installed `tree-sitter`.
153
+
121
154
  ## Examples
122
155
 
123
156
  See `examples` directory.
@@ -1,6 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mkmf'
2
4
  require 'pathname'
3
5
 
6
+ require_relative 'repo'
7
+
4
8
  # ################################## #
5
9
  # Some helpers #
6
10
  # ################################## #
@@ -14,71 +18,88 @@ def system_tree_sitter?
14
18
  enable_config('sys-libs', true)
15
19
  end
16
20
 
17
- def sh cmd
18
- if !system(cmd)
19
- abort <<~MSG
20
-
21
- Failed to run: #{cmd}
22
-
23
- exiting…
24
-
25
- MSG
26
- end
27
- end
28
-
29
21
  def env_var_on?(var)
30
22
  %w[1 on true t yes y].include?(ENV.fetch(var, '').downcase)
31
23
  end
32
24
 
33
25
  # ################################## #
34
- # System lib #
35
- # #
36
- # OR #
37
- # #
38
- # Downloaded libs #
26
+ # System lib vs Downloaded lib #
39
27
  # ################################## #
40
28
 
41
29
  dir_include, dir_lib =
42
30
  if system_tree_sitter?
43
- [['/opt/include', '/opt/local/include', '/usr/include', '/usr/local/include'],
44
- ['/opt/lib', '/opt/local/lib', '/usr/lib', '/usr/local/lib']]
31
+ [
32
+ %w[/opt/include /opt/local/include /usr/include /usr/local/include],
33
+ %w[/opt/lib /opt/local/lib /usr/lib /usr/local/lib]
34
+ ]
45
35
  else
46
- src = Pathname.pwd / "tree-sitter-#{TreeSitter::VERSION}"
47
- if !Dir.exist? src
48
- if find_executable('git')
49
- sh "git clone https://github.com/tree-sitter/tree-sitter #{src}"
50
- sh "cd #{src} && git checkout tags/v#{TreeSitter::VERSION}"
51
- elsif find_executable('curl')
52
- if find_executable('tar')
53
- sh "curl -L https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v#{TreeSitter::VERSION}.tar.gz -o tree-sitter-v#{TreeSitter::VERSION}.tar.gz"
54
- sh "tar -xf tree-sitter-v#{TreeSitter::VERSION}.tar.gz"
55
- elsif find_executable('zip')
56
- sh "curl -L https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v#{TreeSitter::VERSION}.zip -o tree-sitter-v#{TreeSitter::VERSION}.zip"
57
- sh "unzip -q tree-sitter-v#{TreeSitter::VERSION}.zip"
58
- else
59
- abort('Could not find `tar` or `zip` (and `git` was not found!)')
60
- end
61
- else
62
- abort('Could not find `git` or `curl` to download tree-sitter and build from sources.')
63
- end
36
+ repo = TreeSitter::Repo.new
37
+ if !repo.download
38
+ msg = <<~MSG
39
+
40
+ Could not fetch tree-sitter sources:
41
+
42
+ #{repo.exe.map { |k, v| "#{k}: #{v}" }.join("\n")}
43
+
44
+ MSG
45
+ abort(msg)
64
46
  end
65
47
 
66
48
  # We need to make sure we're selecting the proper toolchain.
67
49
  # Especially needed for corss-compilation.
68
50
  ENV.store('CC', RbConfig::CONFIG['CC'])
69
- # We need to clean because the same folder is used over and over
70
- # by rake-compiler-dock
71
- sh "cd #{src} && make clean && make"
72
-
73
- [[src / 'lib' / 'include'], [src.to_s]]
51
+ repo.compile
52
+ repo.keep_static_lib
53
+ repo.include_and_lib_dirs
74
54
  end
75
55
 
56
+ # TREESITTER_SPEC = Bundler.load_gemspec('../../../../tree_sitter.gemspec')
57
+
58
+ # # def version = TREESITTER_SPEC.version.gsub(/\A(\d+\.\d+\.\d+)(\.\d+)?\z/, '\1')
59
+
60
+ # def version = '0.20.8'
61
+
62
+ # LINUX_PLATFORM_REGEX = /linux/
63
+ # DARWIN_PLATFORM_REGEX = /darwin/
64
+
65
+ # def platform = RUBY_PLATFORM
66
+
67
+ # def darwin?
68
+ # !!(platform =~ DARWIN_PLATFORM_REGEX)
69
+ # end
70
+
71
+ # def dll_ext
72
+ # darwin? ? 'dylib' : 'so'
73
+ # end
74
+
75
+ # def staging_path
76
+ # '../../stage/lib/tree_sitter'
77
+ # end
78
+
79
+ # def downloaded_dll_path
80
+ # "tree-sitter-#{version}"
81
+ # end
82
+
83
+ # def add_tree_sitter_dll_to_gem
84
+ # puts ">>>>>>>>>>>>> #{`pwd`}"
85
+ # path = "#{downloaded_dll_path}/libtree-sitter*.#{dll_ext}"
86
+ # files =
87
+ # Dir.glob(path)
88
+ # .map { |f| Pathname(f) }
89
+ # .filter { |f| !f.symlink? && f.file? }
90
+ # dll = files.first
91
+ # dst = Pathname(staging_path) / "libtree-sitter.#{dll_ext}"
92
+ # FileUtils.cp(dll, dst)
93
+ # TREESITTER_SPEC.files << dst
94
+ # end
95
+
96
+ # add_tree_sitter_dll_to_gem
97
+
76
98
  # ################################## #
77
99
  # Generate Makefile #
78
100
  # ################################## #
79
101
 
80
102
  header = find_header('tree_sitter/api.h', *dir_include)
81
-
82
103
  library = find_library('tree-sitter', # libtree-sitter
83
104
  'ts_parser_new', # a symbol
84
105
  *dir_lib)
@@ -100,9 +121,7 @@ if !header || !library
100
121
  MSG
101
122
  end
102
123
 
103
- if env_var_on?('TREE_SITTER_PEDANTIC')
104
- cflags << '-Werror'
105
- end
124
+ cflags << '-Werror' if env_var_on?('TREE_SITTER_PEDANTIC')
106
125
 
107
126
  if env_var_on?('DEBUG')
108
127
  cflags << '-fbounds-check'
@@ -61,12 +61,12 @@ static void logger_payload_set(logger_t *logger, VALUE value) {
61
61
  if (rb_respond_to(logger->payload, rb_intern("printf"))) {
62
62
  logger->data.log = logger_log_printf;
63
63
  } else if (rb_respond_to(logger->payload, rb_intern("puts"))) {
64
- logger->data.log = &logger_log_puts;
64
+ logger->data.log = logger_log_puts;
65
65
  } else {
66
- logger->data.log = &logger_log_write;
66
+ logger->data.log = logger_log_write;
67
67
  }
68
68
  } else if (!NIL_P(logger->payload)) {
69
- logger->data.log = &logger_log_write;
69
+ logger->data.log = logger_log_write;
70
70
  }
71
71
  }
72
72
 
@@ -76,7 +76,6 @@ module TreeSitter
76
76
  end
77
77
 
78
78
  def respond_to_missing?(*args)
79
- init_fields
80
79
  args.length == 1 && fields.include?(args[0])
81
80
  end
82
81
 
Binary file
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TreeSitter
4
- VERSION = '0.20.8.1'
4
+ TREESITTER_VERSION = '0.20.8'
5
+ VERSION = "#{TREESITTER_VERSION}.2".freeze
5
6
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../test_helper'
4
+
5
+ js = TreeSitter.lang('javascript')
6
+ parser = TreeSitter::Parser.new
7
+ parser.language = js
8
+
9
+ program = <<~JS
10
+ let a = 42;
11
+ JS
12
+
13
+ describe 'loading a language' do
14
+ before do
15
+ parser.reset
16
+ end
17
+
18
+ it 'must set/get the same language' do
19
+ parser.language = js
20
+ assert_equal js, parser.language
21
+ end
22
+ end
23
+
24
+ describe 'parse_string' do
25
+ before do
26
+ parser.reset
27
+ end
28
+
29
+ it 'must parse nil' do
30
+ res = parser.parse_string(nil, nil)
31
+ assert_nil res
32
+ end
33
+
34
+ [
35
+ ['empty', '', 0],
36
+ ['valid', program, 1],
37
+ # ['invalid', margorp, 3]
38
+ ].each do |q, p, c|
39
+ it "must parse #{q} programs" do
40
+ res = parser.parse_string(nil, p)
41
+ assert_instance_of TreeSitter::Tree, res
42
+
43
+ root = res.root_node
44
+ assert_instance_of TreeSitter::Node, root
45
+ assert_equal c, root.child_count
46
+ end
47
+ end
48
+ end
@@ -27,7 +27,12 @@ describe 'language' do
27
27
  if p = ENV.fetch('TREE_SITTER_PARSERS', nil)
28
28
  Pathname(p) / "libtree-sitter-ruby.#{TreeSitter.ext}"
29
29
  else
30
- Pathname('tree-sitter-parsers') / 'ruby' / "libtree-sitter-ruby.#{TreeSitter.ext}"
30
+ downloaded = Pathname('tree-sitter-parsers') / "libtree-sitter-ruby.#{TreeSitter.ext}"
31
+ if !downloaded.exist?
32
+ Pathname('tree-sitter-parsers') / "ruby" / "libtree-sitter-ruby.#{TreeSitter.ext}"
33
+ else
34
+ downloaded
35
+ end
31
36
  end
32
37
  ll = TreeSitter::Language.load('ruby', path)
33
38
  assert ll.field_count.positive?
@@ -62,6 +62,7 @@ describe 'logging' do
62
62
  backend = StringIO.new
63
63
  parser.logger = TreeSitter::Logger.new(backend, "%s#{delim}%s")
64
64
  parser.parse_string(nil, program)
65
+ refute_empty backend.string, 'the backend should be filled with logs'
65
66
  backend.each_line do |l|
66
67
  assert (/#{delim}/ =~ l), 'delimiter must be in every single line'
67
68
  end
data/tree_sitter.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ $LOAD_PATH.unshift(lib) if !$LOAD_PATH.include?(lib)
5
5
 
6
6
  require 'tree_sitter/version'
7
7
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.version = TreeSitter::VERSION
18
18
 
19
19
  spec.extensions = %(ext/tree_sitter/extconf.rb)
20
- spec.files = %w(LICENSE README.md tree_sitter.gemspec)
20
+ spec.files = %w[LICENSE README.md tree_sitter.gemspec]
21
21
  spec.files += Dir.glob('ext/**/*.[ch]')
22
22
  spec.files += Dir.glob('lib/**/*.rb')
23
23
  spec.test_files = Dir.glob('test/**/*')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_tree_sitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.8.1
4
+ version: 0.20.8.2
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Firas al-Khalil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-20 00:00:00.000000000 Z
11
+ date: 2023-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -146,6 +146,7 @@ files:
146
146
  - lib/tree_sitter/version.rb
147
147
  - test/README.md
148
148
  - test/test_helper.rb
149
+ - test/tree_sitter/js_test.rb
149
150
  - test/tree_sitter/language_test.rb
150
151
  - test/tree_sitter/logger_test.rb
151
152
  - test/tree_sitter/node_test.rb
@@ -183,6 +184,7 @@ summary: Ruby bindings for Tree-Sitter
183
184
  test_files:
184
185
  - test/README.md
185
186
  - test/test_helper.rb
187
+ - test/tree_sitter/js_test.rb
186
188
  - test/tree_sitter/language_test.rb
187
189
  - test/tree_sitter/logger_test.rb
188
190
  - test/tree_sitter/node_test.rb