rolify 1.2.0 → 2.0.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/.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
|