patriarch 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/lib/generators/patriarch/patriarch_generator.rb +52 -52
- data/lib/generators/patriarch/templates/empty_behaviour_module.rb +6 -1
- data/lib/generators/patriarch/templates/empty_service_module.rb +24 -0
- data/lib/patriarch/authorization_service.rb +7 -5
- data/lib/patriarch/behaviours.rb +6 -16
- data/lib/patriarch/dao_services/retriever_service.rb +4 -4
- data/lib/patriarch/manager_service.rb +12 -11
- data/lib/patriarch/service.rb +1 -1
- data/lib/patriarch/transaction.rb +52 -50
- data/lib/patriarch/transaction_step.rb +32 -30
- data/lib/patriarch/version.rb +1 -1
- data/lib/patriarch.rb +35 -2
- data/patriarch.gemspec +14 -2
- data/spec/lib/patriarch/add_behaviour_spec.rb +31 -44
- data/spec/lib/patriarch/bipartite_relationship_builder_spec.rb +11 -12
- data/spec/lib/patriarch/like_service_spec.rb +6 -5
- data/spec/lib/patriarch/redis_mapper_service_spec.rb +6 -4
- data/spec/spec_helper.rb +117 -0
- metadata +89 -13
- data/spec/lib/patriarch/clean_reclip_spec.rb +0 -31
- data/spec/lib/patriarch/reclip_spec.rb +0 -39
data/.gitignore
CHANGED
@@ -1,69 +1,69 @@
|
|
1
|
-
|
2
|
-
source_root File.expand_path('../templates', __FILE__)
|
3
|
-
|
4
|
-
desc "Generate files needed to implement the BEHAVIOUR you specified. Don't forget to add declarations into models"
|
1
|
+
require "rails/generators"
|
5
2
|
|
6
|
-
|
3
|
+
class PatriarchGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
desc "Generate files needed to implement the BEHAVIOUR you specified. Don't forget to add declarations into models"
|
7
7
|
|
8
|
-
|
9
|
-
def init_directories
|
10
|
-
empty_directory "lib/patriarch/services/#{behaviour.underscore.downcase}"
|
11
|
-
empty_directory "lib/patriarch/services/#{undo(behaviour.underscore.downcase)}"
|
12
|
-
template "empty_behaviour_module.rb", "lib/patriarch/services/#{behaviour.underscore.downcase}.rb"
|
13
|
-
template "tools_methods.rb", "lib/patriarch/behaviours/#{behaviour.underscore.downcase}/tools_methods.rb"
|
14
|
-
end
|
8
|
+
argument :behaviour, :type => :string
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
public
|
11
|
+
def init_directories
|
12
|
+
empty_directory "lib/patriarch/services/#{behaviour.underscore.downcase}"
|
13
|
+
empty_directory "lib/patriarch/services/#{Patriarch.undo(behaviour.underscore.downcase)}"
|
14
|
+
template "empty_behaviour_module.rb", "lib/patriarch/behaviours/#{behaviour.underscore.downcase}.rb"
|
15
|
+
template "empty_service_module.rb", "lib/patriarch/services/#{behaviour.underscore.downcase}.rb"
|
16
|
+
template "tools_methods.rb", "lib/patriarch/behaviours/#{behaviour.underscore.downcase}/tools_methods.rb"
|
21
17
|
end
|
22
|
-
create_undo_services(behaviour)
|
23
|
-
end
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
def generate_services
|
20
|
+
create_services(behaviour)
|
21
|
+
# implémenter un switch ici, plus zoli ...
|
22
|
+
self.class.send(:define_method,:class_name) do
|
23
|
+
Patriarch.undo(behaviour).classify
|
24
|
+
end
|
25
|
+
create_undo_services(behaviour)
|
28
26
|
end
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
template "before_manager_service.rb", "lib/patriarch/services/#{behaviour_str}/before_manager_service.rb"
|
35
|
-
template "before_service.rb", "lib/patriarch/services/#{behaviour_str}/before_service.rb"
|
28
|
+
private
|
29
|
+
def class_name
|
30
|
+
behaviour.classify
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
def undo_class_name
|
34
|
+
Patriarch.undo(behaviour).classify
|
35
|
+
end
|
40
36
|
|
37
|
+
def create_services(behaviour)
|
38
|
+
behaviour_str = behaviour.underscore.downcase
|
39
|
+
template "authorization_service.rb", "lib/patriarch/services/#{behaviour_str}/authorization_service.rb"
|
40
|
+
|
41
|
+
template "before_manager_service.rb", "lib/patriarch/services/#{behaviour_str}/before_manager_service.rb"
|
42
|
+
template "before_service.rb", "lib/patriarch/services/#{behaviour_str}/before_service.rb"
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
template "manager_service.rb", "lib/patriarch/services/#{behaviour_str}/manager_service.rb"
|
45
|
+
|
46
|
+
template "service.rb", "lib/patriarch/services/#{behaviour_str}/service.rb"
|
45
47
|
|
46
|
-
def create_undo_services(behaviour)
|
47
|
-
undo_behaviour_str = undo(behaviour).underscore.downcase
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
template "before_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/before_service.rb"
|
49
|
+
template "after_manager_service.rb", "lib/patriarch/services/#{behaviour_str}/after_manager_service.rb"
|
50
|
+
template "after_service.rb", "lib/patriarch/services/#{behaviour_str}/after_service.rb"
|
51
|
+
end
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
template "undo_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/service.rb"
|
53
|
+
def create_undo_services(behaviour)
|
54
|
+
undo_behaviour_str = Patriarch.undo(behaviour).underscore.downcase
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
template "authorization_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/authorization_service.rb"
|
57
|
+
|
58
|
+
template "before_manager_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/before_manager_service.rb"
|
59
|
+
template "before_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/before_service.rb"
|
61
60
|
|
61
|
+
template "manager_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/manager_service.rb"
|
62
|
+
|
63
|
+
template "undo_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/service.rb"
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
undo
|
67
|
-
end
|
65
|
+
template "after_manager_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/after_manager_service.rb"
|
66
|
+
template "after_service.rb", "lib/patriarch/services/#{undo_behaviour_str}/after_service.rb"
|
67
|
+
end
|
68
68
|
|
69
|
-
end
|
69
|
+
end # PatriarchGenerator
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Patriarch
|
2
|
+
module Services
|
3
|
+
module <%= class_name %>
|
4
|
+
autoload :AfterManagerService, 'patriarch/services/<%= class_name.underscore %>/after_manager_service.rb'
|
5
|
+
autoload :AfterService, 'patriarch/services/<%= class_name.underscore %>/after_service.rb'
|
6
|
+
autoload :AuthorizationService, 'patriarch/services/<%= class_name.underscore %>/authorization_service.rb'
|
7
|
+
autoload :BeforeManagerService, 'patriarch/services/<%= class_name.underscore %>/before_manager_service.rb'
|
8
|
+
autoload :BeforeService, 'patriarch/services/<%= class_name.underscore %>/before_service.rb'
|
9
|
+
autoload :ManagerService, 'patriarch/services/<%= class_name.underscore %>/manager_service.rb'
|
10
|
+
autoload :Service, 'patriarch/services/<%= class_name.underscore %>/service.rb'
|
11
|
+
end
|
12
|
+
|
13
|
+
module <%= undo_class_name %>
|
14
|
+
autoload :AfterManagerService, 'patriarch/services/<%= undo_class_name.underscore %>/after_manager_service.rb'
|
15
|
+
autoload :AfterService, 'patriarch/services/<%= undo_class_name.underscore %>/after_service.rb'
|
16
|
+
autoload :AuthorizationService, 'patriarch/services/<%= undo_class_name.underscore %>/authorization_service.rb'
|
17
|
+
autoload :BeforeManagerService, 'patriarch/services/<%= undo_class_name.underscore %>/before_manager_service.rb'
|
18
|
+
autoload :BeforeService, 'patriarch/services/<%= undo_class_name.underscore %>/before_service.rb'
|
19
|
+
autoload :ManagerService, 'patriarch/services/<%= undo_class_name.underscore %>/manager_service.rb'
|
20
|
+
autoload :Service, 'patriarch/services/<%= undo_class_name.underscore %>/service.rb'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module Patriarch
|
4
|
+
class AuthorizationService
|
5
|
+
include Singleton
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
# override if necessary
|
8
|
+
def grant?(*args)
|
9
|
+
true
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
data/lib/patriarch/behaviours.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#require 'patriarch/behaviours/tagging'
|
4
|
-
#require 'patriarch/behaviours/join'
|
1
|
+
require 'verbs'
|
2
|
+
require 'patriarch'
|
5
3
|
|
6
4
|
module Patriarch
|
7
5
|
module Behaviours
|
@@ -61,12 +59,6 @@ module Patriarch
|
|
61
59
|
end
|
62
60
|
end
|
63
61
|
|
64
|
-
def undo(str)
|
65
|
-
undo = "undo_"
|
66
|
-
undo << str
|
67
|
-
undo
|
68
|
-
end
|
69
|
-
|
70
62
|
def included(klass)
|
71
63
|
klass.extend ClassMethods
|
72
64
|
klass.extend ActiveModel::Callbacks
|
@@ -77,8 +69,6 @@ module Patriarch
|
|
77
69
|
end
|
78
70
|
|
79
71
|
module ClassMethods
|
80
|
-
def add_behaviours(*behaviours)
|
81
|
-
end
|
82
72
|
|
83
73
|
def add_behaviour(behaviour,options)
|
84
74
|
# add_behaviour :like, :by => bla, :on => [:item,:user] || :community, :as => :aimer, :reverse_as => :haïr ...
|
@@ -102,7 +92,7 @@ module Patriarch
|
|
102
92
|
# TODO
|
103
93
|
def self.included(klass)
|
104
94
|
klass.extend ActiveModel::Callbacks
|
105
|
-
klass.send(:define_model_callbacks, self.const_get(:Behaviour).to_sym, Patriarch
|
95
|
+
klass.send(:define_model_callbacks, self.const_get(:Behaviour).to_sym, Patriarch.undo(self.const_get(:Behaviour)).to_sym)
|
106
96
|
end
|
107
97
|
|
108
98
|
# like
|
@@ -113,9 +103,9 @@ module Patriarch
|
|
113
103
|
end
|
114
104
|
|
115
105
|
# undo_like
|
116
|
-
define_method(Patriarch
|
117
|
-
run_callbacks Patriarch
|
118
|
-
"Patriarch::Services::#{(Patriarch
|
106
|
+
define_method(Patriarch.undo(methods_mod.const_get(:Behaviour)).to_sym) do |entity,options={}|
|
107
|
+
run_callbacks Patriarch.undo(methods_mod.const_get(:Behaviour)).to_sym do
|
108
|
+
"Patriarch::Services::#{(Patriarch.undo(methods_mod.const_get(:Behaviour))).classify}::ManagerService".constantize.instance.resolve(self,entity)
|
119
109
|
end
|
120
110
|
end
|
121
111
|
|
@@ -25,10 +25,10 @@ class Patriarch::DAOServices::RetrieverService < Patriarch::Service
|
|
25
25
|
actor_id = transaction_item.actor_id
|
26
26
|
actor_type = transaction_item.actor_type
|
27
27
|
|
28
|
-
if Redis.constants.map(&:to_s).include?("#{dao_info[:type].camelize}")
|
28
|
+
if Redis::Objects.constants.map(&:to_s).include?("#{dao_info[:type].pluralize.camelize}")
|
29
29
|
redis_dao_class = "Redis::#{dao_info[:type].camelize}".constantize
|
30
30
|
else
|
31
|
-
raise InvalidRedisTypeException
|
31
|
+
raise InvalidRedisTypeException, "Redis constants available were #{Redis::Objects.constants} and supplied type was #{dao_info[:type]}"
|
32
32
|
end
|
33
33
|
|
34
34
|
redis_dao_class.new("#{actor_type}:#{actor_id}:#{dao_info[:key]}")
|
@@ -40,10 +40,10 @@ class Patriarch::DAOServices::RetrieverService < Patriarch::Service
|
|
40
40
|
target_id = transaction_item.target_id
|
41
41
|
target_type = transaction_item.target_type
|
42
42
|
|
43
|
-
if Redis.constants.map(&:to_s).include?("#{dao_info[:type].camelize}")
|
43
|
+
if Redis::Objects.constants.map(&:to_s).include?("#{dao_info[:type].pluralize.camelize}")
|
44
44
|
redis_dao_class = "Redis::#{dao_info[:type].camelize}".constantize
|
45
45
|
else
|
46
|
-
raise InvalidRedisTypeException
|
46
|
+
raise InvalidRedisTypeException, "Redis constants available were #{Redis::Objects.constants} and supplied type was #{dao_info[:type]}"
|
47
47
|
end
|
48
48
|
redis_dao_class.new("#{target_type}:#{target_id}:#{dao_info[:key]}")
|
49
49
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
|
3
|
-
|
4
|
-
class
|
5
|
-
|
3
|
+
module Patriarch
|
4
|
+
class ManagerService
|
5
|
+
include Singleton
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
# /!\ Changer l'architecture ici, l'idée est là
|
8
|
+
#def resolve(*args, options={})
|
9
|
+
# Traitement des options
|
10
|
+
# ...
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
12
|
+
# Traitement normal
|
13
|
+
# after_resolve(*args)
|
14
|
+
#end
|
15
|
+
end
|
16
|
+
end
|
data/lib/patriarch/service.rb
CHANGED
@@ -1,68 +1,70 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module Patriarch
|
2
|
+
class Transaction
|
3
|
+
attr_reader :id, :steps, :current_step_number
|
4
|
+
attr_reader :type
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
forwarded_methods_syms = [:relation_type,:actor_type,:target_type,:actor_id,:target_id,
|
7
|
+
:context,:actor,:target]
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Forward methods that are not this transaction's job to step object
|
10
|
+
forwarded_methods_syms.each do |method_sym|
|
11
|
+
define_method(method_sym) do
|
12
|
+
current_step.send(method_sym)
|
13
|
+
end
|
12
14
|
end
|
13
|
-
end
|
14
15
|
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
# id => go $redis.incr
|
18
|
+
def initialize(type,id) #relation_type,actor,target,
|
19
|
+
@type = type
|
20
|
+
@id = id
|
21
|
+
@steps = []
|
22
|
+
@current_step_number = 0
|
23
|
+
end
|
23
24
|
|
24
|
-
# Initializes a new step and stores it in the steps array right away
|
25
|
-
# A step matches a "like", "follow", "own", etc.
|
26
|
-
# Register that we went a step further into the transaction processus
|
27
|
-
# Medium is nil by default (bipartite transactions does not require more than target/actor)
|
28
|
-
def add_step(relation_type,actor,target,medium=nil)
|
29
25
|
# Initializes a new step and stores it in the steps array right away
|
30
|
-
|
31
|
-
|
32
|
-
# if initilization failed we should not move forward ...
|
33
|
-
raise PatriarchTransactionStepInstanciationException unless new_step
|
34
|
-
|
26
|
+
# A step matches a "like", "follow", "own", etc.
|
35
27
|
# Register that we went a step further into the transaction processus
|
36
|
-
|
37
|
-
|
38
|
-
|
28
|
+
# Medium is nil by default (bipartite transactions does not require more than target/actor)
|
29
|
+
def add_step(relation_type,actor,target,medium=nil)
|
30
|
+
# Initializes a new step and stores it in the steps array right away
|
31
|
+
new_step = Patriarch::TransactionStep.new(relation_type,actor,target,medium)
|
32
|
+
|
33
|
+
# if initilization failed we should not move forward ...
|
34
|
+
raise PatriarchTransactionStepInstanciationException unless new_step
|
39
35
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
# Register that we went a step further into the transaction processus
|
37
|
+
@steps << new_step
|
38
|
+
@current_step_number += 1
|
39
|
+
end
|
40
|
+
|
41
|
+
# Executes the calls to redis in one block here.
|
42
|
+
def execute
|
43
|
+
$redis.multi do
|
44
|
+
steps.each do |step|
|
45
|
+
step.execute
|
46
|
+
end
|
45
47
|
end
|
46
48
|
end
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
def transaction_queue
|
51
|
+
transaction_queue = []
|
52
|
+
steps.each do |step|
|
53
|
+
transaction_queue.concat(step.queue)
|
54
|
+
end
|
55
|
+
transaction_queue
|
53
56
|
end
|
54
|
-
transaction_queue
|
55
|
-
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
def add_to_queue(proc)
|
59
|
+
current_step.add_to_queue(proc)
|
60
|
+
end
|
60
61
|
|
61
|
-
|
62
|
+
alias :queue :transaction_queue
|
62
63
|
|
63
|
-
|
64
|
+
protected
|
64
65
|
|
65
|
-
|
66
|
-
|
66
|
+
def current_step
|
67
|
+
steps[current_step_number-1]
|
68
|
+
end
|
67
69
|
end
|
68
|
-
end
|
70
|
+
end
|
@@ -1,39 +1,41 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Patriarch
|
2
|
+
class TransactionStep
|
3
|
+
attr_accessor :context, :queue
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
def initialize(relation_type,actor,target,medium)
|
6
|
+
@context = {
|
7
|
+
:relation_type => relation_type,
|
8
|
+
:actor_type => actor.class.name.underscore.to_sym,
|
9
|
+
:target_type => target.class.name.underscore.to_sym,
|
10
|
+
:actor_id => actor.id,
|
11
|
+
:target_id => target.id,
|
12
|
+
}
|
13
|
+
@queue = []
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
# defines access methods to context fields letting it be encapsulated nicely
|
17
|
+
[:relation_type,:actor_type,:target_type,:actor_id,:target_id].each do |context_key|
|
18
|
+
define_method(context_key) do
|
19
|
+
context[context_key]
|
20
|
+
end
|
19
21
|
end
|
20
|
-
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def actor
|
24
|
+
actor_type.to_s.camelize.constantize.find actor_id
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def target
|
28
|
+
target_type.to_s.camelize.constantize.find target_id
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
def execute
|
32
|
+
queue.each do |redis_instruction|
|
33
|
+
redis_instruction.call
|
34
|
+
end
|
33
35
|
end
|
34
|
-
end
|
35
36
|
|
36
|
-
|
37
|
-
|
37
|
+
def add_to_queue(proc)
|
38
|
+
queue << proc
|
39
|
+
end
|
38
40
|
end
|
39
|
-
end
|
41
|
+
end
|
data/lib/patriarch/version.rb
CHANGED
data/lib/patriarch.rb
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
require "patriarch/version"
|
2
|
+
require "redis"
|
3
|
+
require "redis/objects"
|
4
|
+
require "rails/generators"
|
5
|
+
|
6
|
+
|
7
|
+
require File.expand_path('../generators/patriarch/patriarch_generator',__FILE__)
|
2
8
|
|
3
9
|
module Patriarch
|
4
|
-
|
5
|
-
|
10
|
+
autoload :Service, 'patriarch/service'
|
11
|
+
autoload :Transaction, 'patriarch/transaction'
|
12
|
+
autoload :TransactionStep, 'patriarch/transaction_step'
|
13
|
+
autoload :AuthorizationService, 'patriarch/authorization_service'
|
14
|
+
autoload :ManagerService, 'patriarch/manager_service'
|
15
|
+
autoload :Behaviours, 'patriarch/behaviours'
|
16
|
+
|
17
|
+
module DAOServices
|
18
|
+
autoload :BipartiteRelationshipBuilderService, 'patriarch/dao_services/bipartite_relationship_builder_service'
|
19
|
+
autoload :RedisMapperService, 'patriarch/dao_services/redis_mapper_service'
|
20
|
+
autoload :RetrieverService, 'patriarch/dao_services/retriever_service'
|
21
|
+
end
|
22
|
+
|
23
|
+
module ToolServices
|
24
|
+
autoload :RedisCleaner, 'patriarch/tool_services/redis_cleaner'
|
25
|
+
autoload :RedisExtractorService, 'patriarch/tool_services/redis_extractor_service'
|
26
|
+
end
|
27
|
+
|
28
|
+
module TransactionServices
|
29
|
+
autoload :TransactionManagerService, 'patriarch/transaction_services/transaction_manager_service'
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.undo(str)
|
33
|
+
undo = "undo_"
|
34
|
+
undo << str
|
35
|
+
undo
|
36
|
+
end
|
37
|
+
|
38
|
+
end # Patriarch
|
data/patriarch.gemspec
CHANGED
@@ -10,10 +10,22 @@ Gem::Specification.new do |spec|
|
|
10
10
|
|
11
11
|
spec.platform = Gem::Platform::RUBY
|
12
12
|
spec.licenses = ['MIT']
|
13
|
-
|
13
|
+
spec.post_install_message = "Thanks for installing!"
|
14
|
+
|
15
|
+
# Main dependencies
|
16
|
+
spec.add_dependency "redis-objects"
|
17
|
+
spec.add_runtime_dependency "verbs"
|
18
|
+
spec.add_runtime_dependency "rails"
|
19
|
+
spec.add_runtime_dependency "railties"
|
20
|
+
spec.add_runtime_dependency "redis-objects"
|
21
|
+
|
22
|
+
# Dependencies needed for testing
|
14
23
|
spec.add_development_dependency "rspec"
|
15
|
-
|
24
|
+
spec.add_development_dependency "fakeredis"
|
25
|
+
spec.add_development_dependency "autotest-rails"
|
26
|
+
spec.add_development_dependency "ZenTest"
|
16
27
|
|
28
|
+
# Other options ...
|
17
29
|
spec.files = `git ls-files`.split($\)
|
18
30
|
spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
31
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
@@ -1,72 +1,59 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
3
|
describe Patriarch::Behaviours do
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
class ModelClass;
|
9
|
-
include Patriarch::Behaviours
|
10
|
-
end
|
11
|
-
|
12
|
-
class ModelKlass;
|
13
|
-
include Patriarch::Behaviours
|
14
|
-
end
|
15
|
-
|
16
|
-
ModelClass.add_behaviour :like, :on => [:modelKlass]
|
17
|
-
ModelKlass.add_behaviour :like, :by => [:modelClass]
|
5
|
+
Monster.add_behaviour :like, :on => [:fallenAngel]
|
6
|
+
FallenAngel.add_behaviour :like, :by => [:monster]
|
18
7
|
|
19
8
|
|
20
9
|
context "when adding a behaviour" do
|
10
|
+
before(:all) do
|
11
|
+
@monster = new_monster
|
12
|
+
@fallen_angel = new_fallen_angel
|
13
|
+
end
|
14
|
+
|
21
15
|
it "should implement basic tool methods" do
|
22
16
|
progressive_like = (Verbs::Conjugator.conjugate :like, :aspect => :progressive).split(/ /).last
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
17
|
+
@monster.should respond_to("#{"fallen_angel".pluralize}_i_like")
|
18
|
+
@monster.should respond_to("#{"fallen_angel".pluralize}_i_like_ids")
|
19
|
+
@fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_like}_me")
|
20
|
+
@fallen_angel.should respond_to("#{"monster".pluralize}_#{progressive_like}_me_ids")
|
27
21
|
end
|
28
22
|
|
29
23
|
it "should implement actions only on model being added behaviours with ':on' options" do
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
mk.should_not respond_to(:like)
|
35
|
-
mk.should_not respond_to(:undo_like)
|
24
|
+
@monster.should respond_to(:like)
|
25
|
+
@monster.should respond_to(:undo_like)
|
26
|
+
@fallen_angel.should_not respond_to(:like)
|
27
|
+
@fallen_angel.should_not respond_to(:undo_like)
|
36
28
|
end
|
37
|
-
end
|
29
|
+
end # context "when adding a behaviour"
|
38
30
|
|
39
31
|
context "when using an added behaviour" do
|
40
|
-
User.add_behaviour :smoke, :on => [:User]
|
41
|
-
User.add_behaviour :smoke, :by => [:User]
|
42
|
-
|
43
32
|
before(:all) do
|
44
|
-
@
|
45
|
-
@
|
46
|
-
@
|
33
|
+
@monster = new_monster
|
34
|
+
@fallen_angel = new_fallen_angel
|
35
|
+
@monster.like @fallen_angel
|
47
36
|
end
|
48
37
|
|
49
38
|
it "shall play the transaction nicely" do
|
50
|
-
@
|
51
|
-
@
|
39
|
+
@monster.fallen_angels_i_like.should == [@fallen_angel]
|
40
|
+
@fallen_angel.monsters_liking_me.should == [@monster]
|
52
41
|
|
53
|
-
@
|
54
|
-
@
|
42
|
+
@monster.fallen_angels_i_like_ids.should == [@fallen_angel.id]
|
43
|
+
@fallen_angel.monsters_liking_me_ids.should == [@monster.id]
|
55
44
|
end
|
56
45
|
|
57
46
|
it "shall play reverse transaction nicely" do
|
58
|
-
@
|
59
|
-
@
|
60
|
-
@
|
47
|
+
@monster.undo_like @fallen_angel
|
48
|
+
@monster.fallen_angels_i_like.include?(@fallen_angel).should be_false
|
49
|
+
@fallen_angel.monsters_liking_me.include?(@monster).should be_false
|
61
50
|
|
62
|
-
|
63
|
-
|
64
|
-
# @userA.users_i_smoke_ids.should be_empty
|
65
|
-
#@userB.users_smoking_me_ids.should be_empty
|
51
|
+
@monster.fallen_angels_i_like_ids.should be_empty
|
52
|
+
@fallen_angel.monsters_liking_me_ids.should be_empty
|
66
53
|
end
|
67
54
|
|
68
55
|
after(:all) do
|
69
|
-
@
|
56
|
+
@monster.undo_like @fallen_angel
|
70
57
|
end
|
71
|
-
end
|
72
|
-
end
|
58
|
+
end # context "when using an added behaviour"
|
59
|
+
end # describe
|
@@ -3,19 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe Patriarch::DAOServices::BipartiteRelationshipBuilderService do
|
4
4
|
before(:each) do
|
5
5
|
@instance = Patriarch::DAOServices::BipartiteRelationshipBuilderService.instance
|
6
|
-
@
|
7
|
-
@
|
6
|
+
@monster = new_monster
|
7
|
+
@fallen_angel = new_fallen_angel
|
8
8
|
@transac ||= Patriarch::TransactionServices::TransactionManagerService.instance.new_transaction(:like)
|
9
|
-
@transac.add_step(:like,@
|
9
|
+
@transac.add_step(:like,@monster,@fallen_angel)
|
10
10
|
end
|
11
11
|
|
12
12
|
it "shall insert processable lambdas into queues when create is called" do
|
13
13
|
# Stubs the DAO retriever service so it gives DAO arrays back
|
14
14
|
dao_sample = {
|
15
|
-
:actor => Redis::SortedSet.new("
|
16
|
-
:target => Redis::
|
15
|
+
:actor => Redis::SortedSet.new("monster:1:patriarch_fallen_angels_i_like"),
|
16
|
+
:target => Redis::SortedSet.new("fallen_angel:1:patriarch_monsters_liking_me")
|
17
17
|
}
|
18
|
-
Patriarch::DAOServices::RetrieverService.instance.stub(:call).with(any_args()).and_return(dao_sample)
|
18
|
+
Patriarch::DAOServices::RetrieverService.instance.stub(:call).twice.with(any_args()).and_return(dao_sample)
|
19
19
|
|
20
20
|
expect{
|
21
21
|
@instance.create(@transac)
|
@@ -29,12 +29,11 @@ describe Patriarch::DAOServices::BipartiteRelationshipBuilderService do
|
|
29
29
|
it "shall insert processable lambdas into queues when destroy is called" do
|
30
30
|
# Stubs the DAO retriever service so it gives DAO arrays back
|
31
31
|
dao_sample = {
|
32
|
-
:actor => Redis::SortedSet.new("
|
33
|
-
:target => Redis::
|
32
|
+
:actor => Redis::SortedSet.new("monster:1:patriarch_fallen_angels_i_like"),
|
33
|
+
:target => Redis::SortedSet.new("fallen_angel:1:patriarch_monsters_liking_me")
|
34
34
|
}
|
35
|
-
Patriarch::DAOServices::RetrieverService.instance.stub(:call).with(any_args()).and_return(dao_sample)
|
35
|
+
Patriarch::DAOServices::RetrieverService.instance.stub(:call).twice.with(any_args()).and_return(dao_sample)
|
36
36
|
|
37
|
-
|
38
37
|
expect{
|
39
38
|
@instance.destroy(@transac)
|
40
39
|
}.to change{ @transac.transaction_queue.select{ |queue_element| queue_element.is_a? Proc}.size }.by(2)
|
@@ -45,7 +44,7 @@ describe Patriarch::DAOServices::BipartiteRelationshipBuilderService do
|
|
45
44
|
end
|
46
45
|
|
47
46
|
after(:each) do
|
48
|
-
$redis.del "
|
49
|
-
$redis.del "
|
47
|
+
$redis.del "monster:#{@monster.id}:patriarch_fallen_angels_i_like"
|
48
|
+
$redis.del "fallen_angel:#{@fallen_angel.id}:patriarch_monsters_liking_me"
|
50
49
|
end
|
51
50
|
end
|
@@ -2,16 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Patriarch::Services do
|
4
4
|
before (:each) do
|
5
|
-
@
|
6
|
-
@
|
5
|
+
@monster = new_monster
|
6
|
+
@fallen_angel = new_fallen_angel
|
7
7
|
end
|
8
8
|
|
9
9
|
context "LikeService" do
|
10
10
|
it "should register like informations properly" do
|
11
11
|
# Wrong way of doing tests, test should not know about what's inside ...
|
12
|
-
|
13
|
-
|
14
|
-
Redis::SortedSet.new("
|
12
|
+
pending "redo this test ffs"
|
13
|
+
# Patriarch::Services::Like::ManagerService.instance.resolve(@mc,@mk)
|
14
|
+
# Redis::SortedSet.new("mc:#{@mc.id}:redis_likes").members.include?(@mk.id.to_s).should be_true
|
15
|
+
# Redis::SortedSet.new("mk:#{@mk.id}:redis_liker_mcs").members.include?(@mc.id.to_s).should be_true
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
@@ -3,15 +3,17 @@ require 'spec_helper'
|
|
3
3
|
describe Patriarch::DAOServices::RedisMapperService do
|
4
4
|
before(:each) do
|
5
5
|
@instance = Patriarch::DAOServices::RedisMapperService.instance
|
6
|
-
@context = {:relation_type => :like, :actor_type => :
|
6
|
+
@context = {:relation_type => :like, :actor_type => :monster, :target_type => :fallen_angel,
|
7
7
|
:actor_id => 1, :target_id => 1}
|
8
8
|
@transaction_item = double()
|
9
|
-
@transaction_item.stub(:
|
9
|
+
@transaction_item.stub(:relation_type).and_return(@context[:relation_type])
|
10
|
+
@transaction_item.stub(:actor_type).and_return(@context[:actor_type])
|
11
|
+
@transaction_item.stub(:target_type).and_return(@context[:target_type])
|
10
12
|
end
|
11
13
|
|
12
14
|
it "shall retrieve right DAO information" do
|
13
|
-
@instance.call(@transaction_item,:actor).should eq({:type => "sorted_set", :key => "
|
14
|
-
@instance.call(@transaction_item,:target).should eq({:type => "sorted_set", :key => "
|
15
|
+
@instance.call(@transaction_item,:actor).should eq({:type => "sorted_set", :key => "patriarch_fallen_angels_i_like"})
|
16
|
+
@instance.call(@transaction_item,:target).should eq({:type => "sorted_set", :key => "patriarch_monsters_liking_me"})
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'redis'
|
2
|
+
require 'redis/objects'
|
3
|
+
|
4
|
+
# Beware of poor autoload in redis_objects ...
|
5
|
+
# TODO ask nateware
|
6
|
+
require 'redis/objects/hashes'
|
7
|
+
require 'redis/objects/sorted_sets'
|
8
|
+
|
9
|
+
require 'patriarch'
|
10
|
+
require 'active_model'
|
11
|
+
require 'action_view'
|
12
|
+
require 'rails/generators'
|
13
|
+
require 'rspec/autorun'
|
14
|
+
|
15
|
+
require File.expand_path("../../lib/generators/patriarch/patriarch_generator", __FILE__)
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
# ## Mock Framework
|
19
|
+
#
|
20
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
21
|
+
#
|
22
|
+
# config.mock_with :mocha
|
23
|
+
# config.mock_with :flexmock
|
24
|
+
# config.mock_with :rr
|
25
|
+
end
|
26
|
+
|
27
|
+
$redis=Redis.new(:host => 'localhost', :port => 6379, :db => 8)
|
28
|
+
$redis.flushdb
|
29
|
+
|
30
|
+
dummy_location = File.expand_path("../../spec/dummy", __FILE__)
|
31
|
+
|
32
|
+
puts "Cleaning previous dummy"
|
33
|
+
# refactor with elegant code here
|
34
|
+
`yes|rm -r #{dummy_location + "/*"}`
|
35
|
+
|
36
|
+
# Destroy previously initialized files in dummy, clean up !
|
37
|
+
puts "Generating files to be tested in a dummy"
|
38
|
+
|
39
|
+
# Initialize files in dummy :)
|
40
|
+
# Capture prevents stdout outputs from code between curly braces to be displayed
|
41
|
+
# This avoid polluting user interface
|
42
|
+
capture(:stdout) { PatriarchGenerator.start(%w(like),{:destination_root => dummy_location}) }
|
43
|
+
|
44
|
+
#Enhance load_path with dummy located files ...
|
45
|
+
$LOAD_PATH << File.expand_path("../../spec/dummy/lib", __FILE__)
|
46
|
+
$LOAD_PATH << File.expand_path("../../lib", __FILE__)
|
47
|
+
|
48
|
+
# load files living in the dummy ...
|
49
|
+
require File.expand_path("../../spec/dummy/lib/patriarch/services/like", __FILE__)
|
50
|
+
require File.expand_path("../../spec/dummy/lib/patriarch/behaviours/like", __FILE__)
|
51
|
+
|
52
|
+
class Monster
|
53
|
+
attr_reader :id
|
54
|
+
|
55
|
+
class << self
|
56
|
+
attr_accessor :count, :object_mapping
|
57
|
+
end
|
58
|
+
|
59
|
+
self.count = 1
|
60
|
+
self.object_mapping = {}
|
61
|
+
|
62
|
+
def initialize
|
63
|
+
@id = self.class.count
|
64
|
+
self.class.count += 1
|
65
|
+
self.class.object_mapping.merge!({@id => self.object_id})
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.find(ids)
|
69
|
+
ids = Array(ids)
|
70
|
+
result = []
|
71
|
+
ids.each do |id|
|
72
|
+
object_ref = self.object_mapping[id]
|
73
|
+
record = ObjectSpace._id2ref(object_ref)
|
74
|
+
result << record unless record.nil?
|
75
|
+
end
|
76
|
+
result
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class FallenAngel
|
81
|
+
attr_reader :id
|
82
|
+
|
83
|
+
class << self
|
84
|
+
attr_accessor :count, :object_mapping
|
85
|
+
end
|
86
|
+
|
87
|
+
self.count = 1
|
88
|
+
self.object_mapping = {}
|
89
|
+
|
90
|
+
def initialize
|
91
|
+
@id = self.class.count
|
92
|
+
self.class.count += 1
|
93
|
+
self.class.object_mapping.merge!({@id => self.object_id})
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.find(ids)
|
97
|
+
ids = Array(ids)
|
98
|
+
result = []
|
99
|
+
ids.each do |id|
|
100
|
+
object_ref = self.object_mapping[id]
|
101
|
+
record = ObjectSpace._id2ref(object_ref)
|
102
|
+
result << record unless record.nil?
|
103
|
+
end
|
104
|
+
result
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
Monster.send(:include,Patriarch::Behaviours)
|
109
|
+
FallenAngel.send(:include,Patriarch::Behaviours)
|
110
|
+
|
111
|
+
def new_monster
|
112
|
+
Monster.new
|
113
|
+
end
|
114
|
+
|
115
|
+
def new_fallen_angel
|
116
|
+
FallenAngel.new
|
117
|
+
end
|
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.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,55 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: &
|
15
|
+
name: redis-objects
|
16
|
+
requirement: &12695180 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
|
-
type: :
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *12695180
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: verbs
|
27
|
+
requirement: &12694700 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *12694700
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rails
|
38
|
+
requirement: &12694280 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *12694280
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: railties
|
49
|
+
requirement: &12693800 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *12693800
|
25
58
|
- !ruby/object:Gem::Dependency
|
26
59
|
name: redis-objects
|
27
|
-
requirement: &
|
60
|
+
requirement: &12693300 !ruby/object:Gem::Requirement
|
28
61
|
none: false
|
29
62
|
requirements:
|
30
63
|
- - ! '>='
|
@@ -32,7 +65,51 @@ dependencies:
|
|
32
65
|
version: '0'
|
33
66
|
type: :runtime
|
34
67
|
prerelease: false
|
35
|
-
version_requirements: *
|
68
|
+
version_requirements: *12693300
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: &12692620 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *12692620
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: fakeredis
|
82
|
+
requirement: &12691360 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *12691360
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: autotest-rails
|
93
|
+
requirement: &12690940 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *12690940
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: ZenTest
|
104
|
+
requirement: &12690500 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *12690500
|
36
113
|
description: Patriach is about adding behaviours on the fly to good old active record
|
37
114
|
models.
|
38
115
|
email:
|
@@ -54,6 +131,7 @@ files:
|
|
54
131
|
- lib/generators/patriarch/templates/before_manager_service.rb
|
55
132
|
- lib/generators/patriarch/templates/before_service.rb
|
56
133
|
- lib/generators/patriarch/templates/empty_behaviour_module.rb
|
134
|
+
- lib/generators/patriarch/templates/empty_service_module.rb
|
57
135
|
- lib/generators/patriarch/templates/manager_service.rb
|
58
136
|
- lib/generators/patriarch/templates/service.rb
|
59
137
|
- lib/generators/patriarch/templates/tools_methods.rb
|
@@ -76,15 +154,14 @@ files:
|
|
76
154
|
- patriarch.gemspec
|
77
155
|
- spec/lib/patriarch/add_behaviour_spec.rb
|
78
156
|
- spec/lib/patriarch/bipartite_relationship_builder_spec.rb
|
79
|
-
- spec/lib/patriarch/clean_reclip_spec.rb
|
80
157
|
- spec/lib/patriarch/like_service_spec.rb
|
81
|
-
- spec/lib/patriarch/reclip_spec.rb
|
82
158
|
- spec/lib/patriarch/redis_mapper_service_spec.rb
|
83
159
|
- spec/lib/patriarch/retriever_service_spec.rb
|
160
|
+
- spec/spec_helper.rb
|
84
161
|
homepage: https://github.com/giglemad/patriarch
|
85
162
|
licenses:
|
86
163
|
- MIT
|
87
|
-
post_install_message:
|
164
|
+
post_install_message: Thanks for installing!
|
88
165
|
rdoc_options: []
|
89
166
|
require_paths:
|
90
167
|
- lib
|
@@ -109,8 +186,7 @@ summary: Manage relationships between instances of your models easily
|
|
109
186
|
test_files:
|
110
187
|
- spec/lib/patriarch/add_behaviour_spec.rb
|
111
188
|
- spec/lib/patriarch/bipartite_relationship_builder_spec.rb
|
112
|
-
- spec/lib/patriarch/clean_reclip_spec.rb
|
113
189
|
- spec/lib/patriarch/like_service_spec.rb
|
114
|
-
- spec/lib/patriarch/reclip_spec.rb
|
115
190
|
- spec/lib/patriarch/redis_mapper_service_spec.rb
|
116
191
|
- spec/lib/patriarch/retriever_service_spec.rb
|
192
|
+
- spec/spec_helper.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "reclip cleaner" do
|
4
|
-
before (:each) do
|
5
|
-
@recliper_user = create_user
|
6
|
-
@item = create_item(create_user)
|
7
|
-
@recliped_on_user = create_user
|
8
|
-
@recliper_user.reclip(@item,@recliped_on_user)
|
9
|
-
@reclip_id = @item.reclips_of_me_reclips_ids.first
|
10
|
-
end
|
11
|
-
|
12
|
-
it "shall clean reclips everywhere when given a single item" do
|
13
|
-
Patriarch::Behaviours::Reclip.clean_reclip_id(@reclip_id)
|
14
|
-
|
15
|
-
@recliped_on_user.reclipeds_on_me_reclips_ids.include?(@reclip_id).should be_false
|
16
|
-
@recliper_user.reclipeds_by_me_reclips_ids.include?(@reclip_id).should be_false
|
17
|
-
@item.reclips_of_me_reclips_ids.include?(@reclip_id).should be_false
|
18
|
-
end
|
19
|
-
|
20
|
-
it "shall clean all the reclip stuff (on him, by him) of a given user properly" do
|
21
|
-
pending('like the test above but in the adequate loop')
|
22
|
-
end
|
23
|
-
|
24
|
-
it "shall clean all the reclip stuff (on him, by him) of a given group properly" do
|
25
|
-
pending('like the test above but in the adequate loop')
|
26
|
-
end
|
27
|
-
|
28
|
-
it "shall clean all the reclip stuff of a given item properly" do
|
29
|
-
pending('like the test above but in the adequate loop')
|
30
|
-
end
|
31
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "reclip" do
|
4
|
-
before (:each) do
|
5
|
-
@recliper_user = create_user
|
6
|
-
@item = create_item(create_user)
|
7
|
-
@recliped_on_user = create_user
|
8
|
-
end
|
9
|
-
|
10
|
-
it "stores informations in redis properly" do
|
11
|
-
@recliper_user.reclip(@item,@recliped_on_user)
|
12
|
-
|
13
|
-
# Guy being recliped on remembers it
|
14
|
-
@recliped_on_user.reclipeds_on_me.should == [@item]
|
15
|
-
# Recliper remembers the reclip it did
|
16
|
-
@recliper_user.reclipeds_by_me.should == [@item]
|
17
|
-
|
18
|
-
# Item
|
19
|
-
@recliper_user.reclipeds_by_me.should have(1).reclip_hash
|
20
|
-
end
|
21
|
-
|
22
|
-
it "only updates information when clipped twice" do
|
23
|
-
@recliper_user.reclip(@item,@recliped_on_user)
|
24
|
-
old_time = @recliper_user.reclipeds_by_me(:with_scores => true).first[1]
|
25
|
-
@recliper_user.reclip(@item,@recliped_on_user)
|
26
|
-
new_time = @recliper_user.reclipeds_by_me(:with_scores => true).first[1]
|
27
|
-
|
28
|
-
new_time.should_not eq(old_time)
|
29
|
-
|
30
|
-
# Guy being recliped on remembers it
|
31
|
-
@recliped_on_user.reclipeds_on_me.should == [@item]
|
32
|
-
# Recliper remembers the reclip it did
|
33
|
-
@recliper_user.reclipeds_by_me.should == [@item]
|
34
|
-
|
35
|
-
# Item
|
36
|
-
@recliper_user.reclipeds_by_me.should have(1).reclip_hash
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|