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 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