role_model 0.2.0 → 0.3.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.
- data/README.rdoc +21 -11
- data/VERSION +1 -1
- data/lib/role_model/roles.rb +14 -0
- data/lib/role_model.rb +4 -2
- data/role_model.gemspec +5 -2
- data/spec/role_model_spec.rb +62 -1
- data/spec/roles_spec.rb +21 -0
- metadata +6 -3
data/README.rdoc
CHANGED
@@ -3,12 +3,8 @@
|
|
3
3
|
Ever needed to assign roles to a model, say a User, and build conditional
|
4
4
|
behaviour on top of that?
|
5
5
|
|
6
|
-
Enter RoleModel -- roles have never been easier! No need to build a separate
|
7
|
-
Role model, managing seed data and the like. Just declare your roles and you
|
8
|
-
are done.
|
9
|
-
|
10
6
|
Assigned roles will be stored as a bitmask in an configurable attribute
|
11
|
-
(default: <tt>roles_mask</tt>). Here's
|
7
|
+
(default: <tt>roles_mask</tt>). Here's how to get started:
|
12
8
|
|
13
9
|
# given a User class with a roles_mask attribute
|
14
10
|
require 'rubygems'
|
@@ -18,6 +14,7 @@ Assigned roles will be stored as a bitmask in an configurable attribute
|
|
18
14
|
attr_accessor :roles_mask # in real life this would be an persisted attribute / DB-column
|
19
15
|
|
20
16
|
include RoleModel
|
17
|
+
|
21
18
|
# optionally set the integer attribute to store the roles in,
|
22
19
|
# :roles_mask is the default
|
23
20
|
roles_attribute :roles_mask
|
@@ -27,23 +24,36 @@ Assigned roles will be stored as a bitmask in an configurable attribute
|
|
27
24
|
roles :admin, :manager, :author
|
28
25
|
end
|
29
26
|
|
27
|
+
#
|
28
|
+
# Test drive
|
29
|
+
#
|
30
|
+
|
30
31
|
>> u = User.new
|
31
32
|
=> #<User ...>
|
32
33
|
|
34
|
+
# role assignment
|
33
35
|
>> u.roles = [:admin] # ['admin'] works as well
|
34
36
|
=> [:admin]
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
+
# adding roles
|
39
|
+
>> u.roles << :manager
|
40
|
+
=> [:admin, :manager]
|
38
41
|
|
39
|
-
|
42
|
+
# quering roles...
|
43
|
+
|
44
|
+
# ... retrieve all assigned roles
|
45
|
+
>> u.roles # aliased to role_symbols for DeclarativeAuthorization
|
46
|
+
=> [:admin, :manager]
|
47
|
+
|
48
|
+
# ... check for individual roles
|
49
|
+
>> u.has_role? :author
|
40
50
|
=> false
|
41
|
-
|
42
51
|
>> u.has_role? :admin
|
43
52
|
=> true
|
44
|
-
|
53
|
+
|
54
|
+
# see the internal bitmask representation (3 = 0b0011)
|
45
55
|
>> u.roles_mask
|
46
|
-
=>
|
56
|
+
=> 3
|
47
57
|
|
48
58
|
Once you have included RoleModel, your model is perfectly fit to be used
|
49
59
|
together with a role-based authorization solution, such as
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/role_model.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'role_model/roles'
|
2
|
+
|
1
3
|
module RoleModel
|
2
4
|
|
3
5
|
INHERITABLE_CLASS_ATTRIBUTES = [:roles_attribute_name, :valid_roles]
|
@@ -6,7 +8,7 @@ module RoleModel
|
|
6
8
|
base.extend ClassMethods
|
7
9
|
base.class_eval do
|
8
10
|
class << self
|
9
|
-
attr_accessor
|
11
|
+
attr_accessor(*::RoleModel::INHERITABLE_CLASS_ATTRIBUTES)
|
10
12
|
end
|
11
13
|
roles_attribute :roles_mask
|
12
14
|
end
|
@@ -18,7 +20,7 @@ module RoleModel
|
|
18
20
|
|
19
21
|
# query assigned roles
|
20
22
|
def roles
|
21
|
-
self.class.valid_roles.reject { |r| ((self.send(self.class.roles_attribute_name) || 0) & 2**self.class.valid_roles.index(r)).zero? }
|
23
|
+
Roles.new(self, self.class.valid_roles.reject { |r| ((self.send(self.class.roles_attribute_name) || 0) & 2**self.class.valid_roles.index(r)).zero? })
|
22
24
|
end
|
23
25
|
alias role_symbols roles
|
24
26
|
|
data/role_model.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{role_model}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Martin Rehfeld"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-29}
|
13
13
|
s.description = %q{Ever needed to assign roles to a model, say a User, and build conditional behaviour on top of that? Enter RoleModel -- roles have never been easier! Just declare your roles and you are done. Assigned roles will be stored as a bitmask.}
|
14
14
|
s.email = %q{martin.rehfeld@glnetworks.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -24,8 +24,10 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"lib/role_model.rb",
|
27
|
+
"lib/role_model/roles.rb",
|
27
28
|
"role_model.gemspec",
|
28
29
|
"spec/role_model_spec.rb",
|
30
|
+
"spec/roles_spec.rb",
|
29
31
|
"spec/spec.opts",
|
30
32
|
"spec/spec_helper.rb"
|
31
33
|
]
|
@@ -36,6 +38,7 @@ Gem::Specification.new do |s|
|
|
36
38
|
s.summary = %q{Declare, assign and query roles with ease}
|
37
39
|
s.test_files = [
|
38
40
|
"spec/role_model_spec.rb",
|
41
|
+
"spec/roles_spec.rb",
|
39
42
|
"spec/spec_helper.rb"
|
40
43
|
]
|
41
44
|
|
data/spec/role_model_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe RoleModel do
|
|
9
9
|
attr_accessor :roles_mask
|
10
10
|
attr_accessor :custom_roles_mask
|
11
11
|
include RoleModel
|
12
|
-
roles :foo, :bar
|
12
|
+
roles :foo, :bar, :third
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -113,6 +113,67 @@ describe RoleModel do
|
|
113
113
|
subject.roles = :baz
|
114
114
|
subject.roles.should be_empty
|
115
115
|
end
|
116
|
+
|
117
|
+
context "with previouly assigned roles" do
|
118
|
+
before(:each) do
|
119
|
+
subject.roles = :foo
|
120
|
+
subject.roles.should include(:foo)
|
121
|
+
subject.should have(1).roles
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should set set assigned roles regardless overwriting previouly assigned roles" do
|
125
|
+
subject.roles = :bar
|
126
|
+
subject.roles.should include(:bar)
|
127
|
+
subject.should have(1).roles
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#<<" do
|
133
|
+
subject { model_class.new }
|
134
|
+
|
135
|
+
context "with roles :foo and :bar already assigned" do
|
136
|
+
before(:each) do
|
137
|
+
subject.roles = [:foo, :bar]
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should add a role given as a symbol" do
|
141
|
+
subject.roles << :third
|
142
|
+
subject.roles.should include(:foo, :bar, :third)
|
143
|
+
subject.should have(3).roles
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should add a role given as a string" do
|
147
|
+
subject.roles << 'third'
|
148
|
+
subject.roles.should include(:foo, :bar, :third)
|
149
|
+
subject.should have(3).roles
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "without any previouly assigned roles" do
|
154
|
+
it "should add a single symbol" do
|
155
|
+
subject.roles << :foo
|
156
|
+
subject.roles.should include(:foo)
|
157
|
+
subject.should have(1).roles
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should add a single string" do
|
161
|
+
subject.roles << 'foo'
|
162
|
+
subject.roles.should include(:foo)
|
163
|
+
subject.should have(1).roles
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should allow chaining of <<" do
|
167
|
+
subject.roles << :foo << :bar
|
168
|
+
subject.roles.should include(:foo, :bar)
|
169
|
+
subject.should have(2).roles
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should silently ignore undefined roles" do
|
174
|
+
subject.roles << :baz
|
175
|
+
subject.roles.should be_empty
|
176
|
+
end
|
116
177
|
end
|
117
178
|
|
118
179
|
describe "#has_role?" do
|
data/spec/roles_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RoleModel::Roles do
|
4
|
+
|
5
|
+
let(:model_instance) { Class.new.new }
|
6
|
+
let(:array) { [:foo, :bar] }
|
7
|
+
subject { RoleModel::Roles.new(model_instance, array) }
|
8
|
+
|
9
|
+
its(:model_instance) { should == model_instance }
|
10
|
+
it { should include(:foo, :bar) }
|
11
|
+
it { should be_kind_of(Array) }
|
12
|
+
|
13
|
+
describe "#<<" do
|
14
|
+
let(:roles_of_model_instance) { [:one, :two] }
|
15
|
+
|
16
|
+
it "should add the given element to the model_instance.roles by re-assigning all roles" do
|
17
|
+
model_instance.should_receive(:roles=).with([:foo, :bar, :baz])
|
18
|
+
subject << :baz
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Martin Rehfeld
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-29 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -48,8 +48,10 @@ files:
|
|
48
48
|
- Rakefile
|
49
49
|
- VERSION
|
50
50
|
- lib/role_model.rb
|
51
|
+
- lib/role_model/roles.rb
|
51
52
|
- role_model.gemspec
|
52
53
|
- spec/role_model_spec.rb
|
54
|
+
- spec/roles_spec.rb
|
53
55
|
- spec/spec.opts
|
54
56
|
- spec/spec_helper.rb
|
55
57
|
has_rdoc: true
|
@@ -84,4 +86,5 @@ specification_version: 3
|
|
84
86
|
summary: Declare, assign and query roles with ease
|
85
87
|
test_files:
|
86
88
|
- spec/role_model_spec.rb
|
89
|
+
- spec/roles_spec.rb
|
87
90
|
- spec/spec_helper.rb
|