srizzo-irber 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/README.markdown +95 -0
- data/VERSION +1 -1
- data/features/get_a_generated_source_code_on_the_fly.feature +8 -8
- data/features/{make_an_object_print_itself.feature → make_any_object_inspect_itself.feature} +11 -3
- data/features/print_an_objects_api.feature +67 -0
- data/features/print_generated_source_code.feature +3 -3
- data/features/step_definitions/irber_steps.rb +9 -0
- data/irber.gemspec +21 -11
- data/lib/irber.rb +3 -2
- data/lib/irber/api.rb +57 -0
- data/lib/irber/papi.rb +22 -0
- data/lib/irber/psrc.rb +11 -0
- data/lib/irber/{printing.rb → self_inspect.rb} +13 -3
- data/lib/irber/signature.rb +45 -0
- data/lib/irber/src.rb +45 -7
- data/spec/irber/api_spec.rb +66 -0
- data/spec/irber/papi_spec.rb +43 -0
- data/spec/irber/psrc_spec.rb +33 -0
- data/spec/irber/self_inspect_spec.rb +90 -0
- data/spec/irber/signature_spec.rb +66 -0
- data/spec/irber/src_spec.rb +140 -18
- metadata +21 -11
- data/README.rdoc +0 -73
- data/lib/irber/to_code.rb +0 -50
- data/spec/irber/printing_spec.rb +0 -52
- data/spec/irber/to_code_spec.rb +0 -143
data/lib/irber/papi.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'irber/api'
|
2
|
+
|
3
|
+
module Kernel
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def papi object
|
8
|
+
|
9
|
+
signatures = object.api
|
10
|
+
|
11
|
+
max_length = signatures.collect {|signature| signature[0].size}.max
|
12
|
+
|
13
|
+
formatted_signatures = signatures.collect do |signature|
|
14
|
+
"#{signature[0].rjust(max_length)} #{signature[1]} #{signature[2]}#{signature[3]}"
|
15
|
+
end
|
16
|
+
|
17
|
+
puts formatted_signatures.join("\n")
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
data/lib/irber/psrc.rb
ADDED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'pp'
|
2
|
-
|
2
|
+
require 'irber/psrc'
|
3
|
+
require 'irber/papi'
|
3
4
|
|
4
5
|
module Irber
|
5
|
-
module
|
6
|
+
module SelfInspect
|
6
7
|
|
7
8
|
module InstanceMethods
|
8
9
|
def puts_it
|
@@ -14,6 +15,15 @@ module Irber
|
|
14
15
|
def pp_it
|
15
16
|
pp self
|
16
17
|
end
|
18
|
+
|
19
|
+
def psrc_it *args
|
20
|
+
psrc self, *args
|
21
|
+
end
|
22
|
+
|
23
|
+
def papi_it
|
24
|
+
papi self
|
25
|
+
end
|
26
|
+
|
17
27
|
end
|
18
28
|
|
19
29
|
def self.included(receiver)
|
@@ -25,6 +35,6 @@ end
|
|
25
35
|
|
26
36
|
|
27
37
|
class Object
|
28
|
-
include Irber::
|
38
|
+
include Irber::SelfInspect
|
29
39
|
end
|
30
40
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'irber/src'
|
2
|
+
|
3
|
+
module Irber
|
4
|
+
module Signature
|
5
|
+
module InstanceMethods
|
6
|
+
def signature
|
7
|
+
owner, level, method_name = self.inspect.match(/<(?:Unbound)?Method: ([^.#]*)(\.|#)(.*)>/).captures
|
8
|
+
owner = owner[/^(?:.*\()?([^()]*)\)?$/, 1]
|
9
|
+
|
10
|
+
begin
|
11
|
+
params = "(#{self.owner.src(self.name)[/def [^(]*\(([^)]*)\)\n/, 1]})"
|
12
|
+
rescue Irber::Src::ParseError
|
13
|
+
if self.arity > 0
|
14
|
+
req_args = self.arity
|
15
|
+
params = "(#{(1..req_args).collect {|i| "arg#{i}"}.join(", ")})"
|
16
|
+
elsif self.arity < 0
|
17
|
+
req_args = (-self.arity) -1
|
18
|
+
params = "("
|
19
|
+
params += "#{(1..req_args).collect {|i| "arg#{i}"}.join(", ")}, " if req_args > 0
|
20
|
+
params += "var_args = nil"
|
21
|
+
params += ")"
|
22
|
+
else
|
23
|
+
params = "()"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
[owner, level, method_name, params]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.included(receiver)
|
33
|
+
receiver.send :include, InstanceMethods
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
class Method
|
40
|
+
include Irber::Signature
|
41
|
+
end
|
42
|
+
|
43
|
+
class UnboundMethod
|
44
|
+
include Irber::Signature
|
45
|
+
end
|
data/lib/irber/src.rb
CHANGED
@@ -1,12 +1,50 @@
|
|
1
|
-
require '
|
1
|
+
require 'parse_tree'
|
2
|
+
require 'ruby2ruby'
|
2
3
|
|
4
|
+
module Irber
|
5
|
+
module Src
|
6
|
+
|
7
|
+
class ParseError < StandardError; end
|
8
|
+
|
9
|
+
module InstanceMethods
|
10
|
+
def src method = nil
|
11
|
+
|
12
|
+
if method
|
13
|
+
|
14
|
+
if (the_method = self.method(method) rescue nil)
|
15
|
+
receiver = the_method.owner
|
16
|
+
elsif (the_method = self.instance_method(method) if self.respond_to? :instance_method)
|
17
|
+
receiver = the_method.owner
|
18
|
+
else
|
19
|
+
throw NameError.new "couldn't find method `#{method}' for `#{self}' "
|
20
|
+
end
|
21
|
+
|
22
|
+
Ruby2Ruby.new.process(ParseTree.translate(receiver, method)) rescue raise ParseError.new("couldn't parse method")
|
23
|
+
|
24
|
+
else
|
25
|
+
if self.class == Class || self.class == Module
|
26
|
+
receiver = self
|
27
|
+
else
|
28
|
+
receiver = self.class
|
29
|
+
end
|
3
30
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
31
|
+
Ruby2Ruby.new.process(ParseTree.translate(receiver)) rescue raise ParseError.new("couldn't parse class")
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.included(receiver)
|
39
|
+
receiver.send :include, InstanceMethods
|
40
|
+
end
|
10
41
|
end
|
11
42
|
|
12
43
|
end
|
44
|
+
|
45
|
+
|
46
|
+
class Object
|
47
|
+
include Irber::Src
|
48
|
+
end
|
49
|
+
|
50
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
require "irber/api"
|
4
|
+
|
5
|
+
module Irber
|
6
|
+
module Api
|
7
|
+
|
8
|
+
class A
|
9
|
+
def an_instance_method; end
|
10
|
+
def self.a_class_method; end
|
11
|
+
|
12
|
+
def a_method_with_args an_arg, another_arg; end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def a_private_method; end
|
17
|
+
def self.a_private_class_method; end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#api" do
|
22
|
+
|
23
|
+
it "should be available on all objects" do
|
24
|
+
Object.new.should respond_to(:api)
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "on objects" do
|
28
|
+
|
29
|
+
it "should include instance methods" do
|
30
|
+
A.new.api.to_s.should include("an_instance_method")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should not include private methods" do
|
34
|
+
A.new.api.to_s.should_not include("a_private_class_method()")
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "on classes" do
|
40
|
+
|
41
|
+
it "should include class methods" do
|
42
|
+
A.api.to_s.should include("a_class_method()")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should include instance methods" do
|
46
|
+
A.api.to_s.should include("an_instance_method()")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should not include Module methods" do
|
50
|
+
A.api.to_s.should_not match(/Module/)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not include Class methods" do
|
54
|
+
A.api.to_s.should_not match(/Class/)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not include Kernel methods" do
|
58
|
+
A.api.to_s.should_not match(/Kernel/)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
require "irber/papi"
|
4
|
+
|
5
|
+
module Irber
|
6
|
+
module Papi
|
7
|
+
|
8
|
+
class B
|
9
|
+
def c; end
|
10
|
+
def b; end
|
11
|
+
def self.a; end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
module E
|
16
|
+
def e; end;
|
17
|
+
end
|
18
|
+
|
19
|
+
class Ddd < B
|
20
|
+
include E
|
21
|
+
def d; end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#papi" do
|
25
|
+
|
26
|
+
describe "formating" do
|
27
|
+
|
28
|
+
it "should order by method name, showing owner, level (instance, class) and signature, and putting methods on the same column" do
|
29
|
+
stdout{ papi Ddd }.should == "
|
30
|
+
Irber::Papi::B . a()
|
31
|
+
Irber::Papi::B # b()
|
32
|
+
Irber::Papi::B # c()
|
33
|
+
Irber::Papi::Ddd # d()
|
34
|
+
Irber::Papi::E # e()
|
35
|
+
".unindented
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
require "irber/psrc"
|
4
|
+
|
5
|
+
|
6
|
+
module Irber
|
7
|
+
module Psrc
|
8
|
+
|
9
|
+
class A
|
10
|
+
def an_instance_method
|
11
|
+
"result"
|
12
|
+
end
|
13
|
+
def self.a_class_method
|
14
|
+
"result"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
describe "#psrc" do
|
20
|
+
|
21
|
+
it "should print a class source" do
|
22
|
+
@a = A.new
|
23
|
+
stdout{ psrc @a }.should == stdout{ puts @a.src }
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should print a method source" do
|
27
|
+
@a = A.new
|
28
|
+
stdout{ psrc @a, :an_instance_method }.should == stdout{ puts @a.src :an_instance_method }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
require "irber/self_inspect"
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
module Irber
|
8
|
+
|
9
|
+
module SelfInspect
|
10
|
+
|
11
|
+
class A
|
12
|
+
def a arg
|
13
|
+
"a"
|
14
|
+
end
|
15
|
+
def to_s
|
16
|
+
"O#to_s"
|
17
|
+
end
|
18
|
+
def inspect
|
19
|
+
"O#inspect"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
describe Irber::SelfInspect do
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
@a = A.new
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#puts_it" do
|
31
|
+
it "should be available on all objects" do
|
32
|
+
Object.new.should respond_to(:puts_it)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should puts itself" do
|
36
|
+
stdout{ @a.puts_it }.should == stdout{ puts @a }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#p_it" do
|
41
|
+
it "should be available on all objects" do
|
42
|
+
Object.new.should respond_to(:p_it)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should puts itself" do
|
46
|
+
stdout{ @a.p_it }.should == stdout{ p @a }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#pp_it" do
|
51
|
+
it "should be available on all objects" do
|
52
|
+
Object.new.should respond_to(:pp_it)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should puts itself" do
|
56
|
+
stdout{ @a.pp_it }.should == stdout{ pp @a }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
describe "#psrc_it" do
|
62
|
+
it "should be available on all objects" do
|
63
|
+
Object.new.should respond_to(:psrc_it)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should psrc itself" do
|
67
|
+
stdout{ @a.psrc_it }.should == stdout{ psrc @a }
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should psrc itself with method arg" do
|
71
|
+
stdout{ @a.psrc_it :a }.should == stdout{ psrc @a, :a }
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#papi_it" do
|
77
|
+
it "should be available on all objects" do
|
78
|
+
Object.new.should respond_to(:papi_it)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should papi itself" do
|
82
|
+
stdout{ @a.papi_it }.should == stdout{ papi @a }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
require 'irber/signature'
|
4
|
+
|
5
|
+
|
6
|
+
module Irber
|
7
|
+
module Signature
|
8
|
+
|
9
|
+
class A
|
10
|
+
def a(param); end
|
11
|
+
def self.b; end
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
describe Irber::Signature do
|
16
|
+
|
17
|
+
it "should be available on all unbound methods" do
|
18
|
+
A.instance_method(:a).should respond_to(:signature)
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
it "should be available on all methods" do
|
23
|
+
A.new.method(:a).should respond_to(:signature)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
describe "returned data" do
|
28
|
+
|
29
|
+
before(:each) do
|
30
|
+
@method = A.instance_method(:a)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should include the owner" do
|
34
|
+
@method.signature[0].should == "Irber::Signature::A"
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should include the level (class/instance)" do
|
38
|
+
@method.signature[1].should == "#"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should include the method name" do
|
42
|
+
@method.signature[2].should == "a"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should include the params" do
|
46
|
+
@method.signature[3].should == "(param)"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
describe "method signatures creation" do
|
52
|
+
|
53
|
+
it "should include arg names when possible" do
|
54
|
+
A.instance_method(:a).signature[3].should == "(param)"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should create a signature when not possible" do
|
58
|
+
String.instance_method(:between?).signature[3].should == "(arg1, arg2)"
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|