sorcerer 1.0.2 → 2.0.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 +5 -5
- data/README.md +1 -1
- data/lib/sorcerer/resource.rb +43 -15
- data/lib/sorcerer/version.rb +2 -2
- data/test/assert_resource_helper.rb +2 -2
- data/test/sorcerer/resource_test.rb +46 -3
- data/test/sorcerer/signature_test.rb +5 -1
- metadata +11 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '086949b9939c7dcc5b702d516b2c8c5050e1aec12a4f9e0b6f93bd16883b4311'
|
4
|
+
data.tar.gz: 8e98466c01a8758aa2a93a0f9b420bab5ab71b44855882a535d7713dbf6cccfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d04f7f34a703da571ce0b5821f183ea25775bce5c95d10e8b98682f7c0e156f8d257dcf40f6f8d00fc915f0872f7b3264b24f645fab23e7d6563455704fbc2c
|
7
|
+
data.tar.gz: e959656fc9dbf13fe5c8a580a13330a40f259560fb16fc8e99746235f91c4047dd9b884a17fbc2cbbca7d792053c1df89b6a234e5c79519addfcab213f13f2fc
|
data/README.md
CHANGED
data/lib/sorcerer/resource.rb
CHANGED
@@ -101,7 +101,7 @@ module Sorcerer
|
|
101
101
|
resource(sexp[2]) # Statements
|
102
102
|
end
|
103
103
|
if !void?(sexp[2])
|
104
|
-
soft_newline
|
104
|
+
soft_newline unless sexp[2].first == :bodystmt
|
105
105
|
else
|
106
106
|
emit(" ")
|
107
107
|
end
|
@@ -186,7 +186,7 @@ module Sorcerer
|
|
186
186
|
if sig.opts_arg
|
187
187
|
first = emit_separator(", ", first)
|
188
188
|
emit("**")
|
189
|
-
emit(sig.opts_arg[1])
|
189
|
+
DOESNT_WRAP_OPTS_ARG_IN_KWREST_PARAM ? emit(sig.opts_arg[1]) : resource(sig.opts_arg[1])
|
190
190
|
end
|
191
191
|
if sig.block_arg
|
192
192
|
first = emit_separator(", ", first)
|
@@ -292,6 +292,17 @@ module Sorcerer
|
|
292
292
|
MISSES_ARRAY_NODE_FOR_WORDS = RUBY_VERSION < '1.9.2' ||
|
293
293
|
(RUBY_VERSION == '1.9.2' && RUBY_PATCHLEVEL < 320)
|
294
294
|
|
295
|
+
RUBY_MAJOR, RUBY_MINOR, RUBY_PATCH = RUBY_VERSION.split('.').map(&:to_i)
|
296
|
+
|
297
|
+
# As of 2.5, Ripper started wrapping **opts rest keyword args in a
|
298
|
+
# :kwrest_param s-expression
|
299
|
+
DOESNT_WRAP_OPTS_ARG_IN_KWREST_PARAM = RUBY_MAJOR < 2 || (RUBY_MAJOR == 2 && RUBY_MINOR < 5)
|
300
|
+
|
301
|
+
# As of 2.6, Ripper parses the period in fields and calls as s-expressions
|
302
|
+
# as opposed to raw strings
|
303
|
+
# See: https://github.com/rspec-given/sorcerer/pull/1
|
304
|
+
TREATS_MORE_PERIODS_AS_TEXT = RUBY_MAJOR < 2 || (RUBY_MAJOR == 2 && RUBY_MINOR < 6)
|
305
|
+
|
295
306
|
HANDLERS = {
|
296
307
|
# parser keywords
|
297
308
|
|
@@ -460,12 +471,15 @@ module Sorcerer
|
|
460
471
|
},
|
461
472
|
:call => lambda { |sexp|
|
462
473
|
resource(sexp[1])
|
463
|
-
emit(sexp[2])
|
474
|
+
TREATS_MORE_PERIODS_AS_TEXT || !sexp?(sexp[2]) ? emit(sexp[2]) : resource(sexp[2])
|
464
475
|
resource(sexp[3]) unless sexp[3] == :call
|
465
476
|
},
|
466
477
|
:case => lambda { |sexp|
|
467
|
-
emit("case
|
468
|
-
|
478
|
+
emit("case")
|
479
|
+
if sexp[1]
|
480
|
+
emit(" ")
|
481
|
+
resource(sexp[1])
|
482
|
+
end
|
469
483
|
soft_newline
|
470
484
|
indent do
|
471
485
|
resource(sexp[2])
|
@@ -494,7 +508,7 @@ module Sorcerer
|
|
494
508
|
},
|
495
509
|
:command_call => lambda { |sexp|
|
496
510
|
resource(sexp[1])
|
497
|
-
emit(sexp[2])
|
511
|
+
TREATS_MORE_PERIODS_AS_TEXT || !sexp?(sexp[2]) ? emit(sexp[2]) : resource(sexp[2])
|
498
512
|
resource(sexp[3])
|
499
513
|
emit(" ")
|
500
514
|
resource(sexp[4])
|
@@ -579,7 +593,7 @@ module Sorcerer
|
|
579
593
|
:fcall => PASS1,
|
580
594
|
:field => lambda { |sexp|
|
581
595
|
resource(sexp[1])
|
582
|
-
emit(sexp[2])
|
596
|
+
TREATS_MORE_PERIODS_AS_TEXT || !sexp?(sexp[2]) ? emit(sexp[2]) : resource(sexp[2])
|
583
597
|
resource(sexp[3])
|
584
598
|
},
|
585
599
|
:for => lambda { |sexp|
|
@@ -765,7 +779,7 @@ module Sorcerer
|
|
765
779
|
},
|
766
780
|
:rest_param => lambda { |sexp|
|
767
781
|
emit("*")
|
768
|
-
resource(sexp[1])
|
782
|
+
resource(sexp[1]) if sexp[1]
|
769
783
|
},
|
770
784
|
:retry => lambda { |sexp|
|
771
785
|
emit("retry")
|
@@ -777,7 +791,15 @@ module Sorcerer
|
|
777
791
|
:return0 => lambda { |sexp|
|
778
792
|
emit("return")
|
779
793
|
},
|
780
|
-
:sclass =>
|
794
|
+
:sclass => lambda { |sexp|
|
795
|
+
emit("class << ")
|
796
|
+
resource(sexp[1])
|
797
|
+
newline
|
798
|
+
indent do
|
799
|
+
resource(sexp[2]) unless void?(sexp[2])
|
800
|
+
end
|
801
|
+
emit("end")
|
802
|
+
},
|
781
803
|
:stmts_add => lambda { |sexp|
|
782
804
|
if sexp[1] != [:stmts_new] && ! void?(sexp[1])
|
783
805
|
resource(sexp[1])
|
@@ -793,7 +815,10 @@ module Sorcerer
|
|
793
815
|
resource(sexp[2])
|
794
816
|
},
|
795
817
|
:string_content => NOOP,
|
796
|
-
:string_dvar =>
|
818
|
+
:string_dvar => lambda { |sexp|
|
819
|
+
emit('#')
|
820
|
+
resource(sexp[1])
|
821
|
+
},
|
797
822
|
:string_embexpr => lambda { |sexp|
|
798
823
|
emit('#{')
|
799
824
|
resource(sexp[1])
|
@@ -817,8 +842,10 @@ module Sorcerer
|
|
817
842
|
words("I", sexp)
|
818
843
|
},
|
819
844
|
:symbols_new => NOOP,
|
820
|
-
:
|
821
|
-
|
845
|
+
:top_const_ref => lambda { |sexp|
|
846
|
+
emit("::")
|
847
|
+
resource(sexp[1])
|
848
|
+
},
|
822
849
|
:unary => lambda { |sexp|
|
823
850
|
op = sexp[1].to_s
|
824
851
|
op = op[0,1] if op =~ /^.@$/
|
@@ -916,10 +943,10 @@ module Sorcerer
|
|
916
943
|
|
917
944
|
# Scanner keywords
|
918
945
|
|
919
|
-
:@CHAR =>
|
946
|
+
:@CHAR => EMIT1,
|
920
947
|
:@__end__ => NYI,
|
921
|
-
:@backref =>
|
922
|
-
:@backtick =>
|
948
|
+
:@backref => EMIT1,
|
949
|
+
:@backtick => EMIT1,
|
923
950
|
:@comma => NYI,
|
924
951
|
:@comment => NYI,
|
925
952
|
:@const => EMIT1,
|
@@ -964,6 +991,7 @@ module Sorcerer
|
|
964
991
|
:@words_sep => NYI,
|
965
992
|
}
|
966
993
|
HANDLERS[:bodystmt] = HANDLERS[:body_stmt]
|
994
|
+
HANDLERS[:top_const_field] = HANDLERS[:top_const_ref]
|
967
995
|
end
|
968
996
|
|
969
997
|
end
|
data/lib/sorcerer/version.rb
CHANGED
@@ -61,7 +61,7 @@ module AssertResource
|
|
61
61
|
string.
|
62
62
|
gsub(/\b THEN~/, "; ").
|
63
63
|
gsub(/~/, "\n").
|
64
|
-
gsub(
|
64
|
+
gsub(/;\s+/, "\n").
|
65
65
|
gsub(/#/,'') + "\n"
|
66
66
|
end
|
67
67
|
|
@@ -69,7 +69,7 @@ module AssertResource
|
|
69
69
|
string.
|
70
70
|
gsub(/\b THEN~/, "; ").
|
71
71
|
gsub(/~/, "\n").
|
72
|
-
gsub(
|
72
|
+
gsub(/;\s+/, "\n").
|
73
73
|
gsub(/#/,' ') + "\n"
|
74
74
|
end
|
75
75
|
|
@@ -45,6 +45,7 @@ class ResourceTest < Test::Unit::TestCase
|
|
45
45
|
assert_resource "A"
|
46
46
|
assert_resource "Mod::X"
|
47
47
|
assert_resource "Mod::NS::Y"
|
48
|
+
assert_resource "::Mod::NS::Y"
|
48
49
|
end
|
49
50
|
|
50
51
|
def test_can_source_keywords
|
@@ -55,8 +56,10 @@ class ResourceTest < Test::Unit::TestCase
|
|
55
56
|
|
56
57
|
def test_can_source_constant_definition
|
57
58
|
assert_resource "X = 1"
|
59
|
+
assert_resource "::X = 1"
|
58
60
|
assert_resource "X::Y = 1"
|
59
61
|
assert_resource "X::Y::Z = 1"
|
62
|
+
assert_resource "::X::Y::Z = 1"
|
60
63
|
end
|
61
64
|
|
62
65
|
def test_can_source_instance_variables
|
@@ -102,7 +105,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
102
105
|
assert_resource "obj.meth &code"
|
103
106
|
assert_resource "obj.meth a, &code"
|
104
107
|
assert_resource "obj.meth a, *args, &code"
|
105
|
-
|
108
|
+
if RUBY_VERSION >= "2.5"
|
109
|
+
assert_resource "obj.meth a, *args do |x| x.y; end"
|
110
|
+
else
|
111
|
+
assert_resource "obj.meth a, *args do |x| x.y end"
|
112
|
+
end
|
106
113
|
end
|
107
114
|
|
108
115
|
def test_can_source_method_called_with_scope_op_without_parans
|
@@ -151,7 +158,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
151
158
|
assert_resource "meth &code"
|
152
159
|
assert_resource "meth a, &code"
|
153
160
|
assert_resource "meth a, *args, &code"
|
154
|
-
|
161
|
+
if RUBY_VERSION >= "2.5"
|
162
|
+
assert_resource "meth a, *args do |x| x.y; end"
|
163
|
+
else
|
164
|
+
assert_resource "meth a, *args do |x| x.y end"
|
165
|
+
end
|
155
166
|
end
|
156
167
|
|
157
168
|
def test_can_source_method_with_bare_assoc
|
@@ -172,7 +183,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
172
183
|
def test_can_source_method_with_do_block
|
173
184
|
assert_resource_lines "meth do end"
|
174
185
|
assert_resource_lines "meth do |a| end"
|
175
|
-
|
186
|
+
if RUBY_VERSION >= "2.5"
|
187
|
+
assert_resource_lines "meth(x, y, *rest, &code) do |a, b=1, c=x, *args, &block|~#one; #two; #three;~end"
|
188
|
+
else
|
189
|
+
assert_resource_lines "meth(x, y, *rest, &code) do |a, b=1, c=x, *args, &block|~#one; #two; #three~end"
|
190
|
+
end
|
176
191
|
end
|
177
192
|
|
178
193
|
def test_can_source_method_with_block
|
@@ -219,6 +234,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
219
234
|
assert_resource "3.14"
|
220
235
|
end
|
221
236
|
|
237
|
+
def test_can_source_chars
|
238
|
+
assert_resource "?/"
|
239
|
+
assert_resource "?q"
|
240
|
+
end
|
241
|
+
|
222
242
|
def test_can_source_strings
|
223
243
|
assert_resource '"HI"'
|
224
244
|
assert_equal '"HI"', source("'HI'")
|
@@ -234,6 +254,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
234
254
|
assert_resource '"my name is #{x.a("B")}"'
|
235
255
|
end
|
236
256
|
|
257
|
+
def test_can_source_string_dvars
|
258
|
+
assert_resource '"my program is #$0"'
|
259
|
+
assert_resource '"my global is #$glob"'
|
260
|
+
end
|
261
|
+
|
237
262
|
def test_can_source_string_concat
|
238
263
|
assert_resource '"a" "b"'
|
239
264
|
assert_resource '"a" "b" "c"'
|
@@ -348,6 +373,11 @@ class ResourceTest < Test::Unit::TestCase
|
|
348
373
|
assert_resource "not a"
|
349
374
|
end
|
350
375
|
|
376
|
+
def test_can_source_backreferences
|
377
|
+
assert_resource "$1"
|
378
|
+
assert_resource "$9"
|
379
|
+
end
|
380
|
+
|
351
381
|
def test_can_source_binary_expressions
|
352
382
|
assert_resource "a + 1"
|
353
383
|
assert_resource "a + b"
|
@@ -356,6 +386,10 @@ class ResourceTest < Test::Unit::TestCase
|
|
356
386
|
assert_resource "a / b"
|
357
387
|
assert_resource "a && b"
|
358
388
|
assert_resource "a || b"
|
389
|
+
assert_resource "a < b"
|
390
|
+
assert_resource "a <= b"
|
391
|
+
assert_resource "a > b"
|
392
|
+
assert_resource "a >= b"
|
359
393
|
end
|
360
394
|
|
361
395
|
def test_can_source_trinary_expressions
|
@@ -513,6 +547,7 @@ class ResourceTest < Test::Unit::TestCase
|
|
513
547
|
end
|
514
548
|
|
515
549
|
def test_can_source_case
|
550
|
+
assert_resource_lines "case~when b; #c; end"
|
516
551
|
assert_resource_lines "case a~when b; #c; end"
|
517
552
|
assert_resource_lines "case a~when b; #c when d; #e; end"
|
518
553
|
assert_resource_lines "case a~when b; #c when d; #e~else~#f; end"
|
@@ -584,10 +619,12 @@ class ResourceTest < Test::Unit::TestCase
|
|
584
619
|
assert_resource_lines "def f(a); end"
|
585
620
|
assert_resource_lines "def f(a, b); end"
|
586
621
|
assert_resource_lines "def f(a, b=1); end"
|
622
|
+
assert_resource_lines "def f(a, *); end"
|
587
623
|
assert_resource_lines "def f(a, *args); end"
|
588
624
|
assert_resource_lines "def f(a, *args, &block); end"
|
589
625
|
assert_resource_lines "def f(a); #x; end"
|
590
626
|
assert_resource_lines "def f(a); #x; #y; end"
|
627
|
+
assert_resource_lines "def `(a); end"
|
591
628
|
end
|
592
629
|
|
593
630
|
def test_can_source_def_without_parens
|
@@ -651,6 +688,12 @@ class ResourceTest < Test::Unit::TestCase
|
|
651
688
|
assert_resource_lines "class X; #def f(); #end; #private :f; end"
|
652
689
|
end
|
653
690
|
|
691
|
+
def test_can_source_sclass
|
692
|
+
assert_resource_lines "class << self; end"
|
693
|
+
assert_resource_lines "class << a; end"
|
694
|
+
assert_resource_lines "class << self; #x; end"
|
695
|
+
end
|
696
|
+
|
654
697
|
def test_can_source_module
|
655
698
|
assert_resource_lines "module X; end"
|
656
699
|
assert_resource_lines "module X; #x; end"
|
@@ -35,7 +35,11 @@ class SignatureTest < Test::Unit::TestCase
|
|
35
35
|
assert_equal [[[:@ident, "b", [1, 11]], [:@int, "1", [1, 13]]]], sig.default_args
|
36
36
|
assert_equal [:rest_param, [:@ident, "args", [1, 17]]], sig.rest_arg
|
37
37
|
assert_equal [[[:@label, "c:", [1, 23]], [:@int, "2", [1, 26]]]], sig.keyword_args
|
38
|
-
|
38
|
+
if RUBY_VERSION >= "2.5"
|
39
|
+
assert_equal [:kwrest_param, [:@ident, "opts", [1, 31]]], sig.opts_arg
|
40
|
+
else
|
41
|
+
assert_equal [:@ident, "opts", [1, 31]], sig.opts_arg
|
42
|
+
end
|
39
43
|
assert_equal [:blockarg, [:@ident, "block", [1, 38]]], sig.block_arg
|
40
44
|
end
|
41
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorcerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Generate the original Ruby source from a Ripper-style abstract syntax
|
14
14
|
tree.
|
@@ -20,14 +20,14 @@ files:
|
|
20
20
|
- README.md
|
21
21
|
- Rakefile
|
22
22
|
- doc/jamis.rb
|
23
|
-
- rakelib/git.rake
|
24
|
-
- rakelib/readme.rake
|
25
|
-
- rakelib/testing.rake
|
26
23
|
- lib/sorcerer.rb
|
27
24
|
- lib/sorcerer/resource.rb
|
28
25
|
- lib/sorcerer/signature.rb
|
29
26
|
- lib/sorcerer/subexpression.rb
|
30
27
|
- lib/sorcerer/version.rb
|
28
|
+
- rakelib/git.rake
|
29
|
+
- rakelib/readme.rake
|
30
|
+
- rakelib/testing.rake
|
31
31
|
- test/assert_resource_helper.rb
|
32
32
|
- test/sorcerer/resource_test.rb
|
33
33
|
- test/sorcerer/signature_test.rb
|
@@ -37,25 +37,24 @@ licenses: []
|
|
37
37
|
metadata: {}
|
38
38
|
post_install_message:
|
39
39
|
rdoc_options:
|
40
|
-
- --line-numbers
|
41
|
-
- --inline-source
|
42
|
-
- --title
|
40
|
+
- "--line-numbers"
|
41
|
+
- "--inline-source"
|
42
|
+
- "--title"
|
43
43
|
- Rake -- Ruby Make
|
44
44
|
require_paths:
|
45
45
|
- lib
|
46
46
|
required_ruby_version: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
|
-
- -
|
48
|
+
- - ">="
|
49
49
|
- !ruby/object:Gem::Version
|
50
50
|
version: '0'
|
51
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
requirements: []
|
57
|
-
|
58
|
-
rubygems_version: 2.0.5
|
57
|
+
rubygems_version: 3.0.3
|
59
58
|
signing_key:
|
60
59
|
specification_version: 4
|
61
60
|
summary: Generate Source from Ripper ASTs
|