indulgence 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +19 -8
- data/lib/indulgence/permission.rb +6 -1
- data/lib/indulgence/version.rb +4 -1
- data/test/db/test.sqlite3.db +0 -0
- data/test/lib/thing_permission.rb +4 -10
- data/test/units/indulgence/permission_test.rb +3 -4
- data/test/units/thing_permission_test.rb +1 -1
- data/test/units/thing_test.rb +9 -5
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -24,7 +24,21 @@ Indulgence can be added to a class via acts_as_indulgent:
|
|
24
24
|
end
|
25
25
|
|
26
26
|
Used in this way, permissions need to be defined in an Indulgence::Permission
|
27
|
-
object called ThingPermission
|
27
|
+
object called ThingPermission.
|
28
|
+
|
29
|
+
class ThingPermission < Indulgence::Permission
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
This needs to be available to the Thing class. For example, in a rails app, by
|
34
|
+
placing it in app/permissions/thing_permission.rb
|
35
|
+
|
36
|
+
=== Default permissions
|
37
|
+
|
38
|
+
The Permission class has a default method, that matches all the CRUD actions to
|
39
|
+
the ability *none*.
|
40
|
+
|
41
|
+
This behaviour can be overridden by explicitly defining the default method.
|
28
42
|
|
29
43
|
class ThingPermission < Indulgence::Permission
|
30
44
|
|
@@ -39,13 +53,10 @@ object called ThingPermission, with an instance method :default
|
|
39
53
|
|
40
54
|
end
|
41
55
|
|
42
|
-
This needs to be available to the Thing class. For example, in a rails app, by
|
43
|
-
placing it in app/permissions/thing_permission.rb
|
44
|
-
|
45
56
|
== Users and Roles
|
46
57
|
|
47
58
|
Indulgence assumes that permissions will be tested against an entity object
|
48
|
-
(e.g. User). The
|
59
|
+
(e.g. User). The standard behaviour assumes that the entity object has a :role
|
49
60
|
method that returns the role object, and that the role object has a :name method.
|
50
61
|
|
51
62
|
So typically, these objects could look like this:
|
@@ -73,7 +84,7 @@ Simple true/false permission can be determined using the :indulge? method:
|
|
73
84
|
thing = Thing.first
|
74
85
|
|
75
86
|
thing.indulge?(user, :create) == false
|
76
|
-
thing.indulge?(user, :read) == true
|
87
|
+
thing.indulge?(user, :read) == true # Note default has be overridden
|
77
88
|
thing.indulge?(user, :update) == false
|
78
89
|
thing.indulge?(user, :delete) == false
|
79
90
|
|
@@ -94,8 +105,8 @@ So to find all the blue things that the user has permission to read:
|
|
94
105
|
|
95
106
|
=== Adding other roles
|
96
107
|
|
97
|
-
Up until now, all users get the same permissions irrespective of role.
|
98
|
-
give Emperors the right to see and do anything by first creating an emperor
|
108
|
+
Up until now, all users get the same permissions (default) irrespective of role.
|
109
|
+
Let's give Emperors the right to see and do anything by first creating an emperor
|
99
110
|
|
100
111
|
emperor = Role.create(:name => 'emperor')
|
101
112
|
caesar = User.create(
|
data/lib/indulgence/version.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
module Indulgence
|
2
|
-
VERSION = "0.0.
|
2
|
+
VERSION = "0.0.6"
|
3
3
|
end
|
4
4
|
|
5
5
|
# History
|
6
6
|
# =======
|
7
|
+
#
|
8
|
+
# 0.0.6 Specifies the default behaviour as assigning the none ability to
|
9
|
+
# all CRUD actions.
|
7
10
|
#
|
8
11
|
# 0.0.5 Allows simplified ability definition to be used with has_many
|
9
12
|
#
|
data/test/db/test.sqlite3.db
CHANGED
Binary file
|
@@ -11,19 +11,10 @@ class ThingPermission < Indulgence::Permission
|
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
def default
|
16
|
-
{
|
17
|
-
create: none,
|
18
|
-
read: all,
|
19
|
-
update: none,
|
20
|
-
delete: none
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
14
|
def god
|
25
15
|
{
|
26
16
|
create: all,
|
17
|
+
read: all,
|
27
18
|
update: all,
|
28
19
|
delete: all
|
29
20
|
}
|
@@ -32,6 +23,7 @@ class ThingPermission < Indulgence::Permission
|
|
32
23
|
def demigod
|
33
24
|
{
|
34
25
|
create: things_they_own,
|
26
|
+
read: all,
|
35
27
|
update: things_they_own,
|
36
28
|
delete: things_they_own
|
37
29
|
}
|
@@ -39,12 +31,14 @@ class ThingPermission < Indulgence::Permission
|
|
39
31
|
|
40
32
|
def thief
|
41
33
|
{
|
34
|
+
read: all,
|
42
35
|
update: things_they_stole
|
43
36
|
}
|
44
37
|
end
|
45
38
|
|
46
39
|
def friend
|
47
40
|
{
|
41
|
+
read: all,
|
48
42
|
update: things_they_borrow
|
49
43
|
}
|
50
44
|
end
|
@@ -6,10 +6,9 @@ require 'ability'
|
|
6
6
|
module Indulgence
|
7
7
|
class PermissionTest < Test::Unit::TestCase
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
def test_creation
|
10
|
+
permission = Permission.new(User.create(:name => 'Whisp'), :read)
|
11
|
+
assert_equal Permission.none, permission.default[:read]
|
13
12
|
end
|
14
13
|
|
15
14
|
def test_define_ability_uses_cache_rather_than_duplicates
|
@@ -25,7 +25,7 @@ class ThingPermissionTest < Test::Unit::TestCase
|
|
25
25
|
|
26
26
|
def test_default_permissions
|
27
27
|
assert_equal Permission.none, ThingPermission.new(@user, :create).ability
|
28
|
-
assert_equal Permission.
|
28
|
+
assert_equal Permission.none, ThingPermission.new(@user, :read).ability
|
29
29
|
assert_equal Permission.none, ThingPermission.new(@user, :update).ability
|
30
30
|
assert_equal Permission.none, ThingPermission.new(@user, :delete).ability
|
31
31
|
end
|
data/test/units/thing_test.rb
CHANGED
@@ -21,7 +21,7 @@ class ThingTest < Test::Unit::TestCase
|
|
21
21
|
|
22
22
|
def test_indulge
|
23
23
|
make_second_thing
|
24
|
-
assert_equal(
|
24
|
+
assert_equal(false, @thing.indulge?(@owner, :read))
|
25
25
|
assert_equal(false, @thing.indulge?(@owner, :delete))
|
26
26
|
assert_equal(false, @other_thing.indulge?(@owner, :delete))
|
27
27
|
end
|
@@ -66,7 +66,7 @@ class ThingTest < Test::Unit::TestCase
|
|
66
66
|
|
67
67
|
def test_indulge_other_thing
|
68
68
|
other_thing = OtherThing.create(:name => 'Other Stuff', :owner => @owner)
|
69
|
-
assert_equal(
|
69
|
+
assert_equal(false, other_thing.indulge?(@owner, :read))
|
70
70
|
assert_equal(false, other_thing.indulge?(@owner, :delete))
|
71
71
|
end
|
72
72
|
|
@@ -74,7 +74,9 @@ class ThingTest < Test::Unit::TestCase
|
|
74
74
|
make_second_thing
|
75
75
|
@owner.update_attribute(:role, @demigod)
|
76
76
|
assert_equal(Thing.order('id'), Thing.indulgence(@owner, :read).order('id'))
|
77
|
-
|
77
|
+
assert_raise ActiveRecord::RecordNotFound do
|
78
|
+
Thing.indulgence(@user, :read).order('id')
|
79
|
+
end
|
78
80
|
assert_equal([@thing], Thing.indulgence(@owner, :delete))
|
79
81
|
assert_raise ActiveRecord::RecordNotFound do
|
80
82
|
Thing.indulgence(@user, :delete)
|
@@ -110,7 +112,7 @@ class ThingTest < Test::Unit::TestCase
|
|
110
112
|
|
111
113
|
def test_aliased_compare_single_method
|
112
114
|
make_second_thing
|
113
|
-
assert_equal(
|
115
|
+
assert_equal(false, @thing.permit?(@owner, :read))
|
114
116
|
assert_equal(false, @thing.permit?(@owner, :delete))
|
115
117
|
assert_equal(false, @other_thing.permit?(@owner, :delete))
|
116
118
|
end
|
@@ -119,7 +121,9 @@ class ThingTest < Test::Unit::TestCase
|
|
119
121
|
make_second_thing
|
120
122
|
@owner.update_attribute(:role, @demigod)
|
121
123
|
assert_equal(Thing.order('id'), Thing.permitted(@owner, :read).order('id'))
|
122
|
-
|
124
|
+
assert_raise ActiveRecord::RecordNotFound do
|
125
|
+
Thing.permitted(@user, :read).order('id')
|
126
|
+
end
|
123
127
|
assert_equal([@thing], Thing.permitted(@owner, :delete))
|
124
128
|
assert_raise ActiveRecord::RecordNotFound do
|
125
129
|
Thing.permitted(@user, :delete)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: indulgence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|