sorcerer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  module Sorcerer
2
2
  VERSION_MAJOR = 0
3
- VERSION_MINOR = 1
3
+ VERSION_MINOR = 2
4
4
  VERSION_BUILD = 0
5
5
  VERSION_BETA = 0
6
6
 
@@ -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|~one; two; three~end"
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
- assert_resource "meth { |a| a.x }"
119
- assert_resource "meth { |a| a.x; b.z }"
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
- assert_resource "meth(x, y, *rest, &code) { |a, b=1, c=x, *args, &block| one; two; three }"
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
- assert_resource "->() { }"
128
- assert_resource "->(a) { }"
129
- assert_resource "->(a, b) { }"
130
- assert_resource "->(a, *args) { }"
131
- assert_resource "->(a, *args, &block) { }"
132
- assert_resource "->(a) { b }"
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~a; end"
332
- assert_resource_ml "begin~a(); end"
333
- assert_resource_ml "begin~a; b; c; end"
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~a; rescue E => ex; b; end"
340
- assert_resource_ml "begin~a; rescue E, F => ex; b; end"
341
- assert_resource_ml "begin~a; rescue E, F => ex; b; c; end"
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~b; end"
348
- assert_resource_ml "begin~a; ensure~b; end"
349
- assert_resource_ml "begin~a; ensure~b; end"
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~c; end"
355
- assert_resource_ml "begin~a; rescue E => ex; b; ensure~c; end"
356
- assert_resource_ml "begin~a; rescue E, F => ex; b; ensure~c; end"
357
- assert_resource_ml "begin~a; rescue E, F => ex; b; c; ensure~d; end"
358
- assert_resource_ml "begin~rescue E, F => ex; b; c; ensure~d; end"
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
- assert_resource "until c do body end"
462
+ assert_resource_ml "until c; #body end"
402
463
  end
403
464
 
404
465
  def test_can_source_for
405
- assert_resource "for a in list do end"
406
- assert_resource "for a in list do c end"
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~f; end"
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 {~x~}"
532
- assert_resource_ml "BEGIN {~x; y~}"
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 {~x~}"
538
- assert_resource_ml "END {~x; y~}"
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 {~a == b~}"
543
- assert_resource_ml "Then {~a == b; x~}"
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.1.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-01 00:00:00 Z
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.