parser 2.3.0.1 → 2.3.0.2
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 +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +3 -3
- data/lib/parser/lexer.rl +62 -79
- data/lib/parser/lexer/dedenter.rb +2 -1
- data/lib/parser/lexer/literal.rb +7 -9
- data/lib/parser/meta.rb +1 -1
- data/lib/parser/version.rb +1 -1
- data/test/test_lexer.rb +51 -1
- data/test/test_parser.rb +1 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3cb2802760d71d558e9ab344e63deb18525be110
|
4
|
+
data.tar.gz: 32edc10c308de0d00030d4b9fbac6bd40bfff36f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 365c674e6cf6b3fa43f81903a7f46ce787075eb927e4aecce9b59ff05d81b5c47d4304f063f2f31c528f8846faec1983736f7bbd169697e19950e03346b0e52a
|
7
|
+
data.tar.gz: 1504d14896c1cb0dde7a8bc46aa60b04036e03310b1f097e84e5f14587699f18b086184292fbb5fb1aaff4d201d172cd9c424d1b8bc11de725d2c64567893928
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
v2.3.0.2 (2016-01-24)
|
5
|
+
---------------------
|
6
|
+
|
7
|
+
Bugs fixed:
|
8
|
+
* Add :csend to Parser::Meta::NODE_TYPES (Markus Schirp)
|
9
|
+
* lexer/dedenter: "\<\<x\n y\\n z\nx": don't dedent after escaped newline. (whitequark)
|
10
|
+
|
11
|
+
v2.3.0.2 (2016-01-16)
|
12
|
+
---------------------
|
13
|
+
|
14
|
+
v2.3.0.1 (2016-01-14)
|
15
|
+
---------------------
|
16
|
+
|
17
|
+
Features implemented:
|
18
|
+
* ruby23.y: implement optional superclass (cremno)
|
19
|
+
|
4
20
|
v2.3.0.0 (2016-01-14)
|
5
21
|
---------------------
|
6
22
|
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Parser
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/parser)
|
4
|
+
[](https://travis-ci.org/whitequark/parser)
|
5
|
+
[](https://coveralls.io/r/whitequark/parser)
|
6
6
|
|
7
7
|
_Parser_ is a production-ready Ruby parser written in pure Ruby. It recognizes as
|
8
8
|
much or more code than Ripper, Melbourne, JRubyParser or ruby\_parser, and
|
data/lib/parser/lexer.rl
CHANGED
@@ -92,7 +92,7 @@ class Parser::Lexer
|
|
92
92
|
REGEXP_META_CHARACTERS = Regexp.union(*"\\$()*+.<>?[]^{|}".chars).freeze
|
93
93
|
UNDERSCORE_STRING = '_'.freeze
|
94
94
|
|
95
|
-
|
95
|
+
RBRACE_OR_RBRACK = %w"} ]".freeze
|
96
96
|
|
97
97
|
attr_reader :source_buffer
|
98
98
|
attr_reader :encoding
|
@@ -426,6 +426,12 @@ class Parser::Lexer
|
|
426
426
|
else
|
427
427
|
self.class.lex_en_plain_words
|
428
428
|
end
|
429
|
+
elsif new_literal.backslash_delimited?
|
430
|
+
if new_literal.interpolate?
|
431
|
+
self.class.lex_en_interp_backslash_delimited
|
432
|
+
else
|
433
|
+
self.class.lex_en_plain_backslash_delimited
|
434
|
+
end
|
429
435
|
else
|
430
436
|
if new_literal.interpolate?
|
431
437
|
self.class.lex_en_interp_string
|
@@ -645,10 +651,10 @@ class Parser::Lexer
|
|
645
651
|
flo_pow = [eE] [+\-]? ( digit+ '_' )* digit+;
|
646
652
|
|
647
653
|
int_suffix =
|
648
|
-
'' % { @num_xfrm = lambda { |chars|
|
649
|
-
| 'r' % { @num_xfrm = lambda { |chars|
|
650
|
-
| 'i' % { @num_xfrm = lambda { |chars|
|
651
|
-
| 'ri' % { @num_xfrm = lambda { |chars|
|
654
|
+
'' % { @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } }
|
655
|
+
| 'r' % { @num_xfrm = lambda { |chars| emit(:tRATIONAL, Rational(chars)) } }
|
656
|
+
| 'i' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, chars)) } }
|
657
|
+
| 'ri' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Rational(chars))) } };
|
652
658
|
|
653
659
|
flo_pow_suffix =
|
654
660
|
'' % { @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars)) } }
|
@@ -682,11 +688,8 @@ class Parser::Lexer
|
|
682
688
|
codepoint = codepoint_str.to_i(16)
|
683
689
|
|
684
690
|
if codepoint >= 0x110000
|
685
|
-
|
686
|
-
|
687
|
-
range(codepoint_s, codepoint_s + codepoint_str.length)
|
688
|
-
end
|
689
|
-
|
691
|
+
diagnostic :error, :unicode_point_too_large, nil,
|
692
|
+
range(codepoint_s, codepoint_s + codepoint_str.length)
|
690
693
|
break
|
691
694
|
end
|
692
695
|
|
@@ -701,9 +704,7 @@ class Parser::Lexer
|
|
701
704
|
}
|
702
705
|
|
703
706
|
action invalid_complex_escape {
|
704
|
-
|
705
|
-
diagnostic :fatal, :invalid_escape
|
706
|
-
end
|
707
|
+
diagnostic :fatal, :invalid_escape
|
707
708
|
}
|
708
709
|
|
709
710
|
action slash_c_char {
|
@@ -731,20 +732,17 @@ class Parser::Lexer
|
|
731
732
|
% { @escape = encode_escape(tok(@escape_s, p).to_i(8) % 0x100) }
|
732
733
|
|
733
734
|
# \xff
|
734
|
-
|
|
735
|
+
| 'x' xdigit{1,2}
|
735
736
|
% { @escape = encode_escape(tok(@escape_s + 1, p).to_i(16)) }
|
737
|
+
|
736
738
|
# \u263a
|
737
|
-
|
738
|
-
|
739
|
-
)
|
739
|
+
| 'u' xdigit{4}
|
740
|
+
% { @escape = tok(@escape_s + 1, p).to_i(16).chr(Encoding::UTF_8) }
|
740
741
|
|
741
742
|
# %q[\x]
|
742
743
|
| 'x' ( c_any - xdigit )
|
743
744
|
% {
|
744
|
-
@
|
745
|
-
diagnostic :fatal, :invalid_hex_escape, nil,
|
746
|
-
range(@escape_s - 1, p + 2)
|
747
|
-
end
|
745
|
+
diagnostic :fatal, :invalid_hex_escape, nil, range(@escape_s - 1, p + 2)
|
748
746
|
}
|
749
747
|
|
750
748
|
# %q[\u123] %q[\u{12]
|
@@ -756,10 +754,7 @@ class Parser::Lexer
|
|
756
754
|
)
|
757
755
|
)
|
758
756
|
% {
|
759
|
-
@
|
760
|
-
diagnostic :fatal, :invalid_unicode_escape, nil,
|
761
|
-
range(@escape_s - 1, p)
|
762
|
-
end
|
757
|
+
diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p)
|
763
758
|
}
|
764
759
|
|
765
760
|
# \u{123 456}
|
@@ -770,10 +765,7 @@ class Parser::Lexer
|
|
770
765
|
| ( c_any - '}' )* c_eof
|
771
766
|
| xdigit{7,}
|
772
767
|
) % {
|
773
|
-
|
774
|
-
diagnostic :fatal, :unterminated_unicode, nil,
|
775
|
-
range(p - 1, p)
|
776
|
-
end
|
768
|
+
diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p)
|
777
769
|
}
|
778
770
|
)
|
779
771
|
|
@@ -881,53 +873,35 @@ class Parser::Lexer
|
|
881
873
|
|
882
874
|
action extend_string_escaped {
|
883
875
|
current_literal = literal
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
876
|
+
# Get the first character after the backslash.
|
877
|
+
escaped_char = @source[@escape_s].chr
|
878
|
+
|
879
|
+
if current_literal.munge_escape? escaped_char
|
880
|
+
# If this particular literal uses this character as an opening
|
881
|
+
# or closing delimiter, it is an escape sequence for that
|
882
|
+
# particular character. Write it without the backslash.
|
883
|
+
|
884
|
+
if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char)
|
885
|
+
# Regular expressions should include escaped delimiters in their
|
886
|
+
# escaped form, except when the escaped character is
|
887
|
+
# a closing delimiter but not a regexp metacharacter.
|
888
|
+
#
|
889
|
+
# The backslash itself cannot be used as a closing delimiter
|
890
|
+
# at the same time as an escape symbol, but it is always munged,
|
891
|
+
# so this branch also executes for the non-closing-delimiter case
|
892
|
+
# for the backslash.
|
893
|
+
current_literal.extend_string(tok, @ts, @te)
|
894
|
+
else
|
895
|
+
current_literal.extend_string(escaped_char, @ts, @te)
|
896
|
+
end
|
889
897
|
else
|
890
|
-
#
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
# or closing delimiter, it is an escape sequence for that
|
896
|
-
# particular character. Write it without the backslash.
|
897
|
-
|
898
|
-
if current_literal.regexp? && REGEXP_META_CHARACTERS.match(escaped_char)
|
899
|
-
# Regular expressions should include escaped delimiters in their
|
900
|
-
# escaped form, except when the escaped character is
|
901
|
-
# a closing delimiter but not a regexp metacharacter.
|
902
|
-
#
|
903
|
-
# The backslash itself cannot be used as a closing delimiter
|
904
|
-
# at the same time as an escape symbol, but it is always munged,
|
905
|
-
# so this branch also executes for the non-closing-delimiter case
|
906
|
-
# for the backslash.
|
907
|
-
current_literal.extend_string(tok, @ts, @te)
|
908
|
-
else
|
909
|
-
current_literal.extend_string(escaped_char, @ts, @te)
|
910
|
-
end
|
898
|
+
# It does not. So this is an actual escape sequence, yay!
|
899
|
+
if current_literal.regexp?
|
900
|
+
# Regular expressions should include escape sequences in their
|
901
|
+
# escaped form. On the other hand, escaped newlines are removed.
|
902
|
+
current_literal.extend_string(tok.gsub(ESCAPED_NEXT_LINE, BLANK_STRING), @ts, @te)
|
911
903
|
else
|
912
|
-
|
913
|
-
# Two things to consider here.
|
914
|
-
#
|
915
|
-
# 1. The `escape' rule should be pure and so won't raise any
|
916
|
-
# errors by itself. Instead, it stores them in lambdas.
|
917
|
-
#
|
918
|
-
# 2. Non-interpolated literals do not go through the aforementioned
|
919
|
-
# rule. As \\ and \' (and variants) are munged, the full token
|
920
|
-
# should always be written for such literals.
|
921
|
-
|
922
|
-
@escape.call if @escape.respond_to? :call
|
923
|
-
|
924
|
-
if current_literal.regexp?
|
925
|
-
# Regular expressions should include escape sequences in their
|
926
|
-
# escaped form. On the other hand, escaped newlines are removed.
|
927
|
-
current_literal.extend_string(tok.gsub(ESCAPED_NEXT_LINE, BLANK_STRING), @ts, @te)
|
928
|
-
else
|
929
|
-
current_literal.extend_string(@escape || tok, @ts, @te)
|
930
|
-
end
|
904
|
+
current_literal.extend_string(@escape || tok, @ts, @te)
|
931
905
|
end
|
932
906
|
end
|
933
907
|
}
|
@@ -1115,6 +1089,18 @@ class Parser::Lexer
|
|
1115
1089
|
c_any => extend_string;
|
1116
1090
|
*|;
|
1117
1091
|
|
1092
|
+
interp_backslash_delimited := |*
|
1093
|
+
interp_code => extend_interp_code;
|
1094
|
+
interp_var => extend_interp_var;
|
1095
|
+
c_eol => extend_string_eol;
|
1096
|
+
c_any => extend_string;
|
1097
|
+
*|;
|
1098
|
+
|
1099
|
+
plain_backslash_delimited := |*
|
1100
|
+
c_eol => extend_string_eol;
|
1101
|
+
c_any => extend_string;
|
1102
|
+
*|;
|
1103
|
+
|
1118
1104
|
regexp_modifiers := |*
|
1119
1105
|
[A-Za-z]+
|
1120
1106
|
=> {
|
@@ -1669,7 +1655,7 @@ class Parser::Lexer
|
|
1669
1655
|
# %w(we are the people)
|
1670
1656
|
'%' [A-Za-z]+ c_any
|
1671
1657
|
=> {
|
1672
|
-
type, delimiter =
|
1658
|
+
type, delimiter = @source[@ts...(@te - 1)], @source[@te - 1].chr
|
1673
1659
|
fgoto *push_literal(type, delimiter, @ts);
|
1674
1660
|
};
|
1675
1661
|
|
@@ -1746,9 +1732,6 @@ class Parser::Lexer
|
|
1746
1732
|
| (c_any - c_space_nl - e_bs) % { @escape = nil }
|
1747
1733
|
)
|
1748
1734
|
=> {
|
1749
|
-
# Show an error if memorized.
|
1750
|
-
@escape.call if @escape.respond_to? :call
|
1751
|
-
|
1752
1735
|
value = @escape || tok(@ts + 1)
|
1753
1736
|
|
1754
1737
|
if version?(18)
|
@@ -2177,7 +2160,7 @@ class Parser::Lexer
|
|
2177
2160
|
emit_table(PUNCTUATION)
|
2178
2161
|
@cond.lexpop; @cmdarg.lexpop
|
2179
2162
|
|
2180
|
-
if
|
2163
|
+
if RBRACE_OR_RBRACK.include?(tok)
|
2181
2164
|
fnext expr_endarg;
|
2182
2165
|
else # )
|
2183
2166
|
# fnext expr_endfn; ?
|
@@ -9,6 +9,7 @@ module Parser
|
|
9
9
|
|
10
10
|
def dedent(string)
|
11
11
|
space_begin = space_end = offset = 0
|
12
|
+
last_index = string.length - 1
|
12
13
|
string.chars.each_with_index do |char, index|
|
13
14
|
if @at_line_begin
|
14
15
|
if char == ?\n || @indent_level >= @dedent_level
|
@@ -26,7 +27,7 @@ module Parser
|
|
26
27
|
@indent_level += 8 - @indent_level % 8
|
27
28
|
space_end += 1
|
28
29
|
end
|
29
|
-
elsif char == ?\n
|
30
|
+
elsif char == ?\n && index == last_index
|
30
31
|
@at_line_begin = true
|
31
32
|
@indent_level = 0
|
32
33
|
space_begin = space_end = index - offset + 1
|
data/lib/parser/lexer/literal.rb
CHANGED
@@ -4,7 +4,6 @@ module Parser
|
|
4
4
|
|
5
5
|
class Lexer::Literal
|
6
6
|
DELIMITERS = { '(' => ')', '[' => ']', '{' => '}', '<' => '>' }
|
7
|
-
MONOLITHIC = { :tSTRING_BEG => :tSTRING }
|
8
7
|
|
9
8
|
TYPES = {
|
10
9
|
# type start token interpolate?
|
@@ -79,9 +78,7 @@ module Parser
|
|
79
78
|
!heredoc?)
|
80
79
|
|
81
80
|
# Capture opening delimiter in percent-literals.
|
82
|
-
|
83
|
-
@str_type << delimiter
|
84
|
-
end
|
81
|
+
@str_type << delimiter if @str_type.start_with?('%')
|
85
82
|
|
86
83
|
clear_buffer
|
87
84
|
|
@@ -105,6 +102,10 @@ module Parser
|
|
105
102
|
!!@heredoc_e
|
106
103
|
end
|
107
104
|
|
105
|
+
def backslash_delimited?
|
106
|
+
@end_delim == '\\'
|
107
|
+
end
|
108
|
+
|
108
109
|
def type
|
109
110
|
@start_tok
|
110
111
|
end
|
@@ -141,7 +142,7 @@ module Parser
|
|
141
142
|
emit(:tLABEL_END, @end_delim, ts, te + 1)
|
142
143
|
elsif @monolithic
|
143
144
|
# Emit the string as a single token.
|
144
|
-
emit(
|
145
|
+
emit(:tSTRING, @buffer, @str_s, te)
|
145
146
|
else
|
146
147
|
# If this is a heredoc, @buffer contains the sentinel now.
|
147
148
|
# Just throw it out. Lexer flushes the heredoc after each
|
@@ -183,10 +184,7 @@ module Parser
|
|
183
184
|
end
|
184
185
|
|
185
186
|
def extend_string(string, ts, te)
|
186
|
-
|
187
|
-
@buffer_s = ts
|
188
|
-
end
|
189
|
-
|
187
|
+
@buffer_s ||= ts
|
190
188
|
@buffer_e = te
|
191
189
|
|
192
190
|
@buffer << string
|
data/lib/parser/meta.rb
CHANGED
@@ -16,7 +16,7 @@ module Parser
|
|
16
16
|
match_with_lvasgn match_current_line
|
17
17
|
module class sclass def defs undef alias args
|
18
18
|
cbase arg optarg restarg blockarg block_pass args def kwarg kwoptarg
|
19
|
-
kwrestarg send super zsuper yield block
|
19
|
+
kwrestarg send csend super zsuper yield block
|
20
20
|
and not or if when case while until while_post
|
21
21
|
until_post for break next redo return resbody
|
22
22
|
kwbegin begin retry preexe postexe iflipflop eflipflop
|
data/lib/parser/version.rb
CHANGED
data/test/test_lexer.rb
CHANGED
@@ -1796,6 +1796,14 @@ class TestLexer < Minitest::Test
|
|
1796
1796
|
:tREGEXP_OPT, "")
|
1797
1797
|
end
|
1798
1798
|
|
1799
|
+
def test_regexp_escape_other_meta
|
1800
|
+
assert_scanned("/\\.\\$\\*\\+\\.\\?\\|/",
|
1801
|
+
:tREGEXP_BEG, "/",
|
1802
|
+
:tSTRING_CONTENT, "\\.\\$\\*\\+\\.\\?\\|",
|
1803
|
+
:tSTRING_END, "/",
|
1804
|
+
:tREGEXP_OPT, "")
|
1805
|
+
end
|
1806
|
+
|
1799
1807
|
def test_regexp_nm
|
1800
1808
|
assert_scanned("/.*/nm",
|
1801
1809
|
:tREGEXP_BEG, "/",
|
@@ -2097,7 +2105,7 @@ class TestLexer < Minitest::Test
|
|
2097
2105
|
|
2098
2106
|
def test_string_pct_pct
|
2099
2107
|
assert_scanned("%%blah%",
|
2100
|
-
:tSTRING_BEG, '
|
2108
|
+
:tSTRING_BEG, '%%',
|
2101
2109
|
:tSTRING_CONTENT, "blah",
|
2102
2110
|
:tSTRING_END, '%')
|
2103
2111
|
end
|
@@ -2159,6 +2167,48 @@ class TestLexer < Minitest::Test
|
|
2159
2167
|
:tSTRING_END, ')')
|
2160
2168
|
end
|
2161
2169
|
|
2170
|
+
def test_string_pct_backslash
|
2171
|
+
assert_scanned("%\\a\\",
|
2172
|
+
:tSTRING_BEG, "%\\",
|
2173
|
+
:tSTRING_CONTENT, "a",
|
2174
|
+
:tSTRING_END, "\\")
|
2175
|
+
end
|
2176
|
+
|
2177
|
+
def test_string_pct_backslash_with_bad_escape
|
2178
|
+
# No escapes are allowed in a backslash-delimited string
|
2179
|
+
refute_scanned("%\\a\\n\\",
|
2180
|
+
:tSTRING_BEG, "%\\",
|
2181
|
+
:tSTRING_CONTENT, "a",
|
2182
|
+
:tSTRING_END, "\\",
|
2183
|
+
:tIDENTIFIER, "n")
|
2184
|
+
end
|
2185
|
+
|
2186
|
+
def test_string_pct_intertwined_with_heredoc
|
2187
|
+
assert_scanned("<<-foo + %\\a\nbar\nfoo\nb\\",
|
2188
|
+
:tSTRING_BEG, "<<\"",
|
2189
|
+
:tSTRING_CONTENT, "bar\n",
|
2190
|
+
:tSTRING_END, "foo",
|
2191
|
+
:tPLUS, "+",
|
2192
|
+
:tSTRING_BEG, "%\\",
|
2193
|
+
:tSTRING_CONTENT, "a\n",
|
2194
|
+
:tSTRING_CONTENT, "b",
|
2195
|
+
:tSTRING_END, "\\")
|
2196
|
+
end
|
2197
|
+
|
2198
|
+
def test_string_pct_q_backslash
|
2199
|
+
assert_scanned("%q\\a\\",
|
2200
|
+
:tSTRING_BEG, "%q\\",
|
2201
|
+
:tSTRING_CONTENT, "a",
|
2202
|
+
:tSTRING_END, "\\")
|
2203
|
+
end
|
2204
|
+
|
2205
|
+
def test_string_pct_Q_backslash
|
2206
|
+
assert_scanned("%Q\\a\\",
|
2207
|
+
:tSTRING_BEG, "%Q\\",
|
2208
|
+
:tSTRING_CONTENT, "a",
|
2209
|
+
:tSTRING_END, "\\")
|
2210
|
+
end
|
2211
|
+
|
2162
2212
|
def test_string_single
|
2163
2213
|
assert_scanned("'string'",
|
2164
2214
|
:tSTRING, "string")
|
data/test/test_parser.rb
CHANGED
@@ -5286,17 +5286,15 @@ class TestParser < Minitest::Test
|
|
5286
5286
|
ALL_VERSIONS - %w(1.8 1.9 mac ios 2.0)) # no 1.9 backport
|
5287
5287
|
end
|
5288
5288
|
|
5289
|
-
# We implement broken behavior, and Ruby is not fixed as of 2016-01-14.
|
5290
5289
|
def test_ruby_bug_11989
|
5291
5290
|
assert_parses(
|
5292
5291
|
s(:send, nil, :p,
|
5293
|
-
s(:str, "x\n
|
5292
|
+
s(:str, "x\n y\n")),
|
5294
5293
|
%Q{p <<~"E"\n x\\n y\nE},
|
5295
5294
|
%q{},
|
5296
5295
|
ALL_VERSIONS - %w(1.8 1.9 2.0 2.1 2.2 ios mac))
|
5297
5296
|
end
|
5298
5297
|
|
5299
|
-
# We implement correct behavior, but Ruby is not fixed as of 2016-01-14.
|
5300
5298
|
def test_ruby_bug_11990
|
5301
5299
|
assert_parses(
|
5302
5300
|
s(:send, nil, :p,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.0.
|
4
|
+
version: 2.3.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -354,7 +354,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
354
354
|
version: '0'
|
355
355
|
requirements: []
|
356
356
|
rubyforge_project:
|
357
|
-
rubygems_version: 2.
|
357
|
+
rubygems_version: 2.5.1
|
358
358
|
signing_key:
|
359
359
|
specification_version: 4
|
360
360
|
summary: A Ruby parser written in pure Ruby.
|