ruby_tree_sitter 0.20.8.1 → 0.20.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94cb2ce80adc91e98ee79fb48b89a8f35b750b57b38272d0f1256a2641b36434
4
- data.tar.gz: a84e39a7e69d457f187ae20627a03a19476a6956ba05fe53d3088cd4ae899e22
3
+ metadata.gz: 8fa1192182d47ed588452cc52bdc175a046ab6640de7be352b28dc1da5196d7f
4
+ data.tar.gz: 5fec5601dce2ae11735046bc889a0a08f4f4cffd9bfa42f3100345b7edc9bf32
5
5
  SHA512:
6
- metadata.gz: c9d6f4150314194818f1d61030324b32ff763d2d0c799a76373ec6e4d3d1fc85b660c8848df867c73eafb3903ac426f684010465cedcbd1e1a11d2cfbc11efdc
7
- data.tar.gz: aeed7a952d3b640d8f9bc2c35abf73e05f3c0d921f13776ca938b6dbdaf21eaec97f617ee6984f399ab320c2066b383cc081aee287a3ac2123c6e0185ff5df74
6
+ metadata.gz: '09bd1eb015eb14bb5e0f500d23cadd50c7aa97e61296a382379ba29cec849c5393903ee79f2de98c954777462badb2e6bc514372a66cd297c6c3044f7fed6ef4'
7
+ data.tar.gz: 9d0f3635d0bb438a22878e96315521c8cb396001d1093ca1f8496bd91927b7829becae12be15f9cbd9eb88ff5018fece2fec5121f808c2b3e4314cc5376a02e4
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
 
@@ -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: ruby
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
@@ -180,6 +181,7 @@ summary: Ruby bindings for Tree-Sitter
180
181
  test_files:
181
182
  - test/README.md
182
183
  - test/test_helper.rb
184
+ - test/tree_sitter/js_test.rb
183
185
  - test/tree_sitter/language_test.rb
184
186
  - test/tree_sitter/logger_test.rb
185
187
  - test/tree_sitter/node_test.rb