sorcerer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sorcerer/resource.rb +521 -459
- data/lib/sorcerer/version.rb +1 -1
- data/test/sorcerer/resource_test.rb +118 -71
- metadata +2 -2
data/lib/sorcerer/version.rb
CHANGED
@@ -5,6 +5,58 @@ require 'ripper'
|
|
5
5
|
require 'sorcerer'
|
6
6
|
|
7
7
|
class SourcerTest < Test::Unit::TestCase
|
8
|
+
private
|
9
|
+
|
10
|
+
# Assert that a string can be parsed and then resourced without changes.
|
11
|
+
def assert_resource(string, options={})
|
12
|
+
assert_equal string, source(string, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Assert that a string can be resourced properly in all the various
|
16
|
+
# output modes:
|
17
|
+
#
|
18
|
+
# * single line
|
19
|
+
# * multi-line
|
20
|
+
# * indentation
|
21
|
+
#
|
22
|
+
# Special markup is supported in the string to indicate different
|
23
|
+
# expected output. The string is expressed in single line mode with
|
24
|
+
# the following interpretation:
|
25
|
+
#
|
26
|
+
# * "; " is expected to be literal in single line mode and a newline
|
27
|
+
# in multi-line and indented modes.
|
28
|
+
#
|
29
|
+
# * "~" is expected to be a space in single line mode and a newline
|
30
|
+
# in multi-line and indented modes.
|
31
|
+
#
|
32
|
+
# * "#" is expected to be a tabbed indent in indent mode and a null
|
33
|
+
# string in single line and multi-line modes.
|
34
|
+
#
|
35
|
+
def assert_resource_ml(string)
|
36
|
+
assert_resource_for_mode(string, multiline: false) { |s| for_single_line(s) }
|
37
|
+
assert_resource_for_mode(string, multiline: true) { |s| for_multi_line(s) }
|
38
|
+
assert_resource_for_mode(string, indent: true) { |s| for_indented(s) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Assert the string is correctly resourced given the options and the
|
42
|
+
# block conversion.
|
43
|
+
def assert_resource_for_mode(string, options={})
|
44
|
+
expectation = yield(string)
|
45
|
+
assert_equal expectation, source(expectation, options)
|
46
|
+
end
|
47
|
+
|
48
|
+
def for_single_line(string)
|
49
|
+
string.gsub(/~/, " ").gsub(/#/,'')
|
50
|
+
end
|
51
|
+
|
52
|
+
def for_multi_line(string)
|
53
|
+
string.gsub(/~/, "\n").gsub(/; /, "\n").gsub(/#/,'')
|
54
|
+
end
|
55
|
+
|
56
|
+
def for_indented(string)
|
57
|
+
string.gsub(/~/, "\n").gsub(/; /, "\n").gsub(/#/,' ')
|
58
|
+
end
|
59
|
+
|
8
60
|
def source(string, options={})
|
9
61
|
if options[:debug]
|
10
62
|
puts
|
@@ -14,6 +66,8 @@ class SourcerTest < Test::Unit::TestCase
|
|
14
66
|
Sorcerer.source(sexp, options)
|
15
67
|
end
|
16
68
|
|
69
|
+
public
|
70
|
+
|
17
71
|
def test_can_source_variables
|
18
72
|
assert_resource "a"
|
19
73
|
assert_resource "b"
|
@@ -98,7 +152,7 @@ class SourcerTest < Test::Unit::TestCase
|
|
98
152
|
def test_can_source_method_with_do_block
|
99
153
|
assert_resource_ml "meth do end"
|
100
154
|
assert_resource_ml "meth do |a| end"
|
101
|
-
assert_resource_ml "meth(x, y, *rest, &code) do |a, b=1, c=x, *args, &block
|
155
|
+
assert_resource_ml "meth(x, y, *rest, &code) do |a, b=1, c=x, *args, &block|~#one; #two; #three~end"
|
102
156
|
end
|
103
157
|
|
104
158
|
def test_can_source_method_with_block
|
@@ -115,21 +169,22 @@ class SourcerTest < Test::Unit::TestCase
|
|
115
169
|
end
|
116
170
|
|
117
171
|
def test_can_source_method_with_block_contents
|
118
|
-
|
119
|
-
|
172
|
+
assert_resource_ml "meth { |a|~#a.x~}"
|
173
|
+
assert_resource_ml "meth { |a|~#a.x; #b.z~}"
|
120
174
|
end
|
121
175
|
|
122
176
|
def test_can_source_method_with_complex_args_and_block
|
123
|
-
|
177
|
+
assert_resource_ml "meth(x, y, *rest, &code) { |a, b=1, c=x, *args, &block|~#one; #two; #three~}"
|
124
178
|
end
|
125
179
|
|
126
180
|
def test_can_source_stabby_procs
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
181
|
+
assert_resource_ml "-> { }"
|
182
|
+
assert_resource_ml "->() { }"
|
183
|
+
assert_resource_ml "->(a) { }"
|
184
|
+
assert_resource_ml "->(a, b) { }"
|
185
|
+
assert_resource_ml "->(a, *args) { }"
|
186
|
+
assert_resource_ml "->(a, b=12, *args, &block) { }"
|
187
|
+
assert_resource_ml "->(a) {~b~}"
|
133
188
|
end
|
134
189
|
|
135
190
|
def test_can_source_dot_calls
|
@@ -328,34 +383,34 @@ class SourcerTest < Test::Unit::TestCase
|
|
328
383
|
|
329
384
|
def test_can_source_begin_end
|
330
385
|
assert_resource_ml "begin end"
|
331
|
-
assert_resource_ml "begin
|
332
|
-
assert_resource_ml "begin
|
333
|
-
assert_resource_ml "begin
|
386
|
+
assert_resource_ml "begin~#a; end"
|
387
|
+
assert_resource_ml "begin~#a(); end"
|
388
|
+
assert_resource_ml "begin~#a; #b; #c; end"
|
334
389
|
end
|
335
390
|
|
336
391
|
def test_can_source_begin_rescue_end
|
337
392
|
assert_resource_ml "begin~rescue; end"
|
338
|
-
assert_resource_ml "begin~rescue E => ex; b; end"
|
339
|
-
assert_resource_ml "begin
|
340
|
-
assert_resource_ml "begin
|
341
|
-
assert_resource_ml "begin
|
342
|
-
assert_resource_ml "begin~rescue E, F => ex; b; c; end"
|
393
|
+
assert_resource_ml "begin~rescue E => ex; #b; end"
|
394
|
+
assert_resource_ml "begin~#a; rescue E => ex; #b; end"
|
395
|
+
assert_resource_ml "begin~#a; rescue E, F => ex; #b; end"
|
396
|
+
assert_resource_ml "begin~#a; rescue E, F => ex; #b; #c; end"
|
397
|
+
assert_resource_ml "begin~rescue E, F => ex; #b; #c; end"
|
343
398
|
end
|
344
399
|
|
345
400
|
def test_can_source_begin_ensure_end
|
346
401
|
assert_resource_ml "begin~ensure~end"
|
347
|
-
assert_resource_ml "begin~ensure
|
348
|
-
assert_resource_ml "begin
|
349
|
-
assert_resource_ml "begin
|
402
|
+
assert_resource_ml "begin~ensure~#b; end"
|
403
|
+
assert_resource_ml "begin~#a; ensure~#b; end"
|
404
|
+
assert_resource_ml "begin~#a; ensure~#b; end"
|
350
405
|
end
|
351
406
|
|
352
407
|
def test_can_source_begin_rescue_ensure_end
|
353
408
|
assert_resource_ml "begin~rescue; end"
|
354
|
-
assert_resource_ml "begin~rescue E => ex; b; ensure
|
355
|
-
assert_resource_ml "begin
|
356
|
-
assert_resource_ml "begin
|
357
|
-
assert_resource_ml "begin
|
358
|
-
assert_resource_ml "begin~rescue E, F => ex; b; c; ensure
|
409
|
+
assert_resource_ml "begin~rescue E => ex; #b; ensure~#c; end"
|
410
|
+
assert_resource_ml "begin~#a; rescue E => ex; #b; ensure~#c; end"
|
411
|
+
assert_resource_ml "begin~#a; rescue E, F => ex; #b; ensure~#c; end"
|
412
|
+
assert_resource_ml "begin~#a; rescue E, F => ex; #b; #c; ensure~#d; end"
|
413
|
+
assert_resource_ml "begin~rescue E, F => ex; #b; #c; ensure~#d; end"
|
359
414
|
end
|
360
415
|
|
361
416
|
def test_can_source_rescue_modifier
|
@@ -365,61 +420,67 @@ class SourcerTest < Test::Unit::TestCase
|
|
365
420
|
def test_can_source_if
|
366
421
|
assert_resource "if a then b end"
|
367
422
|
assert_resource "if a\nb\nend", multiline: true
|
423
|
+
assert_resource "if a\n b\nend", indent: 2
|
368
424
|
end
|
369
425
|
|
370
426
|
def test_can_source_if_else
|
371
427
|
assert_resource "if a then b else c end"
|
372
428
|
assert_resource "if a\nb\nelse\nc\nend", multiline: true
|
429
|
+
assert_resource "if a\n b\nelse\n c\nend", indent: 2
|
373
430
|
end
|
374
431
|
|
375
432
|
def test_can_source_if_elsif
|
376
433
|
assert_resource "if a then b elsif c then d end"
|
377
434
|
assert_resource "if a\nb\nelsif c\nd\nend", multiline: true
|
435
|
+
assert_resource "if a\n b\nelsif c\n d\nend", indent: 2
|
378
436
|
end
|
379
437
|
|
380
438
|
def test_can_source_if_elsif_else
|
381
439
|
assert_resource "if a then b elsif c then d else e end"
|
382
440
|
assert_resource "if a\nb\nelsif c\nd\nelse\ne\nend", multiline: true
|
441
|
+
assert_resource "if a\n b\nelsif c\n d\nelse\n e\nend", indent: 2
|
383
442
|
end
|
384
443
|
|
385
444
|
def test_can_source_unless
|
386
445
|
assert_resource "unless a then b end"
|
387
446
|
assert_resource "unless a\nb\nend", multiline: true
|
447
|
+
assert_resource "unless a\n b\nend", indent: 2
|
388
448
|
end
|
389
449
|
|
390
450
|
def test_can_source_unless_else
|
391
451
|
assert_resource "unless a then b else c end"
|
392
452
|
assert_resource "unless a\nb\nelse\nc\nend", multiline: true
|
453
|
+
assert_resource "unless a\n b\nelse\n c\nend", indent: 2
|
393
454
|
end
|
394
455
|
|
395
456
|
def test_can_source_while
|
396
457
|
assert_resource_ml "while c; end"
|
397
|
-
assert_resource_ml "while c; body; end"
|
458
|
+
assert_resource_ml "while c; #body; end"
|
398
459
|
end
|
399
460
|
|
400
461
|
def test_can_source_until
|
401
|
-
|
462
|
+
assert_resource_ml "until c; #body end"
|
402
463
|
end
|
403
464
|
|
404
465
|
def test_can_source_for
|
405
|
-
|
406
|
-
|
466
|
+
assert_resource_ml "for a in list; end"
|
467
|
+
assert_resource_ml "for a in list; #c~end"
|
407
468
|
end
|
408
469
|
|
409
470
|
def test_can_source_break
|
410
|
-
assert_resource_ml "while c; a; break if b; c; end"
|
411
|
-
assert_resource_ml "while c; a; break value if b; c; end"
|
471
|
+
assert_resource_ml "while c; #a; #break if b; #c; end"
|
472
|
+
assert_resource_ml "while c; #a; #break value if b; #c; end"
|
412
473
|
end
|
413
474
|
|
414
475
|
def test_can_source_next
|
415
|
-
assert_resource_ml "while c; a; next if b; c; end"
|
416
|
-
assert_resource_ml "while c; a; next if b; c; end"
|
476
|
+
assert_resource_ml "while c; #a; #next if b; #c; end"
|
477
|
+
assert_resource_ml "while c; #a; #next if b; #c; end"
|
417
478
|
end
|
418
479
|
|
419
480
|
def test_can_source_case
|
420
|
-
assert_resource_ml "case a~when b; c; end"
|
421
|
-
assert_resource_ml "case a~when b; c when d; e; end"
|
422
|
-
assert_resource_ml "case a~when b; c when d; e~else
|
481
|
+
assert_resource_ml "case a~when b; #c; end"
|
482
|
+
assert_resource_ml "case a~when b; #c when d; #e; end"
|
483
|
+
assert_resource_ml "case a~when b; #c when d; #e~else~#f; end"
|
423
484
|
end
|
424
485
|
|
425
486
|
def test_can_source_if_modifier
|
@@ -485,26 +546,26 @@ class SourcerTest < Test::Unit::TestCase
|
|
485
546
|
|
486
547
|
def test_can_source_def
|
487
548
|
assert_resource_ml "def f; end"
|
488
|
-
assert_resource_ml "def f; x; end"
|
549
|
+
assert_resource_ml "def f; #x; end"
|
489
550
|
assert_resource_ml "def f a; end"
|
490
551
|
assert_resource_ml "def f(); end"
|
491
552
|
assert_resource_ml "def f(a); end"
|
492
553
|
assert_resource_ml "def f(a, b); end"
|
493
554
|
assert_resource_ml "def f(a, *args); end"
|
494
555
|
assert_resource_ml "def f(a, *args, &block); end"
|
495
|
-
assert_resource_ml "def f(a); x; end"
|
496
|
-
assert_resource_ml "def f(a); x; y; end"
|
556
|
+
assert_resource_ml "def f(a); #x; end"
|
557
|
+
assert_resource_ml "def f(a); #x; #y; end"
|
497
558
|
end
|
498
559
|
|
499
560
|
def test_can_source_class_without_parent
|
500
561
|
assert_resource_ml "class X; end"
|
501
|
-
assert_resource_ml "class X; x; end"
|
502
|
-
assert_resource_ml "class X; def f(); end; end"
|
562
|
+
assert_resource_ml "class X; #x; end"
|
563
|
+
assert_resource_ml "class X; #def f(); #end; end"
|
503
564
|
end
|
504
565
|
|
505
566
|
def test_can_source_class_with_parent
|
506
567
|
assert_resource_ml "class X < Y; end"
|
507
|
-
assert_resource_ml "class X < Y; x; end"
|
568
|
+
assert_resource_ml "class X < Y; #x; end"
|
508
569
|
end
|
509
570
|
|
510
571
|
def test_can_source_class_with_self_parent
|
@@ -512,35 +573,35 @@ class SourcerTest < Test::Unit::TestCase
|
|
512
573
|
end
|
513
574
|
|
514
575
|
def test_can_source_private_etc_in_class
|
515
|
-
assert_resource_ml "class X; public; def f(); end; end"
|
516
|
-
assert_resource_ml "class X; protected; def f(); end; end"
|
517
|
-
assert_resource_ml "class X; private; def f(); end; end"
|
518
|
-
assert_resource_ml "class X; def f(); end; public :f; end"
|
519
|
-
assert_resource_ml "class X; def f(); end; protected :f; end"
|
520
|
-
assert_resource_ml "class X; def f(); end; private :f; end"
|
576
|
+
assert_resource_ml "class X; #public; #def f(); #end; end"
|
577
|
+
assert_resource_ml "class X; #protected; #def f(); #end; end"
|
578
|
+
assert_resource_ml "class X; #private; #def f(); #end; end"
|
579
|
+
assert_resource_ml "class X; #def f(); #end; #public :f; end"
|
580
|
+
assert_resource_ml "class X; #def f(); #end; #protected :f; end"
|
581
|
+
assert_resource_ml "class X; #def f(); #end; #private :f; end"
|
521
582
|
end
|
522
583
|
|
523
584
|
def test_can_source_module
|
524
585
|
assert_resource_ml "module X; end"
|
525
|
-
assert_resource_ml "module X; x; end"
|
526
|
-
assert_resource_ml "module X; def f(); end; end"
|
586
|
+
assert_resource_ml "module X; #x; end"
|
587
|
+
assert_resource_ml "module X; #def f(); #end; end"
|
527
588
|
end
|
528
589
|
|
529
590
|
def test_can_source_BEGIN
|
530
591
|
assert_resource_ml "BEGIN { }"
|
531
|
-
assert_resource_ml "BEGIN {
|
532
|
-
assert_resource_ml "BEGIN {
|
592
|
+
assert_resource_ml "BEGIN {~#x~}"
|
593
|
+
assert_resource_ml "BEGIN {~#x; #y~}"
|
533
594
|
end
|
534
595
|
|
535
596
|
def test_can_source_END
|
536
597
|
assert_resource_ml "END { }"
|
537
|
-
assert_resource_ml "END {
|
538
|
-
assert_resource_ml "END {
|
598
|
+
assert_resource_ml "END {~#x~}"
|
599
|
+
assert_resource_ml "END {~#x; #y~}"
|
539
600
|
end
|
540
601
|
|
541
602
|
def test_can_source_then
|
542
|
-
assert_resource_ml "Then {
|
543
|
-
assert_resource_ml "Then {
|
603
|
+
assert_resource_ml "Then {~#a == b~}"
|
604
|
+
assert_resource_ml "Then {~#a == b; #x~}"
|
544
605
|
end
|
545
606
|
|
546
607
|
def test_can_use_ripper_sexp_output
|
@@ -553,18 +614,4 @@ class SourcerTest < Test::Unit::TestCase
|
|
553
614
|
assert_equal "", Sorcerer.source(sexp)
|
554
615
|
end
|
555
616
|
|
556
|
-
private
|
557
|
-
|
558
|
-
def assert_resource(string, options={})
|
559
|
-
assert_equal string, source(string, options)
|
560
|
-
end
|
561
|
-
|
562
|
-
def assert_resource_ml(string, options={})
|
563
|
-
expected = string.gsub(/~/, " ")
|
564
|
-
assert_equal expected, source(expected, options)
|
565
|
-
|
566
|
-
expected_ml = string.gsub(/~/, "\n").gsub(/; /, "\n")
|
567
|
-
assert_equal expected_ml, source(expected_ml, {multiline: true}.merge(options))
|
568
|
-
end
|
569
|
-
|
570
617
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: sorcerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jim Weirich
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-05 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Generate the original Ruby source from a Ripper-style abstract syntax tree.
|