ori 0.1.0

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.
@@ -0,0 +1,82 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ori}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Alex Fortuna"]
12
+ s.date = %q{2011-01-02}
13
+ s.description = %q{Object-Oriented RI for IRB Console}
14
+ s.email = %q{alex.r@askit.org}
15
+ s.extra_rdoc_files = [
16
+ "README.html",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "MIT-LICENSE",
21
+ "README.html",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION.yml",
25
+ "lib/misc/method_aliases.rb",
26
+ "lib/ori.rb",
27
+ "lib/ori/auto_config.rb",
28
+ "lib/ori/colorize.rb",
29
+ "lib/ori/config.rb",
30
+ "lib/ori/extensions.rb",
31
+ "lib/ori/extensions/object/ri.rb",
32
+ "lib/ori/internals.rb",
33
+ "lib/ori/library.rb",
34
+ "lib/ori/list_method.rb",
35
+ "lib/ori/request.rb",
36
+ "lib/ori/tools.rb",
37
+ "ori.gemspec",
38
+ "samples/NOTES",
39
+ "samples/basic_extension.rb",
40
+ "samples/basic_inheritance.rb",
41
+ "samples/self_singletons.rb",
42
+ "samples/singleton_class_includes_module.rb",
43
+ "spec/auto_config_spec.rb",
44
+ "spec/colorize_spec.rb",
45
+ "spec/inspector_spec.rb",
46
+ "spec/internals_spec.rb",
47
+ "spec/list_method_spec.rb",
48
+ "spec/request_spec.rb",
49
+ "spec/site/NOTES",
50
+ "spec/site/library_spec.rb",
51
+ "spec/site/spec_helper.rb",
52
+ "spec/spec_helper.rb",
53
+ "spec/tools_spec.rb"
54
+ ]
55
+ s.homepage = %q{http://github.com/dadooda/ori}
56
+ s.require_paths = ["lib"]
57
+ s.rubygems_version = %q{1.3.7}
58
+ s.summary = %q{Object-Oriented RI for IRB Console}
59
+ s.test_files = [
60
+ "spec/auto_config_spec.rb",
61
+ "spec/colorize_spec.rb",
62
+ "spec/inspector_spec.rb",
63
+ "spec/internals_spec.rb",
64
+ "spec/list_method_spec.rb",
65
+ "spec/request_spec.rb",
66
+ "spec/site/library_spec.rb",
67
+ "spec/site/spec_helper.rb",
68
+ "spec/spec_helper.rb",
69
+ "spec/tools_spec.rb"
70
+ ]
71
+
72
+ if s.respond_to? :specification_version then
73
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
74
+ s.specification_version = 3
75
+
76
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
77
+ else
78
+ end
79
+ else
80
+ end
81
+ end
82
+
@@ -0,0 +1,3 @@
1
+ These are the "official" samples used in tests, references etc.
2
+
3
+ There's no single naming scheme. Top-level namespace may describe the general situation (`BasicInheritance`) or the particular case (`ModuleExtendsClass`).
@@ -0,0 +1,27 @@
1
+ module Sample
2
+ module BasicExtension
3
+ module Mo
4
+ def public_meth
5
+ true
6
+ end
7
+
8
+ protected
9
+ def protected_meth
10
+ true
11
+ end
12
+
13
+ private
14
+ def private_meth
15
+ true
16
+ end
17
+ end
18
+
19
+ class Klass
20
+ extend Mo
21
+ end
22
+
23
+ module OtherMo
24
+ extend Mo
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,99 @@
1
+ module Sample
2
+ module BasicInheritance
3
+ class Grandpa
4
+ def grandpa_public
5
+ true
6
+ end
7
+
8
+ protected
9
+ def grandpa_protected
10
+ true
11
+ end
12
+
13
+ private
14
+ def grandpa_private
15
+ true
16
+ end
17
+
18
+ class << self
19
+ def grandpa_public_singleton
20
+ true
21
+ end
22
+
23
+ protected
24
+ def grandpa_protected_singleton
25
+ true
26
+ end
27
+
28
+ private
29
+ def grandpa_private_singleton
30
+ true
31
+ end
32
+ end
33
+ end # Grandpa
34
+
35
+ class Papa < Grandpa
36
+ def papa_public
37
+ true
38
+ end
39
+
40
+ protected
41
+ def papa_protected
42
+ true
43
+ end
44
+
45
+ private
46
+ def papa_private
47
+ true
48
+ end
49
+
50
+ class << self
51
+ def papa_public_singleton
52
+ true
53
+ end
54
+
55
+ protected
56
+ def papa_protected_singleton
57
+ true
58
+ end
59
+
60
+ private
61
+ def papa_private_singleton
62
+ true
63
+ end
64
+ end
65
+ end # Papa
66
+
67
+ class Son < Papa
68
+ def son_public
69
+ true
70
+ end
71
+
72
+ protected
73
+ def son_protected
74
+ true
75
+ end
76
+
77
+ private
78
+ def son_private
79
+ true
80
+ end
81
+
82
+ class << self
83
+ def son_public_singleton
84
+ true
85
+ end
86
+
87
+ protected
88
+ def son_protected_singleton
89
+ true
90
+ end
91
+
92
+ private
93
+ def son_private_singleton
94
+ true
95
+ end
96
+ end
97
+ end # Son
98
+ end
99
+ end
@@ -0,0 +1,36 @@
1
+ module Sample
2
+ # Singletons declared via <tt>self.</tt> are in fact always public.
3
+ module SelfSingletons
4
+ module Mo
5
+ def self.public_meth
6
+ true
7
+ end
8
+
9
+ protected
10
+ def self.protected_meth
11
+ true
12
+ end
13
+
14
+ private
15
+ def self.private_meth
16
+ true
17
+ end
18
+ end
19
+
20
+ class Klass
21
+ def self.public_meth
22
+ true
23
+ end
24
+
25
+ protected
26
+ def self.protected_meth
27
+ true
28
+ end
29
+
30
+ private
31
+ def self.private_meth
32
+ true
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ module Sample
2
+ module SingletonClassIncludesModule
3
+ module Mo
4
+ # NOTE: Method names are in context of `Mo`. `Mo` doesn't "know" that they are to become singleton.
5
+
6
+ def public_meth
7
+ true
8
+ end
9
+
10
+ protected
11
+ def protected_meth
12
+ true
13
+ end
14
+
15
+ private
16
+ def private_meth
17
+ true
18
+ end
19
+ end
20
+
21
+ class Klass
22
+ class << self
23
+ include Mo
24
+ end
25
+ end
26
+
27
+ module OtherMo
28
+ class << self
29
+ include Mo
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "::ORI::AutoConfig" do
4
+ klass = ::ORI::AutoConfig
5
+
6
+ it "requires host_os most of the time" do
7
+ r = klass.new
8
+ proc {r.has_less?}.should raise_error
9
+ proc {r.unix?}.should raise_error
10
+ proc {r.windows?}.should raise_error
11
+
12
+ proc {r.color}.should raise_error
13
+ proc {r.frontend}.should raise_error
14
+ proc {r.pager}.should raise_error
15
+ proc {r.shell_escape}.should raise_error
16
+ end
17
+
18
+ it "generally works" do
19
+ r = klass.new(:host_os => "mswin32")
20
+ r.has_less?.should == false
21
+ r.unix?.should == false
22
+ r.windows?.should == true
23
+
24
+ r = klass.new(:host_os => "cygwin")
25
+ r.has_less?.should == true
26
+ r.color.should == true
27
+
28
+ r = klass.new(:host_os => "linux-gnu")
29
+ r.has_less?.should == true
30
+ r.color.should == true
31
+ r.frontend.should match /ansi/
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ describe "::ORI::Tools" do
4
+ mod = ::ORI::Colorize
5
+
6
+ describe ".colorize" do
7
+ meth = :colorize
8
+
9
+ it "generally works" do
10
+ mod.send(meth, "the quick ", "brown fox").should == "the quick brown fox"
11
+ mod.send(meth, [:message, :error], "the message", [:reset]).should(match(/the message/) && match(/\e\[0m/)) # NOTE: () and && are to satisfy Ruby 1.8.
12
+ end
13
+ end
14
+
15
+ describe ".seq" do
16
+ meth = :seq
17
+
18
+ it "generally works" do
19
+ mod.send(meth, :reset).should == "\e[0m"
20
+
21
+ proc do
22
+ mod.send(meth, :kaka)
23
+ end.should raise_error ArgumentError
24
+ end
25
+ end # .seq
26
+ end
@@ -0,0 +1,75 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ # Rules of method inspection, formulated as spec samples.
4
+ #
5
+ # NOTES:
6
+ # * DO NOT sort arrays to compare them with each other. Instead use array arithmetic.
7
+ # * Try NOT to touch method `methods`. ORI doesn't actually use it.
8
+ # * Test concrete inspectors thoroughly: `public_methods`, `protected_methods`, etc.
9
+ # * Sort from more public to less public: public -- protected -- private.
10
+
11
+ obj_subjects = [
12
+ nil,
13
+ false,
14
+ 5,
15
+ "kaka",
16
+ Time.now,
17
+ ]
18
+
19
+ class_subjects = [
20
+ Array,
21
+ Fixnum,
22
+ String,
23
+ ]
24
+
25
+ module_subjects = [
26
+ Enumerable,
27
+ Kernel,
28
+ ]
29
+
30
+ cm_subjects = class_subjects + module_subjects
31
+ all_subjects = obj_subjects + cm_subjects
32
+
33
+ describe "{Class|Module}#instance_methods" do
34
+ it "does not intersect #private_instance_methods" do
35
+ (cm_subjects).each do |subj|
36
+ (subj.instance_methods & subj.private_instance_methods).should == []
37
+ end
38
+ end
39
+
40
+ it "is fully contained in (#public_instance_methods + #protected_instance_methods)" do
41
+ (cm_subjects).each do |subj|
42
+ (subj.instance_methods - (subj.public_instance_methods + subj.protected_instance_methods)).should == []
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "anything#methods" do
48
+ it "is fully contained in (#public_methods + #protected_methods)" do
49
+ all_subjects.each do |subj|
50
+ (subj.methods - (subj.public_methods + subj.protected_methods)).should == []
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "{Class|Module}#singleton_methods" do
56
+ it "is fully contained in (#public_methods + #protected_methods + #private_methods)" do
57
+ cm_subjects.each do |subj|
58
+ (subj.singleton_methods - (subj.public_methods + subj.protected_methods + subj.private_methods)).should == []
59
+ end
60
+ end
61
+ end
62
+
63
+ describe "Module#singleton_methods" do
64
+ it "is fully containted in #public_methods" do
65
+ module_subjects.each do |subj|
66
+ (subj.singleton_methods - subj.public_methods).should == []
67
+ end
68
+ end
69
+
70
+ it "does not intersect with #protected_methods or #private_methods)" do
71
+ module_subjects.each do |subj|
72
+ (subj.singleton_methods & (subj.protected_methods + subj.private_methods)).should == []
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,219 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+
3
+ # NOTE: When checking collection against the rule, it's wiser to use `all?`, `any?` and `none?` and ONE `should` at the end. It's about 2 times faster
4
+ # than calling a `should` at every pass of an `each` loop.
5
+
6
+ describe "::ORI::Internals" do
7
+ mod = ::ORI::Internals
8
+
9
+ describe ".get_list_methods" do
10
+ meth = :get_list_methods
11
+
12
+ it "maintains uniqueness of output" do
13
+ list1 = mod.send(meth, :objs => [1])
14
+ list2 = mod.send(meth, :objs => [1, 1])
15
+ (list2 - list1).should be_empty
16
+
17
+ list1 = mod.send(meth, :objs => [Array])
18
+ list2 = mod.send(meth, :objs => [Array, Array])
19
+ (list2 - list1).should be_empty
20
+
21
+ list1 = mod.send(meth, :objs => [1])
22
+ list2 = mod.send(meth, :objs => [1, 2])
23
+ (list2 - list1).should be_empty
24
+ end
25
+
26
+ it "requires :objs option to be an Array" do
27
+ proc do
28
+ mod.send(meth)
29
+ end.should raise_error ArgumentError
30
+
31
+ proc do
32
+ mod.send(meth, :objs => 5)
33
+ end.should raise_error ArgumentError
34
+ end
35
+
36
+ it "supports :access option" do
37
+ proc do
38
+ mod.send(meth, :objs => [5], :access => 1)
39
+ mod.send(meth, :objs => [5], :access => "kk")
40
+ end.should raise_error ArgumentError
41
+
42
+ proc do
43
+ mod.send(meth, :objs => [5], :access => "#")
44
+ mod.send(meth, :objs => [5], :access => "::")
45
+ mod.send(meth, :objs => [5], :access => :"#")
46
+ mod.send(meth, :objs => [5], :access => :"::")
47
+ end.should_not raise_error
48
+
49
+ list_methods = mod.send(meth, :objs => [Time], :access => "::")
50
+ list_methods.all? {|r| r.access == "::"}.should == true
51
+
52
+ list_methods = mod.send(meth, :objs => [Time], :access => "#")
53
+ list_methods.all? {|r| r.access == "#"}.should == true
54
+ end
55
+
56
+ it "supports `:fullre` option" do
57
+ list_methods = mod.send(meth, :objs => [Module], :fullre => (re = /Object.*::/))
58
+ ##re = /kk/ #DEBUG: Fail by hand.
59
+ list_methods.all? do |r|
60
+ ##p "r", r
61
+ r.format(:color => false).match re
62
+ end.should == true
63
+ end
64
+
65
+ it "supports `:own` option" do
66
+ inputs = []
67
+ inputs << 5
68
+ inputs << []
69
+ inputs << String
70
+ inputs << Enumerable
71
+ inputs << Array
72
+ inputs << Class
73
+ inputs << Module
74
+ inputs << Object
75
+
76
+ inputs.each do |obj|
77
+ list_methods = mod.send(meth, :objs => [obj], :own => true)
78
+ list_methods.all? do |r|
79
+ ##p "r", r # Uncomment if fails.
80
+ r.own?
81
+ end.should == true
82
+ end
83
+
84
+ list_methods = mod.send(meth, :objs => inputs, :own => true)
85
+ list_methods.all? do |r|
86
+ ##p "r", r # Uncomment if fails.
87
+ r.own?
88
+ end.should == true
89
+ end
90
+
91
+ it "supports `:re` option" do
92
+ list_methods = mod.send(meth, :objs => [Module], :re => (re = /pub/))
93
+ ##re = /kk/ #DEBUG: Fail by hand.
94
+ list_methods.all? do |r|
95
+ ##p "r", r
96
+ r.method_name.match re
97
+ end.should == true
98
+ end
99
+
100
+ it "supports `:visibility` option" do
101
+ list_methods = mod.send(meth, :objs => [::Sample::BasicInheritance::Son], :all => true, :visibility => :public)
102
+ list_methods.all? do |r|
103
+ ##p "r", r
104
+ r.public?
105
+ end.should == true
106
+
107
+ list_methods = mod.send(meth, :objs => [::Sample::BasicInheritance::Son], :all => true, :visibility => :protected)
108
+ list_methods.all? do |r|
109
+ ##p "r", r
110
+ r.protected?
111
+ end.should == true
112
+
113
+ list_methods = mod.send(meth, :objs => [::Sample::BasicInheritance::Son], :all => true, :visibility => :private)
114
+ list_methods.all? do |r|
115
+ ##p "r", r
116
+ r.private?
117
+ end.should == true
118
+ end
119
+
120
+ describe "filtering" do
121
+ it "chops off all methods starting with '_ori_'" do
122
+ inputs = [5, "", [], String, Enumerable, Array, Class, Module, Object]
123
+ inputs.each do |obj|
124
+ list_methods = mod.send(meth, :objs => [obj])
125
+ list_methods.none? do |r|
126
+ ##p "r", r # Uncomment if fails.
127
+ r.method_name.match /\A_ori_/
128
+ end.should == true
129
+ end
130
+
131
+ list_methods = mod.send(meth, :objs => inputs)
132
+ list_methods.none? do |r|
133
+ ##p "r", r # Uncomment if fails.
134
+ r.method_name.match /\A_ori_/
135
+ end.should == true
136
+ end
137
+
138
+ it "chops off non-public Kernel methods if `obj` is not Kernel" do
139
+ inputs = [5, "", [], String, Enumerable, Array, Class, Module, Object]
140
+ inputs.each do |obj|
141
+ list_methods = mod.send(meth, :objs => [obj])
142
+ list_methods.none? do |r|
143
+ ##p "r", r # Uncomment if fails.
144
+ r.owner == Kernel and not r.public?
145
+ end.should == true
146
+
147
+ list_methods = mod.send(meth, :objs => inputs)
148
+ list_methods.none? do |r|
149
+ ##p "r", r # Uncomment if fails.
150
+ r.owner == Kernel and not r.public?
151
+ end.should == true
152
+ end
153
+ end
154
+
155
+ it "chops off non-public methods if `obj` is an object" do
156
+ inputs = [5, "", []]
157
+ inputs.each do |obj|
158
+ list_methods = mod.send(meth, :objs => [obj])
159
+ list_methods.none? do |r|
160
+ ##p "r", r # Uncomment if fails.
161
+ not r.public?
162
+ end.should == true
163
+ end
164
+ end
165
+
166
+ it "chops off others' private instance methods if `obj` is a module or a class" do
167
+ inputs = [String, Enumerable, Array, Class, Module, Object, ::Sample::BasicInheritance::Son]
168
+ inputs.each do |obj|
169
+ list_methods = mod.send(meth, :objs => [obj])
170
+ list_methods.none? do |r|
171
+ ##p "r", r # Uncomment if fails.
172
+ not r.own? and r.private? and r.instance?
173
+ end.should == true
174
+ end
175
+
176
+ list_methods = mod.send(meth, :objs => inputs)
177
+ list_methods.none? do |r|
178
+ ##p "r", r # Uncomment if fails.
179
+ not r.own? and r.private? and r.instance?
180
+ end.should == true
181
+ end
182
+
183
+ it "generally works for modules and classes" do
184
+ list_methods = mod.send(meth, :objs => [::Sample::BasicInheritance::Son])
185
+ list_methods.find {|r| r.method_name == "son_public"}.should_not be_nil
186
+ list_methods.find {|r| r.method_name == "son_protected"}.should_not be_nil
187
+ list_methods.find {|r| r.method_name == "son_private"}.should_not be_nil
188
+ list_methods.find {|r| r.method_name == "papa_public"}.should_not be_nil
189
+ list_methods.find {|r| r.method_name == "papa_protected"}.should_not be_nil
190
+ list_methods.find {|r| r.method_name == "grandpa_public"}.should_not be_nil
191
+ list_methods.find {|r| r.method_name == "grandpa_protected"}.should_not be_nil
192
+ list_methods.find {|r| r.method_name == "papa_private"}.should be_nil
193
+ list_methods.find {|r| r.method_name == "grandpa_private"}.should be_nil
194
+
195
+ list_methods = mod.send(meth, :objs => [::Sample::BasicExtension::Klass])
196
+ list_methods.find {|r| r.method_name == "public_meth"}.should_not be_nil
197
+ list_methods.find {|r| r.method_name == "protected_meth"}.should_not be_nil
198
+ list_methods.find {|r| r.method_name == "private_meth"}.should_not be_nil
199
+
200
+ list_methods = mod.send(meth, :objs => [::Sample::BasicExtension::OtherMo])
201
+ list_methods.find {|r| r.method_name == "public_meth"}.should_not be_nil
202
+ list_methods.find {|r| r.method_name == "protected_meth"}.should_not be_nil
203
+ list_methods.find {|r| r.method_name == "private_meth"}.should_not be_nil
204
+ end
205
+ end # filtering
206
+ end # .get_list_methods
207
+
208
+ describe ".get_ri_arg_prefix" do
209
+ meth = :get_ri_arg_prefix
210
+
211
+ it "generally works" do
212
+ mod.send(meth, "kaka").should == nil
213
+ mod.send(meth, "Object.ri").should == nil
214
+ mod.send(meth, " Object.ri ").should == nil
215
+ mod.send(meth, "Object.ri //").should == "Object.ri"
216
+ mod.send(meth, " Object.ri :x").should == " Object.ri"
217
+ end
218
+ end
219
+ end