ruby_ext 0.5.9 → 0.5.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -3
- data/lib/rake_ext/project.rb +1 -2
- data/lib/rspec_ext.rb +37 -35
- data/lib/rspec_ext/nokogiri.rb +26 -0
- data/lib/ruby_ext/core.rb +3 -5
- data/lib/ruby_ext/core/array.rb +1 -1
- data/lib/ruby_ext/core/basic_object.rb +1 -1
- data/lib/ruby_ext/core/deep_clone.rb +3 -10
- data/lib/ruby_ext/core/enumerable.rb +3 -3
- data/lib/ruby_ext/core/false_class.rb +1 -1
- data/lib/ruby_ext/core/hash.rb +23 -7
- data/lib/ruby_ext/core/module.rb +37 -57
- data/lib/ruby_ext/core/multiple_inheritance.rb +3 -3
- data/lib/ruby_ext/core/must.rb +0 -16
- data/lib/ruby_ext/core/nil_class.rb +5 -0
- data/lib/ruby_ext/core/object.rb +7 -7
- data/lib/ruby_ext/core/open_object.rb +7 -25
- data/lib/ruby_ext/core/string.rb +1 -6
- data/lib/ruby_ext/more.rb +2 -0
- data/lib/ruby_ext/more/callbacks.rb +37 -0
- data/lib/ruby_ext/more/declarative_cache.rb +45 -56
- data/lib/yaml_fix.rb +9 -0
- data/spec/core/array_spec.rb +1 -1
- data/spec/core/deep_clone_spec.rb +4 -2
- data/spec/core/enumerable.rb +1 -1
- data/spec/core/module_spec.rb +65 -107
- data/spec/core/multiple_inheritance_spec.rb +4 -4
- data/spec/core/must_spec.rb +1 -1
- data/spec/core/object_spec.rb +6 -6
- data/spec/core/open_object_spec.rb +1 -1
- data/spec/more/callbacks_spec.rb +90 -20
- data/spec/more/declarative_cache_spec.rb +96 -75
- data/spec/more/observable_spec.rb +10 -34
- data/spec/more/open_constructor_spec.rb +14 -11
- data/spec/spec_helper.rb +2 -0
- metadata +5 -6
- data/lib/rspec_ext/xhtml.rb +0 -48
- data/lib/ruby_ext/fixes.rb +0 -6
- data/spec/core/spec_helper.rb +0 -2
- data/spec/more/spec_helper.rb +0 -2
@@ -1,4 +1,4 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe "Multiple Inheritance" do
|
4
4
|
after do
|
@@ -28,7 +28,7 @@ describe "Multiple Inheritance" do
|
|
28
28
|
A.new.should respond_to(:instance_method)
|
29
29
|
A.new.should respond_to(:some_accessor)
|
30
30
|
|
31
|
-
M.directly_included_by.should ==
|
31
|
+
M.directly_included_by.should == {A => true}
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should inherit all ancestors class methods" do
|
@@ -58,8 +58,8 @@ describe "Multiple Inheritance" do
|
|
58
58
|
B.should respond_to(:class_method2)
|
59
59
|
B.new.should respond_to(:instance_method)
|
60
60
|
|
61
|
-
M.directly_included_by.should ==
|
62
|
-
M2.directly_included_by.should ==
|
61
|
+
M.directly_included_by.should == {M2 => true}
|
62
|
+
M2.directly_included_by.should == {B => true}
|
63
63
|
end
|
64
64
|
|
65
65
|
it "shouldn't redefine ancestors class methods" do
|
data/spec/core/must_spec.rb
CHANGED
data/spec/core/object_spec.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe 'Object' do
|
4
|
-
after
|
4
|
+
after{remove_constants :Tmp}
|
5
5
|
|
6
6
|
it "respond_to" do
|
7
|
-
class
|
7
|
+
class Tmp
|
8
8
|
def test; 2 end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
o = Tmp.new
|
12
|
+
o.respond_to(:not_exist).should be_nil
|
13
|
+
o.respond_to(:test).should == 2
|
14
14
|
end
|
15
15
|
end
|
data/spec/more/callbacks_spec.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Callbacks" do
|
4
|
-
before
|
5
|
-
|
6
|
-
class CallbacksSpec::Basic
|
4
|
+
before do
|
5
|
+
class ABase
|
7
6
|
inherit RubyExt::Callbacks
|
8
7
|
|
9
8
|
set_callback :save, :before, :before_save
|
@@ -17,10 +16,10 @@ describe "Callbacks" do
|
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
20
|
-
after
|
19
|
+
after{remove_constants :ABase, :SomeClass, :AnotherClass}
|
21
20
|
|
22
21
|
it "basic" do
|
23
|
-
o =
|
22
|
+
o = ABase.new
|
24
23
|
o.should_receive :before_save
|
25
24
|
o.should_receive :around_save_called
|
26
25
|
o.should_receive :after_save
|
@@ -28,7 +27,7 @@ describe "Callbacks" do
|
|
28
27
|
end
|
29
28
|
|
30
29
|
it "should be possible to call before & after separatelly (in this mode :around is not available)" do
|
31
|
-
o =
|
30
|
+
o = ABase.new
|
32
31
|
o.should_receive :before_save
|
33
32
|
o.run_before_callbacks(:save)
|
34
33
|
o.should_receive :after_save
|
@@ -36,7 +35,7 @@ describe "Callbacks" do
|
|
36
35
|
end
|
37
36
|
|
38
37
|
it "blocks" do
|
39
|
-
class
|
38
|
+
class SomeClass
|
40
39
|
inherit RubyExt::Callbacks
|
41
40
|
|
42
41
|
set_callback(:save, :before){|controller| controller.result << :before}
|
@@ -55,13 +54,13 @@ describe "Callbacks" do
|
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
58
|
-
o =
|
57
|
+
o = SomeClass.new
|
59
58
|
o.run_callbacks(:save){"result"}.should == "result"
|
60
59
|
o.result.should == [:before, :around_begin, :after, :around_end]
|
61
60
|
end
|
62
61
|
|
63
62
|
it "execution order" do
|
64
|
-
class
|
63
|
+
class SomeClass
|
65
64
|
inherit RubyExt::Callbacks
|
66
65
|
|
67
66
|
# order is important, don't change it
|
@@ -77,7 +76,7 @@ describe "Callbacks" do
|
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
80
|
-
o =
|
79
|
+
o = SomeClass.new
|
81
80
|
o.should_receive(:before1).ordered.once
|
82
81
|
o.should_receive(:around1_called).ordered.once
|
83
82
|
o.should_receive(:before2).ordered.once
|
@@ -86,11 +85,11 @@ describe "Callbacks" do
|
|
86
85
|
end
|
87
86
|
|
88
87
|
it "inheritance" do
|
89
|
-
class
|
88
|
+
class SomeClass < ABase
|
90
89
|
set_callback :save, :before, :before_save2
|
91
90
|
end
|
92
91
|
|
93
|
-
o =
|
92
|
+
o = SomeClass.new
|
94
93
|
o.should_receive :before_save
|
95
94
|
o.should_receive :before_save2
|
96
95
|
o.should_receive :around_save_called
|
@@ -99,7 +98,7 @@ describe "Callbacks" do
|
|
99
98
|
end
|
100
99
|
|
101
100
|
it 'terminator' do
|
102
|
-
class
|
101
|
+
class SomeClass
|
103
102
|
inherit RubyExt::Callbacks
|
104
103
|
|
105
104
|
set_callback :save, :before, :before_save, terminator: false
|
@@ -117,23 +116,23 @@ describe "Callbacks" do
|
|
117
116
|
end
|
118
117
|
end
|
119
118
|
|
120
|
-
o =
|
119
|
+
o = SomeClass.new
|
121
120
|
o.should_not_receive :before_save2
|
122
121
|
o.run_callbacks(:save){"result"}.should_not == "result"
|
123
122
|
end
|
124
123
|
|
125
124
|
it 'conditions' do
|
126
|
-
class
|
125
|
+
class SomeClass
|
127
126
|
inherit RubyExt::Callbacks
|
128
127
|
|
129
128
|
set_callback :save, :before, :before_save, only: :another_method
|
130
129
|
end
|
131
130
|
|
132
|
-
o =
|
131
|
+
o = SomeClass.new
|
133
132
|
o.should_not_receive :before_save
|
134
133
|
o.run_callbacks(:save, method: :method){"result"}.should == 'result'
|
135
134
|
|
136
|
-
o =
|
135
|
+
o = SomeClass.new
|
137
136
|
o.should_receive :before_save
|
138
137
|
o.run_callbacks(:save, method: :another_method){"result"}.should == 'result'
|
139
138
|
end
|
@@ -173,7 +172,7 @@ describe "Callbacks" do
|
|
173
172
|
|
174
173
|
|
175
174
|
it "around callback should be able to change result value" do
|
176
|
-
class
|
175
|
+
class SomeClass
|
177
176
|
inherit RubyExt::Callbacks
|
178
177
|
|
179
178
|
set_callback :save, :around, :around_save
|
@@ -184,7 +183,78 @@ describe "Callbacks" do
|
|
184
183
|
end
|
185
184
|
end
|
186
185
|
|
187
|
-
o =
|
186
|
+
o = SomeClass.new
|
188
187
|
o.run_callbacks(:save){"result"}.should == 'another result'
|
189
188
|
end
|
189
|
+
|
190
|
+
describe "wrapping methods in callbacks" do
|
191
|
+
it "wrap_method_with_callbacks" do
|
192
|
+
class SomeClass
|
193
|
+
inherit RubyExt::Callbacks
|
194
|
+
|
195
|
+
set_callback :save, :before, :before_save
|
196
|
+
|
197
|
+
def update
|
198
|
+
'ok'
|
199
|
+
end
|
200
|
+
|
201
|
+
wrap_method_with_callbacks :update, :save
|
202
|
+
end
|
203
|
+
|
204
|
+
o = SomeClass.new
|
205
|
+
o.should_receive(:before_save).once
|
206
|
+
o.update.should == 'ok'
|
207
|
+
end
|
208
|
+
|
209
|
+
it "wrap_with_callbacks" do
|
210
|
+
class SomeClass
|
211
|
+
inherit RubyExt::Callbacks
|
212
|
+
def update; end
|
213
|
+
|
214
|
+
should_receive(:wrap_method_with_callbacks).with(:update, :save)
|
215
|
+
wrap_with_callback :save
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
it "callbacks for method with super call should be called only once" do
|
220
|
+
class SomeClass
|
221
|
+
inherit RubyExt::Callbacks
|
222
|
+
|
223
|
+
set_callback :save, :before, :before_save
|
224
|
+
|
225
|
+
def update
|
226
|
+
'ok'
|
227
|
+
end
|
228
|
+
wrap_method_with_callbacks :update, :save
|
229
|
+
end
|
230
|
+
|
231
|
+
class AnotherClass < SomeClass
|
232
|
+
def update
|
233
|
+
super
|
234
|
+
'ok2'
|
235
|
+
end
|
236
|
+
wrap_method_with_callbacks :update, :save
|
237
|
+
end
|
238
|
+
|
239
|
+
o = AnotherClass.new
|
240
|
+
o.should_receive(:before_save).once
|
241
|
+
o.update.should == 'ok2'
|
242
|
+
end
|
243
|
+
|
244
|
+
it "run_callbacks_only_once" do
|
245
|
+
class SomeClass
|
246
|
+
inherit RubyExt::Callbacks
|
247
|
+
|
248
|
+
set_callback :save, :before, :before_save
|
249
|
+
end
|
250
|
+
|
251
|
+
o = SomeClass.new
|
252
|
+
o.should_receive(:before_save).once
|
253
|
+
(o.run_callbacks_only_once :save do
|
254
|
+
o.run_callbacks_only_once :save do
|
255
|
+
'result'
|
256
|
+
end
|
257
|
+
end).should == 'result'
|
258
|
+
end
|
259
|
+
end
|
190
260
|
end
|
@@ -1,44 +1,58 @@
|
|
1
|
-
require "
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe 'DeclarativeCache' do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
4
|
+
after{remove_constants :Tmp, :TmpModule}
|
5
|
+
|
6
|
+
# class CachedClass
|
7
|
+
# attr_accessor :value
|
8
|
+
# def value_get; @value end
|
9
|
+
# cache_method :value_get
|
10
|
+
#
|
11
|
+
# attr_accessor :value2
|
12
|
+
# def value2_get; @value2 end
|
13
|
+
#
|
14
|
+
# attr_accessor :params
|
15
|
+
# def params_get param; @params[param] end
|
16
|
+
#
|
17
|
+
# attr_accessor :multiplier
|
18
|
+
# def *(arg)
|
19
|
+
# @multiplier * arg
|
20
|
+
# end
|
21
|
+
# cache_method_with_params '*'
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# RubyExt::DeclarativeCache.cache_method CachedClass, :value2_get
|
25
|
+
# RubyExt::DeclarativeCache.cache_method_with_params CachedClass, :params_get
|
26
|
+
|
27
|
+
it "basics" do
|
28
|
+
class Tmp
|
29
|
+
attr_accessor :value
|
30
|
+
def value_get; @value end
|
31
|
+
cache_method :value_get
|
18
32
|
end
|
19
|
-
cache_method_with_params '*'
|
20
|
-
end
|
21
|
-
|
22
|
-
RubyExt::DeclarativeCache.cache_method CachedClass, :value2_get
|
23
|
-
RubyExt::DeclarativeCache.cache_method_with_params CachedClass, :params_get
|
24
33
|
|
25
|
-
|
26
|
-
o = CachedClass.new
|
34
|
+
o = Tmp.new
|
27
35
|
o.value = 0
|
28
|
-
o.value2 = 0
|
29
36
|
o.value_get.should == 0
|
30
|
-
o.value2_get.should == 0
|
31
37
|
|
32
38
|
o.value = 1
|
33
|
-
o.value2 = 1
|
34
39
|
o.value_get.should == 0
|
35
|
-
o.value2_get.should == 0
|
36
40
|
end
|
37
41
|
|
38
|
-
it "should define
|
39
|
-
|
42
|
+
it "should define {method}_with_cache and {method}_without_cache methods" do
|
43
|
+
class Tmp
|
44
|
+
attr_accessor :value
|
45
|
+
def value_get; @value end
|
46
|
+
cache_method :value_get
|
47
|
+
|
48
|
+
attr_accessor :params
|
49
|
+
def params_get param; @params[param] end
|
50
|
+
cache_method_with_params :params_get
|
51
|
+
end
|
52
|
+
|
53
|
+
o = Tmp.new
|
40
54
|
|
41
|
-
#
|
55
|
+
# Without params.
|
42
56
|
o.value = 0
|
43
57
|
o.value_get.should == 0
|
44
58
|
o.value = 1
|
@@ -46,7 +60,7 @@ describe 'DeclarativeCache' do
|
|
46
60
|
o.value_get_with_cache.should == 0
|
47
61
|
o.value_get_without_cache.should == 1
|
48
62
|
|
49
|
-
#
|
63
|
+
# With params.
|
50
64
|
o.params = {a: :b}
|
51
65
|
o.params_get(:a).should == :b
|
52
66
|
o.params = {a: :c}
|
@@ -56,7 +70,13 @@ describe 'DeclarativeCache' do
|
|
56
70
|
end
|
57
71
|
|
58
72
|
it "clear_cache" do
|
59
|
-
|
73
|
+
class Tmp
|
74
|
+
attr_accessor :value
|
75
|
+
def value_get; @value end
|
76
|
+
cache_method :value_get
|
77
|
+
end
|
78
|
+
|
79
|
+
o = Tmp.new
|
60
80
|
o.value = 0
|
61
81
|
o.value_get.should == 0
|
62
82
|
|
@@ -67,13 +87,24 @@ describe 'DeclarativeCache' do
|
|
67
87
|
o.value_get.should == 1
|
68
88
|
end
|
69
89
|
|
70
|
-
it "should check for
|
71
|
-
|
90
|
+
it "should check for method signature" do
|
91
|
+
class Tmp
|
92
|
+
def value_get; @value end
|
93
|
+
cache_method :value_get
|
94
|
+
end
|
95
|
+
|
96
|
+
o = Tmp.new
|
72
97
|
lambda{o.value_get(1)}.should raise_error(/cache_method_with_params/)
|
73
98
|
end
|
74
99
|
|
75
|
-
it "
|
76
|
-
|
100
|
+
it "cache_method_with_params" do
|
101
|
+
class Tmp
|
102
|
+
attr_accessor :params
|
103
|
+
def params_get param; @params[param] end
|
104
|
+
cache_method_with_params :params_get
|
105
|
+
end
|
106
|
+
|
107
|
+
o = Tmp.new
|
77
108
|
o.params = {a: :b}
|
78
109
|
o.params_get(:a).should == :b
|
79
110
|
o.params = {a: :c}
|
@@ -81,62 +112,52 @@ describe 'DeclarativeCache' do
|
|
81
112
|
end
|
82
113
|
|
83
114
|
it "should works with operators" do
|
84
|
-
|
115
|
+
class Tmp
|
116
|
+
attr_accessor :multiplier
|
117
|
+
def *(arg)
|
118
|
+
@multiplier * arg
|
119
|
+
end
|
120
|
+
cache_method_with_params '*'
|
121
|
+
end
|
122
|
+
|
123
|
+
o = Tmp.new
|
85
124
|
o.multiplier = 2
|
86
125
|
(o * 2).should == 4
|
87
126
|
o.multiplier = 3
|
88
127
|
(o * 2).should == 4
|
89
128
|
end
|
90
129
|
|
91
|
-
|
92
|
-
class
|
93
|
-
|
94
|
-
|
95
|
-
|
130
|
+
it "should works with singleton classes" do
|
131
|
+
class Tmp
|
132
|
+
class << self
|
133
|
+
attr_accessor :value
|
134
|
+
def value_get; @value end
|
135
|
+
cache_method :value_get
|
136
|
+
end
|
96
137
|
end
|
97
|
-
end
|
98
138
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
CachedClass2.value_get.should == 0
|
139
|
+
Tmp.value = 0
|
140
|
+
Tmp.value_get.should == 0
|
141
|
+
Tmp.value = 1
|
142
|
+
Tmp.value_get.should == 0
|
104
143
|
end
|
105
144
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
145
|
+
it "should works with included modules (from error)" do
|
146
|
+
module TmpModule
|
147
|
+
attr_accessor :value
|
148
|
+
def value_get; @value end
|
149
|
+
cache_method :value_get
|
150
|
+
end
|
111
151
|
|
112
|
-
|
113
|
-
|
114
|
-
|
152
|
+
class Tmp
|
153
|
+
include TmpModule
|
154
|
+
end
|
115
155
|
|
116
|
-
|
117
|
-
o = CachedClass.new
|
156
|
+
o = Tmp.new
|
118
157
|
o.value = 0
|
119
158
|
o.value_get.should == 0
|
120
159
|
|
121
160
|
o.value = 1
|
122
161
|
o.value_get.should == 0
|
123
162
|
end
|
124
|
-
|
125
|
-
class CachedClass4
|
126
|
-
attr_accessor :value
|
127
|
-
def value_get; @value end
|
128
|
-
end
|
129
|
-
|
130
|
-
it "should not cache twice, and should works" do
|
131
|
-
CachedClass4.cache_method :value_get
|
132
|
-
|
133
|
-
Object.should_receive(:warn){|msg| msg =~ /twice/}
|
134
|
-
CachedClass4.cache_method :value_get
|
135
|
-
|
136
|
-
o = CachedClass.new
|
137
|
-
o.value = 0
|
138
|
-
o.value_get.should == 0
|
139
|
-
o.value = 1
|
140
|
-
o.value_get.should == 0
|
141
|
-
end
|
142
163
|
end
|