include_complete 0.1.0-i386-mswin32 → 0.1.2-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ 1/11/2010 version 0.1.2
2
+ * Anonymous module's #to_s now returns "Anon"
1
3
  1/11/2010 *NAME CHANGE* TO include_complete, version reset to 0.1.0
2
4
  * now called include_complete
3
5
  22/10/2010 version 0.2.2
@@ -1,3 +1,4 @@
1
+ /* include_complete_one.c */
1
2
  /* (c) 2010 John Mair (banisterfiend), MIT license */
2
3
  /* */
3
4
  /* include a module (and its singleton) into an inheritance chain */
@@ -10,11 +11,18 @@ static VALUE
10
11
  class_to_s(VALUE self)
11
12
  {
12
13
  VALUE attached = rb_iv_get(self, "__attached__");
14
+ VALUE name;
13
15
 
14
16
  if (attached)
15
- return rb_mod_name(rb_iv_get(attached, "__module__"));
17
+ name = rb_mod_name(rb_iv_get(attached, "__module__"));
16
18
  else
17
- return rb_mod_name(rb_iv_get(self, "__module__"));
19
+ name = rb_mod_name(rb_iv_get(self, "__module__"));
20
+
21
+ /* if module does not have a name, return "Anon" */
22
+ if (NIL_P(name) || RSTRING_LEN(name) == 0)
23
+ return rb_str_new2("Anon");
24
+ else
25
+ return name;
18
26
  }
19
27
 
20
28
  /* totally hacked up version of include_class_new() from class.c; brings in singletons into inheritance chain */
@@ -51,7 +59,7 @@ include_class_new(VALUE module, VALUE super)
51
59
  RCLASS_SUPER(klass) = super;
52
60
 
53
61
  if (TYPE(module) == T_MODULE || FL_TEST(module, FL_SINGLETON))
54
- rb_iv_set((VALUE)klass, "__module__", module);
62
+ rb_iv_set(klass, "__module__", module);
55
63
 
56
64
  /* create IClass for module's singleton */
57
65
  /* if super is 0 then we're including into a module (not a class), so treat as special case */
@@ -149,3 +157,4 @@ void
149
157
  Init_include_complete_one() {
150
158
  rb_define_method(rb_cModule, "include_complete_one", rb_include_complete_module_one, 1);
151
159
  }
160
+
Binary file
Binary file
@@ -34,7 +34,7 @@ class Module
34
34
  # end
35
35
  # C.hello #=> "hello"
36
36
  def include_complete(*mods)
37
- mods.each do |mod|
37
+ mods.reverse.each do |mod|
38
38
  include_complete_one mod
39
39
  end
40
40
  self
@@ -1,3 +1,3 @@
1
1
  module IncludeComplete
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
data/test/test.rb CHANGED
@@ -7,256 +7,265 @@ require 'bacon'
7
7
  puts "Testing IncludeComplete version #{IncludeComplete::VERSION}..."
8
8
  puts "Ruby version #{RUBY_VERSION}"
9
9
 
10
- describe 'Including a module into a class using include_complete' do
11
- before do
12
- @m = Module.new {
13
- def self.class_method
14
- :class_method
15
- end
16
-
17
- def instance_method
18
- :instance_method
19
- end
20
- }
21
-
22
- @m::CONST = :const
23
-
24
- @c = Class.new
25
-
26
- @c.send(:include_complete, @m)
27
- end
28
-
29
- it 'should make class methods accessible to class' do
30
- @c.class_method.should.equal :class_method
31
- end
32
-
33
- it 'should make instance methods accessible to instances of the class' do
34
- obj = @c.new
35
- obj.instance_method.should.equal :instance_method
36
- end
37
-
38
- it 'should make constants accessible to the class' do
39
- lambda { @c::CONST }.should.not.raise NameError
40
- end
41
- end
42
-
43
- describe 'Extending a module into a class using extend_complete' do
44
- before do
45
- @m = Module.new {
46
- def self.class_method
47
- :class_method
48
- end
49
-
50
- def instance_method
51
- :instance_method
52
- end
53
- }
54
-
55
- @m::CONST = :const
56
-
57
- @c = Class.new
58
-
59
- @c.send(:extend_complete, @m)
60
- end
61
-
62
- it 'should make instance methods from the module available as class methods on the class' do
63
- @c.instance_method.should.equal :instance_method
64
- end
65
-
66
- it 'should make class methods from the module available as class methods on the singleton class' do
67
- class << @c; self; end.class_method.should.equal :class_method
68
- end
69
- end
70
-
71
-
72
- describe 'Including a module into a module and then into a class using include_complete' do
10
+ describe IncludeComplete do
11
+ describe 'Including a module into a class using include_complete' do
73
12
  before do
74
- @m1 = Module.new {
75
- def self.class_method1
76
- :class_method1
77
- end
13
+ @m = Module.new {
14
+ def self.class_method
15
+ :class_method
16
+ end
78
17
 
79
- def instance_method1
80
- :instance_method1
81
- end
82
- }
18
+ def instance_method
19
+ :instance_method
20
+ end
21
+ }
83
22
 
84
- @m1::CONST1 = :const1
23
+ @m::CONST = :const
85
24
 
86
- @m2 = Module.new {
87
- def self.class_method2
88
- :class_method2
89
- end
25
+ @c = Class.new
90
26
 
91
- def instance_method2
92
- :instance_method2
93
- end
94
- }
95
- @m2.send(:include_complete, @m1)
27
+ @c.send(:include_complete, @m)
28
+ end
96
29
 
97
- @m2::CONST2 = :const2
30
+ it 'should make class methods accessible to class' do
31
+ @c.class_method.should.equal :class_method
32
+ end
98
33
 
99
- @c = Class.new
100
-
101
- @c.send(:include_complete, @m2)
102
- end
34
+ it 'should make instance methods accessible to instances of the class' do
35
+ obj = @c.new
36
+ obj.instance_method.should.equal :instance_method
37
+ end
103
38
 
104
- it 'should make class methods on m1 accessible to m2' do
105
- @m2.class_method1.should.equal :class_method1
39
+ it 'should make constants accessible to the class' do
40
+ lambda { @c::CONST }.should.not.raise NameError
41
+ end
106
42
  end
107
43
 
108
- it 'should make constants on m1 and m2 accessible to class' do
109
- lambda { @c::CONST1 == :const1 }.should.not.raise NameError
110
- lambda { @m2::CONST1 == :const1 }.should.not.raise NameError
111
- lambda { @c::CONST2 == :const2 }.should.not.raise NameError
112
- end
113
-
114
- it 'should make class methods on modules m1 and m2 accessible to class' do
115
- @c.class_method1.should.equal :class_method1
116
- @c.class_method2.should.equal :class_method2
117
- end
118
-
119
- it 'should make instance methods on modules m1 and m2 accessible to instances of class' do
120
- obj = @c.new
121
-
122
- obj.instance_method1.should.equal :instance_method1
123
- obj.instance_method2.should.equal :instance_method2
124
- end
125
-
126
- it 'should make ancestor chain "look" accurate' do
127
- @m1 = Module.new {
128
- def self.class_method1
129
- :class_method1
130
- end
131
-
132
- def instance_method1
133
- :instance_method1
134
- end
135
- }
136
-
137
- Object.const_set(:M1, @m1)
138
-
139
- @m2 = Module.new {
140
- def self.class_method2
141
- :class_method2
142
- end
143
-
144
- def instance_method2
145
- :instance_method2
146
- end
147
- }
148
- Object.const_set(:M2, @m2)
149
-
150
- @m2.send(:include_complete, @m1)
151
-
152
- @c = Class.new
153
-
154
- @c.send(:include_complete, @m2)
155
-
156
- @c.ancestors[1].to_s.should.equal M2.name
157
- @c.class_method1.should.equal :class_method1
158
- @c.class_method2.should.equal :class_method2
159
- end
160
-
161
- it 'should work if real_including a module that has another module included using Module#include' do
162
- @m1 = Module.new {
163
- def self.class_method1
164
- :class_method1
165
- end
166
-
167
- def instance_method1
168
- :instance_method1
169
- end
170
- }
44
+ describe 'Extending a module into a class using extend_complete' do
45
+ before do
46
+ @m = Module.new {
47
+ def self.class_method
48
+ :class_method
49
+ end
171
50
 
172
- Object.const_set(:N1, @m1)
51
+ def instance_method
52
+ :instance_method
53
+ end
54
+ }
173
55
 
174
- @m2 = Module.new {
175
- def self.class_method2
176
- :class_method2
177
- end
56
+ @m::CONST = :const
178
57
 
179
- def instance_method2
180
- :instance_method2
181
- end
182
- }
183
- Object.const_set(:N2, @m2)
58
+ @c = Class.new
184
59
 
185
- @m2.send(:include, @m1)
60
+ @c.send(:extend_complete, @m)
61
+ end
186
62
 
187
- @c = Class.new
63
+ it 'should make instance methods from the module available as class methods on the class' do
64
+ @c.instance_method.should.equal :instance_method
65
+ end
188
66
 
189
- @c.send(:include_complete, @m2)
190
-
191
- @c.ancestors[1].to_s.should.equal N2.name
192
- @c.ancestors[2].to_s.should.equal N1.name
193
- @c.class_method1.should.equal :class_method1
194
- @c.class_method2.should.equal :class_method2
67
+ it 'should make class methods from the module available as class methods on the singleton class' do
68
+ class << @c; self; end.class_method.should.equal :class_method
69
+ end
195
70
  end
196
71
 
197
- it 'should work if Module#including a module that has another module included using include_complete' do
198
- @m1 = Module.new {
199
- def self.class_method1
200
- :class_method1
201
- end
202
-
203
- def instance_method1
204
- :instance_method1
205
- end
206
- }
207
-
208
- Object.const_set(:K1, @m1)
209
-
210
- @m2 = Module.new {
211
- def self.class_method2
212
- :class_method2
213
- end
214
-
215
- def instance_method2
216
- :instance_method2
217
- end
218
- }
219
- Object.const_set(:K2, @m2)
220
-
221
- @m2.send(:include_complete, @m1)
222
-
223
- @c = Class.new
224
-
225
- @c.send(:include, @m2)
226
-
227
- @c.ancestors[1].should.equal K2
228
- @c.ancestors[2].should.equal K1
229
- @c.new.instance_method1.should.equal :instance_method1
230
- @c.new.instance_method2.should.equal :instance_method2
231
- end
232
72
 
73
+ describe 'Including a module into a module and then into a class using include_complete' do
74
+ before do
75
+ @m1 = Module.new {
76
+ def self.class_method1
77
+ :class_method1
78
+ end
79
+
80
+ def instance_method1
81
+ :instance_method1
82
+ end
83
+ }
84
+
85
+ @m1::CONST1 = :const1
86
+
87
+ @m2 = Module.new {
88
+ def self.class_method2
89
+ :class_method2
90
+ end
91
+
92
+ def instance_method2
93
+ :instance_method2
94
+ end
95
+ }
96
+ @m2.send(:include_complete, @m1)
97
+
98
+ @m2::CONST2 = :const2
99
+
100
+ @c = Class.new
101
+
102
+ @c.send(:include_complete, @m2)
103
+ end
104
+
105
+ it 'should make class methods on m1 accessible to m2' do
106
+ @m2.class_method1.should.equal :class_method1
107
+ end
108
+
109
+ it 'should make constants on m1 and m2 accessible to class' do
110
+ lambda { @c::CONST1 == :const1 }.should.not.raise NameError
111
+ lambda { @m2::CONST1 == :const1 }.should.not.raise NameError
112
+ lambda { @c::CONST2 == :const2 }.should.not.raise NameError
113
+ end
114
+
115
+ it 'should make class methods on modules m1 and m2 accessible to class' do
116
+ @c.class_method1.should.equal :class_method1
117
+ @c.class_method2.should.equal :class_method2
118
+ end
119
+
120
+ it 'should make instance methods on modules m1 and m2 accessible to instances of class' do
121
+ obj = @c.new
122
+
123
+ obj.instance_method1.should.equal :instance_method1
124
+ obj.instance_method2.should.equal :instance_method2
125
+ end
126
+
127
+ it 'should make ancestor chain "look" accurate' do
128
+ @m1 = Module.new {
129
+ def self.class_method1
130
+ :class_method1
131
+ end
132
+
133
+ def instance_method1
134
+ :instance_method1
135
+ end
136
+ }
137
+
138
+ Object.const_set(:M1, @m1)
139
+
140
+ @m2 = Module.new {
141
+ def self.class_method2
142
+ :class_method2
143
+ end
144
+
145
+ def instance_method2
146
+ :instance_method2
147
+ end
148
+ }
149
+ Object.const_set(:M2, @m2)
150
+
151
+ @m2.send(:include_complete, @m1)
152
+
153
+ @c = Class.new
154
+
155
+ @c.send(:include_complete, @m2)
156
+
157
+ @c.ancestors[1].to_s.should.equal M2.name
158
+ @c.class_method1.should.equal :class_method1
159
+ @c.class_method2.should.equal :class_method2
160
+ end
161
+
162
+ it 'should work if real_including a module that has another module included using Module#include' do
163
+ @m1 = Module.new {
164
+ def self.class_method1
165
+ :class_method1
166
+ end
167
+
168
+ def instance_method1
169
+ :instance_method1
170
+ end
171
+ }
172
+
173
+ Object.const_set(:N1, @m1)
174
+
175
+ @m2 = Module.new {
176
+ def self.class_method2
177
+ :class_method2
178
+ end
179
+
180
+ def instance_method2
181
+ :instance_method2
182
+ end
183
+ }
184
+ Object.const_set(:N2, @m2)
185
+
186
+ @m2.send(:include, @m1)
187
+
188
+ @c = Class.new
189
+
190
+ @c.send(:include_complete, @m2)
191
+
192
+ @c.ancestors[1].to_s.should.equal N2.name
193
+ @c.ancestors[2].to_s.should.equal N1.name
194
+ @c.class_method1.should.equal :class_method1
195
+ @c.class_method2.should.equal :class_method2
196
+ end
197
+
198
+ it 'should work if Module#including a module that has another module included using include_complete' do
199
+ @m1 = Module.new {
200
+ def self.class_method1
201
+ :class_method1
202
+ end
203
+
204
+ def instance_method1
205
+ :instance_method1
206
+ end
207
+ }
208
+
209
+ Object.const_set(:K1, @m1)
210
+
211
+ @m2 = Module.new {
212
+ def self.class_method2
213
+ :class_method2
214
+ end
215
+
216
+ def instance_method2
217
+ :instance_method2
218
+ end
219
+ }
220
+ Object.const_set(:K2, @m2)
221
+
222
+ @m2.send(:include_complete, @m1)
223
+
224
+ @c = Class.new
225
+
226
+ @c.send(:include, @m2)
227
+
228
+ @c.ancestors[1].should.equal K2
229
+ @c.ancestors[2].should.equal K1
230
+ @c.new.instance_method1.should.equal :instance_method1
231
+ @c.new.instance_method2.should.equal :instance_method2
232
+ end
233
+
234
+ it 'should show an anonymous module as "Anon" in ancestor chain' do
235
+ c = Class.new
236
+ c.include_complete Module.new
237
+ c.ancestors[1].to_s.should == "Anon"
238
+ end
239
+
233
240
 
234
- it 'should work with multiple modules passed to include_complete' do
235
- @m1 = Module.new {
236
- def self.class_method1
237
- :class_method1
238
- end
239
-
240
- def instance_method1
241
- :instance_method1
242
- end
243
- }
244
-
245
- @m2 = Module.new {
246
- def self.class_method2
247
- :class_method2
248
- end
249
-
250
- def instance_method2
251
- :instance_method2
252
- end
253
- }
254
-
255
- @c = Class.new
256
- @c.send(:include_complete, @m2, @m1)
241
+ it 'should work with multiple modules passed to include_complete' do
242
+ @m1 = Module.new {
243
+ def self.class_method1
244
+ :class_method1
245
+ end
246
+
247
+ def instance_method1
248
+ :instance_method1
249
+ end
250
+ }
251
+
252
+ @m2 = Module.new {
253
+ def self.class_method2
254
+ :class_method2
255
+ end
256
+
257
+ def instance_method2
258
+ :instance_method2
259
+ end
260
+ }
261
+
262
+ @c = Class.new
263
+ @c.send(:include_complete, @m2, @m1)
264
+
265
+ @c.class_method1.should.equal :class_method1
266
+ @c.class_method2.should.equal :class_method2
267
+ @c.ancestors[1..2].map { |v| v.to_s }.should == ["Anon", "Anon"]
268
+ end
257
269
 
258
- @c.class_method1.should.equal :class_method1
259
- @c.class_method2.should.equal :class_method2
260
270
  end
261
-
262
271
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: include_complete
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 1
9
- - 0
10
- version: 0.1.0
8
+ - 2
9
+ version: 0.1.2
11
10
  platform: i386-mswin32
12
11
  authors:
13
12
  - John Mair (banisterfiend)
@@ -56,7 +55,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
55
  requirements:
57
56
  - - ">="
58
57
  - !ruby/object:Gem::Version
59
- hash: 3
60
58
  segments:
61
59
  - 0
62
60
  version: "0"
@@ -65,7 +63,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
63
  requirements:
66
64
  - - ">="
67
65
  - !ruby/object:Gem::Version
68
- hash: 3
69
66
  segments:
70
67
  - 0
71
68
  version: "0"