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 CHANGED
@@ -2,3 +2,6 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ tmp/*
6
+ logs/*
7
+ .rbx/*
data/.travis.yml CHANGED
@@ -1,9 +1,8 @@
1
1
  rvm:
2
+ - 1.8.7
2
3
  - 1.9.2
3
4
  - 1.9.3
4
5
  - ruby-head
5
- - rbx-19mode
6
+ - rbx
6
7
  - jruby
7
-
8
- env:
9
- - JRUBY_OPTS="--1.9"
8
+ - ree
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 (JRuby and Rubinius support on going)
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 => true
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
- "#{" extend Rolify::Reloaded\n" if options[:dynamic_shortcuts]}" +
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.user_cname = <%= user_cname.camelize %>
2
- Rolify.role_cname = <%= role_cname.camelize %>
3
- Rolify.dynamic_shortcuts = <%= options[:dynamic_shortcuts].to_s %> if ARGV[0] != "db:migrate"
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
- Rolify.user_cname.load_dynamic_methods if is_dynamic
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(*query, *values).size > 0
49
+ self.roles.where(query, *values).size > 0
43
50
  end
44
51
 
45
52
  def has_all_roles?(*args)
46
- args.each do |arg|
47
- if arg.is_a? Hash
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( :name => role_name)
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
- [ [ query ], values]
119
+ [ query, values ]
119
120
  end
120
121
 
121
122
  end
122
123
 
123
- module Reloaded
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? "is_#{role_name}?".to_sym
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)
@@ -1,3 +1,3 @@
1
1
  module Rolify
2
- VERSION = "1.2.0"
2
+ VERSION = "2.0.0"
3
3
  end
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 "Rolify.user_cname = User" }
29
- it { should contain "Rolify.role_cname = Role" }
30
- it { should contain "Rolify.dynamic_shortcuts = true" }
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::Reloaded" }
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 "Rolify.user_cname = Client" }
64
- it { should contain "Rolify.role_cname = Rank" }
65
- it { should contain "Rolify.dynamic_shortcuts = true" }
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::Reloaded" }
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 no dynamic shortcuts' do
85
- before(:all) { arguments [ "Role", "User", "--no-dynamic_shortcuts" ] }
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 "Rolify.dynamic_shortcuts = false" }
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 { should_not contain "extend Rolify::Reloaded" }
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
 
@@ -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.role_cname.create(:name => "superman")
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
- Rolify.role_cname.create(:name => "batman", :resource => Forum.first)
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.first },
229
- { :name => "visitor", :resource => Forum.last }).should be(true)
230
- @moderator.has_all_roles?({ :name => "moderator", :resource => Forum.first },
231
- { :name => "dummy", :resource => Forum.last }).should be(false)
232
- @moderator.has_all_roles?({ :name => "dummy", :resource => Forum.first },
233
- { :name => "dumber", :resource => Forum.last }).should be(false)
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.has_any_role?( { :name => "visitor", :resource => Forum.last }).should be(true)
238
- @moderator.has_any_role?( { :name => "moderator", :resource => Forum.first },
239
- { :name => "visitor", :resource => Forum.last }).should be(true)
240
- @moderator.has_any_role?( { :name => "moderator", :resource => Forum.first },
241
- { :name => "dummy", :resource => Forum.last }).should be(true)
242
- @moderator.has_any_role?( { :name => "dummy", :resource => Forum.first },
243
- { :name => "dumber", :resource => Forum.last }).should be(false)
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 => Forum },
328
- { :name => "dummy", :resource => Forum }).should be(false)
329
- @manager.has_all_roles?({ :name => "dummy", :resource => Forum },
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?( { :name => "player", :resource => Forum }).should be(true)
335
- @manager.has_any_role?( { :name => "manager", :resource => Forum },
336
- { :name => "player", :resource => Forum }).should be(true)
337
- @manager.has_any_role?( { :name => "manager", :resource => Forum },
338
- { :name => "dummy", :resource => Forum }).should be(true)
339
- @manager.has_any_role?( { :name => "dummy", :resource => Forum },
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'
@@ -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::Reloaded
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::Reloaded
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: 1.2.0
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-05 00:00:00.000000000 Z
12
+ date: 2011-11-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &70283269093580 !ruby/object:Gem::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: *70283269093580
24
+ version_requirements: *70300130621700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &70283269093060 !ruby/object:Gem::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: *70283269093060
35
+ version_requirements: *70300130621240
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ammeter
38
- requirement: &70283269092560 !ruby/object:Gem::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: *70283269092560
46
+ version_requirements: *70300130620780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &70283269092080 !ruby/object:Gem::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: *70283269092080
57
+ version_requirements: *70300130620360
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70283269091560 !ruby/object:Gem::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: *70283269091560
68
+ version_requirements: *70300130619940
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &70283269091120 !ruby/object:Gem::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: *70283269091120
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