mongoid_ability 0.1.7 → 0.1.8
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/lib/mongoid_ability/ability.rb +8 -46
- data/lib/mongoid_ability/accessible_query_builder.rb +3 -14
- data/lib/mongoid_ability/lock.rb +12 -0
- data/lib/mongoid_ability/owner.rb +4 -0
- data/lib/mongoid_ability/version.rb +1 -1
- data/test/mongoid_ability/lock_test.rb +21 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4380837ac3e83d99bb741c4f5fa31f70598500bf
|
4
|
+
data.tar.gz: 9537c54dfcb14ee4a9d0affd7fb9291c5ecc7e55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37dbd56daf307a7af85f54a254dde5a9546059fea164540dd2c3512b8543587c8f42278c49169134e2acc66d3194457117c10ae1201712baba685bbccb0b5a42
|
7
|
+
data.tar.gz: 25cd98e83f5145b3b694a6e689ae9d533558752b3f4f17561b2420c85fde2be068b5250d0099d33c2cc394012359722aa5175629c86df392dc493133dec8978e
|
@@ -20,55 +20,17 @@ module MongoidAbility
|
|
20
20
|
@owner = owner
|
21
21
|
|
22
22
|
can do |action, subject_type, subject, options|
|
23
|
-
|
23
|
+
subject_class = subject_type.to_s.constantize
|
24
|
+
outcome = nil
|
25
|
+
options ||= {}
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# else
|
30
|
-
# _can(action, subject_type, subject, options)
|
31
|
-
# end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# ---------------------------------------------------------------------
|
27
|
+
subject_class.self_and_ancestors_with_default_locks.each do |cls|
|
28
|
+
outcome = ResolveInheritedLocks.call(owner, action, cls, subject, options)
|
29
|
+
break if outcome != nil
|
30
|
+
end
|
36
31
|
|
37
|
-
|
38
|
-
subject_class = subject_type.to_s.constantize
|
39
|
-
outcome = nil
|
40
|
-
options ||= {}
|
41
|
-
|
42
|
-
subject_class.self_and_ancestors_with_default_locks.each do |cls|
|
43
|
-
outcome = ResolveInheritedLocks.call(owner, action, cls, subject, options)
|
44
|
-
break if outcome != nil
|
32
|
+
outcome
|
45
33
|
end
|
46
|
-
|
47
|
-
outcome
|
48
|
-
end
|
49
|
-
|
50
|
-
# ---------------------------------------------------------------------
|
51
|
-
|
52
|
-
def cache_key
|
53
|
-
["ability", owner.cache_key, inherit_from_relation_cache_keys].compact.join('/')
|
54
|
-
end
|
55
|
-
|
56
|
-
def cache_keys action, subject_type, subject, options
|
57
|
-
res = []
|
58
|
-
res << action
|
59
|
-
res << subject_type
|
60
|
-
res << subject.cache_key unless subject.nil?
|
61
|
-
res << options_cache_key(options)
|
62
|
-
res.compact
|
63
|
-
end
|
64
|
-
|
65
|
-
def options_cache_key options={}
|
66
|
-
Digest::SHA1.hexdigest( options.to_a.sort_by { |k,v| k.to_s }.to_s )
|
67
|
-
end
|
68
|
-
|
69
|
-
def inherit_from_relation_cache_keys
|
70
|
-
return unless owner.respond_to?(owner.class.inherit_from_relation_name) && owner.inherit_from_relation != nil
|
71
|
-
owner.inherit_from_relation.map(&:cache_key)
|
72
34
|
end
|
73
35
|
|
74
36
|
# ---------------------------------------------------------------------
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# FIXME: this is extremely slow and not suitable for use, yet
|
2
|
+
|
1
3
|
module MongoidAbility
|
2
4
|
class AccessibleQueryBuilder < Struct.new(:base_class, :ability, :action, :options)
|
3
5
|
|
@@ -8,24 +10,11 @@ module MongoidAbility
|
|
8
10
|
# =====================================================================
|
9
11
|
|
10
12
|
def call
|
11
|
-
|
12
|
-
|
13
|
-
# if defined? Rails
|
14
|
-
# # FIXME: this is a bit of a dirty hack, since the marshalling of criteria does not preserve the embedded attributes
|
15
|
-
# Rails.cache.fetch( [ 'ability-query', base_class, ability.cache_key, action, ability.options_cache_key(options) ] ) do
|
16
|
-
# _call
|
17
|
-
# end.tap { |c| c.embedded = base_criteria.embedded }
|
18
|
-
# else
|
19
|
-
# _call
|
20
|
-
# end
|
13
|
+
base_class_and_descendants.inject(base_criteria) { |criteria, cls| criteria.merge!(criteria_for_class(cls)) }
|
21
14
|
end
|
22
15
|
|
23
16
|
private # =============================================================
|
24
17
|
|
25
|
-
def _call
|
26
|
-
base_class_and_descendants.inject(base_criteria) { |criteria, cls| criteria.merge!(criteria_for_class(cls)) }
|
27
|
-
end
|
28
|
-
|
29
18
|
def base_criteria
|
30
19
|
@base_criteria ||= base_class.criteria
|
31
20
|
end
|
data/lib/mongoid_ability/lock.rb
CHANGED
@@ -40,8 +40,20 @@ module MongoidAbility
|
|
40
40
|
res
|
41
41
|
end
|
42
42
|
|
43
|
+
# calculates outcome as if this lock is not present
|
44
|
+
def inherited_outcome
|
45
|
+
return unless owner.present?
|
46
|
+
cloned_owner = owner.clone
|
47
|
+
cloned_owner.locks_relation = cloned_owner.locks_relation - [self]
|
48
|
+
MongoidAbility::Ability.new(cloned_owner).can? action, (id_lock? ? subject : subject_class)
|
49
|
+
end
|
50
|
+
|
43
51
|
# ---------------------------------------------------------------------
|
44
52
|
|
53
|
+
def subject_class
|
54
|
+
subject_type.constantize
|
55
|
+
end
|
56
|
+
|
45
57
|
def open? options={}
|
46
58
|
calculated_outcome(options) == true
|
47
59
|
end
|
@@ -26,6 +26,10 @@ module MongoidAbility
|
|
26
26
|
self.send(self.class.locks_relation_name)
|
27
27
|
end
|
28
28
|
|
29
|
+
def locks_relation= val
|
30
|
+
self.send "#{self.class.locks_relation_name}=", val
|
31
|
+
end
|
32
|
+
|
29
33
|
def inherit_from_relation
|
30
34
|
self.send(self.class.inherit_from_relation_name)
|
31
35
|
end
|
@@ -49,6 +49,27 @@ module MongoidAbility
|
|
49
49
|
|
50
50
|
# ---------------------------------------------------------------------
|
51
51
|
|
52
|
+
describe '#inherited_outcome' do
|
53
|
+
let(:my_subject) { MySubject.new }
|
54
|
+
let(:subject_type_lock) { MyLock.new(subject_type: MySubject, action: :read, outcome: false) }
|
55
|
+
let(:subject_lock) { MyLock.new(subject: my_subject, action: :read, outcome: true) }
|
56
|
+
let(:owner) { MyOwner.new(my_locks: [subject_type_lock, subject_lock]) }
|
57
|
+
let(:ability) { Ability.new(owner) }
|
58
|
+
|
59
|
+
before { ability } # initialize owner
|
60
|
+
|
61
|
+
it 'does not affect calculated_outcome' do
|
62
|
+
ability.can?(:read, my_subject).must_equal true
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns calculated_outcome without this lock' do
|
66
|
+
subject_lock.inherited_outcome.must_equal false
|
67
|
+
subject_type_lock.inherited_outcome.must_equal true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# ---------------------------------------------------------------------
|
72
|
+
|
52
73
|
describe '#criteria' do
|
53
74
|
let(:open_subject_type_lock) { MyLock.new(subject_type: MySubject, action: :read, outcome: true) }
|
54
75
|
let(:closed_subject_type_lock) { MyLock.new(subject_type: MySubject, action: :read, outcome: false) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_ability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomas Celizna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cancancan
|