ripper_ruby_parser 1.8.0 → 1.9.0
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 +13 -0
- data/README.md +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +2 -2
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +8 -4
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +5 -0
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +3 -3
- data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +3 -13
- data/lib/ripper_ruby_parser/unescape.rb +27 -10
- data/lib/ripper_ruby_parser/version.rb +1 -1
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e4ee66b4ce6abf5b0eeacd55fd137dd7217bf728bc59f1ad6bdf0b197011f86
|
4
|
+
data.tar.gz: a35a48bfa5178c5a9cec64017842246a4acb8b10a0c09fba2749de9aa650772c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0574addabb87b0f843c2a72a3e5c03b6ffff2461a9f1fa551412ee706841a2baeb354c1decd3ca7c902e1e78c2c2b7c4a346784ebb6c5b1064211b4ca08b8039
|
7
|
+
data.tar.gz: cffd4a9f013b443e82b3b4d6149719b02119f182aafe86fc2984d81b131bc047bd1143ca5b06cd28dc32e71876cbb67452c9db47979a50d766e28ea7b7f590a2
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,15 @@ This project adheres to [Semantic Versioning 2.0.0][1].
|
|
6
6
|
|
7
7
|
This document is formatted based on [Keep A CHANGELOG][2].
|
8
8
|
|
9
|
+
## 1.9.0 / 2021-08-10
|
10
|
+
|
11
|
+
* Fix escape sequence handling in non-interpolating strings and word lists
|
12
|
+
([#152])
|
13
|
+
* Handle strings with mixed valid and invalid utf8 ([#153])
|
14
|
+
* Handle argument forwarding, updating the RubyParser compatibility target to
|
15
|
+
3.17.0 ([#154])
|
16
|
+
* Fix encoding for non-interpolating strings as well ([#155])
|
17
|
+
|
9
18
|
## 1.8.0 / 2021-05-18
|
10
19
|
|
11
20
|
### Changes
|
@@ -217,6 +226,10 @@ This document is formatted based on [Keep A CHANGELOG][2].
|
|
217
226
|
* Initial release
|
218
227
|
|
219
228
|
<!-- Pull request links -->
|
229
|
+
[#155]: https://github.com/mvz/ripper_ruby_parser/pull/155
|
230
|
+
[#154]: https://github.com/mvz/ripper_ruby_parser/pull/154
|
231
|
+
[#153]: https://github.com/mvz/ripper_ruby_parser/pull/153
|
232
|
+
[#152]: https://github.com/mvz/ripper_ruby_parser/pull/152
|
220
233
|
[#145]: https://github.com/mvz/ripper_ruby_parser/pull/145
|
221
234
|
[#123]: https://github.com/mvz/ripper_ruby_parser/pull/123
|
222
235
|
[#106]: https://github.com/mvz/ripper_ruby_parser/pull/106
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ Parse with Ripper, produce sexps that are compatible with RubyParser.
|
|
11
11
|
* Drop-in replacement for RubyParser
|
12
12
|
* Should handle 1.9 and later syntax gracefully
|
13
13
|
* Requires Ruby 2.5 or higher
|
14
|
-
* Compatible with RubyParser 3.
|
14
|
+
* Compatible with RubyParser 3.17.0
|
15
15
|
|
16
16
|
## Known incompatibilities
|
17
17
|
|
@@ -26,7 +26,11 @@ module RipperRubyParser
|
|
26
26
|
_, call, parens = exp.shift 3
|
27
27
|
call = process(call)
|
28
28
|
parens = process(parens)
|
29
|
-
|
29
|
+
if parens.sexp_type == :forward_args
|
30
|
+
call.push(parens)
|
31
|
+
else
|
32
|
+
call.push(*parens.sexp_body)
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
# Handle implied hashes, such as at the end of argument lists.
|
@@ -36,9 +40,9 @@ module RipperRubyParser
|
|
36
40
|
end
|
37
41
|
|
38
42
|
CALL_OP_MAP = {
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
".": :call,
|
44
|
+
"::": :call,
|
45
|
+
"&.": :safe_call
|
42
46
|
}.freeze
|
43
47
|
|
44
48
|
def process_call(exp)
|
@@ -5,8 +5,8 @@ module RipperRubyParser
|
|
5
5
|
# Sexp handlers for operators
|
6
6
|
module Operators
|
7
7
|
BINARY_OPERATOR_MAP = {
|
8
|
-
|
9
|
-
|
8
|
+
"&&": :and,
|
9
|
+
"||": :or,
|
10
10
|
and: :and,
|
11
11
|
or: :or
|
12
12
|
}.freeze
|
@@ -16,7 +16,7 @@ module RipperRubyParser
|
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
NEGATED_BINARY_OPERATOR_MAP = {
|
19
|
-
|
19
|
+
"!~": :=~
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
SHIFT_OPERATORS = [:<<, :>>].freeze
|
@@ -123,8 +123,7 @@ module RipperRubyParser
|
|
123
123
|
|
124
124
|
def process_at_tstring_content(exp)
|
125
125
|
_, content, pos, delim = exp.shift 4
|
126
|
-
string = handle_string_unescaping(content, delim)
|
127
|
-
string = handle_string_encoding(string, delim)
|
126
|
+
string = fix_encoding handle_string_unescaping(content, delim)
|
128
127
|
with_position(pos, s(:str, string))
|
129
128
|
end
|
130
129
|
|
@@ -243,24 +242,15 @@ module RipperRubyParser
|
|
243
242
|
when INTERPOLATING_WORD_LIST
|
244
243
|
unescape_wordlist_word(content)
|
245
244
|
when *NON_INTERPOLATING_STRINGS
|
246
|
-
simple_unescape(content)
|
245
|
+
simple_unescape(content, delim)
|
247
246
|
when *REGEXP_LITERALS
|
248
247
|
unescape_regexp(content)
|
249
248
|
when NON_INTERPOLATING_WORD_LIST
|
250
|
-
simple_unescape_wordlist_word(content)
|
249
|
+
simple_unescape_wordlist_word(content, delim)
|
251
250
|
else
|
252
251
|
content
|
253
252
|
end
|
254
253
|
end
|
255
|
-
|
256
|
-
def handle_string_encoding(string, delim)
|
257
|
-
case delim
|
258
|
-
when INTERPOLATING_HEREDOC, INTERPOLATING_WORD_LIST, *INTERPOLATING_STRINGS
|
259
|
-
fix_encoding string
|
260
|
-
else
|
261
|
-
string
|
262
|
-
end
|
263
|
-
end
|
264
254
|
end
|
265
255
|
end
|
266
256
|
end
|
@@ -37,25 +37,34 @@ module RipperRubyParser
|
|
37
37
|
SINGLE_LETTER_ESCAPES_REGEXP =
|
38
38
|
Regexp.new("^[#{SINGLE_LETTER_ESCAPES.keys.join}]$")
|
39
39
|
|
40
|
-
|
40
|
+
DELIMITER_PAIRS = {
|
41
|
+
"(" => "()",
|
42
|
+
"<" => "<>",
|
43
|
+
"[" => "[]",
|
44
|
+
"{" => "{}"
|
45
|
+
}.freeze
|
46
|
+
|
47
|
+
def simple_unescape(string, delimiter)
|
48
|
+
delimiters = delimiter_regexp_pattern(delimiter)
|
41
49
|
string.gsub(/
|
42
50
|
\\ # a backslash
|
43
51
|
( # followed by a
|
44
|
-
|
45
|
-
|
52
|
+
#{delimiters} | # delimiter or
|
53
|
+
\\ # backslash
|
46
54
|
)/x) do
|
47
55
|
Regexp.last_match[1]
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
51
|
-
def simple_unescape_wordlist_word(string)
|
59
|
+
def simple_unescape_wordlist_word(string, delimiter)
|
60
|
+
delimiters = delimiter_regexp_pattern(delimiter)
|
52
61
|
string.gsub(/
|
53
62
|
\\ # a backslash
|
54
63
|
( # followed by a
|
55
|
-
|
56
|
-
\\
|
57
|
-
[ ]
|
58
|
-
\n
|
64
|
+
#{delimiters} | # delimiter or
|
65
|
+
\\ | # backslash or
|
66
|
+
[ ] | # space or
|
67
|
+
\n # newline
|
59
68
|
)
|
60
69
|
/x) do
|
61
70
|
Regexp.last_match[1]
|
@@ -63,12 +72,14 @@ module RipperRubyParser
|
|
63
72
|
end
|
64
73
|
|
65
74
|
def unescape(string)
|
75
|
+
string = string.dup if string.frozen?
|
76
|
+
string.force_encoding("ASCII-8BIT")
|
66
77
|
string.gsub(ESCAPE_SEQUENCE_REGEXP) do
|
67
78
|
bare = Regexp.last_match[1]
|
68
79
|
if bare == "\n"
|
69
80
|
""
|
70
81
|
else
|
71
|
-
unescaped_value(bare)
|
82
|
+
unescaped_value(bare).force_encoding("ASCII-8BIT")
|
72
83
|
end
|
73
84
|
end
|
74
85
|
end
|
@@ -105,7 +116,7 @@ module RipperRubyParser
|
|
105
116
|
def unescaped_value(bare)
|
106
117
|
case bare
|
107
118
|
when SINGLE_LETTER_ESCAPES_REGEXP
|
108
|
-
SINGLE_LETTER_ESCAPES[bare]
|
119
|
+
SINGLE_LETTER_ESCAPES[bare].dup
|
109
120
|
when /^x/
|
110
121
|
unescape_hex_char bare
|
111
122
|
when /^u/
|
@@ -164,5 +175,11 @@ module RipperRubyParser
|
|
164
175
|
def meta(val)
|
165
176
|
val | 0b1000_0000
|
166
177
|
end
|
178
|
+
|
179
|
+
def delimiter_regexp_pattern(delimiter)
|
180
|
+
delimiter = delimiter[-1]
|
181
|
+
delimiters = DELIMITER_PAIRS.fetch(delimiter, delimiter)
|
182
|
+
delimiters.each_char.map { |it| Regexp.escape it }.join(" | ")
|
183
|
+
end
|
167
184
|
end
|
168
185
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ripper_ruby_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matijs van Zuijlen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sexp_processor
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '5.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-focus
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.3.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.3.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: pry
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,28 +100,28 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
103
|
+
version: 1.18.0
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
110
|
+
version: 1.18.0
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rubocop-minitest
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
117
|
+
version: 0.15.0
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
124
|
+
version: 0.15.0
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rubocop-performance
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +142,14 @@ dependencies:
|
|
128
142
|
requirements:
|
129
143
|
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: 3.
|
145
|
+
version: 3.17.0
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: 3.
|
152
|
+
version: 3.17.0
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: sexp_processor
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -224,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
238
|
- !ruby/object:Gem::Version
|
225
239
|
version: '0'
|
226
240
|
requirements: []
|
227
|
-
rubygems_version: 3.2.
|
241
|
+
rubygems_version: 3.2.22
|
228
242
|
signing_key:
|
229
243
|
specification_version: 4
|
230
244
|
summary: Parse with Ripper, produce sexps that are compatible with RubyParser.
|