sorcerer 0.3.9 → 0.3.10
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.md +1 -1
- data/lib/sorcerer.rb +1 -1
- data/lib/sorcerer/resource.rb +16 -19
- data/lib/sorcerer/signature.rb +38 -0
- data/lib/sorcerer/version.rb +1 -1
- data/rakelib/readme.rake +16 -34
- data/test/sorcerer/resource_test.rb +19 -3
- data/test/sorcerer/signature_test.rb +102 -0
- metadata +23 -39
data/README.md
CHANGED
data/lib/sorcerer.rb
CHANGED
data/lib/sorcerer/resource.rb
CHANGED
@@ -116,7 +116,8 @@ module Sorcerer
|
|
116
116
|
def params_are_empty?(sexp)
|
117
117
|
params = sexp
|
118
118
|
params = sexp[1] if sexp.first == :paren || sexp.first == :arg_paren
|
119
|
-
|
119
|
+
sig = Signature.new(params)
|
120
|
+
sig.empty?
|
120
121
|
end
|
121
122
|
|
122
123
|
def opt_parens(sexp)
|
@@ -154,42 +155,42 @@ module Sorcerer
|
|
154
155
|
false
|
155
156
|
end
|
156
157
|
|
157
|
-
def params(
|
158
|
+
def params(sig)
|
158
159
|
first = true
|
159
|
-
if normal_args
|
160
|
-
normal_args.each do |sx|
|
160
|
+
if sig.normal_args
|
161
|
+
sig.normal_args.each do |sx|
|
161
162
|
first = emit_separator(", ", first)
|
162
163
|
resource(sx)
|
163
164
|
end
|
164
165
|
end
|
165
|
-
if default_args
|
166
|
-
default_args.each do |sx|
|
166
|
+
if sig.default_args
|
167
|
+
sig.default_args.each do |sx|
|
167
168
|
first = emit_separator(", ", first)
|
168
169
|
resource(sx[0])
|
169
170
|
emit("=")
|
170
171
|
resource(sx[1])
|
171
172
|
end
|
172
173
|
end
|
173
|
-
if rest_arg
|
174
|
+
if sig.rest_arg
|
174
175
|
first = emit_separator(", ", first)
|
175
|
-
resource(rest_arg)
|
176
|
+
resource(sig.rest_arg)
|
176
177
|
end
|
177
|
-
if
|
178
|
-
|
178
|
+
if sig.keyword_args
|
179
|
+
sig.keyword_args.each do |sx|
|
179
180
|
first = emit_separator(", ", first)
|
180
181
|
resource(sx[0])
|
181
182
|
emit(" ")
|
182
183
|
resource(sx[1])
|
183
184
|
end
|
184
185
|
end
|
185
|
-
if opts_arg
|
186
|
+
if sig.opts_arg
|
186
187
|
first = emit_separator(", ", first)
|
187
188
|
emit("**")
|
188
|
-
emit(opts_arg[1])
|
189
|
+
emit(sig.opts_arg[1])
|
189
190
|
end
|
190
|
-
if block_arg
|
191
|
+
if sig.block_arg
|
191
192
|
first = emit_separator(", ", first)
|
192
|
-
resource(block_arg)
|
193
|
+
resource(sig.block_arg)
|
193
194
|
end
|
194
195
|
end
|
195
196
|
|
@@ -707,11 +708,7 @@ module Sorcerer
|
|
707
708
|
},
|
708
709
|
:param_error => NYI,
|
709
710
|
:params => lambda { |sexp|
|
710
|
-
|
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
|
711
|
+
params(Signature.new(sexp))
|
715
712
|
},
|
716
713
|
:paren => lambda { |sexp|
|
717
714
|
emit("(")
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Sorcerer
|
2
|
+
class Signature
|
3
|
+
|
4
|
+
attr_reader :normal_args, :default_args, :rest_arg, :keyword_args, :opts_arg, :block_arg
|
5
|
+
|
6
|
+
def initialize(sexp)
|
7
|
+
@normal_args = sexp[1]
|
8
|
+
@default_args = sexp[2]
|
9
|
+
@rest_arg = sexp[3]
|
10
|
+
if ruby2_style_param_list?(sexp)
|
11
|
+
@keyword_args = sexp[5]
|
12
|
+
@opts_arg = sexp[6]
|
13
|
+
@block_arg = sexp[7]
|
14
|
+
else
|
15
|
+
@block_arg = sexp[5]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
missing?(normal_args) &&
|
21
|
+
missing?(default_args) &&
|
22
|
+
missing?(rest_arg) &&
|
23
|
+
missing?(keyword_args) &&
|
24
|
+
missing?(opts_arg) &&
|
25
|
+
missing?(block_arg)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def missing?(args)
|
31
|
+
args.nil? || args.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def ruby2_style_param_list?(sexp)
|
35
|
+
sexp.size == 8
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/sorcerer/version.rb
CHANGED
data/rakelib/readme.rake
CHANGED
@@ -1,44 +1,26 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require 'redcloth'
|
5
|
-
directory "html"
|
3
|
+
directory "html"
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
5
|
+
desc "Display the README file"
|
6
|
+
task :readme => "README.md" do
|
7
|
+
sh "ghpreview README.md"
|
8
|
+
end
|
20
9
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
outs.puts line
|
10
|
+
namespace "readme" do
|
11
|
+
desc "Update the version in the readme"
|
12
|
+
file "README.md" => ["lib/sorcerer/version.rb"] do
|
13
|
+
open("README.md") do |ins|
|
14
|
+
open("new_readme.txt", "w") do |outs|
|
15
|
+
while line = ins.gets
|
16
|
+
if line =~ /^\*\*Version: .*\*\*$/
|
17
|
+
line = "**Version: #{PKG_VERSION}**"
|
31
18
|
end
|
19
|
+
outs.puts line
|
32
20
|
end
|
33
21
|
end
|
34
|
-
mv "README.textile", "README.bak"
|
35
|
-
mv "new_readme.txt", "README.textile"
|
36
22
|
end
|
37
|
-
|
38
|
-
|
39
|
-
rescue LoadError => ex
|
40
|
-
task :readme do
|
41
|
-
fail "Install RedCloth to generate the README"
|
23
|
+
mv "README.md", "README.bak"
|
24
|
+
mv "new_readme.txt", "README.md"
|
42
25
|
end
|
43
26
|
end
|
44
|
-
|
@@ -567,9 +567,6 @@ class ResourceTest < Test::Unit::TestCase
|
|
567
567
|
end
|
568
568
|
|
569
569
|
def test_can_source_def
|
570
|
-
assert_resource_lines "def f; end"
|
571
|
-
assert_resource_lines "def f; #x; end"
|
572
|
-
assert_resource_lines "def f a; end"
|
573
570
|
assert_resource_lines "def f(); end"
|
574
571
|
assert_resource_lines "def f(a); end"
|
575
572
|
assert_resource_lines "def f(a, b); end"
|
@@ -580,10 +577,29 @@ class ResourceTest < Test::Unit::TestCase
|
|
580
577
|
assert_resource_lines "def f(a); #x; #y; end"
|
581
578
|
end
|
582
579
|
|
580
|
+
def test_can_source_def_without_parens
|
581
|
+
assert_resource_lines "def f; end"
|
582
|
+
assert_resource_lines "def f; #x; end"
|
583
|
+
assert_resource_lines "def f a; end"
|
584
|
+
assert_resource_lines "def f b=1; end"
|
585
|
+
assert_resource_lines "def f *args; end"
|
586
|
+
assert_resource_lines "def f █ end"
|
587
|
+
end
|
588
|
+
|
583
589
|
if RUBY_VERSION >= "2.0.0"
|
584
590
|
def test_can_source_ruby2_defs
|
585
591
|
assert_resource_lines "def f(a, b=1, *args, c: 2, **opts, &block); end"
|
586
592
|
assert_resource_lines "def f(a, aa, b=1, bb=2, *args, c: 3, cc: 4, **opts, &block); end"
|
593
|
+
assert_resource_lines "def f(c: 3); end"
|
594
|
+
assert_resource_lines "def f(**opts); end"
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
if RUBY_VERSION >= "2.0.0"
|
599
|
+
def test_can_source_ruby2_defs_without_parens
|
600
|
+
assert_resource_lines "def f a, b=1, *args, c: 2, **opts, █ end"
|
601
|
+
assert_resource_lines "def f a, aa, b=1, bb=2, *args, c: 3, cc: 4, **opts, █ end"
|
602
|
+
assert_resource_lines "def f **opts; end"
|
587
603
|
end
|
588
604
|
end
|
589
605
|
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'sorcerer'
|
4
|
+
require 'ripper'
|
5
|
+
|
6
|
+
class SignatureTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def test_populate_fields_with_nil
|
9
|
+
sig = signature_for("def foo; end")
|
10
|
+
|
11
|
+
assert_nil sig.normal_args
|
12
|
+
assert_nil sig.default_args
|
13
|
+
assert_nil sig.rest_arg
|
14
|
+
assert_nil sig.keyword_args
|
15
|
+
assert_nil sig.opts_arg
|
16
|
+
assert_nil sig.block_arg
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_populate_fields_with_real_args
|
20
|
+
sig = signature_for("def foo(a, b=1, *args, &block); end")
|
21
|
+
|
22
|
+
assert_equal [[:@ident, "a", [1, 8]]], sig.normal_args
|
23
|
+
assert_equal [[[:@ident, "b", [1, 11]], [:@int, "1", [1, 13]]]], sig.default_args
|
24
|
+
assert_equal [:rest_param, [:@ident, "args", [1, 17]]], sig.rest_arg
|
25
|
+
assert_nil sig.keyword_args
|
26
|
+
assert_nil sig.opts_arg
|
27
|
+
assert_equal [:blockarg, [:@ident, "block", [1, 24]]], sig.block_arg
|
28
|
+
end
|
29
|
+
|
30
|
+
if RUBY_VERSION >= "2.0"
|
31
|
+
def test_populate_fields_with_real_args_in_ruby2
|
32
|
+
sig = signature_for("def foo(a, b=1, *args, c: 2, **opts, &block); end")
|
33
|
+
|
34
|
+
assert_equal [[:@ident, "a", [1, 8]]], sig.normal_args
|
35
|
+
assert_equal [[[:@ident, "b", [1, 11]], [:@int, "1", [1, 13]]]], sig.default_args
|
36
|
+
assert_equal [:rest_param, [:@ident, "args", [1, 17]]], sig.rest_arg
|
37
|
+
assert_equal [[[:@label, "c:", [1, 23]], [:@int, "2", [1, 26]]]], sig.keyword_args
|
38
|
+
assert_equal [:@ident, "opts", [1, 31]], sig.opts_arg
|
39
|
+
assert_equal [:blockarg, [:@ident, "block", [1, 38]]], sig.block_arg
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_empty_when_no_args
|
44
|
+
sig = signature_for("def foo(); end")
|
45
|
+
assert sig.empty?, "should be empty"
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_not_empty_when_normal_args
|
49
|
+
sig = signature_for("def foo(a); end")
|
50
|
+
assert ! sig.empty?, "should not be empty"
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_not_empty_when_default_args
|
54
|
+
sig = signature_for("def foo(b=1); end")
|
55
|
+
assert ! sig.empty?, "should not be empty"
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_not_empty_when_rest_arg
|
59
|
+
sig = signature_for("def foo(*rest); end")
|
60
|
+
assert ! sig.empty?, "should not be empty"
|
61
|
+
end
|
62
|
+
|
63
|
+
if RUBY_VERSION >= "2.0"
|
64
|
+
def test_not_empty_when_keyword_args
|
65
|
+
sig = signature_for("def foo(c: 1); end")
|
66
|
+
assert ! sig.empty?, "should not be empty"
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_not_empty_when_options_args
|
70
|
+
sig = signature_for("def foo(**opts); end")
|
71
|
+
assert ! sig.empty?, "should not be empty"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_not_empty_when_block_arg
|
76
|
+
sig = signature_for("def foo(&block); end")
|
77
|
+
assert ! sig.empty?, "should not be empty"
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def signature_for(string)
|
83
|
+
sexp = Ripper::SexpBuilder.new(string).parse
|
84
|
+
params = find_params(sexp)
|
85
|
+
Sorcerer::Signature.new(params)
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_params(sexp)
|
89
|
+
if ! sexp.is_a?(Array)
|
90
|
+
nil
|
91
|
+
elsif sexp.first == :params
|
92
|
+
sexp
|
93
|
+
else
|
94
|
+
sexp.each { |subexp|
|
95
|
+
found = find_params(subexp)
|
96
|
+
return found if found
|
97
|
+
}
|
98
|
+
nil
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
metadata
CHANGED
@@ -1,80 +1,64 @@
|
|
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
|
+
version: 0.3.10
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
- 9
|
10
|
-
version: 0.3.9
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Jim Weirich
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2013-02-04 00:00:00 Z
|
12
|
+
date: 2013-02-06 00:00:00.000000000 Z
|
19
13
|
dependencies: []
|
20
|
-
|
21
|
-
|
14
|
+
description: Generate the original Ruby source from a Ripper-style abstract syntax
|
15
|
+
tree.
|
22
16
|
email: jim.weirich@gmail.com
|
23
17
|
executables: []
|
24
|
-
|
25
18
|
extensions: []
|
26
|
-
|
27
19
|
extra_rdoc_files: []
|
28
|
-
|
29
|
-
files:
|
20
|
+
files:
|
30
21
|
- README.md
|
31
22
|
- Rakefile
|
32
23
|
- doc/jamis.rb
|
33
24
|
- rakelib/git.rake
|
34
25
|
- rakelib/readme.rake
|
35
26
|
- rakelib/testing.rake
|
27
|
+
- lib/sorcerer.rb
|
36
28
|
- lib/sorcerer/resource.rb
|
29
|
+
- lib/sorcerer/signature.rb
|
37
30
|
- lib/sorcerer/subexpression.rb
|
38
31
|
- lib/sorcerer/version.rb
|
39
|
-
- lib/sorcerer.rb
|
40
32
|
- test/assert_resource_helper.rb
|
41
33
|
- test/sorcerer/resource_test.rb
|
34
|
+
- test/sorcerer/signature_test.rb
|
42
35
|
- test/sorcerer/subexpression_test.rb
|
43
36
|
homepage: http://github.com/jimweirich/sorcerer
|
44
37
|
licenses: []
|
45
|
-
|
46
38
|
post_install_message:
|
47
|
-
rdoc_options:
|
39
|
+
rdoc_options:
|
48
40
|
- --line-numbers
|
49
41
|
- --inline-source
|
50
42
|
- --title
|
51
43
|
- Rake -- Ruby Make
|
52
|
-
require_paths:
|
44
|
+
require_paths:
|
53
45
|
- lib
|
54
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
47
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
|
61
|
-
- 0
|
62
|
-
version: "0"
|
63
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
53
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
|
69
|
-
segments:
|
70
|
-
- 0
|
71
|
-
version: "0"
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
72
58
|
requirements: []
|
73
|
-
|
74
59
|
rubyforge_project: sorcerer
|
75
60
|
rubygems_version: 1.8.24
|
76
61
|
signing_key:
|
77
62
|
specification_version: 3
|
78
63
|
summary: Generate Source from Ripper ASTs
|
79
64
|
test_files: []
|
80
|
-
|