Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4efb084

Browse files
committed
Handle multiple Ruby versions
1 parent eafdb48 commit 4efb084

13 files changed

+128
-49
lines changed

.github/workflows/main.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ on:
44
- pull_request_target
55
jobs:
66
ci:
7+
strategy:
8+
fail-fast: false
9+
matrix:
10+
ruby:
11+
- '2.7'
12+
- '3.0'
13+
- '3.1'
14+
- head
715
name: CI
816
runs-on: ubuntu-latest
917
env:
@@ -13,7 +21,7 @@ jobs:
1321
- uses: ruby/setup-ruby@v1
1422
with:
1523
bundler-cache: true
16-
ruby-version: '3.1'
24+
ruby-version: ${{ matrix.ruby }}
1725
- name: Test
1826
run: bundle exec rake test
1927
automerge:

Gemfile.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ GEM
2626

2727
PLATFORMS
2828
arm64-darwin-21
29+
ruby
2930
x86_64-darwin-19
3031
x86_64-darwin-21
3132
x86_64-linux

lib/syntax_tree/node.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3295,9 +3295,10 @@ def to_json(*opts)
32953295
private
32963296

32973297
def align?(node)
3298-
if node.arguments in Args[parts: [Def | Defs | DefEndless]]
3298+
case node.arguments
3299+
in Args[parts: [Def | Defs | DefEndless]]
32993300
false
3300-
elsif node.arguments in Args[parts: [Command => command]]
3301+
in Args[parts: [Command => command]]
33013302
align?(command)
33023303
else
33033304
true

test/fixtures/begin.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,3 @@
55
begin
66
expression
77
end
8-
%
9-
case value
10-
in ^(expression)
11-
end

test/fixtures/command.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,3 @@
2323
%
2424
meta3 meta2 meta1 def self.foo
2525
end
26-
%
27-
meta1 def foo = 1
28-
%
29-
meta2 meta1 def foo = 1
30-
%
31-
meta3 meta2 meta1 def foo = 1

test/fixtures/command_def_endless.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
%
2+
meta1 def foo = 1
3+
%
4+
meta2 meta1 def foo = 1
5+
%
6+
meta3 meta2 meta1 def foo = 1

test/fixtures/pinned_begin.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
%
2+
case value
3+
in ^(expression)
4+
end

test/fixtures/var_field.rb

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,3 @@
88
foo = bar
99
%
1010
@foo = bar
11-
%
12-
foo in bar
13-
%
14-
foo in ^bar
15-
%
16-
foo in ^@bar
17-
%
18-
foo in ^@@bar
19-
%
20-
foo in ^$gvar

test/fixtures/var_field_rassign.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
%
2+
foo in bar
3+
%
4+
foo in ^bar
5+
%
6+
foo in ^@bar
7+
%
8+
foo in ^@@bar
9+
%
10+
foo in ^$gvar

test/formatting_test.rb

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,28 @@
44

55
module SyntaxTree
66
class FormattingTest < Minitest::Test
7-
delimiter = /%(?: # (.+?))?\n/
7+
FIXTURES_3_0_0 = %w[
8+
command_def_endless
9+
def_endless
10+
fndptn
11+
rassign
12+
rassign_rocket
13+
]
14+
15+
FIXTURES_3_1_0 = %w[
16+
pinned_begin
17+
var_field_rassign
18+
]
819

9-
Dir[File.join(__dir__, "fixtures", "*.rb")].each do |filepath|
10-
basename = File.basename(filepath, ".rb")
11-
sources = File.readlines(filepath).slice_before(delimiter)
20+
fixtures = Dir[File.join(__dir__, "fixtures", "*.rb")].map { |filepath| File.basename(filepath, ".rb") }
21+
fixtures -= FIXTURES_3_1_0 if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.1.0")
22+
fixtures -= FIXTURES_3_0_0 if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.0.0")
23+
24+
delimiter = /%(?: # (.+?))?\n/
25+
fixtures.each do |fixture|
26+
filepath = File.join(__dir__, "fixtures", "#{fixture}.rb")
1227

13-
sources.each_with_index do |source, index|
28+
File.readlines(filepath).slice_before(delimiter).each_with_index do |source, index|
1429
comment = source.shift.match(delimiter)[1]
1530
original, expected = source.join.split("-\n")
1631

@@ -22,7 +37,7 @@ class FormattingTest < Minitest::Test
2237
next if Gem::Version.new(RUBY_VERSION) < version
2338
end
2439

25-
define_method(:"test_formatting_#{basename}_#{index}") do
40+
define_method(:"test_formatting_#{fixture}_#{index}") do
2641
assert_equal(expected || original, SyntaxTree.format(original))
2742
end
2843
end

test/node_test.rb

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -289,12 +289,14 @@ def test_case
289289
assert_node(Case, "case", source)
290290
end
291291

292-
def test_rassign_in
293-
assert_node(RAssign, "rassign", "value in pattern")
294-
end
292+
guard_version("3.0.0") do
293+
def test_rassign_in
294+
assert_node(RAssign, "rassign", "value in pattern")
295+
end
295296

296-
def test_rassign_rocket
297-
assert_node(RAssign, "rassign", "value => pattern")
297+
def test_rassign_rocket
298+
assert_node(RAssign, "rassign", "value => pattern")
299+
end
298300
end
299301

300302
def test_class
@@ -352,8 +354,10 @@ def method
352354
assert_node(Def, "def", source)
353355
end
354356

355-
def test_def_endless
356-
assert_node(DefEndless, "def_endless", "def method = result")
357+
guard_version("3.0.0") do
358+
def test_def_endless
359+
assert_node(DefEndless, "def_endless", "def method = result")
360+
end
357361
end
358362

359363
guard_version("3.1.0") do
@@ -478,16 +482,18 @@ def test_float_literal
478482
assert_node(FloatLiteral, "float", "1.0")
479483
end
480484

481-
def test_fndptn
482-
source = <<~SOURCE
483-
case value
484-
in Container[*, 7, *]
485-
end
486-
SOURCE
485+
guard_version("3.0.0") do
486+
def test_fndptn
487+
source = <<~SOURCE
488+
case value
489+
in Container[*, 7, *]
490+
end
491+
SOURCE
487492

488-
at = location(lines: 2..2, chars: 14..32)
489-
assert_node(FndPtn, "fndptn", source, at: at) do |node|
490-
node.consequent.pattern
493+
at = location(lines: 2..2, chars: 14..32)
494+
assert_node(FndPtn, "fndptn", source, at: at) do |node|
495+
node.consequent.pattern
496+
end
491497
end
492498
end
493499

test/parser_test.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "test_helper"
4+
5+
module SyntaxTree
6+
class ParserTest < Minitest::Test
7+
def test_parses_ripper_methods
8+
# First, get a list of all of the dispatched events from ripper.
9+
events = Ripper::EVENTS
10+
11+
# Next, subtract all of the events that we have explicitly defined.
12+
events -= Parser.private_instance_methods(false).grep(/^on_(\w+)/) { $1.to_sym }
13+
14+
# Next, subtract the list of events that we purposefully skipped.
15+
events -= %i[
16+
arg_ambiguous
17+
assoclist_from_args
18+
ignored_nl
19+
ignored_sp
20+
magic_comment
21+
nl
22+
nokw_param
23+
operator_ambiguous
24+
semicolon
25+
sp
26+
words_sep
27+
]
28+
29+
# Finally, assert that we have no remaining events.
30+
assert_empty(events)
31+
end
32+
end
33+
end

test/visitor_test.rb

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,27 @@ def test_visit_all_nodes
1111
program = SyntaxTree.parse(SyntaxTree.read(filepath))
1212

1313
program.statements.body.last.bodystmt.statements.body.each do |node|
14-
next unless node in SyntaxTree::ClassDeclaration[superclass: { value: { value: "Node" } }]
14+
case node
15+
in SyntaxTree::ClassDeclaration[superclass: { value: { value: "Node" } }]
16+
# this is a class we want to look at
17+
else
18+
next
19+
end
1520

16-
accept = node.bodystmt.statements.body.detect { |defm| defm in SyntaxTree::Def[name: { value: "accept" }] }
17-
accept => { bodystmt: { statements: { body: [SyntaxTree::Call[message: { value: visit_method }]] } } }
21+
accept =
22+
node.bodystmt.statements.body.detect do |defm|
23+
case defm
24+
in SyntaxTree::Def[name: { value: "accept" }]
25+
true
26+
else
27+
false
28+
end
29+
end
1830

19-
assert_respond_to(visitor, visit_method)
31+
case accept
32+
in { bodystmt: { statements: { body: [SyntaxTree::Call[message: { value: visit_method }]] } } }
33+
assert_respond_to(visitor, visit_method)
34+
end
2035
end
2136
end
2237
end

0 commit comments

Comments
 (0)