patriarch 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/patriarch.rb CHANGED
@@ -13,6 +13,8 @@ module Patriarch
13
13
  autoload :InstallGenerator, 'generators/patriarch/install_generator'
14
14
  end
15
15
 
16
+ autoload :RedisInstruction, 'patriarch/redis_instruction'
17
+
16
18
  autoload :Service, 'patriarch/service'
17
19
  autoload :Transaction, 'patriarch/transaction'
18
20
  autoload :TransactionStep, 'patriarch/transaction_step'
@@ -12,58 +12,27 @@ module Patriarch
12
12
  # Since type verification is an eternal we implement grant in the mother class and let daughter classes
13
13
  # call it with super and benefit from verify_types or bypass it completely and override the function
14
14
  def grant?(transac)
15
- if check_types(transac)
16
- true
17
- else
18
- raise Patriarch::ForbiddenBehaviourException, "that behaviour is not authorized"
19
- end
15
+ check_types(transac) || raise(Patriarch::ForbiddenBehaviourException, "that behaviour is not authorized")
20
16
  end
21
17
 
22
- # When declaring behaviours in model thanks to add_behaviour helper we enforce that ONLY the behaviour declared
18
+ # When declaring behaviours in model thanks to add_behaviour helper we enforce that ONLY the declared behaviours
23
19
  # are authorized. We hence verify that when a behaviour is called.
24
20
  # For example User could be able to like Items and thus be blessed with #like as an instance method.
25
- # But then we can tell any user instance to like any object, this method denies these behaviours.
21
+ # But then we can call like upon from any user instance to like any object, this method prevents it.
26
22
  # @transac [Patriarch::Transaction] the transaction to be authorized (or not)
27
23
  def check_types(transac)
28
- actor_model = transac.actor.class
29
- actor_model_sym = actor_model.name.underscore.to_sym
30
-
31
- target_model = transac.target.class
32
- target_model_sym = target_model.name.underscore.to_sym
33
-
34
- medium_model = transac.medium.class
35
- medium_model_sym = medium_model.name.underscore.to_sym
36
-
24
+ protagonists_models = transac.protagonists_models
37
25
  behaviour = transac.relation_type.to_s.sub(/undo_/,'').underscore.to_sym
38
26
  auths = []
39
27
 
40
- if transac.tripartite?
41
- # Verification for actor
42
- auths << actor_model.patriarch_behaviours[behaviour][:on].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(target_model_sym)
43
- auths << actor_model.patriarch_behaviours[behaviour][:via].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(medium_model_sym)
44
-
45
- # Verification for target
46
- auths << target_model.patriarch_behaviours[behaviour][:by].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(actor_model_sym)
47
- auths << target_model.patriarch_behaviours[behaviour][:via].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(medium_model_sym)
48
-
49
- # Verification for medium
50
- # Pay attention here since add_behaviour syntax is different when being a medium
51
- auths << medium_model.patriarch_behaviours[behaviour][:medium_between].map do |dual_sym_tab|
52
- dual_sym_tab.map{ |b_sym| b_sym.to_s.underscore.to_sym }
53
- end.include?(
54
- [actor_model_sym, target_model_sym]
55
- )
56
- else
57
- auths << actor_model.patriarch_behaviours[behaviour][:on].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(target_model_sym)
58
- auths << target_model.patriarch_behaviours[behaviour][:by].map{ |b_sym| b_sym.to_s.underscore.to_sym }.include?(actor_model_sym)
28
+ # See register behaviour to see how it is implemented.
29
+ # TODO Couplage trop grand ici.
30
+ protagonists_models.each do |protagonist_model|
31
+ auths << protagonist_model.patriarch_behaviours[behaviour].include?(protagonists_models)
59
32
  end
60
-
61
-
62
- if auths.include? false
63
- false
64
- else
65
- true
66
- end
67
- end
68
- end
69
- end
33
+
34
+ !auths.include?(false)
35
+ end # def check_types
36
+
37
+ end # class AuthorizationService
38
+ end # module Patriarch
@@ -347,7 +347,7 @@ module Patriarch
347
347
  end
348
348
 
349
349
  if options[:on]
350
- module_to_complete.instance_eval do
350
+ module_to_complete.class_eval do
351
351
  # add behaviour_alias
352
352
  if options[:as]
353
353
  alias_method behaviour_alias, behaviour
@@ -365,15 +365,15 @@ module Patriarch
365
365
  # @param [String] behaviour
366
366
  # Add basic behaviours calls to models in bipartite situations
367
367
  def add_functionality_for_bipartite(anon_module,behaviour)
368
- anon_module.instance_eval do
369
-
370
- instance_eval do
371
- # in instance_eval situations, there is no scope change so if we want to define included as a "self" method
372
- # we are obliged to use this
373
- (class << self; self; end).send(:define_method,:included) do |klass|
374
- klass.extend ActiveModel::Callbacks
375
- klass.send(:define_model_callbacks, behaviour, Patriarch.undo(behaviour))
376
- end
368
+ anon_module.class_eval do
369
+
370
+ # use define_method to get otherwise out of scope variables
371
+ # usage of self.send(:define_method,:included) would fail as it would declare included
372
+ # as a method available to class including this module not as an override of the included
373
+ # hook
374
+ (class << self; self; end).send(:define_method,:included) do |klass|
375
+ klass.extend ActiveModel::Callbacks
376
+ klass.send(:define_model_callbacks, behaviour, Patriarch.undo(behaviour))
377
377
  end
378
378
 
379
379
  # behave
@@ -390,22 +390,22 @@ module Patriarch
390
390
  end
391
391
  end
392
392
 
393
- end # instance_eval
393
+ end # class_eval
394
394
  end
395
395
 
396
396
  # @param [Module] anon_module
397
397
  # @param [String] behaviour
398
398
  # Add basic behaviours calls to models in tripartite situations
399
399
  def add_functionality_for_tripartite(anon_module,behaviour)
400
- anon_module.instance_eval do
401
-
402
- instance_eval do
403
- # in instance_eval situations, there is no scope change so if we want to define included as a "self" method
404
- # we are obliged to use this
405
- (class << self; self; end).send(:define_method,:included) do |klass|
406
- klass.extend ActiveModel::Callbacks
407
- klass.send(:define_model_callbacks, behaviour, Patriarch.undo(behaviour))
408
- end
400
+ anon_module.class_eval do
401
+
402
+ # use define_method to get otherwise out of scope variables
403
+ # usage of self.send(:define_method,:included) would fail as it would declare included
404
+ # as a method available to class including this module not as an override of the included
405
+ # hook
406
+ (class << self; self; end).send(:define_method,:included) do |klass|
407
+ klass.extend ActiveModel::Callbacks
408
+ klass.send(:define_model_callbacks, behaviour, Patriarch.undo(behaviour))
409
409
  end
410
410
 
411
411
  # behave
@@ -415,7 +415,6 @@ module Patriarch
415
415
  end
416
416
  end
417
417
 
418
-
419
418
  # undo_behave
420
419
  define_method(Patriarch.undo(behaviour)) do |via_entity,entity,options={}|
421
420
  run_callbacks Patriarch.undo(behaviour).to_sym do
@@ -423,7 +422,7 @@ module Patriarch
423
422
  end
424
423
  end
425
424
 
426
- end # instance_eval
425
+ end # class_eval
427
426
  end
428
427
 
429
428
  # @param [String] behaviour
@@ -434,19 +433,14 @@ module Patriarch
434
433
  behaviour = behaviour.underscore.to_sym
435
434
 
436
435
  self.patriarch_behaviours ||= { }
437
- #self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by =>[] }
438
- self.patriarch_behaviours[behaviour] ||= { }
439
- self.patriarch_behaviours[behaviour][:on] ||= []
440
- self.patriarch_behaviours[behaviour][:by] ||= []
436
+ self.patriarch_behaviours[behaviour] ||= []
441
437
 
442
- if options[:on]
443
- self.patriarch_behaviours[behaviour][:on] << options[:on]
444
- self.patriarch_behaviours[behaviour][:on].uniq!
445
- self.patriarch_behaviours[behaviour][:on].flatten!
446
- elsif options[:by]
447
- self.patriarch_behaviours[behaviour][:by] << options[:by]
448
- self.patriarch_behaviours[behaviour][:by].uniq!
449
- self.patriarch_behaviours[behaviour][:by].flatten!
438
+ Array(options[:on]).each do |target_class_sym|
439
+ self.patriarch_behaviours[behaviour] << [self,target_class_sym.to_s.classify.constantize]
440
+ end
441
+
442
+ Array(options[:by]).each do |actor_class_sym|
443
+ self.patriarch_behaviours[behaviour] << [actor_class_sym.to_s.classify.constantize,self]
450
444
  end
451
445
  end
452
446
 
@@ -458,35 +452,28 @@ module Patriarch
458
452
  behaviour = behaviour.underscore.to_sym
459
453
 
460
454
  self.patriarch_behaviours ||= { }
461
- self.patriarch_behaviours[behaviour] ||= {}
455
+ self.patriarch_behaviours[behaviour] ||= []
462
456
 
463
- if options[:via]
464
- #self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :on => [], :by => [], :via => [] }
465
- self.patriarch_behaviours[behaviour][:on] ||= []
466
- self.patriarch_behaviours[behaviour][:by] ||= []
467
- self.patriarch_behaviours[behaviour][:via] ||= []
468
- elsif options[:medium_between]
469
- #self.patriarch_behaviours[behaviour.underscore.to_sym] ||= { :medium_between => [] }
470
- self.patriarch_behaviours[behaviour][:medium_between] ||= []
471
- end
457
+ Array(options[:via]).each do |medium_class_sym|
458
+ Array(options[:on]).each do |target_class_sym|
459
+ target_class = target_class_sym.to_s.classify.constantize
460
+ medium_class = medium_class_sym.to_s.classify.constantize
461
+ self.patriarch_behaviours[behaviour] << [self, target_class, medium_class]
462
+ end
472
463
 
473
- if options[:via]
474
- if options[:on]
475
- self.patriarch_behaviours[behaviour][:on] << options[:on]
476
- self.patriarch_behaviours[behaviour][:on].uniq!
477
- self.patriarch_behaviours[behaviour][:on].flatten!
478
- elsif options[:by]
479
- self.patriarch_behaviours[behaviour][:by] << options[:by]
480
- self.patriarch_behaviours[behaviour][:by].uniq!
481
- self.patriarch_behaviours[behaviour][:by].flatten!
464
+ Array(options[:by]).each do |actor_class_sym|
465
+ actor_class = actor_class_sym.to_s.classify.constantize
466
+ medium_class = medium_class_sym.to_s.classify.constantize
467
+ self.patriarch_behaviours[behaviour] << [actor_class, self, medium_class]
482
468
  end
483
- self.patriarch_behaviours[behaviour][:via] << options[:via]
484
- self.patriarch_behaviours[behaviour][:via].uniq!
485
- self.patriarch_behaviours[behaviour][:via].flatten!
486
- elsif options[:medium_between]
487
- self.patriarch_behaviours[behaviour][:medium_between] << options[:medium_between]
488
- self.patriarch_behaviours[behaviour][:medium_between].uniq!
489
- self.patriarch_behaviours[behaviour][:medium_between]
469
+ end
470
+
471
+ # FIXME should support enumerations of medium betweens like this
472
+ # [[actor1,target1],[actor2,target2]]
473
+ if options[:medium_between]
474
+ actor_class = options[:medium_between].first.to_s.classify.constantize
475
+ target_class = options[:medium_between].last.to_s.classify.constantize
476
+ self.patriarch_behaviours[behaviour] << [actor_class, target_class, self]
490
477
  end
491
478
  end
492
479
 
@@ -558,7 +545,7 @@ module Patriarch
558
545
  # register the behaviour we just added
559
546
  register_bipartite_behaviour(behaviour,options)
560
547
  end
561
- end
548
+ end # module Class Methods
562
549
 
563
550
  end # Behaviours
564
551
  end # Patriarch
@@ -16,13 +16,9 @@ class Patriarch::DAOServices::BipartiteRelationshipBuilderService < Patriarch::S
16
16
  actor_dao = dao_tab[:actor]
17
17
  target_dao = dao_tab[:target]
18
18
 
19
- l = build_ostruct_for_create(actor_dao,transaction_item.target_id,t)
20
- ll = build_ostruct_for_create(target_dao,transaction_item.actor_id,t)
19
+ l = build_struct_for_create(actor_dao,transaction_item.target_id,t)
20
+ ll = build_struct_for_create(target_dao,transaction_item.actor_id,t)
21
21
 
22
- p "#{l.inspect} is creating on key #{actor_dao.key} : #{transaction_item.target_type} #{transaction_item.target_id}"
23
- p "#{ll.inspect} is creating on key #{target_dao.key} : #{transaction_item.actor_type} #{transaction_item.actor_id}"
24
-
25
- # care about that, should be encapsulated into a beautiful add_to_queue method
26
22
  transaction_item.add_to_queue l
27
23
  transaction_item.add_to_queue ll
28
24
  end
@@ -36,10 +32,8 @@ class Patriarch::DAOServices::BipartiteRelationshipBuilderService < Patriarch::S
36
32
  actor_dao = dao_tab[:actor]
37
33
  target_dao = dao_tab[:target]
38
34
 
39
- #l = proc { actor_dao.delete transaction_item.target_id }
40
- #ll = proc { target_dao.delete transaction_item.actor_id }
41
- l = OpenStruct.new(:method_sym => :delete ,:dao => actor_dao, :args => [transaction_item.target_id])
42
- ll = OpenStruct.new(:method_sym => :delete ,:dao => target_dao, :args => [transaction_item.actor_id])
35
+ l = Patriarch::RedisInstruction.new(actor_dao,:delete,[transaction_item.target_id])
36
+ ll = Patriarch::RedisInstruction.new(target_dao,:delete ,[transaction_item.actor_id])
43
37
 
44
38
  transaction_item.add_to_queue l
45
39
  transaction_item.add_to_queue ll
@@ -49,14 +43,12 @@ class Patriarch::DAOServices::BipartiteRelationshipBuilderService < Patriarch::S
49
43
  # @param [Redis::Objects] dao
50
44
  # @param [Array] ids
51
45
  # @param [Time] time
52
- # Returns ostruct objects that store parameters to execute a redis operation
53
- def build_ostruct_for_create(dao,id,time)
46
+ # Returns Patriarch::RedisInstruction (structs) objects that store parameters to execute a redis operation
47
+ def build_struct_for_create(dao,id,time)
54
48
  if dao.is_a? Redis::SortedSet
55
- return OpenStruct.new(:method_sym => :add ,:dao => dao, :args => [id,time])
56
- # return lambda { dao.add ids, time }
49
+ return Patriarch::RedisInstruction.new(dao,:add,[id,time])
57
50
  else
58
- return OpenStruct.new(:method_sym => :add ,:dao => dao, :args => [id])
59
- # return lambda { dao.add ids }
51
+ return Patriarch::RedisInstruction.new(dao,:add,[id])
60
52
  end
61
53
  end
62
54
  end
@@ -20,9 +20,9 @@ class Patriarch::DAOServices::TripartiteRelationshipBuilderService < Patriarch::
20
20
 
21
21
  protagonist_ids = [transaction_item.actor_id,transaction_item.target_id,transaction_item.medium_id]
22
22
 
23
- l = build_ostruct_for_create(actor_dao,protagonist_ids,t)
24
- ll = build_ostruct_for_create(target_dao,protagonist_ids,t)
25
- lll = build_ostruct_for_create(medium_dao,protagonist_ids,t)
23
+ l = build_struct_for_create(actor_dao,protagonist_ids,t)
24
+ ll = build_struct_for_create(target_dao,protagonist_ids,t)
25
+ lll = build_struct_for_create(medium_dao,protagonist_ids,t)
26
26
 
27
27
  # care about that, should be encapsulated into a beautiful add_to_queue method
28
28
  transaction_item.add_to_queue l
@@ -46,9 +46,9 @@ class Patriarch::DAOServices::TripartiteRelationshipBuilderService < Patriarch::
46
46
  #ll = lambda { target_dao.delete protagonist_ids }
47
47
  #lll = lambda { medium_dao.delete protagonist_ids }
48
48
 
49
- l = OpenStruct.new(:method_sym => :delete ,:dao => actor_dao, :args => [protagonist_ids])
50
- ll = OpenStruct.new(:method_sym => :delete ,:dao => target_dao, :args => [protagonist_ids])
51
- lll = OpenStruct.new(:method_sym => :delete ,:dao => medium_dao, :args => [protagonist_ids])
49
+ l = Patriarch::RedisInstruction.new(actor_dao ,:delete,[protagonist_ids])
50
+ ll = Patriarch::RedisInstruction.new(target_dao,:delete,[protagonist_ids])
51
+ lll = Patriarch::RedisInstruction.new(medium_dao,:delete,[protagonist_ids])
52
52
 
53
53
  transaction_item.add_to_queue l
54
54
  transaction_item.add_to_queue ll
@@ -59,14 +59,12 @@ class Patriarch::DAOServices::TripartiteRelationshipBuilderService < Patriarch::
59
59
  # @param [Redis::Objects] dao
60
60
  # @param [Array] ids
61
61
  # @param [Time] time
62
- # Returns ostruct objects that store parameters to execute a redis operation
63
- def build_ostruct_for_create(dao,ids,time)
62
+ # Returns Patriarch::RedisInstruction (structs) objects that store parameters to execute a redis operation
63
+ def build_struct_for_create(dao,ids,time)
64
64
  if dao.is_a? Redis::SortedSet
65
- return OpenStruct.new(:method_sym => :add ,:dao => dao, :args => [ids,time])
66
- # return lambda { dao.add ids, time }
67
- else
68
- return OpenStruct.new(:method_sym => :add ,:dao => dao, :args => [ids])
69
- # return lambda { dao.add ids }
65
+ return Patriarch::RedisInstruction.new(dao,:add,[ids,time])
66
+ else
67
+ return Patriarch::RedisInstruction.new(dao,:add,[ids])
70
68
  end
71
69
  end
72
70
  end
@@ -0,0 +1,8 @@
1
+ module Patriarch
2
+ RedisInstruction = Struct.new(:dao,:method_sym,:args)
3
+ class RedisInstruction
4
+ def execute
5
+ dao.send(method_sym,*args)
6
+ end
7
+ end
8
+ end
@@ -29,102 +29,105 @@ class Patriarch::ToolServices::RedisCleanerService < Patriarch::Service
29
29
  behaviour_symbol = behaviour.to_s.underscore.to_sym
30
30
 
31
31
  if my_behaviours.include? behaviour_symbol
32
- if my_behaviours[behaviour_symbol][:medium_between] || my_behaviours[behaviour_symbol][:via]
32
+ if my_behaviours[behaviour_symbol].first.size == 3
33
33
  clean_tripartite_behaviour(calling_entity,behaviour,options)
34
- else
34
+ elsif my_behaviours[behaviour_symbol].first.size == 2
35
35
  clean_bipartite_behaviour(calling_entity,behaviour,options)
36
+ else
37
+ raise "Bad Behaviour declaration occured, no doublet or triplet are registered"
36
38
  end
37
39
  end
38
40
  end
39
41
 
42
+
40
43
  #:nodoc:
41
44
  def clean_tripartite_behaviour(calling_entity,behaviour,options={})
42
- my_behaviours = calling_entity.class.patriarch_behaviours
43
- behaviour_symbol = behaviour.to_s.underscore.to_sym
44
-
45
- # Compute names based on conventions
46
- progressive_present_behaviour =
47
- (Verbs::Conjugator.conjugate behaviour_symbol, :aspect => :progressive).split(/ /).last
45
+ my_class = calling_entity.class
46
+ tripartite_behaviour = my_class.patriarch_behaviours[behaviour.to_s.underscore.to_sym]
48
47
 
49
48
  transac = options[:transac] || Patriarch::TransactionServices::TransactionManagerService.instance.new_transaction("clean_#{behaviour.to_s}".to_sym)
50
49
  options = { :transac => transac, :stop_execution => true}
50
+
51
+ tripartite_behaviour.each do |protagonists|
52
+ clean_tripartite_behaviour_for_actor(calling_entity,behaviour,protagonists,options) if protagonists.first == my_class
53
+ clean_tripartite_behaviour_for_target(calling_entity,behaviour,protagonists,options) if protagonists.second == my_class
54
+ clean_tripartite_behaviour_for_medium(calling_entity,behaviour,protagonists,options) if protagonists.third == my_class
55
+ end
51
56
 
52
- if my_behaviours.include? behaviour_symbol
57
+ transac
58
+ end #clean_tripartite_behaviour
53
59
 
54
- # Dealing with active behaviour
55
- if my_behaviours[behaviour_symbol][:on]
56
- acted_on_models = my_behaviours[behaviour_symbol][:on]
57
- via_models = my_behaviours[behaviour_symbol][:via]
58
- acted_on_models.each do |acted_on_model|
59
- via_models.each do |via_model|
60
- calling_entity.send("#{acted_on_model.to_s.tableize}_i_#{behaviour.to_s}_via_#{via_model.to_s.tableize}", :with_medium => true).each do |tripartite_hash|
61
- target_i_behaved_on = Array(acted_on_model.to_s.classify.constantize.find(tripartite_hash[:target])).first
62
- medium_for_behaviour = Array(via_model.to_s.classify.constantize.find(tripartite_hash[:medium])).first
63
- calling_entity.send(Patriarch.undo(behaviour.to_s).underscore,medium_for_behaviour,target_i_behaved_on,options)
64
- end
65
- end
66
- end
67
- end
60
+ #:nodoc:
61
+ def clean_bipartite_behaviour(calling_entity,behaviour,options={})
62
+ my_class = calling_entity.class
63
+ bipartite_behaviour = my_class.patriarch_behaviours[behaviour.to_s.underscore.to_sym]
68
64
 
69
- # Dealing with passive behaviour
70
- if my_behaviours[behaviour_symbol][:by]
71
- targetted_by_models = my_behaviours[behaviour_symbol][:by]
72
- via_models = my_behaviours[behaviour_symbol][:via]
73
- targetted_by_models.each do |targetted_by_model|
74
- via_models.each do |via_model|
75
- calling_entity.send("#{targetted_by_model.to_s.tableize}_#{progressive_present_behaviour}_me_via_#{via_model.to_s.tableize}", :with_medium => true).each do |tripartite_hash|
76
- #
77
- actor_that_behaved_on_me = Array(targetted_by_model.to_s.classify.constantize.find(tripartite_hash[:actor])).first
78
- medium_for_behaviour = Array(via_model.to_s.classify.constantize.find(tripartite_hash[:medium])).first
79
- #
80
- actor_that_behaved_on_me.send(Patriarch.undo(behaviour.to_s).underscore,medium_for_behaviour,calling_entity,options)
81
- end
82
- end
83
- end
84
- end
65
+ transac = options[:transac] || Patriarch::TransactionServices::TransactionManagerService.instance.new_transaction("clean_#{behaviour.to_s}".to_sym)
66
+ options = { :transac => transac, :stop_execution => true}
85
67
 
86
- # Dealing with medium behaviour
87
- if my_behaviours[behaviour_symbol][:medium_between]
88
- #do nothing, we do not take care of data relative to medium ...
89
- end
90
- end # if my_behaviours.include?
68
+ bipartite_behaviour.each do |protagonists|
69
+ clean_bipartite_behaviour_for_actor(calling_entity,behaviour,protagonists,options) if protagonists.first == my_class
70
+ clean_bipartite_behaviour_for_target(calling_entity,behaviour,protagonists,options) if protagonists.second == my_class
71
+ end
91
72
 
92
73
  transac
93
- end #clean_tripartite_behaviour
74
+ end # #clean_bipartite_behaviour
94
75
 
95
- #:nodoc:
96
- def clean_bipartite_behaviour(calling_entity,behaviour,options={})
97
- my_behaviours = calling_entity.class.patriarch_behaviours
76
+ protected
77
+
78
+ def clean_bipartite_behaviour_for_actor(calling_entity,behaviour,protagonists,options)
79
+ acted_on_model = protagonists.second
80
+ calling_entity.send("#{acted_on_model.to_s.tableize}_i_#{behaviour.to_s}").each do |target_i_behaved_on|
81
+ calling_entity.send(Patriarch.undo(behaviour.to_s).underscore,target_i_behaved_on,options)
82
+ end
83
+ end
84
+
85
+ def clean_bipartite_behaviour_for_target(calling_entity,behaviour,protagonists,options)
86
+ # Dealing with passive behaviour
98
87
  behaviour_symbol = behaviour.to_s.underscore.to_sym
99
88
 
100
89
  # Compute names based on conventions
101
90
  progressive_present_behaviour =
102
91
  (Verbs::Conjugator.conjugate behaviour_symbol, :aspect => :progressive).split(/ /).last
103
92
 
104
- transac = options[:transac] || Patriarch::TransactionServices::TransactionManagerService.instance.new_transaction("clean_#{behaviour.to_s}".to_sym)
105
- options = { :transac => transac, :stop_execution => true}
93
+ targetted_by_model = protagonists.first
94
+ calling_entity.send("#{targetted_by_model.to_s.tableize}_#{progressive_present_behaviour}_me").each do |actor_that_behaved_on_me|
95
+ actor_that_behaved_on_me.send(Patriarch.undo(behaviour.to_s).underscore,calling_entity,options)
96
+ end
97
+ end
106
98
 
107
- if my_behaviours.include? behaviour_symbol
108
- # Dealing with passive behaviour
109
- if my_behaviours[behaviour_symbol][:by]
110
- targeted_by_models = my_behaviours[behaviour_symbol][:by]
111
- targeted_by_models.each do |targeted_by_model|
112
- calling_entity.send("#{targeted_by_model.to_s.tableize}_#{progressive_present_behaviour}_me").each do |target_that_behaved_on_me|
113
- target_that_behaved_on_me.send(Patriarch.undo(behaviour.to_s).underscore,calling_entity,options)
114
- end
115
- end
116
- end
117
- # Dealing with active behaviour
118
- if my_behaviours[behaviour_symbol][:on]
119
- acted_on_models = my_behaviours[behaviour_symbol][:on]
120
- acted_on_models.each do |acted_on_model|
121
- calling_entity.send("#{acted_on_model.to_s.tableize}_i_#{behaviour.to_s}").each do |target_i_behaved_on|
122
- calling_entity.send(Patriarch.undo(behaviour.to_s).underscore,target_i_behaved_on,options)
123
- end
124
- end
125
- end
126
- end # if my_behaviours.include?
99
+ def clean_tripartite_behaviour_for_actor(calling_entity,behaviour,protagonists,options)
100
+ # Dealing with active behaviour
101
+ acted_on_model = protagonists.second
102
+ via_model = protagonists.third
103
+ calling_entity.send("#{acted_on_model.to_s.tableize}_i_#{behaviour.to_s}_via_#{via_model.to_s.tableize}", :with_medium => true).each do |tripartite_hash|
104
+ target_i_behaved_on = Array(acted_on_model.find(tripartite_hash[:target])).first
105
+ medium_for_behaviour = Array(via_model.find(tripartite_hash[:medium])).first
106
+ calling_entity.send(Patriarch.undo(behaviour.to_s).underscore,medium_for_behaviour,target_i_behaved_on,options)
107
+ end
108
+ end
127
109
 
128
- transac
129
- end # #clean_bipartite_behaviour
130
- end # class Patriarch ...
110
+ def clean_tripartite_behaviour_for_target(calling_entity,behaviour,protagonists,options)
111
+ # Dealing with passive behaviour
112
+ behaviour_symbol = behaviour.to_s.underscore.to_sym
113
+
114
+ # Compute names based on conventions
115
+ progressive_present_behaviour =
116
+ (Verbs::Conjugator.conjugate behaviour_symbol, :aspect => :progressive).split(/ /).last
117
+
118
+ targetted_by_model = protagonists.first
119
+ via_model = protagonists.third
120
+ calling_entity.send("#{targetted_by_model.to_s.tableize}_#{progressive_present_behaviour}_me_via_#{via_model.to_s.tableize}", :with_medium => true).each do |tripartite_hash|
121
+ actor_that_behaved_on_me = Array(targetted_by_model.find(tripartite_hash[:actor])).first
122
+ medium_for_behaviour = Array(via_model.find(tripartite_hash[:medium])).first
123
+ actor_that_behaved_on_me.send(Patriarch.undo(behaviour.to_s).underscore,medium_for_behaviour,calling_entity,options)
124
+ end
125
+ end
126
+
127
+ def clean_tripartite_behaviour_for_medium(calling_entity,behaviour,protagonists,options)
128
+ # do nothing. Not implemented yet.
129
+ # TODO sort this bizarre thing
130
+ # Previous version comment said => #do nothing, we do not take care of data relative to medium ...
131
+ end
132
+
133
+ end # class Patriarch ...
@@ -86,6 +86,7 @@ class Patriarch::ToolServices::RedisExtractorService < Patriarch::Service
86
86
  if x.is_a? Array
87
87
  x[0].to_i
88
88
  x
89
+ # FIXME Bullshit détecté ici
89
90
  else
90
91
  x.to_i
91
92
  end
@@ -15,7 +15,7 @@ module Patriarch
15
15
 
16
16
  forwarded_methods_syms = [:relation_type,:actor_type,:target_type,:medium_type,
17
17
  :actor_id,:target_id,:medium_id,
18
- :context,:actor,:target,:medium]
18
+ :context,:actor,:target,:medium,:protagonists_models]
19
19
 
20
20
  # Forward methods that are not this transaction's job to step object
21
21
  forwarded_methods_syms.each do |method_sym|
@@ -43,22 +43,25 @@ module Patriarch
43
43
  target_type.to_s.camelize.constantize.find target_id
44
44
  end
45
45
 
46
+ def protagonists_models
47
+ # By convention always actor, target, model for tripartite and
48
+ # actor, model for bipartite
49
+ [actor,target,medium].compact.map(&:class)
50
+ end
51
+
46
52
  # execute the redis instructions embedded into this step against
47
53
  # instructions are a dao, a method to call upon and its argument embedded into a OpenStruct
48
54
  # before Patriarch 0.2.5, was embedded directly in a proc, was a complete failure for unknown reasons
49
55
  # Patriach::Transaction use this method on each of the steps it registered within a multi block
50
56
  def execute
51
- queue.each do |redis_ostruct_instruction|
52
- os = redis_ostruct_instruction
53
- dao, method_sym, args = [os.dao,os.method_sym,os.args]
54
- dao.send(method_sym,*args)
55
- # deprecated, remove this : redis_instruction.call
57
+ queue.each do |redis_struct_instruction|
58
+ redis_struct_instruction.execute
56
59
  end
57
60
  end
58
61
 
59
- # @param [OpenStruct] ostruct dao with parameters and method to call embedded here to be processed later
60
- def add_to_queue(ostruct)
61
- queue << ostruct
62
+ # @param [Patriarch::RedisInstruction] ostruct dao with parameters and method to call embedded here to be processed later
63
+ def add_to_queue(struct)
64
+ queue << struct
62
65
  end
63
66
  end
64
67
  end
@@ -1,3 +1,3 @@
1
1
  module Patriarch
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -22,7 +22,7 @@ describe Patriarch::DAOServices::BipartiteRelationshipBuilderService do
22
22
  it "shall insert processable lambdas into queues when create is called" do
23
23
  expect{
24
24
  instance.create(@transac)
25
- }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? OpenStruct}.size }.by(2)
25
+ }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? Patriarch::RedisInstruction}.size }.by(2)
26
26
 
27
27
  expect{
28
28
  @transac.transaction_queue.each do |redis_ostruct_instruction|
@@ -36,7 +36,7 @@ describe Patriarch::DAOServices::BipartiteRelationshipBuilderService do
36
36
  it "shall insert processable lambdas into queues when destroy is called" do
37
37
  expect{
38
38
  instance.destroy(@transac)
39
- }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? OpenStruct}.size }.by(2)
39
+ }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? Patriarch::RedisInstruction}.size }.by(2)
40
40
 
41
41
  expect{
42
42
  @transac.transaction_queue.each do |redis_ostruct_instruction|
@@ -24,7 +24,7 @@ describe Patriarch::DAOServices::TripartiteRelationshipBuilderService do
24
24
  it "shall insert processable lambdas into queues when create is called" do
25
25
  expect{
26
26
  instance.create(@transac)
27
- }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? OpenStruct}.size }.by(3)
27
+ }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? Patriarch::RedisInstruction}.size }.by(3)
28
28
 
29
29
  expect{
30
30
  @transac.transaction_queue.each do |redis_ostruct_instruction|
@@ -38,7 +38,7 @@ describe Patriarch::DAOServices::TripartiteRelationshipBuilderService do
38
38
  it "shall insert processable lambdas into queues when destroy is called" do
39
39
  expect{
40
40
  instance.destroy(@transac)
41
- }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? OpenStruct}.size }.by(3)
41
+ }.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? Patriarch::RedisInstruction}.size }.by(3)
42
42
 
43
43
  expect{
44
44
  @transac.transaction_queue.each do |redis_ostruct_instruction|
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.5
4
+ version: 0.2.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-02-09 00:00:00.000000000 Z
13
+ date: 2013-05-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: verbs
@@ -166,6 +166,7 @@ files:
166
166
  - lib/patriarch/dao_services/retriever_service.rb
167
167
  - lib/patriarch/dao_services/tripartite_relationship_builder_service.rb
168
168
  - lib/patriarch/manager_service.rb
169
+ - lib/patriarch/redis_instruction.rb
169
170
  - lib/patriarch/service.rb
170
171
  - lib/patriarch/tool_services/redis_cleaner_service.rb
171
172
  - lib/patriarch/tool_services/redis_extractor_service.rb