can_play 0.3.1 → 0.4.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.
- checksums.yaml +4 -4
- data/Gemfile +0 -4
- data/lib/can_play.rb +51 -200
- data/lib/can_play/ability.rb +4 -4
- data/lib/can_play/class_method.rb +107 -0
- data/lib/can_play/config.rb +14 -0
- data/lib/can_play/controller.rb +13 -1
- data/lib/can_play/power.rb +0 -6
- data/lib/can_play/resource.rb +164 -0
- data/lib/can_play/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d07491ab6a42d581eb9e9b3d809b4c2b31f5a4b
|
4
|
+
data.tar.gz: ce076576115c4fc9166e06a88145643fce7dc304
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e88dcc97bdd34c34bc2d81bb562ca376b191ebbfcbca4a9e1aa1ba6ca40472687c64162f5963ca6ee44655df28b22847def6982cb644d425be72f23036bcb459
|
7
|
+
data.tar.gz: 379a49b8d9f22be107c4b84eeaf0451061c34d9b1a9cfcdb5df306f0659e2fb53582a071dbbed1b016682a5647427a519a953962603222464fddb4959943f5bc
|
data/Gemfile
CHANGED
data/lib/can_play.rb
CHANGED
@@ -2,231 +2,82 @@ require 'ror_hack'
|
|
2
2
|
require 'consul'
|
3
3
|
require 'cancancan'
|
4
4
|
require 'modularity'
|
5
|
+
require 'can_play/config'
|
6
|
+
require 'can_play/class_method'
|
7
|
+
|
5
8
|
|
6
9
|
module CanPlay
|
7
|
-
|
8
|
-
|
10
|
+
|
11
|
+
singleton_attr_accessor :resources, :override_resources,
|
12
|
+
:override_code, :groups
|
13
|
+
|
9
14
|
self.resources = []
|
10
15
|
self.override_resources = {}.with_indifferent_access
|
16
|
+
self.override_code = nil
|
17
|
+
self.groups = []
|
11
18
|
|
12
|
-
|
13
|
-
def included(base)
|
14
|
-
base.class_eval <<-RUBY
|
15
|
-
singleton_attr_accessor(:groups, :current_group, :module_name)
|
16
|
-
self.groups = []
|
17
|
-
self.current_group = nil
|
18
|
-
self.module_name = ''
|
19
|
-
RUBY
|
20
|
-
base.extend ClassMethods
|
21
|
-
end
|
19
|
+
module_function
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
21
|
+
def included(base)
|
22
|
+
base.extend ClassMethods
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
resources
|
33
|
-
end
|
25
|
+
def find_by_name_and_code(name, code)
|
26
|
+
resource = CanPlay.override_resources[code].p2a.find { |r| r.name.to_s == name.to_s }
|
27
|
+
resource || CanPlay.resources.find { |r| r.name.to_s == name.to_s }
|
28
|
+
end
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
def conjunct_resources(&block)
|
31
|
+
resources = CanPlay.override_resources[CanPlay.override_code].p2a + CanPlay.resources
|
32
|
+
resources = resources.uniq { |i| i.name }
|
33
|
+
resources = resources.select(&block) if block
|
34
|
+
resources
|
35
|
+
end
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
def grouped_resources(&block)
|
38
|
+
conjunct_resources(&block).multi_group_by(:my_module_name, :group)
|
39
|
+
end
|
42
40
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
v.each do |group, resources|
|
47
|
-
group.chinese_desc = begin
|
48
|
-
name = I18n.t("can_play.class_name.#{group.name.to_s.singularize}", default: '')
|
49
|
-
name = group.klass.model_name.human if name.blank?
|
50
|
-
name
|
51
|
-
end
|
52
|
-
resources.each do |resource|
|
53
|
-
resource.chinese_desc = I18n.t("can_play.authority_name.#{group.name.to_s.singularize}.#{resource.verb}", default: '').presence || I18n.t("can_play.authority_name.common.#{resource.verb}")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
v.rehash
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
41
|
+
def splat_grouped_resources(&block)
|
42
|
+
conjunct_resources(&block).group_by(:group)
|
43
|
+
end
|
60
44
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
45
|
+
def grouped_resources_with_chinese_desc(&block)
|
46
|
+
grouped_resources(&block).tap do |e|
|
47
|
+
e.each do |i, v|
|
48
|
+
v.each do |group, resources|
|
49
|
+
group.chinese_desc = begin
|
50
|
+
name = I18n.t("can_play.class_name.#{group.name.to_s.singularize}", default: '')
|
66
51
|
name = group.klass.model_name.human if name.blank?
|
67
52
|
name
|
68
53
|
end
|
69
54
|
resources.each do |resource|
|
70
|
-
resource
|
55
|
+
resource.chinese_desc = I18n.t("can_play.authority_name.#{group.name.to_s.singularize}.#{resource.verb}", default: '').presence || I18n.t("can_play.authority_name.common.#{resource.verb}")
|
71
56
|
end
|
72
57
|
end
|
73
|
-
|
58
|
+
v.rehash
|
74
59
|
end
|
75
60
|
end
|
76
61
|
end
|
77
62
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
def self.setup
|
87
|
-
yield self
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
module ClassMethods
|
92
|
-
|
93
|
-
class NameImportantOpenStruct < OpenStruct
|
94
|
-
def eql?(another)
|
95
|
-
self.name == another.name
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# 为每个 resource 添加一个 group, 方便管理
|
100
|
-
def group(*args, &block)
|
101
|
-
opts = args.extract_options!.with_indifferent_access
|
102
|
-
clazz = args.first
|
103
|
-
if clazz.is_a?(Module)
|
104
|
-
name = clazz.try(:table_name).presence || clazz.to_s.underscore.gsub('/', '_').pluralize
|
105
|
-
group = NameImportantOpenStruct.new(name: name, klass: clazz)
|
106
|
-
elsif clazz.blank? && opts.key?(:name) && opts.key?(:klass)
|
107
|
-
opts = opts.with_indifferent_access
|
108
|
-
group = NameImportantOpenStruct.new(name: opts.delete(:name).to_s, klass: opts.delete(:klass))
|
109
|
-
else
|
110
|
-
raise "group klass need set"
|
111
|
-
end
|
112
|
-
group.opts = OpenStruct.new opts
|
113
|
-
self.groups << group
|
114
|
-
self.groups = groups.uniq(&:name)
|
115
|
-
self.current_group = group
|
116
|
-
block.call(group.klass)
|
117
|
-
self.current_group = nil
|
118
|
-
end
|
119
|
-
|
120
|
-
def limit(name=nil, &block)
|
121
|
-
if current_group.present?
|
122
|
-
CanPlay::Power.power(name||current_group.name, &block)
|
123
|
-
else
|
124
|
-
if name.present?
|
125
|
-
CanPlay::Power.power(name, &block)
|
126
|
-
else
|
127
|
-
raise 'limit name need set'
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def collection(verb_or_verbs, opts={}, &block)
|
133
|
-
raise "Need define group first" if current_group.nil?
|
134
|
-
opts = OpenStruct.new opts
|
135
|
-
group = current_group
|
136
|
-
behavior = nil
|
137
|
-
if block
|
138
|
-
behavior = lambda do |user|
|
139
|
-
# 在block定义的binding里,注入user这个变量。
|
140
|
-
old_binding = block.binding
|
141
|
-
old_binding.eval("user=nil;lambda {|v| user = v}").call(user)
|
142
|
-
block.call_with_binding(old_binding)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
if verb_or_verbs.kind_of?(Array)
|
147
|
-
verb_or_verbs.each do |verb|
|
148
|
-
add_resource(group, verb, group.klass, 'collection', behavior, opts)
|
149
|
-
end
|
150
|
-
else
|
151
|
-
add_resource(group, verb_or_verbs, group.klass, 'collection', behavior, opts)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def member(verb_or_verbs, opts={}, &block)
|
156
|
-
raise "Need define group first" if current_group.nil?
|
157
|
-
opts = OpenStruct.new opts
|
158
|
-
group = current_group
|
159
|
-
behavior = nil
|
160
|
-
if block
|
161
|
-
behavior = lambda do |user, obj|
|
162
|
-
# 在block定义的binding里,注入user这个变量。
|
163
|
-
old_binding = block.binding
|
164
|
-
old_binding.eval("user=nil;lambda {|v| user = v}").call(user)
|
165
|
-
block.call_with_binding(old_binding, obj)
|
63
|
+
def splat_grouped_resources_with_chinese_desc(&block)
|
64
|
+
splat_grouped_resources(&block).tap do |i|
|
65
|
+
i.each do |group, resources|
|
66
|
+
group[:chinese_desc] = begin
|
67
|
+
name = I18n.t("can_play.class_name.#{group.name.singularize}", default: '')
|
68
|
+
name = group.klass.model_name.human if name.blank?
|
69
|
+
name
|
166
70
|
end
|
167
|
-
|
168
|
-
|
169
|
-
if verb_or_verbs.kind_of?(Array)
|
170
|
-
verb_or_verbs.each do |verb|
|
171
|
-
add_resource(group, verb, group.klass, 'member', behavior, opts)
|
71
|
+
resources.each do |resource|
|
72
|
+
resource[:chinese_desc] = I18n.t("can_play.authority_name.#{group[:name].singularize}.#{resource[:verb]}", default: '').presence || I18n.t("can_play.authority_name.common.#{resource[:verb]}")
|
172
73
|
end
|
173
|
-
else
|
174
|
-
add_resource(group, verb_or_verbs, group.klass, 'member', behavior, opts)
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
def add_resource(group, verb, object, type, behavior, opts)
|
179
|
-
name = "#{verb}_#{group.name}"
|
180
|
-
resource = OpenStruct.new(
|
181
|
-
module_name: module_name,
|
182
|
-
name: name,
|
183
|
-
group: group,
|
184
|
-
verb: verb,
|
185
|
-
object: object,
|
186
|
-
type: type,
|
187
|
-
behavior: behavior,
|
188
|
-
opts: opts
|
189
|
-
)
|
190
|
-
CanPlay.resources.keep_if { |i| i.name != name }
|
191
|
-
CanPlay.resources << resource
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
module Override
|
196
|
-
as_trait do |code|
|
197
|
-
extend ClassMethods
|
198
|
-
singleton_attr_accessor(:groups, :current_group, :module_name)
|
199
|
-
self.groups = []
|
200
|
-
self.current_group = nil
|
201
|
-
self.module_name = ''
|
202
|
-
|
203
|
-
define_singleton_method(:limit) do |name=nil, &block|
|
204
|
-
raise "Need define group first" if current_group.nil?
|
205
|
-
method_name = name ? "#{name}_evaluate_in_#{code}_scope" : "#{current_group.name}_evaluate_in_#{code}_scope"
|
206
|
-
Power.power(method_name, &block)
|
207
|
-
end
|
208
|
-
|
209
|
-
define_singleton_method(:add_resource) do |group, verb, object, type, behavior, opts|
|
210
|
-
super(group, verb, object, type, behavior, opts) and return if code.blank?
|
211
|
-
CanPlay.override_resources[code] ||= []
|
212
|
-
name = "#{verb}_#{group.name}"
|
213
|
-
resource = OpenStruct.new(
|
214
|
-
module_name: module_name,
|
215
|
-
name: name,
|
216
|
-
group: group,
|
217
|
-
verb: verb,
|
218
|
-
object: object,
|
219
|
-
type: type,
|
220
|
-
behavior: behavior,
|
221
|
-
opts: opts
|
222
|
-
)
|
223
|
-
CanPlay.override_resources[code].keep_if { |i| i.name != name }
|
224
|
-
CanPlay.override_resources[code] << resource
|
225
74
|
end
|
75
|
+
i.rehash
|
226
76
|
end
|
227
77
|
end
|
228
78
|
end
|
229
79
|
|
230
|
-
require
|
231
|
-
require
|
232
|
-
require
|
80
|
+
require 'can_play/resource'
|
81
|
+
require 'can_play/power'
|
82
|
+
require 'can_play/controller'
|
83
|
+
require 'can_play/ability'
|
data/lib/can_play/ability.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
class Ability
|
2
2
|
include CanCan::Ability
|
3
|
-
attr_accessor :user
|
4
3
|
|
5
4
|
def initialize(user)
|
5
|
+
clear_aliased_actions
|
6
6
|
CanPlay::Config.tap do |i|
|
7
|
-
|
7
|
+
user = user||i.user_class_name.constantize.new
|
8
8
|
if i.super_roles.is_a?(Array)
|
9
9
|
i.super_roles.each do |role_name|
|
10
10
|
can(:manage, :all) if user.send(i.role_judge_method, role_name)
|
@@ -20,7 +20,7 @@ class Ability
|
|
20
20
|
if resource[:type] == 'collection'
|
21
21
|
if resource[:behavior]
|
22
22
|
block = resource[:behavior]
|
23
|
-
can(resource[:verb], resource[:object]) if block.call
|
23
|
+
can(resource[:verb], resource[:object]) if block.call
|
24
24
|
else
|
25
25
|
can resource[:verb], resource[:object]
|
26
26
|
end
|
@@ -28,7 +28,7 @@ class Ability
|
|
28
28
|
if resource[:behavior]
|
29
29
|
block = resource[:behavior]
|
30
30
|
can resource[:verb], resource[:object] do |object|
|
31
|
-
block.call(
|
31
|
+
block.call(object)
|
32
32
|
end
|
33
33
|
else
|
34
34
|
can resource[:verb], resource[:object]
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module CanPlay
|
2
|
+
|
3
|
+
class ResourcePermission < OpenStruct
|
4
|
+
end
|
5
|
+
|
6
|
+
class NameImportantGroup < OpenStruct
|
7
|
+
def eql?(another)
|
8
|
+
self.name == another.name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
|
14
|
+
def group(*args, &block)
|
15
|
+
opts = args.extract_options!.with_indifferent_access
|
16
|
+
clazz = args.first
|
17
|
+
if clazz.is_a?(Module)
|
18
|
+
name = clazz.try(:table_name).presence || clazz.to_s.underscore.gsub('/', '_').pluralize
|
19
|
+
group = NameImportantGroup.new(name: name, klass: clazz, defined_class_wrapper: self)
|
20
|
+
elsif clazz.blank? && opts.key?(:name) && opts.key?(:klass)
|
21
|
+
opts = opts.with_indifferent_access
|
22
|
+
group = NameImportantGroup.new(name: opts.delete(:name).to_s, klass: opts.delete(:klass), defined_class_wrapper: self)
|
23
|
+
else
|
24
|
+
raise "group klass need set"
|
25
|
+
end
|
26
|
+
group.opts = OpenStruct.new opts
|
27
|
+
CanPlay.groups << group
|
28
|
+
CanPlay.groups = CanPlay.groups.uniq(&:name)
|
29
|
+
self.temp_current_group = self.current_group
|
30
|
+
self.current_group = group
|
31
|
+
if block
|
32
|
+
block.call(group.klass)
|
33
|
+
self.current_group = self.temp_current_group
|
34
|
+
self.temp_current_group = nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def limit(name=nil, &block)
|
39
|
+
clazz = self
|
40
|
+
wrap_block = Proc.new do |*args|
|
41
|
+
clazz::OnlyInstance.only.instance_exec(*args, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
CanPlay::Power.power(name||current_group.name, &wrap_block)
|
45
|
+
end
|
46
|
+
|
47
|
+
def collection(verb_or_verbs, opts={}, &block)
|
48
|
+
|
49
|
+
raise "Need define group first" if current_group.nil?
|
50
|
+
opts = OpenStruct.new opts
|
51
|
+
group = current_group
|
52
|
+
behavior = nil
|
53
|
+
clazz = self
|
54
|
+
if block
|
55
|
+
behavior = Proc.new do
|
56
|
+
result = clazz::OnlyInstance.only.instance_eval(&block)
|
57
|
+
result
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if verb_or_verbs.kind_of?(Array)
|
62
|
+
verb_or_verbs.each do |verb|
|
63
|
+
add_resource(group, verb, group.klass, 'collection', behavior, opts)
|
64
|
+
end
|
65
|
+
else
|
66
|
+
add_resource(group, verb_or_verbs, group.klass, 'collection', behavior, opts)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def member(verb_or_verbs, opts={}, &block)
|
71
|
+
raise "Need define group first" if current_group.nil?
|
72
|
+
opts = OpenStruct.new opts
|
73
|
+
group = current_group
|
74
|
+
behavior = nil
|
75
|
+
clazz = self
|
76
|
+
if block
|
77
|
+
behavior = Proc.new do |obj|
|
78
|
+
clazz::OnlyInstance.only.instance_exec(obj, &block)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
if verb_or_verbs.kind_of?(Array)
|
83
|
+
verb_or_verbs.each do |verb|
|
84
|
+
add_resource(group, verb, group.klass, 'member', behavior, opts)
|
85
|
+
end
|
86
|
+
else
|
87
|
+
add_resource(group, verb_or_verbs, group.klass, 'member', behavior, opts)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def add_resource(group, verb, object, type, behavior, opts)
|
92
|
+
name = "#{verb}_#{group.name}"
|
93
|
+
resource = ResourcePermission.new(
|
94
|
+
my_module_name: my_module_name,
|
95
|
+
name: name,
|
96
|
+
group: group,
|
97
|
+
verb: verb,
|
98
|
+
object: object,
|
99
|
+
type: type,
|
100
|
+
behavior: behavior,
|
101
|
+
opts: opts
|
102
|
+
)
|
103
|
+
CanPlay.resources.keep_if { |i| i.name != name }
|
104
|
+
CanPlay.resources << resource
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module CanPlay
|
2
|
+
module Config
|
3
|
+
mattr_accessor :user_class_name, :role_class_name, :role_resources_relation_name, :super_roles, :role_judge_method
|
4
|
+
self.user_class_name = 'User'
|
5
|
+
self.role_class_name = 'Role'
|
6
|
+
self.role_resources_relation_name = 'role_resources'
|
7
|
+
self.super_roles = []
|
8
|
+
self.role_judge_method = 'role_is?'
|
9
|
+
|
10
|
+
def self.setup
|
11
|
+
yield self
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/can_play/controller.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
class ActionController::Base
|
2
2
|
include Consul::Controller
|
3
3
|
current_power do
|
4
|
-
CanPlay::Power.new
|
4
|
+
CanPlay::Power.new
|
5
5
|
end
|
6
6
|
helper_method :play_resources
|
7
|
+
|
8
|
+
after_action do
|
9
|
+
CanPlay::Resource::OnlyInstance.only = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_can_play(user, override_code = nil)
|
13
|
+
CanPlay.override_code = override_code
|
14
|
+
can_play_instance = CanPlay::AbstractResource::OnlyInstance.new(user: user)
|
15
|
+
current_ability.instance_variable_set(:@can_play_instance, can_play_instance)
|
16
|
+
current_power.instance_variable_set(:@can_play_instance, can_play_instance)
|
17
|
+
end
|
18
|
+
|
7
19
|
# 对current_power采用动态方法调用的装饰者。
|
8
20
|
class PlayResourceObject < BasicObject
|
9
21
|
def initialize(obj, klass)
|
data/lib/can_play/power.rb
CHANGED
@@ -0,0 +1,164 @@
|
|
1
|
+
module CanPlay
|
2
|
+
class AbstractResource
|
3
|
+
|
4
|
+
include RorHack::ClassLevelInheritableAttributes
|
5
|
+
extend CanPlay::ClassMethods
|
6
|
+
inheritable_attributes :my_module_name
|
7
|
+
self.my_module_name = 'other'
|
8
|
+
|
9
|
+
def self.set_module_name(str)
|
10
|
+
self.my_module_name = str
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.set_method(name, &block)
|
14
|
+
self::OnlyInstance.after_initialize_block_array << Proc.new do
|
15
|
+
define_singleton_method name, &block
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.inherited(base)
|
20
|
+
super
|
21
|
+
base.class_eval do
|
22
|
+
# 定义动态类。
|
23
|
+
base.const_set "OnlyInstance", Class.new(self::OnlyInstance)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class OnlyInstance
|
28
|
+
|
29
|
+
singleton_attr_accessor :after_initialize_block_array, :only_you, :instance
|
30
|
+
|
31
|
+
def initialize(opts)
|
32
|
+
@user = opts[:user] if opts[:user]
|
33
|
+
@instance = opts[:instance] if opts[:instance]
|
34
|
+
self.class.only_you = self
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.new(opts = {}.with_indifferent_access)
|
38
|
+
o = allocate
|
39
|
+
o.instance_eval { initialize(opts) }
|
40
|
+
after_initialize_block_array.each do |block|
|
41
|
+
o.instance_exec(opts[:user], &block)
|
42
|
+
end
|
43
|
+
o
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.only
|
47
|
+
if only_you.blank?
|
48
|
+
if self == CanPlay::AbstractResource::OnlyInstance
|
49
|
+
raise 'CanPlay::Resource::OnlyInstance not set first instance'
|
50
|
+
else
|
51
|
+
self.only_you = new(instance: superclass.only)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
only_you
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.only=(obj)
|
59
|
+
self.only_you = obj
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.after_initialize_block_array
|
63
|
+
@after_initialize_block_array ||= []
|
64
|
+
end
|
65
|
+
|
66
|
+
def klass
|
67
|
+
@klass ||= begin
|
68
|
+
clazz_string = self.class.parent.name
|
69
|
+
raise 'class name error' unless clazz_string.end_with?('Resource') || clazz_string.end_with?('ResourceOverride')
|
70
|
+
clazz_name = self.class.parent.name.gsub(/Resource$/, '').gsub(/ResourceOverride$/, '')
|
71
|
+
klass = clazz_name.constantize rescue nil
|
72
|
+
klass
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def method_missing(method, *args, &block)
|
77
|
+
if @instance
|
78
|
+
return @instance.send(method, *args, &block)
|
79
|
+
end
|
80
|
+
super(method, *args, &block)
|
81
|
+
end
|
82
|
+
|
83
|
+
self.after_initialize_block_array << Proc.new do |user|
|
84
|
+
|
85
|
+
define_singleton_method :user do
|
86
|
+
user
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
alias_method :set_method, :define_singleton_method
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
class Resource < AbstractResource
|
97
|
+
|
98
|
+
def self.inherited(base)
|
99
|
+
super
|
100
|
+
base.class_eval do
|
101
|
+
raise 'class name set error' unless base.name.end_with?('Resource')
|
102
|
+
clazz_name = base.name.gsub(/Resource$/, '')
|
103
|
+
clazz = clazz_name.constantize rescue nil
|
104
|
+
singleton_attr_accessor :current_group, :temp_current_group
|
105
|
+
if clazz && clazz.is_a?(Module)
|
106
|
+
base.group clazz
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class ResourceOverride < AbstractResource
|
113
|
+
inheritable_attributes :uniq_override_code
|
114
|
+
|
115
|
+
def self.set_override_code(str)
|
116
|
+
self.uniq_override_code = str
|
117
|
+
end
|
118
|
+
|
119
|
+
set_override_code('')
|
120
|
+
|
121
|
+
def self.inherited(base)
|
122
|
+
super
|
123
|
+
base.class_eval do
|
124
|
+
raise 'class name set error' unless base.name.end_with?('ResourceOverride')
|
125
|
+
clazz_name = base.name.gsub(/ResourceOverride$/, '')
|
126
|
+
clazz = clazz_name.constantize rescue nil
|
127
|
+
singleton_attr_accessor :current_group, :temp_current_group
|
128
|
+
if clazz && clazz.is_a?(Module)
|
129
|
+
base.group clazz
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.add_resource(group, verb, object, type, behavior, opts)
|
135
|
+
code = self.uniq_override_code
|
136
|
+
super(group, verb, object, type, behavior, opts) and return if code.blank?
|
137
|
+
name = "#{verb}_#{group.name}"
|
138
|
+
resource = ResourcePermission.new(
|
139
|
+
my_module_name: my_module_name,
|
140
|
+
name: name,
|
141
|
+
group: group,
|
142
|
+
verb: verb,
|
143
|
+
object: object,
|
144
|
+
type: type,
|
145
|
+
behavior: behavior,
|
146
|
+
opts: opts
|
147
|
+
)
|
148
|
+
CanPlay.override_resources[code] ||= []
|
149
|
+
CanPlay.override_resources[code].keep_if { |i| i.name != name }
|
150
|
+
CanPlay.override_resources[code] << resource
|
151
|
+
end
|
152
|
+
|
153
|
+
def self.limit(name=nil, &block)
|
154
|
+
clazz = self
|
155
|
+
wrap_block = Proc.new do |*args|
|
156
|
+
clazz::OnlyInstance.only.instance_exec(*args, &block)
|
157
|
+
end
|
158
|
+
method_name = name ? "#{name}_evaluate_in_#{code}_scope" : "#{current_group.name}_evaluate_in_#{self.uniq_override_code}_scope"
|
159
|
+
|
160
|
+
CanPlay::Power.power(method_name, &wrap_block)
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
data/lib/can_play/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: can_play
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- happyming9527
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -112,8 +112,11 @@ files:
|
|
112
112
|
- config/locales/zh-CN.yml
|
113
113
|
- lib/can_play.rb
|
114
114
|
- lib/can_play/ability.rb
|
115
|
+
- lib/can_play/class_method.rb
|
116
|
+
- lib/can_play/config.rb
|
115
117
|
- lib/can_play/controller.rb
|
116
118
|
- lib/can_play/power.rb
|
119
|
+
- lib/can_play/resource.rb
|
117
120
|
- lib/can_play/version.rb
|
118
121
|
- lib/generators/can_play/install_generator.rb
|
119
122
|
- lib/generators/templates/can_play.rb
|