can_play 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 16441a20427ca9e3570f0e3a3cda976916eea535
4
- data.tar.gz: 23b9fd796b805e68ab8022ba381920e6b76d1f02
3
+ metadata.gz: 8d07491ab6a42d581eb9e9b3d809b4c2b31f5a4b
4
+ data.tar.gz: ce076576115c4fc9166e06a88145643fce7dc304
5
5
  SHA512:
6
- metadata.gz: 1275d49864ffd120b58b98a39035f8573defc82ea5b0579e7e01e158c9260f5ba9bce86037838cc881356c75f7d49b2d2566e9a160242cb509dbb6cdd7ad3fec
7
- data.tar.gz: 59e3db805478f280d33fd85606dd1cc3e3fe2de01094a3c4157ae5ea0bbdd4200e162235ac08672b9694821dd2e5c6187fae40541252c0b031a55448883ad78d
6
+ metadata.gz: e88dcc97bdd34c34bc2d81bb562ca376b191ebbfcbca4a9e1aa1ba6ca40472687c64162f5963ca6ee44655df28b22847def6982cb644d425be72f23036bcb459
7
+ data.tar.gz: 379a49b8d9f22be107c4b84eeaf0451061c34d9b1a9cfcdb5df306f0659e2fb53582a071dbbed1b016682a5647427a519a953962603222464fddb4959943f5bc
data/Gemfile CHANGED
@@ -1,6 +1,2 @@
1
- source 'https://rubygems.org'
2
- gem "cancancan"
3
- gem "consul"
4
- gem "rolify"
5
1
  # Specify your gem's dependencies in can_play.gemspec
6
2
  gemspec
@@ -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
- mattr_accessor :resources, :override_resources, :override_code
8
- self.override_code = nil
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
- class << self
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
- def find_by_name_and_code(name, code)
24
- resource = CanPlay.override_resources[code].p2a.find { |r| r.name.to_s == name.to_s }
25
- resource || CanPlay.resources.find { |r| r.name.to_s == name.to_s }
26
- end
21
+ def included(base)
22
+ base.extend ClassMethods
23
+ end
27
24
 
28
- def conjunct_resources(&block)
29
- resources = CanPlay.override_resources[CanPlay.override_code].p2a + CanPlay.resources
30
- resources = resources.uniq { |i| i.name }
31
- resources = resources.select(&block) if block
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
- def grouped_resources(&block)
36
- conjunct_resources(&block).multi_group_by(:module_name, :group)
37
- end
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
- def splat_grouped_resources(&block)
40
- conjunct_resources(&block).multi_group_by(:group)
41
- end
37
+ def grouped_resources(&block)
38
+ conjunct_resources(&block).multi_group_by(:my_module_name, :group)
39
+ end
42
40
 
43
- def grouped_resources_with_chinese_desc(&block)
44
- grouped_resources(&block).tap do |e|
45
- e.each do |i, v|
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
- def splat_grouped_resources_with_chinese_desc(&block)
62
- splat_grouped_resources(&block).tap do |i|
63
- i.each do |group, resources|
64
- group[:chinese_desc] = begin
65
- name = I18n.t("can_play.class_name.#{group.name.singularize}", default: '')
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[:chinese_desc] = I18n.t("can_play.authority_name.#{group[:name].singularize}.#{resource[:verb]}", default: '').presence || I18n.t("can_play.authority_name.common.#{resource[:verb]}")
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
- i.rehash
58
+ v.rehash
74
59
  end
75
60
  end
76
61
  end
77
62
 
78
- module Config
79
- mattr_accessor :user_class_name, :role_class_name, :role_resources_relation_name, :super_roles, :role_judge_method
80
- self.user_class_name = 'User'
81
- self.role_class_name = 'Role'
82
- self.role_resources_relation_name = 'role_resources'
83
- self.super_roles = []
84
- self.role_judge_method = 'role_is?'
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
- end
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 "can_play/power"
231
- require "can_play/controller"
232
- require "can_play/ability"
80
+ require 'can_play/resource'
81
+ require 'can_play/power'
82
+ require 'can_play/controller'
83
+ require 'can_play/ability'
@@ -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
- self.user = user||i.user_class_name.constantize.new
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(user)
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(user, object)
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
@@ -1,9 +1,21 @@
1
1
  class ActionController::Base
2
2
  include Consul::Controller
3
3
  current_power do
4
- CanPlay::Power.new(current_user)
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)
@@ -1,11 +1,5 @@
1
1
  module CanPlay
2
2
  class Power
3
3
  include Consul::Power
4
- attr_accessor :user
5
-
6
- def initialize(user)
7
- self.user = user
8
- end
9
-
10
4
  end
11
5
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module CanPlay
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
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.3.1
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-09-29 00:00:00.000000000 Z
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