srizzo-irber 0.0.3 → 0.0.4
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/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
|