rolify 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.travis.yml +3 -4
- data/CHANGELOG.rdoc +13 -0
- data/README.rdoc +2 -1
- data/benchmarks/performance.rb +51 -0
- data/lib/generators/rolify/role/role_generator.rb +2 -2
- data/lib/generators/rolify/role/templates/initializer.rb +8 -3
- data/lib/rolify/role.rb +24 -24
- data/lib/rolify/version.rb +1 -1
- data/rolify.gemspec +1 -1
- data/spec/generators/rolify/role/role_generator_spec.rb +12 -12
- data/spec/rolify/role_spec.rb +80 -39
- data/spec/spec_helper.rb +0 -1
- data/spec/support/models.rb +2 -2
- metadata +15 -14
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
= 2.0 (Nov 10, 2011)
|
2
|
+
* improved performance of <tt>has_all_roles?</tt> method using one single DB query instead of doing one DB lookup per argument
|
3
|
+
* significant speed-up when requesting with many arguments
|
4
|
+
* database choice can mitigate the results
|
5
|
+
* clean up the initializer code
|
6
|
+
* using a DSL to configure the library
|
7
|
+
* setting defaults for User and Role classes
|
8
|
+
* dynamic shortcuts feature is now <b>disabled</b> by default. To turn it on:
|
9
|
+
* set it to true in the initializer file
|
10
|
+
* uncomment the <tt>extend Rolify::Dynamic</tt> line in the User class
|
11
|
+
* detecting if it's loaded by Rails::Server or Rails::Console
|
12
|
+
* now also running on Rubinius, JRuby, REE and Ruby 1.8. all specs pass successfully, yeah !
|
13
|
+
|
1
14
|
= 1.2 (Nov 4, 2011)
|
2
15
|
* fixed a strange bug, probably rails related (thanks to @scottkf)
|
3
16
|
* when using rails in development mode, the <tt>config.cache_classes = false</tt> makes the role class to be loaded at every call and can lead to a <tt>AssociationTypeMismatch</tt>
|
data/README.rdoc
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
= rolify {<img src="https://secure.travis-ci.org/EppO/rolify.png?branch=master">}[http://travis-ci.org/EppO/rolify]
|
2
|
+
|
2
3
|
Very simple Roles library without any authorization enforcement supporting scope on resource object.
|
3
4
|
|
4
5
|
Let's see an example:
|
@@ -12,7 +13,7 @@ This library was intended to be used with CanCan[https://github.com/ryanb/cancan
|
|
12
13
|
|
13
14
|
* >= Rails 3.1
|
14
15
|
* ActiveRecord ORM
|
15
|
-
* ruby 1.9
|
16
|
+
* supports ruby 1.8/1.9, REE, JRuby and Rubinius
|
16
17
|
|
17
18
|
== Installation
|
18
19
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
Bundler.require(:default, :test)
|
4
|
+
require 'rolify'
|
5
|
+
require 'benchmark'
|
6
|
+
|
7
|
+
require './spec/spec_helper'
|
8
|
+
|
9
|
+
def seed_roles(n, resources)
|
10
|
+
resource = resources[rand(resources.count)]
|
11
|
+
resource_type = resource.is_a?(Class) ? resource.to_s : resource.class.to_s if resource
|
12
|
+
resource_id = resource.is_a?(Class) ? nil : resource.id if resource
|
13
|
+
n.times { Role.create(:name => "role_#{rand(9999999)}", :resource_type => resource_type, :resource_id => resource_id) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def bench_it(user, n, roles)
|
17
|
+
Benchmark.bmbm do |x|
|
18
|
+
requested_roles = []
|
19
|
+
2.times { requested_roles += roles }
|
20
|
+
puts "requesting ##{requested_roles.count} roles in #{Role.count} total roles"
|
21
|
+
x.report("v1.x") {
|
22
|
+
n.times { user.has_all_roles? *requested_roles }
|
23
|
+
}
|
24
|
+
x.report("v2.0") {
|
25
|
+
n.times { user.has_all_roles_v2? *requested_roles }
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
n = 1000
|
31
|
+
user = User.first
|
32
|
+
user.has_role "admin"
|
33
|
+
user.has_role "moderator", Forum.first
|
34
|
+
user.has_role "manager", Group
|
35
|
+
resources = [ nil, Forum, Forum.first, Forum.last, Group, Group.first, Group.last, nil ]
|
36
|
+
roles = [ "admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Group } ]
|
37
|
+
|
38
|
+
seed_roles(2, resources)
|
39
|
+
bench_it(user, n, roles)
|
40
|
+
|
41
|
+
seed_roles(15, resources)
|
42
|
+
bench_it(user, n, roles)
|
43
|
+
|
44
|
+
seed_roles(80, resources)
|
45
|
+
bench_it(user, n, roles)
|
46
|
+
|
47
|
+
seed_roles(900, resources)
|
48
|
+
bench_it(user, n, roles)
|
49
|
+
|
50
|
+
seed_roles(9000, resources)
|
51
|
+
bench_it(user, n, roles)
|
@@ -8,7 +8,7 @@ module Rolify
|
|
8
8
|
source_root File.expand_path('../templates', __FILE__)
|
9
9
|
argument :role_cname, :type => :string, :default => "Role"
|
10
10
|
argument :user_cname, :type => :string, :default => "User"
|
11
|
-
class_option :dynamic_shortcuts, :type => :boolean, :default =>
|
11
|
+
class_option :dynamic_shortcuts, :type => :boolean, :default => false
|
12
12
|
|
13
13
|
desc "Generates a model with the given NAME and a migration file."
|
14
14
|
|
@@ -16,7 +16,7 @@ module Rolify
|
|
16
16
|
template "role.rb", "app/models/#{role_cname.downcase}.rb"
|
17
17
|
inject_into_class(model_path, user_cname.camelize) do
|
18
18
|
" include Rolify::Roles\n" +
|
19
|
-
"#{
|
19
|
+
" #{'# ' if !options[:dynamic_shortcuts]}extend Rolify::Dynamic\n" +
|
20
20
|
" has_and_belongs_to_many :roles#{", :class_name => \"" + role_cname.camelize + "\"" if role_cname != "Role"}, :join_table => :#{user_cname.tableize + "_" + role_cname.tableize}\n"
|
21
21
|
end
|
22
22
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
-
Rolify.
|
2
|
-
|
3
|
-
|
1
|
+
Rolify.configure do |c|
|
2
|
+
# User class to put the roles association. Default is: "User"
|
3
|
+
<%= "# " if user_cname == "User" %>c.user_cname = "<%= user_cname %>"
|
4
|
+
# Role class provided by Rolify. Default is: "Role"
|
5
|
+
<%= "# " if role_cname == "Role" %>c.role_cname = "<%= role_cname %>"
|
6
|
+
# Dynamic shortcuts for Role class (user.is_admin? like methods). Default is: false
|
7
|
+
<%= "# " if !options[:dynamic_shortcuts] %>c.dynamic_shortcuts = <%= options[:dynamic_shortcuts] == true ? true : false %> if defined?(Rails::Server) == true || defined?(Rails::Console) == true
|
8
|
+
end
|
data/lib/rolify/role.rb
CHANGED
@@ -1,19 +1,26 @@
|
|
1
1
|
module Rolify
|
2
|
+
@@role_cname = "Role"
|
3
|
+
@@user_cname = "User"
|
4
|
+
@@dynamic_shortcuts = false
|
5
|
+
|
6
|
+
def self.configure
|
7
|
+
yield self if block_given?
|
8
|
+
end
|
2
9
|
|
3
10
|
def self.role_cname
|
4
|
-
@@role_cname
|
11
|
+
@@role_cname.constantize
|
5
12
|
end
|
6
13
|
|
7
14
|
def self.role_cname=(role_cname)
|
8
|
-
@@role_cname = role_cname
|
15
|
+
@@role_cname = role_cname.camelize
|
9
16
|
end
|
10
17
|
|
11
18
|
def self.user_cname
|
12
|
-
@@user_cname
|
19
|
+
@@user_cname.constantize
|
13
20
|
end
|
14
21
|
|
15
22
|
def self.user_cname=(user_cname)
|
16
|
-
@@user_cname = user_cname
|
23
|
+
@@user_cname = user_cname.camelize
|
17
24
|
end
|
18
25
|
|
19
26
|
def self.dynamic_shortcuts
|
@@ -22,7 +29,7 @@ module Rolify
|
|
22
29
|
|
23
30
|
def self.dynamic_shortcuts=(is_dynamic)
|
24
31
|
@@dynamic_shortcuts = is_dynamic
|
25
|
-
|
32
|
+
self.user_cname.load_dynamic_methods if is_dynamic
|
26
33
|
end
|
27
34
|
|
28
35
|
module Roles
|
@@ -39,20 +46,12 @@ module Rolify
|
|
39
46
|
|
40
47
|
def has_role?(role_name, resource = nil)
|
41
48
|
query, values = build_query(role_name, resource)
|
42
|
-
self.roles.where(
|
49
|
+
self.roles.where(query, *values).size > 0
|
43
50
|
end
|
44
51
|
|
45
52
|
def has_all_roles?(*args)
|
46
|
-
args
|
47
|
-
|
48
|
-
return false if !self.has_role?(arg[:name], arg[:resource])
|
49
|
-
elsif arg.is_a? String
|
50
|
-
return false if !self.has_role?(arg)
|
51
|
-
else
|
52
|
-
raise ArgumentError, "Invalid argument type: only hash or string allowed"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
true
|
53
|
+
conditions, values, count = sql_conditions(args, true)
|
54
|
+
self.roles.where([ conditions.join(' OR '), *values ]).where(count.join(') AND (')).size > 0
|
56
55
|
end
|
57
56
|
|
58
57
|
def has_any_role?(*args)
|
@@ -61,7 +60,7 @@ module Rolify
|
|
61
60
|
end
|
62
61
|
|
63
62
|
def has_no_role(role_name, resource = nil)
|
64
|
-
role = self.roles.where(
|
63
|
+
role = self.roles.where(:name => role_name)
|
65
64
|
role = role.where(:resource_type => (resource.is_a?(Class) ? resource.to_s : resource.class.name)) if resource
|
66
65
|
role = role.where(:resource_id => resource.id) if resource && !resource.is_a?(Class)
|
67
66
|
self.roles.delete(role) if role
|
@@ -84,8 +83,9 @@ module Rolify
|
|
84
83
|
|
85
84
|
private
|
86
85
|
|
87
|
-
def sql_conditions(args)
|
86
|
+
def sql_conditions(args, count = false)
|
88
87
|
conditions = []
|
88
|
+
count_conditions = [] if count
|
89
89
|
values = []
|
90
90
|
args.each do |arg|
|
91
91
|
if arg.is_a? Hash
|
@@ -96,13 +96,14 @@ module Rolify
|
|
96
96
|
raise ArgumentError, "Invalid argument type: only hash or string allowed"
|
97
97
|
end
|
98
98
|
conditions << a
|
99
|
+
count_conditions << self.roles.where(a, *v).select("COUNT(id)").to_sql + " > 0" if count
|
99
100
|
values += v
|
100
101
|
end
|
101
|
-
[ conditions, values ]
|
102
|
+
count ? [ conditions, values, count_conditions ] : [ conditions, values ]
|
102
103
|
end
|
103
104
|
|
104
105
|
def build_query(role, resource = nil)
|
105
|
-
return [ "name = ?", role] if resource == :any
|
106
|
+
return [ "name = ?", [ role ] ] if resource == :any
|
106
107
|
query = "((name = ?) AND (resource_type IS NULL) AND (resource_id IS NULL))"
|
107
108
|
values = [ role ]
|
108
109
|
if resource
|
@@ -115,12 +116,12 @@ module Rolify
|
|
115
116
|
end
|
116
117
|
query += ")"
|
117
118
|
end
|
118
|
-
[
|
119
|
+
[ query, values ]
|
119
120
|
end
|
120
121
|
|
121
122
|
end
|
122
123
|
|
123
|
-
module
|
124
|
+
module Dynamic
|
124
125
|
|
125
126
|
def load_dynamic_methods
|
126
127
|
Rolify.role_cname.all.each do |r|
|
@@ -128,12 +129,11 @@ module Rolify
|
|
128
129
|
end
|
129
130
|
end
|
130
131
|
|
131
|
-
|
132
132
|
def define_dynamic_method(role_name, resource)
|
133
133
|
class_eval do
|
134
134
|
define_method("is_#{role_name}?".to_sym) do
|
135
135
|
has_role?("#{role_name}")
|
136
|
-
end if !method_defined?
|
136
|
+
end if !method_defined?("is_#{role_name}?".to_sym)
|
137
137
|
|
138
138
|
define_method("is_#{role_name}_of?".to_sym) do |arg|
|
139
139
|
has_role?("#{role_name}", arg)
|
data/lib/rolify/version.rb
CHANGED
data/rolify.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_dependency "activerecord", ">= 3.1.0"
|
23
23
|
|
24
|
-
if RUBY_ENGINE == "jruby"
|
24
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
25
25
|
s.add_development_dependency "activerecord-jdbcsqlite3-adapter"
|
26
26
|
else
|
27
27
|
s.add_development_dependency "sqlite3"
|
@@ -25,15 +25,15 @@ describe Rolify::Generators::RoleGenerator do
|
|
25
25
|
describe 'config/initializers/rolify.rb' do
|
26
26
|
subject { file('config/initializers/rolify.rb') }
|
27
27
|
it { should exist }
|
28
|
-
it { should contain "
|
29
|
-
it { should contain "
|
30
|
-
it { should contain "
|
28
|
+
it { should contain "c.user_cname = \"User\"" }
|
29
|
+
it { should contain "c.role_cname = \"Role\"" }
|
30
|
+
it { should contain "c.dynamic_shortcuts = false" }
|
31
31
|
end
|
32
32
|
|
33
33
|
describe 'app/models/user.rb' do
|
34
34
|
subject { file('app/models/user.rb') }
|
35
35
|
it { should contain "include Rolify::Roles" }
|
36
|
-
it { should contain "extend Rolify::
|
36
|
+
it { should contain "# extend Rolify::Dynamic" }
|
37
37
|
it { should contain "has_and_belongs_to_many :roles, :join_table => :users_roles" }
|
38
38
|
end
|
39
39
|
|
@@ -60,15 +60,15 @@ describe Rolify::Generators::RoleGenerator do
|
|
60
60
|
describe 'config/initializers/rolify.rb' do
|
61
61
|
subject { file('config/initializers/rolify.rb') }
|
62
62
|
it { should exist }
|
63
|
-
it { should contain "
|
64
|
-
it { should contain "
|
65
|
-
it { should contain "
|
63
|
+
it { should contain "c.user_cname = \"Client\"" }
|
64
|
+
it { should contain "c.role_cname = \"Rank\"" }
|
65
|
+
it { should contain "c.dynamic_shortcuts = false" }
|
66
66
|
end
|
67
67
|
|
68
68
|
describe 'app/models/client.rb' do
|
69
69
|
subject { file('app/models/client.rb') }
|
70
70
|
it { should contain "include Rolify::Roles" }
|
71
|
-
it { should contain "extend Rolify::
|
71
|
+
it { should contain "# extend Rolify::Dynamic" }
|
72
72
|
it { should contain "has_and_belongs_to_many :roles, :class_name => \"Rank\", :join_table => :clients_ranks" }
|
73
73
|
end
|
74
74
|
|
@@ -81,8 +81,8 @@ describe Rolify::Generators::RoleGenerator do
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
describe 'specifying
|
85
|
-
before(:all) { arguments [ "Role", "User", "--
|
84
|
+
describe 'specifying dynamic shortcuts' do
|
85
|
+
before(:all) { arguments [ "Role", "User", "--dynamic_shortcuts" ] }
|
86
86
|
|
87
87
|
before {
|
88
88
|
capture(:stdout) {
|
@@ -96,13 +96,13 @@ describe Rolify::Generators::RoleGenerator do
|
|
96
96
|
describe 'config/initializers/rolify.rb' do
|
97
97
|
subject { file('config/initializers/rolify.rb') }
|
98
98
|
it { should exist }
|
99
|
-
it { should contain "
|
99
|
+
it { should contain "c.dynamic_shortcuts = true" }
|
100
100
|
end
|
101
101
|
|
102
102
|
describe 'app/models/user.rb' do
|
103
103
|
subject { file('app/models/user.rb') }
|
104
104
|
it { should contain "include Rolify::Roles" }
|
105
|
-
it {
|
105
|
+
it { should contain "extend Rolify::Dynamic" }
|
106
106
|
it { should contain "has_and_belongs_to_many :roles, :join_table => :users_roles" }
|
107
107
|
end
|
108
108
|
|
data/spec/rolify/role_spec.rb
CHANGED
@@ -50,9 +50,10 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should create a new dynamic method if role exists in database", :if => dynamic do
|
53
|
-
Rolify.
|
53
|
+
other_guy = Rolify.user_cname.last
|
54
|
+
other_guy.has_role "superman"
|
54
55
|
@admin.should respond_to(:is_superman?).with(0).arguments
|
55
|
-
|
56
|
+
other_guy.has_role("batman", Forum.first)
|
56
57
|
@admin.should respond_to(:is_batman_of?).with(1).arguments
|
57
58
|
@admin.should respond_to(:is_batman?).with(0).arguments
|
58
59
|
end
|
@@ -91,7 +92,6 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
91
92
|
|
92
93
|
it "should be able to use dynamic shortcut", :if => dynamic do
|
93
94
|
@admin.is_admin?.should be(true)
|
94
|
-
@admin.is_evil?.should be(false)
|
95
95
|
end
|
96
96
|
|
97
97
|
it "should get any resource request" do
|
@@ -124,6 +124,12 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
124
124
|
@admin.has_all_roles?("admin", "staff").should be(true)
|
125
125
|
@admin.has_all_roles?("admin", "dummy").should be(false)
|
126
126
|
@admin.has_all_roles?("dummy", "dumber").should be(false)
|
127
|
+
@admin.has_all_roles?({ :name => "admin", :resource => Forum }, { :name => "admin", :resource => Group }).should be(true)
|
128
|
+
@admin.has_all_roles?({ :name => "admin", :resource => :any }, { :name => "admin", :resource => Group }).should be(true)
|
129
|
+
@admin.has_all_roles?({ :name => "admin", :resource => Forum }, { :name => "staff", :resource => Group.last }).should be(true)
|
130
|
+
@admin.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "admin", :resource => Forum.last }).should be(true)
|
131
|
+
@admin.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "dummy", :resource => Forum.last }).should be(false)
|
132
|
+
@admin.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "dummy", :resource => :any }).should be(false)
|
127
133
|
end
|
128
134
|
|
129
135
|
it "should check if user has any of a global roles set" do
|
@@ -131,6 +137,12 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
131
137
|
@admin.has_any_role?("admin", "staff").should be(true)
|
132
138
|
@admin.has_any_role?("admin", "moderator").should be(true)
|
133
139
|
@admin.has_any_role?("dummy", "dumber").should be(false)
|
140
|
+
@admin.has_any_role?({ :name => "admin", :resource => Forum }, { :name => "admin", :resource => Group }).should be(true)
|
141
|
+
@admin.has_any_role?({ :name => "admin", :resource => :any }, { :name => "admin", :resource => Group }).should be(true)
|
142
|
+
@admin.has_any_role?({ :name => "admin", :resource => Forum }, { :name => "staff", :resource => Group.last }).should be(true)
|
143
|
+
@admin.has_any_role?({ :name => "admin", :resource => Forum.first }, { :name => "admin", :resource => Forum.last }).should be(true)
|
144
|
+
@admin.has_any_role?({ :name => "admin", :resource => Forum.first }, { :name => "dummy", :resource => Forum.last }).should be(true)
|
145
|
+
@admin.has_any_role?({ :name => "admin", :resource => Forum.first }, { :name => "dummy", :resource => :any }).should be(true)
|
134
146
|
end
|
135
147
|
|
136
148
|
it "should remove a global role of a user" do
|
@@ -166,6 +178,7 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
166
178
|
@moderator = Rolify.user_cname.find(2)
|
167
179
|
@moderator.has_role "moderator", Forum.first
|
168
180
|
@moderator.has_role "soldier"
|
181
|
+
ActiveRecord::Base.logger = nil
|
169
182
|
end
|
170
183
|
|
171
184
|
it "should set an instance scoped role" do
|
@@ -224,23 +237,28 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
224
237
|
end
|
225
238
|
|
226
239
|
it "should check if user has all of a scoped roles set" do
|
240
|
+
@moderator.has_role "visitor", Forum.last
|
227
241
|
@moderator.has_all_roles?({ :name => "visitor", :resource => Forum.last }).should be(true)
|
228
|
-
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.
|
229
|
-
{ :name => "visitor", :resource =>
|
230
|
-
@moderator.has_all_roles?({ :name => "moderator", :resource =>
|
231
|
-
{ :name => "
|
232
|
-
@moderator.has_all_roles?({ :name => "
|
233
|
-
{ :name => "
|
242
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => Forum.last }).should be(true)
|
243
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => :any }).should be(true)
|
244
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => :any }).should be(true)
|
245
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => Forum }).should be(false)
|
246
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first }, { :name => "visitor", :resource => Forum.last }).should be(true)
|
247
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first }, { :name => "moderator", :resource => Forum.last }).should be(false)
|
248
|
+
@moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first }, { :name => "dummy", :resource => Forum.last }).should be(false)
|
249
|
+
@moderator.has_all_roles?({ :name => "dummy", :resource => Forum.first }, { :name => "dumber", :resource => Forum.last }).should be(false)
|
234
250
|
end
|
235
251
|
|
236
252
|
it "should check if user has any of a scoped roles set" do
|
237
|
-
@moderator.
|
238
|
-
@moderator.has_any_role?(
|
239
|
-
{ :name => "visitor", :resource => Forum.last }).should be(true)
|
240
|
-
@moderator.has_any_role?(
|
241
|
-
{ :name => "
|
242
|
-
@moderator.has_any_role?(
|
243
|
-
{ :name => "
|
253
|
+
@moderator.has_role "visitor", Forum.last
|
254
|
+
@moderator.has_any_role?({ :name => "visitor", :resource => Forum.last }).should be(true)
|
255
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => Forum.first }, { :name => "visitor", :resource => Forum.last }).should be(true)
|
256
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => Forum.last }).should be(true)
|
257
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => :any }, { :name => "visitor", :resource => :any}).should be(true)
|
258
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => Forum }, { :name => "visitor", :resource => :any }).should be(true)
|
259
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => Forum.first }, { :name => "moderator", :resource => Forum.last }).should be(true)
|
260
|
+
@moderator.has_any_role?({ :name => "moderator", :resource => Forum.first }, { :name => "dummy", :resource => Forum.last }).should be(true)
|
261
|
+
@moderator.has_any_role?({ :name => "dummy", :resource => Forum.first }, { :name => "dumber", :resource => Forum.last }).should be(false)
|
244
262
|
end
|
245
263
|
|
246
264
|
it "should not remove a global role of a user" do
|
@@ -321,23 +339,32 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
321
339
|
end
|
322
340
|
|
323
341
|
it "should check if user has all of a scoped roles set" do
|
342
|
+
@manager.has_role "player", Forum
|
324
343
|
@manager.has_all_roles?({ :name => "player", :resource => Forum }).should be(true)
|
325
|
-
@manager.has_all_roles?({ :name => "manager", :resource => Forum },
|
326
|
-
{ :name => "player", :resource => Forum }).should be(true)
|
327
|
-
@manager.has_all_roles?({ :name => "manager", :resource =>
|
328
|
-
{ :name => "dummy", :resource => Forum }).should be(false)
|
329
|
-
@manager.has_all_roles?({ :name => "
|
330
|
-
{ :name => "dumber", :resource => Group }).should be(false)
|
344
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum }, { :name => "player", :resource => Forum }).should be(true)
|
345
|
+
@manager.has_all_roles?({ :name => "manager", :resource => :any }, { :name => "player", :resource => Forum }).should be(true)
|
346
|
+
@manager.has_all_roles?({ :name => "manager", :resource => :any }, { :name => "player", :resource => :any }).should be(true)
|
347
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum }, { :name => "dummy", :resource => Forum }).should be(false)
|
348
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum }, { :name => "dummy", :resource => :any }).should be(false)
|
349
|
+
@manager.has_all_roles?({ :name => "dummy", :resource => Forum }, { :name => "dumber", :resource => Group }).should be(false)
|
350
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum.first }, { :name => "manager", :resource => Forum.last }).should be(true)
|
351
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Group }, { :name => "moderator", :resource => Forum.first }).should be(false)
|
352
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum.first }, { :name => "moderator", :resource => Forum }).should be(false)
|
353
|
+
@manager.has_all_roles?({ :name => "manager", :resource => Forum.last }, { :name => "warrior", :resource => Forum.last }).should be(true)
|
331
354
|
end
|
332
355
|
|
333
356
|
it "should check if user has any of a scoped roles set" do
|
334
|
-
@manager.has_any_role?(
|
335
|
-
@manager.has_any_role?(
|
336
|
-
{ :name => "
|
337
|
-
@manager.has_any_role?(
|
338
|
-
{ :name => "dummy", :resource => Forum }).should be(true)
|
339
|
-
@manager.has_any_role?(
|
340
|
-
{ :name => "dumber", :resource => Group }).should be(false)
|
357
|
+
@manager.has_any_role?({ :name => "player", :resource => Forum }).should be(true)
|
358
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum }, { :name => "player", :resource => Forum }).should be(true)
|
359
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum }, { :name => "player", :resource => :any }).should be(true)
|
360
|
+
@manager.has_any_role?({ :name => "manager", :resource => :any }, { :name => "player", :resource => :any }).should be(true)
|
361
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum }, { :name => "dummy", :resource => Forum }).should be(true)
|
362
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum }, { :name => "dummy", :resource => :any }).should be(true)
|
363
|
+
@manager.has_any_role?({ :name => "dummy", :resource => Forum }, { :name => "dumber", :resource => Group }).should be(false)
|
364
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum.first }, { :name => "manager", :resource => Forum.last }).should be(true)
|
365
|
+
@manager.has_any_role?({ :name => "manager", :resource => Group }, { :name => "moderator", :resource => Forum.first }).should be(true)
|
366
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum.first }, { :name => "moderator", :resource => Forum }).should be(true)
|
367
|
+
@manager.has_any_role?({ :name => "manager", :resource => Forum.last }, { :name => "warrior", :resource => Forum.last }).should be(true)
|
341
368
|
end
|
342
369
|
|
343
370
|
it "should not remove a global role of a user" do
|
@@ -374,6 +401,9 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
374
401
|
@user.has_role "visitor", Forum.last
|
375
402
|
@user.has_role "manager", Forum
|
376
403
|
@user.has_role "leader", Group
|
404
|
+
Rolify.role_cname.create :name => "manager", :resource => Forum.find(1)
|
405
|
+
Rolify.role_cname.create :name => "manager", :resource => Forum.find(2)
|
406
|
+
Rolify.role_cname.create :name => "manager", :resource => Forum.find(3)
|
377
407
|
end
|
378
408
|
|
379
409
|
it "should get a global role" do
|
@@ -394,16 +424,26 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
394
424
|
it "should check if user has all of a mix of global and scoped roles set" do
|
395
425
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum }).should be(true)
|
396
426
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Forum }).should be(false)
|
427
|
+
@user.has_all_roles?("admin", { :name => "moderator", :resource => :any }, { :name => "manager", :resource => Forum }).should be(true)
|
428
|
+
@user.has_all_roles?("admin", { :name => "moderator", :resource => :any }, { :name => "manager", :resource => :any }).should be(true)
|
397
429
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Group }).should be(false)
|
398
430
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Group.first }).should be(false)
|
399
431
|
@user.has_all_roles?({ :name => "admin", :resource => Forum }, { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum }).should be(true)
|
400
432
|
@user.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum }).should be(true)
|
401
433
|
@user.has_all_roles?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum.first }).should be(true)
|
402
434
|
@user.has_all_roles?("dummy", { :name => "dumber", :resource => Forum.last }, { :name => "dumberer", :resource => Forum }).should be(false)
|
435
|
+
@user.has_all_roles?("admin", "dummy", { :name => "dumber", :resource => Forum.last }, { :name => "dumberer", :resource => Forum }).should be(false)
|
436
|
+
@user.has_all_roles?({ :name => "manager", :resource => Forum.last }, "dummy", { :name => "dumber", :resource => Forum.last }, { :name => "dumberer", :resource => Forum }).should be(false)
|
437
|
+
@user.has_all_roles?("admin", { :name => "dumber", :resource => Forum.last }, { :name => "manager", :resource => Forum.last }).should be(false)
|
438
|
+
@user.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum.last }).should be(true)
|
439
|
+
@user.has_all_roles?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => :any }, { :name => "manager", :resource => Forum.last }).should be(true)
|
403
440
|
end
|
404
441
|
|
405
442
|
it "should check if user has any of a mix of global and scoped roles set" do
|
406
443
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => Forum }).should be(true)
|
444
|
+
@user.has_any_role?("admin", { :name => "moderator", :resource => :any }, { :name => "manager", :resource => Forum }).should be(true)
|
445
|
+
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.first }, { :name => "manager", :resource => :any }).should be(true)
|
446
|
+
@user.has_any_role?("admin", { :name => "moderator", :resource => :any }, { :name => "manager", :resource => :any }).should be(true)
|
407
447
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Forum }).should be(true)
|
408
448
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Group }).should be(true)
|
409
449
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Group.first }).should be(true)
|
@@ -411,6 +451,7 @@ shared_examples_for "Rolify module" do |dynamic|
|
|
411
451
|
@user.has_any_role?({ :name => "admin", :resource => Forum.first }, { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Forum }).should be(true)
|
412
452
|
@user.has_any_role?("admin", { :name => "moderator", :resource => Forum.last }, { :name => "manager", :resource => Forum.first }).should be(true)
|
413
453
|
@user.has_any_role?("dummy", { :name => "dumber", :resource => Forum.last }, { :name => "dumberer", :resource => Forum }).should be(false)
|
454
|
+
@user.has_any_role?({ :name => "manager", :resource => Forum.last }, "dummy", { :name => "dumber", :resource => Forum.last }, { :name => "dumberer", :resource => Forum }).should be(true)
|
414
455
|
end
|
415
456
|
end
|
416
457
|
|
@@ -419,32 +460,32 @@ end
|
|
419
460
|
describe Rolify do
|
420
461
|
context "using default Role and User class names with dynamic shortcuts", true do
|
421
462
|
it_behaves_like "Rolify module" do
|
422
|
-
let(:user_cname) { User }
|
423
|
-
let(:role_cname) { Role }
|
463
|
+
let(:user_cname) { "User" }
|
464
|
+
let(:role_cname) { "Role" }
|
424
465
|
let(:dynamic_shortcuts) { true }
|
425
466
|
end
|
426
467
|
end
|
427
468
|
|
428
469
|
context "using default Role and User class names without dynamic shortcuts", false do
|
429
470
|
it_behaves_like "Rolify module" do
|
430
|
-
let(:user_cname) { User }
|
431
|
-
let(:role_cname) { Role }
|
471
|
+
let(:user_cname) { "User" }
|
472
|
+
let(:role_cname) { "Role" }
|
432
473
|
let(:dynamic_shortcuts) { false }
|
433
474
|
end
|
434
475
|
end
|
435
|
-
|
476
|
+
|
436
477
|
context "using custom User and Role class names with dynamic shortcuts", true do
|
437
478
|
it_behaves_like "Rolify module" do
|
438
|
-
let(:user_cname) { Customer }
|
439
|
-
let(:role_cname) { Privilege }
|
479
|
+
let(:user_cname) { "Customer" }
|
480
|
+
let(:role_cname) { "Privilege" }
|
440
481
|
let(:dynamic_shortcuts) { true }
|
441
482
|
end
|
442
483
|
end
|
443
|
-
|
484
|
+
|
444
485
|
context "using custom User and Role class names without dynamic shortcuts", false do
|
445
486
|
it_behaves_like "Rolify module" do
|
446
|
-
let(:user_cname) { Customer }
|
447
|
-
let(:role_cname) { Privilege }
|
487
|
+
let(:user_cname) { "Customer" }
|
488
|
+
let(:role_cname) { "Privilege" }
|
448
489
|
let(:dynamic_shortcuts) { false }
|
449
490
|
end
|
450
491
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,7 +6,6 @@ require 'rolify'
|
|
6
6
|
require 'ammeter/init'
|
7
7
|
|
8
8
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
9
|
-
ActiveRecord::Base.logger = Logger.new(File.open('logs/database.log', 'a'))
|
10
9
|
|
11
10
|
load File.dirname(__FILE__) + '/support/schema.rb'
|
12
11
|
load File.dirname(__FILE__) + '/support/models.rb'
|
data/spec/support/models.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class User < ActiveRecord::Base
|
2
2
|
has_and_belongs_to_many :roles, :join_table => :users_roles
|
3
3
|
include Rolify::Roles
|
4
|
-
extend Rolify::
|
4
|
+
extend Rolify::Dynamic
|
5
5
|
end
|
6
6
|
|
7
7
|
class Role < ActiveRecord::Base
|
@@ -18,7 +18,7 @@ end
|
|
18
18
|
class Customer < ActiveRecord::Base
|
19
19
|
has_and_belongs_to_many :roles, :join_table => :customers_privileges, :class_name => "Privilege"
|
20
20
|
include Rolify::Roles
|
21
|
-
extend Rolify::
|
21
|
+
extend Rolify::Dynamic
|
22
22
|
end
|
23
23
|
|
24
24
|
class Privilege < ActiveRecord::Base
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rolify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-10 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70300130621700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70300130621700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: sqlite3
|
27
|
-
requirement: &
|
27
|
+
requirement: &70300130621240 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70300130621240
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ammeter
|
38
|
-
requirement: &
|
38
|
+
requirement: &70300130620780 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70300130620780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70300130620360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70300130620360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rspec
|
60
|
-
requirement: &
|
60
|
+
requirement: &70300130619940 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70300130619940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
|
-
requirement: &
|
71
|
+
requirement: &70300130619520 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70300130619520
|
80
80
|
description: ! 'Very simple Roles library without any authorization enforcement (built
|
81
81
|
to use with cancan) supporting scope on resource: user.is_moderator?(Forum.first)
|
82
82
|
=> # return false if user is moderator of another Forum '
|
@@ -93,6 +93,7 @@ files:
|
|
93
93
|
- LICENSE
|
94
94
|
- README.rdoc
|
95
95
|
- Rakefile
|
96
|
+
- benchmarks/performance.rb
|
96
97
|
- lib/generators/rolify/role/role_generator.rb
|
97
98
|
- lib/generators/rolify/role/templates/initializer.rb
|
98
99
|
- lib/generators/rolify/role/templates/migration.rb
|