mongoid_ability 0.0.11 → 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.
- checksums.yaml +4 -4
- data/README.md +18 -13
- data/lib/mongoid_ability.rb +8 -2
- data/lib/mongoid_ability/ability.rb +32 -30
- data/lib/mongoid_ability/accessible_query_builder.rb +61 -41
- data/lib/mongoid_ability/lock.rb +16 -29
- data/lib/mongoid_ability/owner.rb +6 -22
- data/lib/mongoid_ability/resolve_default_locks.rb +15 -0
- data/lib/mongoid_ability/resolve_inherited_locks.rb +32 -0
- data/lib/mongoid_ability/resolve_locks.rb +34 -0
- data/lib/mongoid_ability/resolve_owner_locks.rb +25 -0
- data/lib/mongoid_ability/subject.rb +28 -32
- data/lib/mongoid_ability/version.rb +1 -1
- data/test/mongoid_ability/ability_role_test.rb +11 -5
- data/test/mongoid_ability/ability_test.rb +67 -91
- data/test/mongoid_ability/accessible_query_builder_test.rb +9 -5
- data/test/mongoid_ability/can_options_test.rb +17 -0
- data/test/mongoid_ability/lock_test.rb +51 -70
- data/test/mongoid_ability/owner_locks_test.rb +42 -0
- data/test/mongoid_ability/owner_test.rb +12 -39
- data/test/mongoid_ability/resolve_default_locks_test.rb +27 -0
- data/test/mongoid_ability/resolve_inherited_locks_test.rb +49 -0
- data/test/mongoid_ability/resolve_locks_test.rb +25 -0
- data/test/mongoid_ability/resolve_owner_locks_test.rb +50 -0
- data/test/mongoid_ability/subject_accessible_by_test.rb +135 -0
- data/test/mongoid_ability/subject_test.rb +20 -201
- data/test/support/test_classes.rb +136 -61
- data/test/test_helper.rb +3 -2
- metadata +20 -5
- data/lib/mongoid_ability/ability_resolver.rb +0 -42
- data/test/mongoid_ability/ability_resolver_test.rb +0 -78
data/test/test_helper.rb
CHANGED
@@ -30,7 +30,8 @@ CONFIG = {
|
|
30
30
|
database: database_id,
|
31
31
|
hosts: [ "#{HOST}:#{PORT}" ]
|
32
32
|
}
|
33
|
-
}
|
33
|
+
},
|
34
|
+
options: { preload_models: true }
|
34
35
|
}
|
35
36
|
|
36
37
|
Mongoid.configure do |config|
|
@@ -43,4 +44,4 @@ DatabaseCleaner.strategy = :truncation
|
|
43
44
|
class MiniTest::Spec
|
44
45
|
before(:each) { DatabaseCleaner.start }
|
45
46
|
after(:each) { DatabaseCleaner.clean }
|
46
|
-
end
|
47
|
+
end
|
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.0
|
4
|
+
version: 0.1.0
|
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-07-
|
11
|
+
date: 2015-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cancancan
|
@@ -154,19 +154,28 @@ files:
|
|
154
154
|
- Rakefile
|
155
155
|
- lib/mongoid_ability.rb
|
156
156
|
- lib/mongoid_ability/ability.rb
|
157
|
-
- lib/mongoid_ability/ability_resolver.rb
|
158
157
|
- lib/mongoid_ability/accessible_query_builder.rb
|
159
158
|
- lib/mongoid_ability/lock.rb
|
160
159
|
- lib/mongoid_ability/owner.rb
|
160
|
+
- lib/mongoid_ability/resolve_default_locks.rb
|
161
|
+
- lib/mongoid_ability/resolve_inherited_locks.rb
|
162
|
+
- lib/mongoid_ability/resolve_locks.rb
|
163
|
+
- lib/mongoid_ability/resolve_owner_locks.rb
|
161
164
|
- lib/mongoid_ability/subject.rb
|
162
165
|
- lib/mongoid_ability/version.rb
|
163
166
|
- mongoid_ability.gemspec
|
164
|
-
- test/mongoid_ability/ability_resolver_test.rb
|
165
167
|
- test/mongoid_ability/ability_role_test.rb
|
166
168
|
- test/mongoid_ability/ability_test.rb
|
167
169
|
- test/mongoid_ability/accessible_query_builder_test.rb
|
170
|
+
- test/mongoid_ability/can_options_test.rb
|
168
171
|
- test/mongoid_ability/lock_test.rb
|
172
|
+
- test/mongoid_ability/owner_locks_test.rb
|
169
173
|
- test/mongoid_ability/owner_test.rb
|
174
|
+
- test/mongoid_ability/resolve_default_locks_test.rb
|
175
|
+
- test/mongoid_ability/resolve_inherited_locks_test.rb
|
176
|
+
- test/mongoid_ability/resolve_locks_test.rb
|
177
|
+
- test/mongoid_ability/resolve_owner_locks_test.rb
|
178
|
+
- test/mongoid_ability/subject_accessible_by_test.rb
|
170
179
|
- test/mongoid_ability/subject_test.rb
|
171
180
|
- test/support/test_classes.rb
|
172
181
|
- test/test_helper.rb
|
@@ -196,12 +205,18 @@ specification_version: 4
|
|
196
205
|
summary: Custom Ability class that allows CanCanCan authorization library store permissions
|
197
206
|
in MongoDB via the Mongoid gem.
|
198
207
|
test_files:
|
199
|
-
- test/mongoid_ability/ability_resolver_test.rb
|
200
208
|
- test/mongoid_ability/ability_role_test.rb
|
201
209
|
- test/mongoid_ability/ability_test.rb
|
202
210
|
- test/mongoid_ability/accessible_query_builder_test.rb
|
211
|
+
- test/mongoid_ability/can_options_test.rb
|
203
212
|
- test/mongoid_ability/lock_test.rb
|
213
|
+
- test/mongoid_ability/owner_locks_test.rb
|
204
214
|
- test/mongoid_ability/owner_test.rb
|
215
|
+
- test/mongoid_ability/resolve_default_locks_test.rb
|
216
|
+
- test/mongoid_ability/resolve_inherited_locks_test.rb
|
217
|
+
- test/mongoid_ability/resolve_locks_test.rb
|
218
|
+
- test/mongoid_ability/resolve_owner_locks_test.rb
|
219
|
+
- test/mongoid_ability/subject_accessible_by_test.rb
|
205
220
|
- test/mongoid_ability/subject_test.rb
|
206
221
|
- test/support/test_classes.rb
|
207
222
|
- test/test_helper.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module MongoidAbility
|
2
|
-
class AbilityResolver
|
3
|
-
|
4
|
-
def initialize owner, action, subject_type, subject=nil
|
5
|
-
@subject_class = subject_type.to_s.constantize
|
6
|
-
|
7
|
-
raise StandardError, "#{subject_type} class does not have default locks" unless @subject_class.respond_to?(:default_locks)
|
8
|
-
raise StandardError, "#{subject_type} class does not have default lock for :#{action} action" unless @subject_class.self_and_ancestors_with_default_locks.any? do |cls|
|
9
|
-
cls.default_locks.any?{ |l| l.action == action }
|
10
|
-
end
|
11
|
-
|
12
|
-
@owner = owner
|
13
|
-
@action = action.to_sym
|
14
|
-
@subject_type = subject_type.to_s
|
15
|
-
@subject = subject
|
16
|
-
@subject_id = subject.id if subject.present?
|
17
|
-
end
|
18
|
-
|
19
|
-
# ---------------------------------------------------------------------
|
20
|
-
|
21
|
-
def outcome
|
22
|
-
locks_for_subject_type = @owner.locks_relation.for_action(@action).for_subject_type(@subject_type)
|
23
|
-
|
24
|
-
return unless locks_for_subject_type.exists?
|
25
|
-
|
26
|
-
# return outcome if owner defines lock for id
|
27
|
-
if @subject.present?
|
28
|
-
id_locks = locks_for_subject_type.id_locks.for_subject_id(@subject_id)
|
29
|
-
return false if id_locks.any?(&:closed?)
|
30
|
-
return true if id_locks.any?(&:open?)
|
31
|
-
end
|
32
|
-
|
33
|
-
# return outcome if owner defines lock for subject_type
|
34
|
-
class_locks = locks_for_subject_type.class_locks
|
35
|
-
return false if class_locks.class_locks.any?(&:closed?)
|
36
|
-
return true if class_locks.class_locks.any?(&:open?)
|
37
|
-
|
38
|
-
nil
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
module MongoidAbility
|
4
|
-
describe AbilityResolver do
|
5
|
-
|
6
|
-
let(:user) { TestUser.new }
|
7
|
-
let(:role_editor) { TestRole.new(name: 'Editor') }
|
8
|
-
let(:role_sysop) { TestRole.new(name: 'SysOp') }
|
9
|
-
|
10
|
-
let(:ability_resolver_subject) { TestAbilityResolverSubject.new }
|
11
|
-
|
12
|
-
subject { AbilityResolver.new(user, :read, TestAbilityResolverSubject.to_s) }
|
13
|
-
let(:subject_with_id) { AbilityResolver.new(user, :read, TestAbilityResolverSubject.to_s, ability_resolver_subject) }
|
14
|
-
|
15
|
-
# ---------------------------------------------------------------------
|
16
|
-
|
17
|
-
describe 'errors' do
|
18
|
-
it 'raises NameError for invalid subject_type' do
|
19
|
-
-> { ar = AbilityResolver.new(user, :read, 'Foo') }.must_raise NameError
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'raises StandardError when subject_type does not have default_locks' do
|
23
|
-
-> { ar = AbilityResolver.new(user, :read, Object.to_s) }.must_raise StandardError
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'raises StandardError when subject_type class or its ancestors does not have default_lock' do
|
27
|
-
TestAbilityResolverSubject.stub(:default_locks, []) do
|
28
|
-
-> { ar = AbilityResolver.new(user, :read, TestAbilityResolverSubject.to_s) }.must_raise StandardError
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# ---------------------------------------------------------------------
|
34
|
-
|
35
|
-
describe '#outcome' do
|
36
|
-
describe 'no locks' do
|
37
|
-
it 'returns nil if no locks for subject_type and action exists' do
|
38
|
-
subject.outcome.must_be_nil
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe 'id locks' do
|
43
|
-
it 'returns outcome' do
|
44
|
-
user.test_locks = [
|
45
|
-
TestLock.new(action: :read, subject: ability_resolver_subject, outcome: true)
|
46
|
-
]
|
47
|
-
subject_with_id.outcome.must_equal true
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'prefers negative outcome' do
|
51
|
-
user.test_locks = [
|
52
|
-
TestLock.new(action: :read, subject: ability_resolver_subject, outcome: true),
|
53
|
-
TestLock.new(action: :read, subject: ability_resolver_subject, outcome: false)
|
54
|
-
]
|
55
|
-
subject_with_id.outcome.must_equal false
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe 'class locks' do
|
60
|
-
it 'returns outcome' do
|
61
|
-
user.test_locks = [
|
62
|
-
TestLock.new(action: :read, subject_type: TestAbilityResolverSubject.to_s, outcome: true)
|
63
|
-
]
|
64
|
-
subject.outcome.must_equal true
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'prefers negative outcome' do
|
68
|
-
user.test_locks = [
|
69
|
-
TestLock.new(action: :read, subject_type: TestAbilityResolverSubject.to_s, outcome: true),
|
70
|
-
TestLock.new(action: :read, subject_type: TestAbilityResolverSubject.to_s, outcome: false)
|
71
|
-
]
|
72
|
-
subject.outcome.must_equal false
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|