sorcerer 0.3.0 → 0.3.1
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/README.textile +11 -1
- data/lib/sorcerer/resource.rb +34 -13
- data/lib/sorcerer/subexpression.rb +1 -1
- data/lib/sorcerer/version.rb +1 -1
- data/rakelib/git.rake +0 -1
- data/rakelib/readme.rake +36 -11
- data/test/sorcerer/resource_test.rb +16 -8
- metadata +20 -27
data/README.textile
CHANGED
@@ -7,6 +7,8 @@ p. Sorcerer is targetted mainly at small snippets of Ruby code,
|
|
7
7
|
expressable in a single line. Longer examples may be re-sourced, but
|
8
8
|
they will be rendered in a single line format.
|
9
9
|
|
10
|
+
*Version: 0.3.1*
|
11
|
+
|
10
12
|
h2. Limitations
|
11
13
|
|
12
14
|
Sorcerer is only testing on Ruby 1.9.
|
@@ -120,8 +122,16 @@ output emitted, then use the debug option:
|
|
120
122
|
h2. History
|
121
123
|
|
122
124
|
* 0.0.7 - Basic single line version
|
125
|
+
|
123
126
|
* 0.1.0 - Added support for multi-line output. Improved rendering of a
|
124
|
-
|
127
|
+
number of constructs
|
128
|
+
|
125
129
|
* 0.2.0 - Added support for indented output.
|
126
130
|
|
131
|
+
* 0.3.0 - New hash literal support. Multi-line output always end with
|
132
|
+
a newline.
|
133
|
+
|
134
|
+
* 0.3.1 - 1.9.3 support. Indenting stabby procs. RedCloth not required
|
135
|
+
for testing.
|
136
|
+
|
127
137
|
|
data/lib/sorcerer/resource.rb
CHANGED
@@ -261,6 +261,11 @@ module Sorcerer
|
|
261
261
|
PASS2 = lambda { |sexp| resource(sexp[2]) }
|
262
262
|
EMIT1 = lambda { |sexp| emit(sexp[1]) }
|
263
263
|
|
264
|
+
# Earlier versions of ripper miss array node for words, see
|
265
|
+
# http://bugs.ruby-lang.org/issues/4365 for more details
|
266
|
+
MISSES_ARRAY_NODE_FOR_WORDS = RUBY_VERSION < '1.9.2' ||
|
267
|
+
(RUBY_VERSION == '1.9.2' && RUBY_PATCHLEVEL < 320)
|
268
|
+
|
264
269
|
HANDLERS = {
|
265
270
|
# parser keywords
|
266
271
|
|
@@ -345,9 +350,15 @@ module Sorcerer
|
|
345
350
|
:args_new => NOOP,
|
346
351
|
:args_prepend => NYI,
|
347
352
|
:array => lambda { |sexp|
|
348
|
-
|
349
|
-
|
350
|
-
|
353
|
+
if !MISSES_ARRAY_NODE_FOR_WORDS &&
|
354
|
+
sexp[1] &&
|
355
|
+
[:words_add, :qwords_add].include?(sexp[1].first)
|
356
|
+
resource(sexp[1])
|
357
|
+
else
|
358
|
+
emit("[")
|
359
|
+
resource(sexp[1]) if sexp[1]
|
360
|
+
emit("]")
|
361
|
+
end
|
351
362
|
},
|
352
363
|
:assign => lambda { |sexp|
|
353
364
|
resource(sexp[1])
|
@@ -580,14 +591,16 @@ module Sorcerer
|
|
580
591
|
emit("->")
|
581
592
|
resource(sexp[1])
|
582
593
|
emit(" {")
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
594
|
+
indent do
|
595
|
+
if ! void?(sexp[2])
|
596
|
+
soft_newline
|
597
|
+
resource(sexp[2])
|
598
|
+
end
|
599
|
+
if void?(sexp[2])
|
600
|
+
emit(" ")
|
601
|
+
else
|
602
|
+
soft_newline
|
603
|
+
end
|
591
604
|
end
|
592
605
|
emit("}")
|
593
606
|
},
|
@@ -698,9 +711,16 @@ module Sorcerer
|
|
698
711
|
end
|
699
712
|
},
|
700
713
|
:rescue_mod => lambda { |sexp|
|
701
|
-
|
714
|
+
if RUBY_VERSION <= '1.9.2'
|
715
|
+
# Pre ruby 1.9.3 these nodes were returned in the reverse order, see
|
716
|
+
# http://bugs.ruby-lang.org/issues/4716 for more details
|
717
|
+
first_node, second_node = sexp[2], sexp[1]
|
718
|
+
else
|
719
|
+
first_node, second_node = sexp[1], sexp[2]
|
720
|
+
end
|
721
|
+
resource(first_node)
|
702
722
|
emit(" rescue ")
|
703
|
-
resource(
|
723
|
+
resource(second_node)
|
704
724
|
},
|
705
725
|
:rest_param => lambda { |sexp|
|
706
726
|
emit("*")
|
@@ -796,6 +816,7 @@ module Sorcerer
|
|
796
816
|
:var_alias => NYI,
|
797
817
|
:var_field => PASS1,
|
798
818
|
:var_ref => PASS1,
|
819
|
+
:vcall => PASS1,
|
799
820
|
:void_stmt => NOOP,
|
800
821
|
:when => lambda { |sexp|
|
801
822
|
outdent do emit("when ") end
|
data/lib/sorcerer/version.rb
CHANGED
data/rakelib/git.rake
CHANGED
data/rakelib/readme.rake
CHANGED
@@ -1,19 +1,44 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
begin
|
4
|
+
require 'redcloth'
|
5
|
+
directory "html"
|
4
6
|
|
5
|
-
|
7
|
+
desc "Display the README file"
|
8
|
+
task :readme => "html/README.html" do
|
9
|
+
sh "open html/README.html"
|
10
|
+
end
|
6
11
|
|
7
|
-
desc "
|
8
|
-
task
|
9
|
-
|
10
|
-
|
12
|
+
desc "format the README file"
|
13
|
+
task "html/README.html" => ['html', 'README.textile', "readme:update"] do
|
14
|
+
open("README.textile") do |source|
|
15
|
+
open('html/README.html', 'w') do |out|
|
16
|
+
out.write(RedCloth.new(source.read).to_html)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
11
20
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
namespace "readme" do
|
22
|
+
desc "Update the version in the readme"
|
23
|
+
task :update do
|
24
|
+
open("README.textile") do |ins|
|
25
|
+
open("new_readme.txt", "w") do |outs|
|
26
|
+
while line = ins.gets
|
27
|
+
if line =~ /^\*Version: .*\*$/
|
28
|
+
line = "*Version: #{PKG_VERSION}*"
|
29
|
+
end
|
30
|
+
outs.puts line
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
mv "README.textile", "README.bak"
|
35
|
+
mv "new_readme.txt", "README.textile"
|
17
36
|
end
|
18
37
|
end
|
38
|
+
|
39
|
+
rescue LoadError => ex
|
40
|
+
task :readme do
|
41
|
+
fail "Install RedCloth to generate the README"
|
42
|
+
end
|
19
43
|
end
|
44
|
+
|
@@ -32,10 +32,10 @@ class SourcerTest < Test::Unit::TestCase
|
|
32
32
|
# * "#" is expected to be a tabbed indent in indent mode and a null
|
33
33
|
# string in single line and multi-line modes.
|
34
34
|
#
|
35
|
-
def assert_resource_lines(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) }
|
35
|
+
def assert_resource_lines(string, options={})
|
36
|
+
assert_resource_for_mode(string, options.merge(multiline: false)) { |s| for_single_line(s) }
|
37
|
+
assert_resource_for_mode(string, options.merge(multiline: true)) { |s| for_multi_line(s) }
|
38
|
+
assert_resource_for_mode(string, options.merge(indent: true)) { |s| for_indented(s) }
|
39
39
|
end
|
40
40
|
|
41
41
|
# Assert the string is correctly resourced given the options and the
|
@@ -68,12 +68,20 @@ class SourcerTest < Test::Unit::TestCase
|
|
68
68
|
gsub(/#/,' ') + "\n"
|
69
69
|
end
|
70
70
|
|
71
|
+
def quietly
|
72
|
+
original_verbosity = $VERBOSE
|
73
|
+
$VERBOSE = nil
|
74
|
+
yield
|
75
|
+
ensure
|
76
|
+
$VERBOSE = original_verbosity
|
77
|
+
end
|
78
|
+
|
71
79
|
def source(string, options={})
|
72
80
|
if options[:debug]
|
73
81
|
puts
|
74
82
|
puts "***************************** options: #{options.inspect}"
|
75
83
|
end
|
76
|
-
sexp = Ripper::SexpBuilder.new(string).parse
|
84
|
+
sexp = quietly { Ripper::SexpBuilder.new(string).parse }
|
77
85
|
fail "Failed to parts '#{string}'" if sexp.nil?
|
78
86
|
Sorcerer.source(sexp, options)
|
79
87
|
end
|
@@ -151,7 +159,7 @@ class SourcerTest < Test::Unit::TestCase
|
|
151
159
|
assert_resource "meth &code"
|
152
160
|
assert_resource "meth a, &code"
|
153
161
|
assert_resource "meth a, *args, &code"
|
154
|
-
assert_resource "meth a, *args do |x| x.y end"
|
162
|
+
assert_resource "meth a, *args do |x| x.y end"
|
155
163
|
end
|
156
164
|
|
157
165
|
def test_can_source_method_with_bare_assoc
|
@@ -204,7 +212,7 @@ class SourcerTest < Test::Unit::TestCase
|
|
204
212
|
assert_resource_lines "->(a, b) { }"
|
205
213
|
assert_resource_lines "->(a, *args) { }"
|
206
214
|
assert_resource_lines "->(a, b=12, *args, &block) { }"
|
207
|
-
assert_resource_lines "->(a) {
|
215
|
+
assert_resource_lines "->(a) {~#b~}"
|
208
216
|
end
|
209
217
|
|
210
218
|
def test_can_source_dot_calls
|
@@ -623,7 +631,7 @@ class SourcerTest < Test::Unit::TestCase
|
|
623
631
|
end
|
624
632
|
|
625
633
|
def test_can_use_ripper_sexp_output
|
626
|
-
sexp = Ripper.sexp("a = 1")
|
634
|
+
sexp = quietly { Ripper.sexp("a = 1") }
|
627
635
|
assert_equal "a = 1", Sorcerer.source(sexp)
|
628
636
|
end
|
629
637
|
|
metadata
CHANGED
@@ -1,27 +1,23 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorcerer
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.3.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Jim Weirich
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2012-07-05 00:00:00 Z
|
12
|
+
date: 2012-07-09 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
|
14
|
+
description: Generate the original Ruby source from a Ripper-style abstract syntax
|
15
|
+
tree.
|
17
16
|
email: jim.weirich@gmail.com
|
18
17
|
executables: []
|
19
|
-
|
20
18
|
extensions: []
|
21
|
-
|
22
19
|
extra_rdoc_files: []
|
23
|
-
|
24
|
-
files:
|
20
|
+
files:
|
25
21
|
- README.textile
|
26
22
|
- Rakefile
|
27
23
|
- doc/jamis.rb
|
@@ -36,35 +32,32 @@ files:
|
|
36
32
|
- test/sorcerer/subexpression_test.rb
|
37
33
|
homepage: http://github.com/jimweirich/sorcerer
|
38
34
|
licenses: []
|
39
|
-
|
40
35
|
post_install_message:
|
41
|
-
rdoc_options:
|
36
|
+
rdoc_options:
|
42
37
|
- --line-numbers
|
43
38
|
- --inline-source
|
44
39
|
- --main
|
45
40
|
- README.textile
|
46
41
|
- --title
|
47
42
|
- Rake -- Ruby Make
|
48
|
-
require_paths:
|
43
|
+
require_paths:
|
49
44
|
- lib
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
46
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ! '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
52
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version:
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
62
57
|
requirements: []
|
63
|
-
|
64
58
|
rubyforge_project: sorcerer
|
65
59
|
rubygems_version: 1.8.15
|
66
60
|
signing_key:
|
67
61
|
specification_version: 3
|
68
62
|
summary: Generate Source from Ripper ASTs
|
69
63
|
test_files: []
|
70
|
-
|