patriarch 0.2.1 → 0.2.2
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/lib/patriarch/behaviours.rb +103 -12
- data/lib/patriarch/version.rb +1 -1
- data/spec/lib/patriarch/behaviours_spec.rb +112 -49
- data/spec/spec_helper.rb +1 -0
- metadata +14 -14
data/lib/patriarch/behaviours.rb
CHANGED
@@ -20,7 +20,7 @@ module Patriarch
|
|
20
20
|
class << self
|
21
21
|
|
22
22
|
# Helper function to complete the anonymous module we include later in the process in the enhanced model class
|
23
|
-
def complete_custom_active_module_bipartite(module_to_complete,relation_type,acted_on_model_list)
|
23
|
+
def complete_custom_active_module_bipartite(module_to_complete,relation_type,acted_on_model_list,options={})
|
24
24
|
module_to_complete.class_eval do
|
25
25
|
|
26
26
|
acted_on_model_list.each do |acted_on_model|
|
@@ -36,16 +36,23 @@ module Patriarch
|
|
36
36
|
Patriarch::ToolServices::RedisExtractorService.instance.
|
37
37
|
get_models_from_ids(self,acted_on_model.to_s.classify.constantize,raw_tool_method_name,options)
|
38
38
|
end
|
39
|
+
if options[:relation_type_alias]
|
40
|
+
alias_for_classic = classic_tool_method_name.sub(relation_type.to_s, options[:relation_type_alias].to_s)
|
41
|
+
alias_method alias_for_classic, classic_tool_method_name
|
42
|
+
end
|
39
43
|
|
40
44
|
define_method(raw_tool_method_name) do |options={}|
|
41
45
|
Patriarch::ToolServices::RedisExtractorService.instance.get_ids_from_sorted_set(self,redis_key,options)
|
42
46
|
end
|
43
|
-
|
47
|
+
if options[:relation_type_alias]
|
48
|
+
alias_for_raw = raw_tool_method_name.sub(relation_type.to_s, options[:relation_type_alias].to_s)
|
49
|
+
alias_method alias_for_raw, raw_tool_method_name
|
50
|
+
end
|
44
51
|
end
|
45
52
|
end
|
46
53
|
end
|
47
54
|
|
48
|
-
def complete_custom_passive_module_bipartite(module_to_complete,relation_type,targetted_by_model_list)
|
55
|
+
def complete_custom_passive_module_bipartite(module_to_complete,relation_type,targetted_by_model_list,options={})
|
49
56
|
module_to_complete.class_eval do
|
50
57
|
|
51
58
|
targetted_by_model_list.each do |targetted_by_model|
|
@@ -62,10 +69,20 @@ module Patriarch
|
|
62
69
|
Patriarch::ToolServices::RedisExtractorService.instance.
|
63
70
|
get_models_from_ids(self,targetted_by_model.to_s.classify.constantize,raw_tool_method_name,options)
|
64
71
|
end
|
72
|
+
if options[:relation_type_alias]
|
73
|
+
progressive_present_relation_type_alias = (Verbs::Conjugator.conjugate options[:relation_type_alias], :aspect => :progressive).split(/ /).last
|
74
|
+
alias_for_classic = classic_tool_method_name.sub(progressive_present_relation_type,progressive_present_relation_type_alias)
|
75
|
+
alias_method alias_for_classic, classic_tool_method_name
|
76
|
+
end
|
65
77
|
|
66
78
|
define_method(raw_tool_method_name) do |options={}|
|
67
79
|
Patriarch::ToolServices::RedisExtractorService.instance.get_ids_from_sorted_set(self,redis_key,options)
|
68
80
|
end
|
81
|
+
if options[:relation_type_alias]
|
82
|
+
progressive_present_relation_type_alias = (Verbs::Conjugator.conjugate options[:relation_type_alias], :aspect => :progressive).split(/ /).last
|
83
|
+
alias_for_raw = raw_tool_method_name.sub(progressive_present_relation_type,progressive_present_relation_type_alias)
|
84
|
+
alias_method alias_for_raw, raw_tool_method_name
|
85
|
+
end
|
69
86
|
|
70
87
|
end
|
71
88
|
|
@@ -73,7 +90,7 @@ module Patriarch
|
|
73
90
|
end
|
74
91
|
|
75
92
|
|
76
|
-
def complete_custom_active_module_tripartite(module_to_complete,relation_type,acted_on_model_list,via_model_list)
|
93
|
+
def complete_custom_active_module_tripartite(module_to_complete,relation_type,acted_on_model_list,via_model_list,options={})
|
77
94
|
module_to_complete.class_eval do
|
78
95
|
|
79
96
|
acted_on_model_list.each do |acted_on_model|
|
@@ -90,12 +107,20 @@ module Patriarch
|
|
90
107
|
Patriarch::ToolServices::RedisExtractorService.instance.
|
91
108
|
get_models_from_ids(self,acted_on_model.to_s.classify.constantize,raw_tool_method_name,options.merge({:tripartite => true}))
|
92
109
|
end
|
110
|
+
if options[:relation_type_alias]
|
111
|
+
alias_for_classic = classic_tool_method_name.sub(relation_type.to_s, options[:relation_type_alias].to_s)
|
112
|
+
alias_method alias_for_classic, classic_tool_method_name
|
113
|
+
end
|
93
114
|
|
94
115
|
define_method(raw_tool_method_name) do |options={}|
|
95
116
|
Patriarch::ToolServices::RedisExtractorService.instance.get_ids_from_sorted_set(self,redis_key,options.merge({:tripartite => true, :protagonist_type => :actor}))
|
96
117
|
# triplet is by convention [actor,target,medium]
|
97
118
|
# TODO Marshallize true items instead of some crappy convention ...
|
98
119
|
end
|
120
|
+
if options[:relation_type_alias]
|
121
|
+
alias_for_raw = raw_tool_method_name.sub(relation_type.to_s, options[:relation_type_alias].to_s)
|
122
|
+
alias_method alias_for_raw, raw_tool_method_name
|
123
|
+
end
|
99
124
|
|
100
125
|
end
|
101
126
|
end
|
@@ -103,7 +128,7 @@ module Patriarch
|
|
103
128
|
end
|
104
129
|
end
|
105
130
|
|
106
|
-
def complete_custom_passive_module_tripartite(module_to_complete,relation_type,targetted_by_model_list,via_model_list)
|
131
|
+
def complete_custom_passive_module_tripartite(module_to_complete,relation_type,targetted_by_model_list,via_model_list,options={})
|
107
132
|
module_to_complete.class_eval do
|
108
133
|
|
109
134
|
targetted_by_model_list.each do |targetted_by_model|
|
@@ -120,6 +145,12 @@ module Patriarch
|
|
120
145
|
Patriarch::ToolServices::RedisExtractorService.instance.
|
121
146
|
get_models_from_ids(self,targetted_by_model.to_s.classify.constantize,raw_tool_method_name,options.merge({:tripartite => true}))
|
122
147
|
end
|
148
|
+
if options[:relation_type_alias]
|
149
|
+
progressive_present_relation_type_alias = (Verbs::Conjugator.conjugate options[:relation_type_alias], :aspect => :progressive).split(/ /).last
|
150
|
+
alias_for_classic = classic_tool_method_name.sub(progressive_present_relation_type,progressive_present_relation_type_alias)
|
151
|
+
alias_method alias_for_classic, classic_tool_method_name
|
152
|
+
end
|
153
|
+
|
123
154
|
|
124
155
|
define_method(raw_tool_method_name) do |options={}|
|
125
156
|
Patriarch::ToolServices::RedisExtractorService.instance.get_ids_from_sorted_set(self,redis_key,options.merge({:tripartite => true , :protagonist_type => :target}))
|
@@ -127,6 +158,12 @@ module Patriarch
|
|
127
158
|
# triplet is by convention [actor,target,medium]
|
128
159
|
# TODO Marshallize true items instead of some crappy convention ...
|
129
160
|
end
|
161
|
+
if options[:relation_type_alias]
|
162
|
+
progressive_present_relation_type_alias = (Verbs::Conjugator.conjugate options[:relation_type_alias], :aspect => :progressive).split(/ /).last
|
163
|
+
alias_for_raw = raw_tool_method_name.sub(progressive_present_relation_type,progressive_present_relation_type_alias)
|
164
|
+
alias_method alias_for_raw, raw_tool_method_name
|
165
|
+
end
|
166
|
+
|
130
167
|
end
|
131
168
|
end
|
132
169
|
|
@@ -202,9 +239,25 @@ module Patriarch
|
|
202
239
|
end
|
203
240
|
end
|
204
241
|
|
242
|
+
complete_module_options = {}
|
243
|
+
if options[:as]
|
244
|
+
# as option should be a string or symbol
|
245
|
+
unless [Symbol,String].include?(options[:as].class)
|
246
|
+
raise AddBehaviourSyntaxError, "as option should be a string or symbol"
|
247
|
+
end
|
248
|
+
complete_module_options.merge! :relation_type_alias => options[:as]
|
249
|
+
end
|
205
250
|
|
206
251
|
methods_mod = Module.new do; end
|
207
252
|
methods_mod.const_set(:Behaviour,behaviour)
|
253
|
+
if options[:as]
|
254
|
+
methods_mod.const_set(:BehaviourAlias,options[:as].to_sym)
|
255
|
+
end
|
256
|
+
|
257
|
+
if options[:undo_as]
|
258
|
+
methods_mod.const_set(:UndoBehaviourAlias,options[:undo_as].to_sym)
|
259
|
+
end
|
260
|
+
|
208
261
|
|
209
262
|
# Target on Actor cases
|
210
263
|
if options[:via]
|
@@ -224,6 +277,9 @@ module Patriarch
|
|
224
277
|
"Patriarch::Services::#{methods_mod.const_get(:Behaviour).classify}::ManagerService".constantize.instance.resolve(self,entity,via_entity,options)
|
225
278
|
end
|
226
279
|
end
|
280
|
+
if options[:as]
|
281
|
+
alias_method methods_mod.const_get(:BehaviourAlias), methods_mod.const_get(:Behaviour).to_sym
|
282
|
+
end
|
227
283
|
|
228
284
|
# undo_behave
|
229
285
|
define_method(Patriarch.undo(methods_mod.const_get(:Behaviour)).to_sym) do |entity,via_entity,options={}|
|
@@ -231,16 +287,20 @@ module Patriarch
|
|
231
287
|
"Patriarch::Services::#{(Patriarch.undo(methods_mod.const_get(:Behaviour))).classify}::ManagerService".constantize.instance.resolve(self,entity,via_entity,options)
|
232
288
|
end
|
233
289
|
end
|
290
|
+
if options[:undo_as]
|
291
|
+
alias_method methods_mod.const_get(:UndoBehaviourAlias), Patriarch.undo(methods_mod.const_get(:Behaviour))
|
292
|
+
end
|
293
|
+
|
234
294
|
end
|
235
295
|
|
236
296
|
acted_on_model_list = Array(options[:on])
|
237
297
|
via_model_list = Array(options[:via])
|
238
|
-
Patriarch::Behaviours.complete_custom_active_module_tripartite(methods_mod,behaviour,acted_on_model_list,via_model_list)
|
298
|
+
Patriarch::Behaviours.complete_custom_active_module_tripartite(methods_mod,behaviour,acted_on_model_list,via_model_list,complete_module_options)
|
239
299
|
#Target case
|
240
300
|
elsif options[:by]
|
241
301
|
targetted_by_model_list = Array(options[:by])
|
242
302
|
via_model_list = Array(options[:via])
|
243
|
-
Patriarch::Behaviours.complete_custom_passive_module_tripartite(methods_mod,behaviour,targetted_by_model_list,via_model_list)
|
303
|
+
Patriarch::Behaviours.complete_custom_passive_module_tripartite(methods_mod,behaviour,targetted_by_model_list,via_model_list,complete_module_options)
|
244
304
|
end
|
245
305
|
# Medium case
|
246
306
|
elsif options[:medium_between]
|
@@ -254,11 +314,16 @@ module Patriarch
|
|
254
314
|
# TODO disjonction register tripartite
|
255
315
|
# register the behaviour we just added
|
256
316
|
self.patriarch_behaviours ||= { }
|
317
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym] ||= {}
|
257
318
|
|
258
319
|
if options[:via]
|
259
|
-
self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by => [], :via => [] }
|
320
|
+
#self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by => [], :via => [] }
|
321
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:on] ||= []
|
322
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:by] ||= []
|
323
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:via] ||= []
|
260
324
|
elsif options[:medium_between]
|
261
|
-
self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :medium_between => [] }
|
325
|
+
#self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :medium_between => [] }
|
326
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:medium_between] ||= []
|
262
327
|
end
|
263
328
|
|
264
329
|
if options[:via]
|
@@ -293,6 +358,12 @@ module Patriarch
|
|
293
358
|
|
294
359
|
methods_mod = Module.new do; end
|
295
360
|
methods_mod.const_set(:Behaviour,behaviour)
|
361
|
+
if options[:as]
|
362
|
+
methods_mod.const_set(:BehaviourAlias,options[:as].to_sym)
|
363
|
+
end
|
364
|
+
if options[:undo_as]
|
365
|
+
methods_mod.const_set(:UndoBehaviourAlias,options[:undo_as].to_sym)
|
366
|
+
end
|
296
367
|
|
297
368
|
if options[:on]
|
298
369
|
# Adds active methods and defines the hook to set callbacks on them
|
@@ -311,6 +382,9 @@ module Patriarch
|
|
311
382
|
"Patriarch::Services::#{methods_mod.const_get(:Behaviour).classify}::ManagerService".constantize.instance.resolve(self,entity,options)
|
312
383
|
end
|
313
384
|
end
|
385
|
+
if options[:as]
|
386
|
+
alias_method methods_mod.const_get(:BehaviourAlias), methods_mod.const_get(:Behaviour).to_sym
|
387
|
+
end
|
314
388
|
|
315
389
|
# undo_like
|
316
390
|
define_method(Patriarch.undo(methods_mod.const_get(:Behaviour)).to_sym) do |entity,options={}|
|
@@ -318,6 +392,9 @@ module Patriarch
|
|
318
392
|
"Patriarch::Services::#{(Patriarch.undo(methods_mod.const_get(:Behaviour))).classify}::ManagerService".constantize.instance.resolve(self,entity,options)
|
319
393
|
end
|
320
394
|
end
|
395
|
+
if options[:undo_as]
|
396
|
+
alias_method methods_mod.const_get(:UndoBehaviourAlias), Patriarch.undo(methods_mod.const_get(:Behaviour))
|
397
|
+
end
|
321
398
|
|
322
399
|
# Not used / not tested, added this method "en passant"
|
323
400
|
# FIX requirements with users
|
@@ -339,12 +416,22 @@ module Patriarch
|
|
339
416
|
end
|
340
417
|
end
|
341
418
|
|
419
|
+
complete_module_options = {}
|
420
|
+
if options[:as]
|
421
|
+
# as option should be a string or symbol
|
422
|
+
unless [Symbol,String].include?(options[:as].class)
|
423
|
+
raise AddBehaviourSyntaxError, "as option should be a string or symbol"
|
424
|
+
end
|
425
|
+
complete_module_options.merge! :relation_type_alias => options[:as]
|
426
|
+
end
|
427
|
+
|
428
|
+
|
342
429
|
if options[:on]
|
343
430
|
acted_on_model_list = Array(options[:on])
|
344
|
-
Patriarch::Behaviours.complete_custom_active_module_bipartite(methods_mod,behaviour,acted_on_model_list)
|
431
|
+
Patriarch::Behaviours.complete_custom_active_module_bipartite(methods_mod,behaviour,acted_on_model_list,complete_module_options)
|
345
432
|
else
|
346
433
|
targetted_by_model_list = Array(options[:by])
|
347
|
-
Patriarch::Behaviours.complete_custom_passive_module_bipartite(methods_mod,behaviour,targetted_by_model_list)
|
434
|
+
Patriarch::Behaviours.complete_custom_passive_module_bipartite(methods_mod,behaviour,targetted_by_model_list,complete_module_options)
|
348
435
|
end
|
349
436
|
|
350
437
|
# Finally ...
|
@@ -354,7 +441,11 @@ module Patriarch
|
|
354
441
|
|
355
442
|
# register the behaviour we just added
|
356
443
|
self.patriarch_behaviours ||= { }
|
357
|
-
self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by =>[] }
|
444
|
+
#self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by =>[] }
|
445
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { }
|
446
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:on] ||= []
|
447
|
+
self.patriarch_behaviours[behaviour.underscore.to_sym][:by] ||= []
|
448
|
+
|
358
449
|
if options[:on]
|
359
450
|
self.patriarch_behaviours[behaviour.underscore.to_sym][:on] << options[:on]
|
360
451
|
self.patriarch_behaviours[behaviour.underscore.to_sym][:on].uniq!
|
data/lib/patriarch/version.rb
CHANGED
@@ -2,18 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Patriarch::Behaviours do
|
4
4
|
describe '#add_behaviour' do
|
5
|
-
|
6
5
|
let(:monster) { Monster.create }
|
7
6
|
let(:fallen_angel) { FallenAngel.create }
|
8
7
|
let(:love_letter) { LoveLetter.create }
|
9
8
|
|
10
|
-
|
11
|
-
|
12
9
|
context 'on a bipartite' do
|
13
10
|
|
14
11
|
before(:all) do
|
15
|
-
Monster.add_behaviour :like, :on => [:fallenAngel]
|
16
|
-
FallenAngel.add_behaviour :like, :by => [:monster]
|
12
|
+
Monster.add_behaviour :like, :on => [:fallenAngel], :as => :love, :undo_as => :hate
|
13
|
+
FallenAngel.add_behaviour :like, :by => [:monster] , :as => :love
|
17
14
|
end
|
18
15
|
|
19
16
|
context "call from a model including Patriarch::Behaviours" do
|
@@ -44,14 +41,6 @@ describe Patriarch::Behaviours do
|
|
44
41
|
monster.should respond_to(:undo_like)
|
45
42
|
end
|
46
43
|
|
47
|
-
it "defines alias for behaviour instance methods on actor model" do
|
48
|
-
pending("implement this with add_behaviour ARGUMENTS, [:as => alias]")
|
49
|
-
end
|
50
|
-
|
51
|
-
it "defines alias for undo behaviour instance methods on actor model" do
|
52
|
-
pending("implement this with add_behaviour ARGUMENTS, [:undo_as => alias]")
|
53
|
-
end
|
54
|
-
|
55
44
|
it "does not define behaviour instance method on target model" do
|
56
45
|
fallen_angel.should_not respond_to(:like)
|
57
46
|
end
|
@@ -61,12 +50,16 @@ describe Patriarch::Behaviours do
|
|
61
50
|
end
|
62
51
|
|
63
52
|
it "does not define alias for behaviour instance methods on target model" do
|
64
|
-
|
53
|
+
progressive_love = (Verbs::Conjugator.conjugate :love, :aspect => :progressive).split(/ /).last
|
54
|
+
fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_love}_me_ids")
|
55
|
+
fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_love}_me")
|
65
56
|
end
|
66
57
|
|
67
|
-
it "
|
68
|
-
|
69
|
-
|
58
|
+
it "defines alias for behaviour instance methods on actor model" do
|
59
|
+
monster.should respond_to(:love)
|
60
|
+
monster.should respond_to("#{"fallen_angel".pluralize}_i_love")
|
61
|
+
monster.should respond_to("#{"fallen_angel".pluralize}_i_love_ids")
|
62
|
+
end
|
70
63
|
end
|
71
64
|
|
72
65
|
context 'implements methods that' do
|
@@ -82,34 +75,37 @@ describe Patriarch::Behaviours do
|
|
82
75
|
|
83
76
|
|
84
77
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
it "allows actor to remember target id" do
|
78
|
+
shared_examples 'instances have behaviour' do
|
79
|
+
it "remember target id in actor's memory" do
|
89
80
|
monster.fallen_angels_i_like_ids.should == [fallen_angel.id]
|
90
81
|
end
|
91
82
|
|
92
|
-
it "
|
83
|
+
it "remember target instance in actor's memory" do
|
93
84
|
monster.fallen_angels_i_like.should == [fallen_angel]
|
94
85
|
end
|
95
86
|
|
96
|
-
it "
|
87
|
+
it "remember actor id in target's memory" do
|
97
88
|
fallen_angel.monsters_liking_me_ids.should == [monster.id]
|
98
89
|
end
|
99
90
|
|
100
|
-
it "
|
91
|
+
it "remember actor instance in target's memory" do
|
101
92
|
fallen_angel.monsters_liking_me.should == [monster]
|
102
93
|
end
|
94
|
+
end
|
103
95
|
|
104
|
-
|
96
|
+
context 'when doing direct behaviour' do
|
97
|
+
before(:all) { monster.like fallen_angel }
|
98
|
+
it_has_behavior 'instances have behaviour'
|
99
|
+
after(:all) { monster.undo_like fallen_angel }
|
105
100
|
end
|
106
101
|
|
107
|
-
context 'when
|
108
|
-
before(:all)
|
109
|
-
|
110
|
-
|
111
|
-
|
102
|
+
context 'when doing behaviour via alias method' do
|
103
|
+
before(:all) { monster.love fallen_angel }
|
104
|
+
it_has_behavior 'instances have behaviour'
|
105
|
+
after(:all) { monster.undo_like fallen_angel }
|
106
|
+
end
|
112
107
|
|
108
|
+
shared_examples 'instances have undo behaviour' do
|
113
109
|
it "erase target id from actor's memory" do
|
114
110
|
monster.fallen_angels_i_like_ids.should be_empty
|
115
111
|
end
|
@@ -127,6 +123,22 @@ describe Patriarch::Behaviours do
|
|
127
123
|
end
|
128
124
|
end
|
129
125
|
|
126
|
+
context 'when calling undo command' do
|
127
|
+
before(:all) do
|
128
|
+
monster.like fallen_angel
|
129
|
+
monster.undo_like fallen_angel
|
130
|
+
end
|
131
|
+
it_has_behavior 'instances have undo behaviour'
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when calling undo command via undo alias' do
|
135
|
+
before(:all) do
|
136
|
+
monster.like fallen_angel
|
137
|
+
monster.hate fallen_angel
|
138
|
+
end
|
139
|
+
it_has_behavior 'instances have undo behaviour'
|
140
|
+
end
|
141
|
+
|
130
142
|
end
|
131
143
|
end # context bipartite
|
132
144
|
|
@@ -134,9 +146,9 @@ describe Patriarch::Behaviours do
|
|
134
146
|
|
135
147
|
before(:all) do
|
136
148
|
# Monster is the actor model and FallenAngel the target model here
|
137
|
-
Monster.add_behaviour :praise, :on => [:fallenAngel], :via => [:loveLetter]
|
138
|
-
FallenAngel.add_behaviour :praise, :by => [:monster], :via => [:loveLetter]
|
139
|
-
LoveLetter.add_behaviour :praise, :medium_between => [:monster,:fallenAngel]
|
149
|
+
Monster.add_behaviour :praise, :on => [:fallenAngel], :via => [:loveLetter], :as => :flatter, :undo_as => :despise
|
150
|
+
FallenAngel.add_behaviour :praise, :by => [:monster], :via => [:loveLetter], :as => :flatter
|
151
|
+
LoveLetter.add_behaviour :praise, :medium_between => [:monster,:fallenAngel], :as => :flatter
|
140
152
|
end
|
141
153
|
|
142
154
|
context "call from a model including Patriarch::Behaviours" do
|
@@ -180,7 +192,29 @@ describe Patriarch::Behaviours do
|
|
180
192
|
|
181
193
|
it "does not define undo behaviour instance method on medium model" do
|
182
194
|
love_letter.should_not respond_to(:undo_praise)
|
183
|
-
end
|
195
|
+
end
|
196
|
+
|
197
|
+
it "does not define alias for behaviour instance methods on target model" do
|
198
|
+
progressive_flatter = (Verbs::Conjugator.conjugate :flatter, :aspect => :progressive).split(/ /).last
|
199
|
+
fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_flatter}_me_via_#{"love_letter".pluralize}")
|
200
|
+
fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_flatter}_me_via_#{"love_letter".pluralize}_ids")
|
201
|
+
end
|
202
|
+
|
203
|
+
#TODO test alias correctly with receive rspec ...
|
204
|
+
it "defines alias for behaviour instance methods on actor model" do
|
205
|
+
monster.should respond_to(:flatter)
|
206
|
+
# from test just below
|
207
|
+
monster.should respond_to(:despise)
|
208
|
+
monster.should respond_to("#{"fallen_angel".pluralize}_i_flatter_via_#{"love_letter".pluralize}")
|
209
|
+
monster.should respond_to("#{"fallen_angel".pluralize}_i_flatter_via_#{"love_letter".pluralize}_ids")
|
210
|
+
end
|
211
|
+
|
212
|
+
# SQLITE 3 IS SHITTING ALL OVER OUR TESTS, TODO FIXME
|
213
|
+
# :memory: option appears to have some limitations there
|
214
|
+
it "defines alias on undo behaviour instance methods of actor model" do
|
215
|
+
# monster.should respond_to(:despise)
|
216
|
+
pending "test is runned elsewhere, fix sqlite3 memory problem please"
|
217
|
+
end
|
184
218
|
end
|
185
219
|
|
186
220
|
context 'implements methods that' do
|
@@ -192,11 +226,8 @@ describe Patriarch::Behaviours do
|
|
192
226
|
monster.praise(fallen_angel, love_letter, :stop_execution => true).should be_an_instance_of(Patriarch::Transaction)
|
193
227
|
end
|
194
228
|
|
195
|
-
|
196
|
-
|
197
|
-
context 'when doing behaviour' do
|
198
|
-
before(:all) { monster.praise fallen_angel,love_letter }
|
199
|
-
|
229
|
+
# prepare examples to test both alias and normal methods ...
|
230
|
+
shared_examples 'instances have behaviour working' do
|
200
231
|
it "allows actor to remember target id" do
|
201
232
|
monster.fallen_angels_i_praise_via_love_letters_ids.should == [fallen_angel.id]
|
202
233
|
end
|
@@ -211,17 +242,23 @@ describe Patriarch::Behaviours do
|
|
211
242
|
|
212
243
|
it "allows target to remember actor instance" do
|
213
244
|
fallen_angel.monsters_praising_me_via_love_letters.should == [monster]
|
214
|
-
end
|
215
|
-
|
216
|
-
after(:all) { monster.undo_praise fallen_angel,love_letter }
|
245
|
+
end
|
217
246
|
end
|
218
247
|
|
219
|
-
context 'when
|
220
|
-
before(:all)
|
221
|
-
|
222
|
-
|
223
|
-
|
248
|
+
context 'when doing direct behaviour' do
|
249
|
+
before(:all) { monster.praise fallen_angel,love_letter }
|
250
|
+
it_has_behavior 'instances have behaviour working'
|
251
|
+
after(:all) { monster.undo_praise fallen_angel,love_letter }
|
252
|
+
end
|
224
253
|
|
254
|
+
context 'when doing behaviour via alias method' do
|
255
|
+
before(:all) { monster.flatter fallen_angel,love_letter }
|
256
|
+
it_has_behavior 'instances have behaviour working'
|
257
|
+
after(:all) { monster.undo_praise fallen_angel,love_letter }
|
258
|
+
end
|
259
|
+
|
260
|
+
# prepare examples to test both undo alias and undo normal methods ...
|
261
|
+
shared_examples 'instances have undo behaviour working' do
|
225
262
|
it "erase target id from actor's memory" do
|
226
263
|
monster.fallen_angels_i_praise_via_love_letters_ids.should be_empty
|
227
264
|
end
|
@@ -236,12 +273,38 @@ describe Patriarch::Behaviours do
|
|
236
273
|
|
237
274
|
it "erase actor instance from target's memory" do
|
238
275
|
fallen_angel.monsters_praising_me_via_love_letters.should be_empty
|
239
|
-
end
|
276
|
+
end
|
240
277
|
end
|
241
278
|
|
279
|
+
context 'when directly undoing behaviour' do
|
280
|
+
before(:all) do
|
281
|
+
monster.praise fallen_angel,love_letter
|
282
|
+
monster.undo_praise fallen_angel,love_letter
|
283
|
+
end
|
284
|
+
it_has_behavior 'instances have undo behaviour working'
|
285
|
+
end
|
242
286
|
|
243
|
-
|
287
|
+
context 'when undoing behaviour via undo alias' do
|
288
|
+
before(:all) do
|
289
|
+
monster.praise fallen_angel,love_letter
|
290
|
+
monster.despise fallen_angel,love_letter
|
291
|
+
end
|
292
|
+
it_has_behavior 'instances have undo behaviour working'
|
293
|
+
end
|
294
|
+
|
295
|
+
end # implements methods that
|
244
296
|
end # context tripartite
|
245
297
|
|
246
298
|
end # desc '#add_behaviour'
|
299
|
+
|
300
|
+
# FIXME learn rspec tocard ...
|
301
|
+
context "multiple tricky calls" do
|
302
|
+
it "works" do
|
303
|
+
class Monsterr < Monster; end
|
304
|
+
class FallenAngell < FallenAngel; end
|
305
|
+
Monsterr.add_behaviour :praise, :on => [:fallenAngell], :via => [:fallenAngell]
|
306
|
+
FallenAngell.add_behaviour :praise, :by => [:monsterr], :via => [:fallenAngell]
|
307
|
+
FallenAngell.add_behaviour :praise, :medium_between => [:monsterr,:fallenAngell]
|
308
|
+
end
|
309
|
+
end
|
247
310
|
end # desc Patriarch::Behaviours
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: patriarch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: verbs
|
16
|
-
requirement: &
|
16
|
+
requirement: &8230400 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *8230400
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: railties
|
27
|
-
requirement: &
|
27
|
+
requirement: &8229980 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *8229980
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activerecord
|
38
|
-
requirement: &
|
38
|
+
requirement: &8229560 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *8229560
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &8229140 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *8229140
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: activerecord
|
60
|
-
requirement: &
|
60
|
+
requirement: &8228720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *8228720
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sqlite3
|
71
|
-
requirement: &
|
71
|
+
requirement: &8228300 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *8228300
|
80
80
|
description: Patriach is about adding behaviours on the fly to good old active record
|
81
81
|
models.
|
82
82
|
email:
|