sorcerer 0.3.7 → 0.3.9
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 → README.md} +72 -51
- data/Rakefile +1 -2
- data/lib/sorcerer/resource.rb +43 -7
- data/lib/sorcerer/subexpression.rb +5 -0
- data/lib/sorcerer/version.rb +1 -1
- data/rakelib/testing.rake +1 -1
- data/test/assert_resource_helper.rb +76 -0
- data/test/sorcerer/resource_test.rb +19 -74
- data/test/sorcerer/subexpression_test.rb +14 -1
- metadata +41 -24
@@ -1,135 +1,156 @@
|
|
1
|
-
|
1
|
+
# Sorcerer -- Recovering the Source
|
2
2
|
|
3
|
-
|
3
|
+
| Master |
|
4
|
+
| :----: |
|
5
|
+
| [](https://secure.travis-ci.org/jimweirich/sorcerer) |
|
6
|
+
|
7
|
+
Sorcerer will generate Ruby code from a Ripper-like abstract syntax
|
4
8
|
tree (i.e. S-Expressions).
|
5
9
|
|
6
|
-
|
7
|
-
expressable in a single line.
|
10
|
+
Sorcerer is targetted mainly at small snippets of Ruby code,
|
11
|
+
expressable in a single line. Longer examples may be re-sourced, but
|
8
12
|
they will be rendered in a single line format.
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
h2. Limitations
|
14
|
+
**Version: 0.3.7**
|
13
15
|
|
14
|
-
|
16
|
+
## Limitations
|
15
17
|
|
16
|
-
|
17
|
-
1.9 I've only tried it on that platform.</em>
|
18
|
+
Sorcerer is only tested on Ruby 1.9.
|
18
19
|
|
19
|
-
|
20
|
+
## Links
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
| Description | Link |
|
23
|
+
| :---: | :---: |
|
24
|
+
| Documents | http://github.com/jimweirich/sorcerer |
|
25
|
+
| Git Clone | git://github.com/jimweirich/sorcerer.git |
|
26
|
+
| Issues / Bug Tracking | https://github.com/jimweirich/sorcerer/issues |
|
27
|
+
| Continuous Integration | http://travis-ci.org/#!/jimweirich/sorcerer |
|
25
28
|
|
26
|
-
|
29
|
+
## Examples
|
27
30
|
|
28
|
-
|
31
|
+
```ruby
|
29
32
|
sexp = [:binary,
|
30
33
|
[:var_ref, [:@ident, "a", [1, 0]]],
|
31
34
|
:+,
|
32
35
|
[:var_ref, [:@ident, "b", [1, 4]]]]
|
33
36
|
puts Sorcerer.source(sexp)
|
34
|
-
|
37
|
+
```
|
35
38
|
|
36
39
|
will generate
|
37
40
|
|
38
|
-
|
41
|
+
```ruby
|
39
42
|
a + b
|
40
|
-
|
43
|
+
```
|
41
44
|
|
42
|
-
Ripper may be used to produce the s-expressions used by Sorcerer.
|
45
|
+
Ripper may be used to produce the s-expressions used by Sorcerer. The
|
46
|
+
following will produce the same output.
|
43
47
|
|
44
|
-
|
48
|
+
```ruby
|
45
49
|
sexp = Ripper::SexpBuilder.new("a + b").parse
|
46
50
|
puts Sorcerer.source(sexp)
|
47
|
-
|
51
|
+
```
|
48
52
|
|
49
|
-
|
53
|
+
## Options
|
50
54
|
|
51
|
-
|
55
|
+
### No Options
|
52
56
|
|
53
57
|
By default, sorcerer will output its source in single line mode.
|
54
58
|
|
55
59
|
For example, given:
|
56
60
|
|
57
|
-
|
61
|
+
```ruby
|
58
62
|
sexp = Ripper::SexpBuilder.new("def foo; bar; end").parse
|
59
|
-
|
63
|
+
```
|
60
64
|
|
61
65
|
Then the following
|
62
66
|
|
63
|
-
|
67
|
+
```ruby
|
64
68
|
puts Sorcerer.source(sexp)
|
65
|
-
|
69
|
+
```
|
66
70
|
|
67
71
|
generates single line output (the default):
|
68
72
|
|
69
|
-
|
73
|
+
```ruby
|
70
74
|
def foo; bar; end
|
71
|
-
|
75
|
+
```
|
72
76
|
|
73
|
-
|
77
|
+
### Multi-Line Output
|
74
78
|
|
75
79
|
If you want multi-line output of source, add the multiline option to
|
76
80
|
the source command.
|
77
81
|
|
78
82
|
For example, given the sexp generated above, then this
|
79
83
|
|
80
|
-
|
84
|
+
```ruby
|
81
85
|
puts Sorcerer.source(sexp, multiline: true)
|
82
|
-
|
86
|
+
```
|
83
87
|
|
84
88
|
generates multi-line output
|
85
89
|
|
86
|
-
|
90
|
+
```ruby
|
87
91
|
def foo
|
88
92
|
bar
|
89
93
|
end
|
90
|
-
|
94
|
+
```
|
91
95
|
|
92
96
|
(Note that all multi-line output will have a final newline.)
|
93
97
|
|
94
|
-
|
98
|
+
### Indentation
|
95
99
|
|
96
100
|
By default, sorcerer does not indent its multiline output. Adding the
|
97
101
|
"indent" option will cause the output to be indented.
|
98
102
|
|
99
103
|
For example, given the sexp generated above, then the following
|
100
104
|
|
101
|
-
|
105
|
+
```ruby
|
102
106
|
puts Sorcerer.source(sexp, indent: true)
|
103
|
-
|
107
|
+
```
|
104
108
|
|
105
109
|
generates indented output:
|
106
110
|
|
107
|
-
|
111
|
+
```ruby
|
108
112
|
def foo
|
109
113
|
bar
|
110
114
|
end
|
111
|
-
|
115
|
+
```
|
112
116
|
|
113
|
-
|
117
|
+
### Debugging Output
|
114
118
|
|
115
119
|
If you wish to see the S-Expressions processed by Sorcerer and the
|
116
120
|
output emitted, then use the debug option:
|
117
121
|
|
118
|
-
|
122
|
+
```ruby
|
119
123
|
puts Sorcerer.source(sexp, debug: true)
|
120
|
-
|
124
|
+
```
|
121
125
|
|
122
|
-
|
126
|
+
## History
|
123
127
|
|
124
|
-
* 0.
|
128
|
+
* 0.3.9 - Support %i{} and %I{}.
|
125
129
|
|
126
|
-
* 0.
|
127
|
-
number of constructs
|
130
|
+
* 0.3.8 - Include constants in sub-expressions.
|
128
131
|
|
129
|
-
* 0.
|
132
|
+
* 0.3.7 - Include array in sub-expressions.
|
130
133
|
|
131
|
-
* 0.3.
|
132
|
-
|
134
|
+
* 0.3.6 - Support 'defined?'. Suppress nil, true, false in
|
135
|
+
sub-expressions.
|
136
|
+
|
137
|
+
* 0.3.5 - Add handler for mrhs_new.
|
138
|
+
|
139
|
+
* 0.3.4 - Support 'meth a, b'.
|
140
|
+
|
141
|
+
* 0.3.3 - Fix unary not.
|
142
|
+
|
143
|
+
* 0.3.2 - Support 'def mod.method' syntax.
|
133
144
|
|
134
145
|
* 0.3.1 - 1.9.3 support. Indenting stabby procs. RedCloth not required
|
135
146
|
for testing.
|
147
|
+
|
148
|
+
* 0.3.0 - New hash literal support. Multi-line output always end with
|
149
|
+
a newline.
|
150
|
+
|
151
|
+
* 0.2.0 - Added support for indented output.
|
152
|
+
|
153
|
+
* 0.1.0 - Added support for multi-line output. Improved rendering of a
|
154
|
+
number of constructs
|
155
|
+
|
156
|
+
* 0.0.7 - Basic single line version
|
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ RUBY = ENV['RUBY19'] || 'ruby19'
|
|
20
20
|
PKG_VERSION = Sorcerer::VERSION
|
21
21
|
|
22
22
|
PKG_FILES = FileList[
|
23
|
-
'README.
|
23
|
+
'README.md',
|
24
24
|
'Rakefile',
|
25
25
|
'doc/*',
|
26
26
|
'rakelib/*',
|
@@ -30,7 +30,6 @@ PKG_FILES = FileList[
|
|
30
30
|
|
31
31
|
BASE_RDOC_OPTIONS = [
|
32
32
|
'--line-numbers', '--inline-source',
|
33
|
-
'--main' , 'README.textile',
|
34
33
|
'--title', 'Rake -- Ruby Make'
|
35
34
|
]
|
36
35
|
|
data/lib/sorcerer/resource.rb
CHANGED
@@ -154,7 +154,7 @@ module Sorcerer
|
|
154
154
|
false
|
155
155
|
end
|
156
156
|
|
157
|
-
def params(normal_args, default_args,
|
157
|
+
def params(normal_args, default_args, rest_arg, unknown, keyw_args, opts_arg, block_arg)
|
158
158
|
first = true
|
159
159
|
if normal_args
|
160
160
|
normal_args.each do |sx|
|
@@ -170,9 +170,22 @@ module Sorcerer
|
|
170
170
|
resource(sx[1])
|
171
171
|
end
|
172
172
|
end
|
173
|
-
if
|
173
|
+
if rest_arg
|
174
174
|
first = emit_separator(", ", first)
|
175
|
-
resource(
|
175
|
+
resource(rest_arg)
|
176
|
+
end
|
177
|
+
if keyw_args
|
178
|
+
keyw_args.each do |sx|
|
179
|
+
first = emit_separator(", ", first)
|
180
|
+
resource(sx[0])
|
181
|
+
emit(" ")
|
182
|
+
resource(sx[1])
|
183
|
+
end
|
184
|
+
end
|
185
|
+
if opts_arg
|
186
|
+
first = emit_separator(", ", first)
|
187
|
+
emit("**")
|
188
|
+
emit(opts_arg[1])
|
176
189
|
end
|
177
190
|
if block_arg
|
178
191
|
first = emit_separator(", ", first)
|
@@ -180,10 +193,22 @@ module Sorcerer
|
|
180
193
|
end
|
181
194
|
end
|
182
195
|
|
196
|
+
def quoted_word_add?(sexp)
|
197
|
+
sexp &&
|
198
|
+
sexp[1] &&
|
199
|
+
[:words_add, :qwords_add, :qsymbols_add, :symbols_add].include?(sexp[1].first)
|
200
|
+
end
|
201
|
+
|
202
|
+
def quoted_word_new?(sexp)
|
203
|
+
sexp &&
|
204
|
+
sexp[1] &&
|
205
|
+
[:qwords_new, :words_new, :qsymbols_new, :symbols_new].include?(sexp[1].first)
|
206
|
+
end
|
207
|
+
|
183
208
|
def words(marker, sexp)
|
184
209
|
emit("%#{marker}{") if @word_level == 0
|
185
210
|
@word_level += 1
|
186
|
-
if sexp
|
211
|
+
if !quoted_word_new?(sexp)
|
187
212
|
resource(sexp[1])
|
188
213
|
emit(" ")
|
189
214
|
end
|
@@ -350,8 +375,7 @@ module Sorcerer
|
|
350
375
|
:args_prepend => NYI,
|
351
376
|
:array => lambda { |sexp|
|
352
377
|
if !MISSES_ARRAY_NODE_FOR_WORDS &&
|
353
|
-
|
354
|
-
[:words_add, :qwords_add].include?(sexp[1].first)
|
378
|
+
quoted_word_add?(sexp)
|
355
379
|
resource(sexp[1])
|
356
380
|
else
|
357
381
|
emit("[")
|
@@ -683,7 +707,11 @@ module Sorcerer
|
|
683
707
|
},
|
684
708
|
:param_error => NYI,
|
685
709
|
:params => lambda { |sexp|
|
686
|
-
|
710
|
+
if sexp.size == 8
|
711
|
+
params(sexp[1], sexp[2], sexp[3], sexp[4], sexp[5], sexp[6], sexp[7])
|
712
|
+
else
|
713
|
+
params(sexp[1], sexp[2], sexp[3], sexp[4],nil, nil, sexp[5])
|
714
|
+
end
|
687
715
|
},
|
688
716
|
:paren => lambda { |sexp|
|
689
717
|
emit("(")
|
@@ -692,6 +720,10 @@ module Sorcerer
|
|
692
720
|
},
|
693
721
|
:parse_error => NYI,
|
694
722
|
:program => PASS1,
|
723
|
+
:qsymbols_add => lambda { |sexp|
|
724
|
+
words("i", sexp)
|
725
|
+
},
|
726
|
+
:qsymbols_new => NOOP,
|
695
727
|
:qwords_add => lambda { |sexp|
|
696
728
|
words("w", sexp)
|
697
729
|
},
|
@@ -789,6 +821,10 @@ module Sorcerer
|
|
789
821
|
resource(sexp[1])
|
790
822
|
},
|
791
823
|
:symbol_literal => PASS1,
|
824
|
+
:symbols_add => lambda { |sexp|
|
825
|
+
words("I", sexp)
|
826
|
+
},
|
827
|
+
:symbols_new => NOOP,
|
792
828
|
:top_const_field => NYI,
|
793
829
|
:top_const_ref => NYI,
|
794
830
|
:unary => lambda { |sexp|
|
@@ -46,8 +46,13 @@ module Sorcerer
|
|
46
46
|
when :call, :method_add_block, :method_add_arg
|
47
47
|
@result << sexp
|
48
48
|
method_sexp(sexp)
|
49
|
+
when :const_path_ref
|
50
|
+
@result << sexp
|
51
|
+
recur(sexp[1])
|
49
52
|
when :@kw
|
50
53
|
# ignore
|
54
|
+
when :@const
|
55
|
+
@result << sexp
|
51
56
|
when :zsuper, :super
|
52
57
|
@result << sexp
|
53
58
|
list_sexp(sexp)
|
data/lib/sorcerer/version.rb
CHANGED
data/rakelib/testing.rake
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
module AssertResource
|
2
|
+
|
3
|
+
# Assert that a string can be parsed and then resourced without changes.
|
4
|
+
def assert_resource(string, options={})
|
5
|
+
assert_equal string, source(string, options)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Assert that a string can be resourced properly in all the various
|
9
|
+
# output modes:
|
10
|
+
#
|
11
|
+
# * single line
|
12
|
+
# * multi-line
|
13
|
+
# * indentation
|
14
|
+
#
|
15
|
+
# Special markup is supported in the string to indicate different
|
16
|
+
# expected output. The string is expressed in single line mode with
|
17
|
+
# the following interpretation:
|
18
|
+
#
|
19
|
+
# * "; " is expected to be literal in single line mode and a newline
|
20
|
+
# in multi-line and indented modes.
|
21
|
+
#
|
22
|
+
# * "~" is expected to be a space in single line mode and a newline
|
23
|
+
# in multi-line and indented modes.
|
24
|
+
#
|
25
|
+
# * "#" is expected to be a tabbed indent in indent mode and a null
|
26
|
+
# string in single line and multi-line modes.
|
27
|
+
#
|
28
|
+
def assert_resource_lines(string, options={})
|
29
|
+
assert_resource_for_mode(
|
30
|
+
string,
|
31
|
+
options.merge(multiline: false)) { |s|
|
32
|
+
for_single_line(s)
|
33
|
+
}
|
34
|
+
assert_resource_for_mode(
|
35
|
+
string,
|
36
|
+
options.merge(multiline: true)) { |s|
|
37
|
+
for_multi_line(s)
|
38
|
+
}
|
39
|
+
assert_resource_for_mode(
|
40
|
+
string,
|
41
|
+
options.merge(indent: true)) { |s|
|
42
|
+
for_indented(s)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
# Assert the string is correctly resourced given the options and the
|
47
|
+
# block conversion.
|
48
|
+
def assert_resource_for_mode(string, options={})
|
49
|
+
expectation = yield(string)
|
50
|
+
assert_equal expectation, source(expectation, options)
|
51
|
+
end
|
52
|
+
|
53
|
+
def for_single_line(string)
|
54
|
+
string.
|
55
|
+
gsub(/\bTHEN~/, "then ").
|
56
|
+
gsub(/~/, " ").
|
57
|
+
gsub(/#/,'')
|
58
|
+
end
|
59
|
+
|
60
|
+
def for_multi_line(string)
|
61
|
+
string.
|
62
|
+
gsub(/\b THEN~/, "; ").
|
63
|
+
gsub(/~/, "\n").
|
64
|
+
gsub(/; /, "\n").
|
65
|
+
gsub(/#/,'') + "\n"
|
66
|
+
end
|
67
|
+
|
68
|
+
def for_indented(string)
|
69
|
+
string.
|
70
|
+
gsub(/\b THEN~/, "; ").
|
71
|
+
gsub(/~/, "\n").
|
72
|
+
gsub(/; /, "\n").
|
73
|
+
gsub(/#/,' ') + "\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -3,82 +3,12 @@
|
|
3
3
|
require 'test/unit'
|
4
4
|
require 'ripper'
|
5
5
|
require 'sorcerer'
|
6
|
+
require 'assert_resource_helper'
|
6
7
|
|
7
|
-
class
|
8
|
-
|
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_lines(string, options={})
|
36
|
-
assert_resource_for_mode(
|
37
|
-
string,
|
38
|
-
options.merge(multiline: false)) { |s|
|
39
|
-
for_single_line(s)
|
40
|
-
}
|
41
|
-
assert_resource_for_mode(
|
42
|
-
string,
|
43
|
-
options.merge(multiline: true)) { |s|
|
44
|
-
for_multi_line(s)
|
45
|
-
}
|
46
|
-
assert_resource_for_mode(
|
47
|
-
string,
|
48
|
-
options.merge(indent: true)) { |s|
|
49
|
-
for_indented(s)
|
50
|
-
}
|
51
|
-
end
|
52
|
-
|
53
|
-
# Assert the string is correctly resourced given the options and the
|
54
|
-
# block conversion.
|
55
|
-
def assert_resource_for_mode(string, options={})
|
56
|
-
expectation = yield(string)
|
57
|
-
assert_equal expectation, source(expectation, options)
|
58
|
-
end
|
59
|
-
|
60
|
-
def for_single_line(string)
|
61
|
-
string.
|
62
|
-
gsub(/\bTHEN~/, "then ").
|
63
|
-
gsub(/~/, " ").
|
64
|
-
gsub(/#/,'')
|
65
|
-
end
|
8
|
+
class ResourceTest < Test::Unit::TestCase
|
9
|
+
include AssertResource
|
66
10
|
|
67
|
-
|
68
|
-
string.
|
69
|
-
gsub(/\b THEN~/, "; ").
|
70
|
-
gsub(/~/, "\n").
|
71
|
-
gsub(/; /, "\n").
|
72
|
-
gsub(/#/,'') + "\n"
|
73
|
-
end
|
74
|
-
|
75
|
-
def for_indented(string)
|
76
|
-
string.
|
77
|
-
gsub(/\b THEN~/, "; ").
|
78
|
-
gsub(/~/, "\n").
|
79
|
-
gsub(/; /, "\n").
|
80
|
-
gsub(/#/,' ') + "\n"
|
81
|
-
end
|
11
|
+
private
|
82
12
|
|
83
13
|
def quietly
|
84
14
|
original_verbosity = $VERBOSE
|
@@ -353,6 +283,13 @@ class SourcerTest < Test::Unit::TestCase
|
|
353
283
|
assert_resource "/a/i"
|
354
284
|
end
|
355
285
|
|
286
|
+
def test_can_source_symbol_quotes
|
287
|
+
if RUBY_VERSION >= "2.0"
|
288
|
+
assert_resource "%i{a b}"
|
289
|
+
assert_resource "%I{a b}"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
356
293
|
def test_can_source_range
|
357
294
|
assert_resource "1..10"
|
358
295
|
assert_resource "1...10"
|
@@ -636,12 +573,20 @@ class SourcerTest < Test::Unit::TestCase
|
|
636
573
|
assert_resource_lines "def f(); end"
|
637
574
|
assert_resource_lines "def f(a); end"
|
638
575
|
assert_resource_lines "def f(a, b); end"
|
576
|
+
assert_resource_lines "def f(a, b=1); end"
|
639
577
|
assert_resource_lines "def f(a, *args); end"
|
640
578
|
assert_resource_lines "def f(a, *args, &block); end"
|
641
579
|
assert_resource_lines "def f(a); #x; end"
|
642
580
|
assert_resource_lines "def f(a); #x; #y; end"
|
643
581
|
end
|
644
582
|
|
583
|
+
if RUBY_VERSION >= "2.0.0"
|
584
|
+
def test_can_source_ruby2_defs
|
585
|
+
assert_resource_lines "def f(a, b=1, *args, c: 2, **opts, &block); end"
|
586
|
+
assert_resource_lines "def f(a, aa, b=1, bb=2, *args, c: 3, cc: 4, **opts, &block); end"
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
645
590
|
def test_can_source_def_self
|
646
591
|
assert_resource_lines "def self.f; end"
|
647
592
|
assert_resource_lines "def self.f(a, *args, &block); #x; #y; end"
|
@@ -4,7 +4,7 @@ require 'ripper'
|
|
4
4
|
require 'pp'
|
5
5
|
|
6
6
|
class SubexpressionTest < Test::Unit::TestCase
|
7
|
-
def assert_subexpressions
|
7
|
+
def assert_subexpressions(code, subexpressions, debug=false)
|
8
8
|
sexp = Ripper::SexpBuilder.new(code).parse
|
9
9
|
if debug
|
10
10
|
pp sexp
|
@@ -140,4 +140,17 @@ class SubexpressionTest < Test::Unit::TestCase
|
|
140
140
|
]
|
141
141
|
end
|
142
142
|
|
143
|
+
def test_constants_are_included
|
144
|
+
assert_subexpressions "a || A", [
|
145
|
+
"a || A",
|
146
|
+
"a",
|
147
|
+
"A",
|
148
|
+
]
|
149
|
+
assert_subexpressions "A::B::C", [
|
150
|
+
"A::B::C",
|
151
|
+
"A::B",
|
152
|
+
"A",
|
153
|
+
]
|
154
|
+
end
|
155
|
+
|
143
156
|
end
|
metadata
CHANGED
@@ -1,63 +1,80 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sorcerer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 9
|
10
|
+
version: 0.3.9
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Jim Weirich
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
17
|
+
|
18
|
+
date: 2013-02-04 00:00:00 Z
|
13
19
|
dependencies: []
|
14
|
-
|
15
|
-
|
20
|
+
|
21
|
+
description: Generate the original Ruby source from a Ripper-style abstract syntax tree.
|
16
22
|
email: jim.weirich@gmail.com
|
17
23
|
executables: []
|
24
|
+
|
18
25
|
extensions: []
|
26
|
+
|
19
27
|
extra_rdoc_files: []
|
20
|
-
|
21
|
-
|
28
|
+
|
29
|
+
files:
|
30
|
+
- README.md
|
22
31
|
- Rakefile
|
23
32
|
- doc/jamis.rb
|
24
33
|
- rakelib/git.rake
|
25
34
|
- rakelib/readme.rake
|
26
35
|
- rakelib/testing.rake
|
27
|
-
- lib/sorcerer.rb
|
28
36
|
- lib/sorcerer/resource.rb
|
29
37
|
- lib/sorcerer/subexpression.rb
|
30
38
|
- lib/sorcerer/version.rb
|
39
|
+
- lib/sorcerer.rb
|
40
|
+
- test/assert_resource_helper.rb
|
31
41
|
- test/sorcerer/resource_test.rb
|
32
42
|
- test/sorcerer/subexpression_test.rb
|
33
43
|
homepage: http://github.com/jimweirich/sorcerer
|
34
44
|
licenses: []
|
45
|
+
|
35
46
|
post_install_message:
|
36
|
-
rdoc_options:
|
47
|
+
rdoc_options:
|
37
48
|
- --line-numbers
|
38
49
|
- --inline-source
|
39
|
-
- --main
|
40
|
-
- README.textile
|
41
50
|
- --title
|
42
51
|
- Rake -- Ruby Make
|
43
|
-
require_paths:
|
52
|
+
require_paths:
|
44
53
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
55
|
none: false
|
47
|
-
requirements:
|
48
|
-
- -
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
|
51
|
-
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
64
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
57
72
|
requirements: []
|
73
|
+
|
58
74
|
rubyforge_project: sorcerer
|
59
75
|
rubygems_version: 1.8.24
|
60
76
|
signing_key:
|
61
77
|
specification_version: 3
|
62
78
|
summary: Generate Source from Ripper ASTs
|
63
79
|
test_files: []
|
80
|
+
|