cantango-core 0.1.0
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/.document +5 -0
- data/.rspec +3 -0
- data/Gemfile +54 -0
- data/Gemfile.lock +231 -0
- data/LICENSE.txt +20 -0
- data/README.mdown +90 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/cantango-core.gemspec +177 -0
- data/lib/cantango/ability.rb +5 -0
- data/lib/cantango/ability/base.rb +61 -0
- data/lib/cantango/ability/cache.rb +7 -0
- data/lib/cantango/ability/cache/key.rb +38 -0
- data/lib/cantango/ability/cached.rb +28 -0
- data/lib/cantango/ability/executor.rb +7 -0
- data/lib/cantango/ability/executor/base.rb +53 -0
- data/lib/cantango/ability/executor/cache_mode.rb +33 -0
- data/lib/cantango/ability/executor/modes.rb +52 -0
- data/lib/cantango/ability/executor/no_cache_mode.rb +17 -0
- data/lib/cantango/ability/helper.rb +11 -0
- data/lib/cantango/ability/helper/account.rb +13 -0
- data/lib/cantango/ability/helper/engine.rb +32 -0
- data/lib/cantango/ability/helper/role.rb +21 -0
- data/lib/cantango/ability/helper/role_group.rb +21 -0
- data/lib/cantango/ability/helper/user.rb +18 -0
- data/lib/cantango/cancan/rule.rb +6 -0
- data/lib/cantango/core.rb +84 -0
- data/lib/cantango/engine.rb +39 -0
- data/lib/cantango/filter.rb +5 -0
- data/lib/cantango/filter/base.rb +31 -0
- data/lib/cantango/helpers.rb +5 -0
- data/lib/cantango/helpers/debug.rb +10 -0
- data/lib/cantango/loader.rb +5 -0
- data/lib/cantango/loader/yaml.rb +33 -0
- data/lib/cantango/macros.rb +11 -0
- data/lib/cantango/macros/account.rb +14 -0
- data/lib/cantango/macros/user.rb +16 -0
- data/lib/cantango/model.rb +5 -0
- data/lib/cantango/model/guest.rb +25 -0
- data/lib/cantango/rails.rb +7 -0
- data/lib/cantango/rails/engine.rb +63 -0
- data/lib/cantango/rails/helpers/base_helper.rb +29 -0
- data/lib/cantango/rails/helpers/controller_helper.rb +17 -0
- data/lib/cantango/rails/helpers/rest_helper.rb +76 -0
- data/lib/cantango/rails/helpers/view_helper.rb +17 -0
- data/lib/cantango/rails/railtie.rb +7 -0
- data/lib/cantango/rspec.rb +1 -0
- data/lib/cantango/rspec/config.rb +3 -0
- data/lib/cantango/rspec/matchers.rb +1 -0
- data/lib/cantango/rspec/matchers/be_allowed_to.rb +28 -0
- data/lib/cantango/rules.rb +8 -0
- data/lib/cantango/rules/adaptor.rb +37 -0
- data/lib/cantango/rules/adaptor/active_record.rb +10 -0
- data/lib/cantango/rules/adaptor/data_mapper.rb +11 -0
- data/lib/cantango/rules/adaptor/generic.rb +16 -0
- data/lib/cantango/rules/adaptor/mongo.rb +19 -0
- data/lib/cantango/rules/adaptor/mongo_mapper.rb +10 -0
- data/lib/cantango/rules/adaptor/mongoid.rb +9 -0
- data/lib/cantango/rules/adaptor/relational.rb +13 -0
- data/lib/cantango/rules/dsl.rb +24 -0
- data/lib/cantango/rules/relation.rb +67 -0
- data/lib/cantango/rules/rule_class.rb +11 -0
- data/lib/cantango/rules/scope.rb +24 -0
- data/lib/cantango/scope.rb +5 -0
- data/lib/cantango/scope/ability.rb +20 -0
- data/lib/generators/cantango/install/install_generator.rb +37 -0
- data/lib/generators/cantango/install/templates/cantango.rb +4 -0
- data/lib/generators/cantango/install/templates/categories.yml +0 -0
- data/lib/generators/cantango/install/templates/permissions.yml +6 -0
- data/spec/cantango/ability/base_spec.rb +73 -0
- data/spec/cantango/ability/cached_spec.rb +0 -0
- data/spec/cantango/ability/executor/base2.rb +75 -0
- data/spec/cantango/ability/executor/base_spec.rb +67 -0
- data/spec/cantango/ability/executor/cache_mode_spec.rb +77 -0
- data/spec/cantango/ability/executor/modes_spec.rb +68 -0
- data/spec/cantango/ability/executor/no_cache_mode_spec.rb +0 -0
- data/spec/cantango/cancan/rule_spec.rb +0 -0
- data/spec/cantango/core_spec.rb +9 -0
- data/spec/cantango/engine_spec.rb +0 -0
- data/spec/cantango/filter/base_spec.rb +0 -0
- data/spec/cantango/helpers/debug_spec.rb +0 -0
- data/spec/cantango/loader/yaml_spec.rb +0 -0
- data/spec/cantango/macros/account_spec.rb +0 -0
- data/spec/cantango/macros/user_spec.rb +0 -0
- data/spec/cantango/rspec/be_allowed_to_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/active_record_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/data_mapper_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/mongo_mapper_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/mongoid_spec.rb +0 -0
- data/spec/cantango/rules/adaptor_spec.rb +0 -0
- data/spec/cantango/rules/dsl_spec.rb +0 -0
- data/spec/cantango/rules/relation_spec.rb +0 -0
- data/spec/cantango/rules/rule_class_spec.rb +0 -0
- data/spec/cantango/rules/scope_spec.rb +0 -0
- data/spec/cantango/rules_spec.rb +55 -0
- data/spec/cantango/scope/ability_spec.rb +0 -0
- data/spec/cantango_spec.rb +0 -0
- data/spec/generators/cantango/install_generator_spec.rb +42 -0
- data/spec/spec_helper.rb +9 -0
- metadata +310 -0
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.0
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Generated by jeweler
|
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
|
+
# -*- encoding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = "cantango-core"
|
|
8
|
+
s.version = "0.1.0"
|
|
9
|
+
|
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
|
+
s.authors = ["Kristian Mandrup", "Stanislaw Pankevich"]
|
|
12
|
+
s.date = "2011-11-25"
|
|
13
|
+
s.description = "Define your permission rules as role- or role group specific permits.\nIntegrates well with multiple Devise user acounts.\nIncludes rules caching.\nStore permissions in yaml file or key-value store"
|
|
14
|
+
s.email = "kmandrup@gmail.com, s.pankevich@gmail.com"
|
|
15
|
+
s.extra_rdoc_files = [
|
|
16
|
+
"LICENSE.txt",
|
|
17
|
+
"README.mdown"
|
|
18
|
+
]
|
|
19
|
+
s.files = [
|
|
20
|
+
".document",
|
|
21
|
+
".rspec",
|
|
22
|
+
"Gemfile",
|
|
23
|
+
"Gemfile.lock",
|
|
24
|
+
"LICENSE.txt",
|
|
25
|
+
"README.mdown",
|
|
26
|
+
"Rakefile",
|
|
27
|
+
"VERSION",
|
|
28
|
+
"cantango-core.gemspec",
|
|
29
|
+
"lib/cantango/ability.rb",
|
|
30
|
+
"lib/cantango/ability/base.rb",
|
|
31
|
+
"lib/cantango/ability/cache.rb",
|
|
32
|
+
"lib/cantango/ability/cache/key.rb",
|
|
33
|
+
"lib/cantango/ability/cached.rb",
|
|
34
|
+
"lib/cantango/ability/executor.rb",
|
|
35
|
+
"lib/cantango/ability/executor/base.rb",
|
|
36
|
+
"lib/cantango/ability/executor/cache_mode.rb",
|
|
37
|
+
"lib/cantango/ability/executor/modes.rb",
|
|
38
|
+
"lib/cantango/ability/executor/no_cache_mode.rb",
|
|
39
|
+
"lib/cantango/ability/helper.rb",
|
|
40
|
+
"lib/cantango/ability/helper/account.rb",
|
|
41
|
+
"lib/cantango/ability/helper/engine.rb",
|
|
42
|
+
"lib/cantango/ability/helper/role.rb",
|
|
43
|
+
"lib/cantango/ability/helper/role_group.rb",
|
|
44
|
+
"lib/cantango/ability/helper/user.rb",
|
|
45
|
+
"lib/cantango/cancan/rule.rb",
|
|
46
|
+
"lib/cantango/core.rb",
|
|
47
|
+
"lib/cantango/engine.rb",
|
|
48
|
+
"lib/cantango/filter.rb",
|
|
49
|
+
"lib/cantango/filter/base.rb",
|
|
50
|
+
"lib/cantango/helpers.rb",
|
|
51
|
+
"lib/cantango/helpers/debug.rb",
|
|
52
|
+
"lib/cantango/loader.rb",
|
|
53
|
+
"lib/cantango/loader/yaml.rb",
|
|
54
|
+
"lib/cantango/macros.rb",
|
|
55
|
+
"lib/cantango/macros/account.rb",
|
|
56
|
+
"lib/cantango/macros/user.rb",
|
|
57
|
+
"lib/cantango/model.rb",
|
|
58
|
+
"lib/cantango/model/guest.rb",
|
|
59
|
+
"lib/cantango/rails.rb",
|
|
60
|
+
"lib/cantango/rails/engine.rb",
|
|
61
|
+
"lib/cantango/rails/helpers/base_helper.rb",
|
|
62
|
+
"lib/cantango/rails/helpers/controller_helper.rb",
|
|
63
|
+
"lib/cantango/rails/helpers/rest_helper.rb",
|
|
64
|
+
"lib/cantango/rails/helpers/view_helper.rb",
|
|
65
|
+
"lib/cantango/rails/railtie.rb",
|
|
66
|
+
"lib/cantango/rspec.rb",
|
|
67
|
+
"lib/cantango/rspec/config.rb",
|
|
68
|
+
"lib/cantango/rspec/matchers.rb",
|
|
69
|
+
"lib/cantango/rspec/matchers/be_allowed_to.rb",
|
|
70
|
+
"lib/cantango/rules.rb",
|
|
71
|
+
"lib/cantango/rules/adaptor.rb",
|
|
72
|
+
"lib/cantango/rules/adaptor/active_record.rb",
|
|
73
|
+
"lib/cantango/rules/adaptor/data_mapper.rb",
|
|
74
|
+
"lib/cantango/rules/adaptor/generic.rb",
|
|
75
|
+
"lib/cantango/rules/adaptor/mongo.rb",
|
|
76
|
+
"lib/cantango/rules/adaptor/mongo_mapper.rb",
|
|
77
|
+
"lib/cantango/rules/adaptor/mongoid.rb",
|
|
78
|
+
"lib/cantango/rules/adaptor/relational.rb",
|
|
79
|
+
"lib/cantango/rules/dsl.rb",
|
|
80
|
+
"lib/cantango/rules/relation.rb",
|
|
81
|
+
"lib/cantango/rules/rule_class.rb",
|
|
82
|
+
"lib/cantango/rules/scope.rb",
|
|
83
|
+
"lib/cantango/scope.rb",
|
|
84
|
+
"lib/cantango/scope/ability.rb",
|
|
85
|
+
"lib/generators/cantango/install/install_generator.rb",
|
|
86
|
+
"lib/generators/cantango/install/templates/cantango.rb",
|
|
87
|
+
"lib/generators/cantango/install/templates/categories.yml",
|
|
88
|
+
"lib/generators/cantango/install/templates/permissions.yml",
|
|
89
|
+
"spec/cantango/ability/base_spec.rb",
|
|
90
|
+
"spec/cantango/ability/cached_spec.rb",
|
|
91
|
+
"spec/cantango/ability/executor/base2.rb",
|
|
92
|
+
"spec/cantango/ability/executor/base_spec.rb",
|
|
93
|
+
"spec/cantango/ability/executor/cache_mode_spec.rb",
|
|
94
|
+
"spec/cantango/ability/executor/modes_spec.rb",
|
|
95
|
+
"spec/cantango/ability/executor/no_cache_mode_spec.rb",
|
|
96
|
+
"spec/cantango/cancan/rule_spec.rb",
|
|
97
|
+
"spec/cantango/core_spec.rb",
|
|
98
|
+
"spec/cantango/engine_spec.rb",
|
|
99
|
+
"spec/cantango/filter/base_spec.rb",
|
|
100
|
+
"spec/cantango/helpers/debug_spec.rb",
|
|
101
|
+
"spec/cantango/loader/yaml_spec.rb",
|
|
102
|
+
"spec/cantango/macros/account_spec.rb",
|
|
103
|
+
"spec/cantango/macros/user_spec.rb",
|
|
104
|
+
"spec/cantango/rspec/be_allowed_to_spec.rb",
|
|
105
|
+
"spec/cantango/rules/adaptor/active_record_spec.rb",
|
|
106
|
+
"spec/cantango/rules/adaptor/data_mapper_spec.rb",
|
|
107
|
+
"spec/cantango/rules/adaptor/mongo_mapper_spec.rb",
|
|
108
|
+
"spec/cantango/rules/adaptor/mongoid_spec.rb",
|
|
109
|
+
"spec/cantango/rules/adaptor_spec.rb",
|
|
110
|
+
"spec/cantango/rules/dsl_spec.rb",
|
|
111
|
+
"spec/cantango/rules/relation_spec.rb",
|
|
112
|
+
"spec/cantango/rules/rule_class_spec.rb",
|
|
113
|
+
"spec/cantango/rules/scope_spec.rb",
|
|
114
|
+
"spec/cantango/rules_spec.rb",
|
|
115
|
+
"spec/cantango/scope/ability_spec.rb",
|
|
116
|
+
"spec/cantango_spec.rb",
|
|
117
|
+
"spec/generators/cantango/install_generator_spec.rb",
|
|
118
|
+
"spec/spec_helper.rb"
|
|
119
|
+
]
|
|
120
|
+
s.homepage = "http://github.com/kristianmandrup/cantango"
|
|
121
|
+
s.licenses = ["MIT"]
|
|
122
|
+
s.require_paths = ["lib"]
|
|
123
|
+
s.rubygems_version = "1.8.10"
|
|
124
|
+
s.summary = "CanCan extension with role oriented permission management and more"
|
|
125
|
+
|
|
126
|
+
if s.respond_to? :specification_version then
|
|
127
|
+
s.specification_version = 3
|
|
128
|
+
|
|
129
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
130
|
+
s.add_runtime_dependency(%q<rails>, [">= 3.0.1"])
|
|
131
|
+
s.add_runtime_dependency(%q<cancan>, [">= 1.4"])
|
|
132
|
+
s.add_runtime_dependency(%q<sugar-high>, [">= 0.6.0"])
|
|
133
|
+
s.add_runtime_dependency(%q<sweetloader>, ["~> 0.1.0"])
|
|
134
|
+
s.add_runtime_dependency(%q<hashie>, [">= 0"])
|
|
135
|
+
s.add_development_dependency(%q<rspec-rails>, [">= 2.6.1"])
|
|
136
|
+
s.add_development_dependency(%q<forgery>, [">= 0.3"])
|
|
137
|
+
s.add_development_dependency(%q<factory_girl>, [">= 0"])
|
|
138
|
+
s.add_development_dependency(%q<sqlite3>, [">= 0"])
|
|
139
|
+
s.add_development_dependency(%q<rspec>, [">= 2.6.0"])
|
|
140
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.4"])
|
|
141
|
+
s.add_development_dependency(%q<bundler>, [">= 1.1.rc"])
|
|
142
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
|
143
|
+
s.add_development_dependency(%q<rake>, [">= 0.9.2.2"])
|
|
144
|
+
else
|
|
145
|
+
s.add_dependency(%q<rails>, [">= 3.0.1"])
|
|
146
|
+
s.add_dependency(%q<cancan>, [">= 1.4"])
|
|
147
|
+
s.add_dependency(%q<sugar-high>, [">= 0.6.0"])
|
|
148
|
+
s.add_dependency(%q<sweetloader>, ["~> 0.1.0"])
|
|
149
|
+
s.add_dependency(%q<hashie>, [">= 0"])
|
|
150
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.6.1"])
|
|
151
|
+
s.add_dependency(%q<forgery>, [">= 0.3"])
|
|
152
|
+
s.add_dependency(%q<factory_girl>, [">= 0"])
|
|
153
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
|
154
|
+
s.add_dependency(%q<rspec>, [">= 2.6.0"])
|
|
155
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.4"])
|
|
156
|
+
s.add_dependency(%q<bundler>, [">= 1.1.rc"])
|
|
157
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
|
158
|
+
s.add_dependency(%q<rake>, [">= 0.9.2.2"])
|
|
159
|
+
end
|
|
160
|
+
else
|
|
161
|
+
s.add_dependency(%q<rails>, [">= 3.0.1"])
|
|
162
|
+
s.add_dependency(%q<cancan>, [">= 1.4"])
|
|
163
|
+
s.add_dependency(%q<sugar-high>, [">= 0.6.0"])
|
|
164
|
+
s.add_dependency(%q<sweetloader>, ["~> 0.1.0"])
|
|
165
|
+
s.add_dependency(%q<hashie>, [">= 0"])
|
|
166
|
+
s.add_dependency(%q<rspec-rails>, [">= 2.6.1"])
|
|
167
|
+
s.add_dependency(%q<forgery>, [">= 0.3"])
|
|
168
|
+
s.add_dependency(%q<factory_girl>, [">= 0"])
|
|
169
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
|
170
|
+
s.add_dependency(%q<rspec>, [">= 2.6.0"])
|
|
171
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.4"])
|
|
172
|
+
s.add_dependency(%q<bundler>, [">= 1.1.rc"])
|
|
173
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
|
174
|
+
s.add_dependency(%q<rake>, [">= 0.9.2.2"])
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Ability
|
|
3
|
+
class Base
|
|
4
|
+
include CanCan::Ability
|
|
5
|
+
|
|
6
|
+
attr_reader :options, :candidate
|
|
7
|
+
|
|
8
|
+
# Equivalent to a CanCan Ability#initialize call
|
|
9
|
+
# which executes all the permission logic
|
|
10
|
+
def initialize candidate, options = {}
|
|
11
|
+
raise "Candidate must be something!" if !candidate
|
|
12
|
+
@candidate, @options = candidate, options
|
|
13
|
+
|
|
14
|
+
clear_rules!
|
|
15
|
+
permit_rules
|
|
16
|
+
|
|
17
|
+
execute_engines! if engines_on?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def cached?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def rules
|
|
25
|
+
@rules
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# developer can add rules here to be included in all subclasses!
|
|
29
|
+
def permit_rules
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def clear_rules!
|
|
33
|
+
@rules ||= default_rules
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def session
|
|
37
|
+
@session = options[:session] || {} # seperate session cache for each type of user?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def subject
|
|
41
|
+
return candidate.active_user if masquerade_user?
|
|
42
|
+
return candidate.active_account if masquerade_account?
|
|
43
|
+
candidate
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def config
|
|
47
|
+
CanTango.config
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
Helper.modules.each do |name|
|
|
51
|
+
include "CanTango::Ability::Helper::#{name.to_s.camelize}".constantize
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
protected
|
|
55
|
+
|
|
56
|
+
def default_rules
|
|
57
|
+
[]
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Ability
|
|
3
|
+
module Cache
|
|
4
|
+
class Key
|
|
5
|
+
attr_reader :user, :subject
|
|
6
|
+
|
|
7
|
+
def initialize user, subject = nil
|
|
8
|
+
@user = user
|
|
9
|
+
@subject = subject || user
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.create_for ability
|
|
13
|
+
self.new ability.user, ability.subject
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def value
|
|
17
|
+
raise "No key could be generated for User:#{user.inspect} and Subject:#{subject} - key field: #{user_key_field}" if !user_key
|
|
18
|
+
@value ||= user_key.hash
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_s
|
|
22
|
+
"key hash: #{value}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
protected
|
|
26
|
+
|
|
27
|
+
def user_key
|
|
28
|
+
# raise "#{user.class} must have a method ##{user_key_field}. You can configure this with CanTango.config#user.unique_key_field" if !user.respond_to?(user_key_field)
|
|
29
|
+
user.send(user_key_field) if user.respond_to? user_key_field
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def user_key_field
|
|
33
|
+
CanTango.config.user.unique_key_field || :email
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Ability
|
|
3
|
+
class Cached < Base
|
|
4
|
+
# Equivalent to a CanCan Ability#initialize call
|
|
5
|
+
# which executes all the permission logic
|
|
6
|
+
def initialize candidate, options = {}
|
|
7
|
+
raise "Candidate must be something!" if !candidate
|
|
8
|
+
@candidate, @options = candidate, options
|
|
9
|
+
|
|
10
|
+
# return if cached_rules?
|
|
11
|
+
|
|
12
|
+
clear_rules!
|
|
13
|
+
permit_rules
|
|
14
|
+
|
|
15
|
+
execute_engines! if engines_on?
|
|
16
|
+
|
|
17
|
+
# cache_rules!
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def cached?
|
|
21
|
+
true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def permit_rules
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Ability
|
|
3
|
+
module Executor
|
|
4
|
+
class Base
|
|
5
|
+
include CanTango::Helpers::Debug
|
|
6
|
+
|
|
7
|
+
delegate :session, :user, :subject, :candidate, :cached?, :to => :ability
|
|
8
|
+
|
|
9
|
+
def execute!
|
|
10
|
+
return if !valid?
|
|
11
|
+
start_execute
|
|
12
|
+
return if cached? # rule set already loaded
|
|
13
|
+
|
|
14
|
+
clear_rules!
|
|
15
|
+
permit_rules
|
|
16
|
+
|
|
17
|
+
end_execute
|
|
18
|
+
rules # return rule set
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def rules
|
|
22
|
+
@rules ||= []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def clear_rules!
|
|
26
|
+
@rules ||= []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def permit_rules
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def cached?
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def start_execute
|
|
40
|
+
debug "Executing base Ability"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def end_execute
|
|
44
|
+
debug "DONE"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def key_method_names
|
|
48
|
+
[]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
class Ability
|
|
3
|
+
module Executor
|
|
4
|
+
class CachedMode < Base
|
|
5
|
+
include CanTango::Ability::CacheHelpers
|
|
6
|
+
|
|
7
|
+
# FIX! no reason for double cache check!
|
|
8
|
+
def cached?
|
|
9
|
+
@rules = cached_rules if cached_rules? && caching_on?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def cache
|
|
13
|
+
@cache ||= cache_class.new self, :cache_key => cache_key, :key_method_names => key_method_names
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
protected
|
|
17
|
+
|
|
18
|
+
def cache_class
|
|
19
|
+
CanTango::Ability::Cache
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def start_execute
|
|
23
|
+
debug "Executing cached ability"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def end_execute
|
|
27
|
+
cache_rules! if caching_on?
|
|
28
|
+
debug "DONE"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module CanTango
|
|
2
|
+
module Ability
|
|
3
|
+
module Executor
|
|
4
|
+
class Modes < Base
|
|
5
|
+
def initialize candidate, options = {}
|
|
6
|
+
raise "Candidate must be something!" if !candidate
|
|
7
|
+
@candidate, @options = [candidate, options]
|
|
8
|
+
calculate_modal_rules.normalize!
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def rules
|
|
12
|
+
@rules ||= []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def modal_rules mode
|
|
16
|
+
mode?(mode) ? get_ability(mode).rules : []
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
protected
|
|
20
|
+
|
|
21
|
+
def calculate_modal_rules
|
|
22
|
+
@rules = modes.inject([]) do |result, mode|
|
|
23
|
+
result = result + modal_rules(mode)
|
|
24
|
+
result
|
|
25
|
+
end
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def normalize!
|
|
30
|
+
rules.flatten!
|
|
31
|
+
rules.compact!
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def get_ability mode
|
|
35
|
+
ability_class_for(mode).new candidate, options
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def ability_class_for mode
|
|
39
|
+
mode == :cache ? CanTango::Ability::Cached : CanTango::Ability::NonCached
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def mode? mode
|
|
43
|
+
modes.include?(mode)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def modes
|
|
47
|
+
CanTango.config.ability.modes
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|