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.
@@ -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.