sorcerer 0.1.0 → 0.2.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.
- 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.
|