rolify 2.2.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.travis.yml +11 -7
  2. data/CHANGELOG.rdoc +6 -0
  3. data/README.rdoc +36 -4
  4. data/UPGRADE.rdoc +22 -0
  5. data/lib/generators/rolify/role/role_generator.rb +5 -6
  6. data/lib/generators/rolify/role/templates/README-active_record +21 -0
  7. data/lib/generators/rolify/role/templates/README-mongoid +17 -0
  8. data/lib/generators/rolify/role/templates/initializer.rb +5 -6
  9. data/lib/generators/rolify/role/templates/{role.rb → role-active_record.rb} +0 -0
  10. data/lib/generators/rolify/role/templates/role-mongoid.rb +8 -0
  11. data/lib/rolify/adapters/active_record.rb +83 -0
  12. data/lib/rolify/adapters/base.rb +53 -0
  13. data/lib/rolify/adapters/mongoid.rb +87 -0
  14. data/lib/rolify/configure.rb +40 -0
  15. data/lib/rolify/dynamic.rb +21 -0
  16. data/lib/rolify/railtie.rb +20 -0
  17. data/lib/rolify/resource.rb +25 -0
  18. data/lib/rolify/role.rb +32 -110
  19. data/lib/rolify/version.rb +1 -1
  20. data/lib/rolify.rb +35 -0
  21. data/rolify.gemspec +3 -2
  22. data/spec/generators/rolify/role/role_generator_spec.rb +75 -16
  23. data/spec/rolify/config_spec.rb +189 -0
  24. data/spec/rolify/custom_spec.rb +15 -0
  25. data/spec/rolify/resource_spec.rb +317 -0
  26. data/spec/rolify/role_spec.rb +8 -495
  27. data/spec/rolify/shared_contexts.rb +74 -0
  28. data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +110 -0
  29. data/spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb +71 -0
  30. data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +71 -0
  31. data/spec/rolify/shared_examples/shared_examples_for_has_no_role.rb +97 -0
  32. data/spec/rolify/shared_examples/shared_examples_for_has_role_getter.rb +135 -0
  33. data/spec/rolify/shared_examples/shared_examples_for_has_role_setter.rb +92 -0
  34. data/spec/rolify/shared_examples/shared_examples_for_roles.rb +80 -0
  35. data/spec/spec_helper.rb +10 -5
  36. data/spec/support/{models.rb → adapters/active_record.rb} +11 -8
  37. data/spec/support/adapters/mongoid.rb +56 -0
  38. data/spec/support/data.rb +14 -5
  39. metadata +76 -20
  40. data/benchmarks/performance.rb +0 -51
@@ -0,0 +1,80 @@
1
+ require "rolify/shared_contexts"
2
+ require "rolify/shared_examples/shared_examples_for_has_role_setter"
3
+ require "rolify/shared_examples/shared_examples_for_has_role_getter"
4
+ require "rolify/shared_examples/shared_examples_for_has_all_roles"
5
+ require "rolify/shared_examples/shared_examples_for_has_any_role"
6
+ require "rolify/shared_examples/shared_examples_for_has_no_role"
7
+
8
+
9
+ shared_examples_for Rolify::Role do
10
+ before(:all) do
11
+ reset_defaults
12
+ Rolify.dynamic_shortcuts = false
13
+ user_class.rolify :role_cname => role_class.to_s
14
+ role_class.destroy_all
15
+ Forum.resourcify :role_cname => role_class.to_s
16
+ Group.resourcify :role_cname => role_class.to_s
17
+ end
18
+
19
+ context "in a Instance level" do
20
+ before(:all) do
21
+ admin = user_class.first
22
+ admin.has_role "admin"
23
+ admin.has_role "moderator", Forum.first
24
+ admin
25
+ end
26
+
27
+ subject do
28
+ user_class.first
29
+ end
30
+
31
+ it { should respond_to(:has_role).with(1).arguments }
32
+ it { should respond_to(:has_role).with(2).arguments }
33
+
34
+ it { should respond_to(:grant).with(1).arguments }
35
+ it { should respond_to(:grant).with(2).arguments }
36
+
37
+ it { should respond_to(:has_role?).with(1).arguments }
38
+ it { should respond_to(:has_role?).with(2).arguments }
39
+
40
+ it { should respond_to(:has_all_roles?) }
41
+ it { should respond_to(:has_all_roles?) }
42
+
43
+ it { should respond_to(:has_any_role?) }
44
+ it { should respond_to(:has_any_role?) }
45
+
46
+ it { should respond_to(:has_no_role).with(1).arguments }
47
+ it { should respond_to(:has_no_role).with(2).arguments }
48
+
49
+ it { should respond_to(:revoke).with(1).arguments }
50
+ it { should respond_to(:revoke).with(2).arguments }
51
+
52
+ it { should_not respond_to(:is_admin?) }
53
+ it { should_not respond_to(:is_moderator_of?) }
54
+ end
55
+
56
+ describe "#has_role" do
57
+ it_should_behave_like "#has_role_examples", "String", :to_s
58
+ it_should_behave_like "#has_role_examples", "Symbol", :to_sym
59
+ end
60
+
61
+ describe "#has_role?" do
62
+ it_should_behave_like "#has_role?_examples", "String", :to_s
63
+ it_should_behave_like "#has_role?_examples", "Symbol", :to_sym
64
+ end
65
+
66
+ describe "#has_all_roles?" do
67
+ it_should_behave_like "#has_all_roles?_examples", "String", :to_s
68
+ it_should_behave_like "#has_all_roles?_examples", "Symbol", :to_sym
69
+ end
70
+
71
+ describe "#has_any_role?" do
72
+ it_should_behave_like "#has_any_role?_examples", "String", :to_s
73
+ it_should_behave_like "#has_any_role?_examples", "Symbol", :to_sym
74
+ end
75
+
76
+ describe "#has_no_role" do
77
+ it_should_behave_like "#has_no_role_examples", "String", :to_s
78
+ it_should_behave_like "#has_no_role_examples", "Symbol", :to_sym
79
+ end
80
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,12 +1,17 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
- Bundler.require(:default, :test)
4
+ require 'mongoid'
5
+ Bundler.require(:default, :development, :test)
5
6
  require 'rolify'
6
7
  require 'ammeter/init'
7
8
 
8
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
9
+ ENV['ADAPTER'] ||= 'active_record'
9
10
 
10
- load File.dirname(__FILE__) + '/support/schema.rb'
11
- load File.dirname(__FILE__) + '/support/models.rb'
12
- load File.dirname(__FILE__) + '/support/data.rb'
11
+ load File.dirname(__FILE__) + "/support/adapters/#{ENV['ADAPTER']}.rb"
12
+ load File.dirname(__FILE__) + '/support/data.rb'
13
+
14
+ def reset_defaults
15
+ Rolify.use_defaults
16
+ Rolify.use_mongoid if ENV['ADAPTER'] == "mongoid"
17
+ end
@@ -1,7 +1,11 @@
1
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
2
+ ActiveRecord::Base.extend Rolify
3
+
4
+ load File.dirname(__FILE__) + '/../schema.rb'
5
+
6
+ # ActiveRecord models
1
7
  class User < ActiveRecord::Base
2
- has_and_belongs_to_many :roles, :join_table => :users_roles
3
- include Rolify::Roles
4
- extend Rolify::Dynamic
8
+ rolify
5
9
  end
6
10
 
7
11
  class Role < ActiveRecord::Base
@@ -10,19 +14,18 @@ class Role < ActiveRecord::Base
10
14
  end
11
15
 
12
16
  class Forum < ActiveRecord::Base
17
+ #resourcify done during specs setup to be able to use custom user classes
13
18
  end
14
19
 
15
20
  class Group < ActiveRecord::Base
21
+ #resourcify done during specs setup to be able to use custom user classes
16
22
  end
17
23
 
18
24
  class Customer < ActiveRecord::Base
19
- has_and_belongs_to_many :roles, :join_table => :customers_privileges, :class_name => "Privilege"
20
- include Rolify::Roles
21
- extend Rolify::Dynamic
25
+ rolify :role_cname => "Privilege"
22
26
  end
23
27
 
24
28
  class Privilege < ActiveRecord::Base
25
29
  has_and_belongs_to_many :customers, :join_table => :customers_privileges
26
30
  belongs_to :resource, :polymorphic => true
27
- end
28
-
31
+ end
@@ -0,0 +1,56 @@
1
+ Mongoid.configure do |config|
2
+ config.master = Mongo::Connection.new.db("godfather")
3
+ end
4
+
5
+ ::Mongoid::Document.module_eval do
6
+ def self.included(base)
7
+ base.extend Rolify
8
+ end
9
+ end
10
+
11
+ Rolify.use_mongoid
12
+
13
+ # Mongoid models
14
+ class User
15
+ include Mongoid::Document
16
+ rolify
17
+
18
+ field :login, :type => String
19
+ end
20
+
21
+ class Role
22
+ include Mongoid::Document
23
+ has_and_belongs_to_many :users
24
+ belongs_to :resource, :polymorphic => true
25
+
26
+ field :name, :type => String
27
+ end
28
+
29
+ class Forum
30
+ include Mongoid::Document
31
+ #resourcify done during specs setup to be able to use custom user classes
32
+
33
+ field :name, :type => String
34
+ end
35
+
36
+ class Group
37
+ include Mongoid::Document
38
+ #resourcify done during specs setup to be able to use custom user classes
39
+
40
+ field :name, :type => String
41
+ end
42
+
43
+ class Customer
44
+ include Mongoid::Document
45
+ rolify :role_cname => "Privilege"
46
+
47
+ field :login, :type => String
48
+ end
49
+
50
+ class Privilege
51
+ include Mongoid::Document
52
+ has_and_belongs_to_many :customers
53
+ belongs_to :resource, :polymorphic => true
54
+
55
+ field :name, :type => String
56
+ end
data/spec/support/data.rb CHANGED
@@ -1,16 +1,25 @@
1
+ User.destroy_all
2
+ Role.destroy_all
3
+ Forum.destroy_all
4
+ Group.destroy_all
5
+ Privilege.destroy_all
6
+ Customer.destroy_all
7
+
1
8
  # Users
2
9
  User.create(:login => "admin")
3
10
  User.create(:login => "moderator")
4
11
  User.create(:login => "god")
5
12
  User.create(:login => "zombie")
6
- Customer.create(:login => "customer VIP")
7
- Customer.create(:login => "customer Doe")
8
- Customer.create(:login => "customer John")
9
- Customer.create(:login => "customer Edgar")
13
+
14
+ Customer.create(:login => "admin")
15
+ Customer.create(:login => "moderator")
16
+ Customer.create(:login => "god")
17
+ Customer.create(:login => "zombie")
10
18
 
11
19
  # Resources
12
20
  Forum.create(:name => "forum 1")
13
21
  Forum.create(:name => "forum 2")
14
22
  Forum.create(:name => "forum 3")
23
+
15
24
  Group.create(:name => "group 1")
16
- Group.create(:name => "group 2")
25
+ Group.create(:name => "group 2")
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: 2.2.2
4
+ version: 3.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,44 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-17 00:00:00.000000000 Z
12
+ date: 2012-04-02 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sqlite3
16
+ requirement: &70312381195700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70312381195700
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: activerecord
16
- requirement: &70168038496160 !ruby/object:Gem::Requirement
27
+ requirement: &70312381193740 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
30
  - - ! '>='
20
31
  - !ruby/object:Gem::Version
21
32
  version: 3.1.0
22
- type: :runtime
33
+ type: :development
23
34
  prerelease: false
24
- version_requirements: *70168038496160
35
+ version_requirements: *70312381193740
25
36
  - !ruby/object:Gem::Dependency
26
- name: sqlite3
27
- requirement: &70168038495500 !ruby/object:Gem::Requirement
37
+ name: mongoid
38
+ requirement: &70312381191900 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '2.3'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70312381191900
47
+ - !ruby/object:Gem::Dependency
48
+ name: bson_ext
49
+ requirement: &70312381191220 !ruby/object:Gem::Requirement
28
50
  none: false
29
51
  requirements:
30
52
  - - ! '>='
@@ -32,10 +54,10 @@ dependencies:
32
54
  version: '0'
33
55
  type: :development
34
56
  prerelease: false
35
- version_requirements: *70168038495500
57
+ version_requirements: *70312381191220
36
58
  - !ruby/object:Gem::Dependency
37
59
  name: ammeter
38
- requirement: &70168038495020 !ruby/object:Gem::Requirement
60
+ requirement: &70312381190320 !ruby/object:Gem::Requirement
39
61
  none: false
40
62
  requirements:
41
63
  - - ! '>='
@@ -43,10 +65,10 @@ dependencies:
43
65
  version: '0'
44
66
  type: :development
45
67
  prerelease: false
46
- version_requirements: *70168038495020
68
+ version_requirements: *70312381190320
47
69
  - !ruby/object:Gem::Dependency
48
70
  name: rake
49
- requirement: &70168038494560 !ruby/object:Gem::Requirement
71
+ requirement: &70312381189180 !ruby/object:Gem::Requirement
50
72
  none: false
51
73
  requirements:
52
74
  - - ! '>='
@@ -54,10 +76,10 @@ dependencies:
54
76
  version: '0'
55
77
  type: :development
56
78
  prerelease: false
57
- version_requirements: *70168038494560
79
+ version_requirements: *70312381189180
58
80
  - !ruby/object:Gem::Dependency
59
81
  name: rspec
60
- requirement: &70168038521480 !ruby/object:Gem::Requirement
82
+ requirement: &70312381188380 !ruby/object:Gem::Requirement
61
83
  none: false
62
84
  requirements:
63
85
  - - ! '>='
@@ -65,10 +87,10 @@ dependencies:
65
87
  version: '0'
66
88
  type: :development
67
89
  prerelease: false
68
- version_requirements: *70168038521480
90
+ version_requirements: *70312381188380
69
91
  - !ruby/object:Gem::Dependency
70
92
  name: bundler
71
- requirement: &70168038520640 !ruby/object:Gem::Requirement
93
+ requirement: &70312381187520 !ruby/object:Gem::Requirement
72
94
  none: false
73
95
  requirements:
74
96
  - - ! '>='
@@ -76,7 +98,7 @@ dependencies:
76
98
  version: '0'
77
99
  type: :development
78
100
  prerelease: false
79
- version_requirements: *70168038520640
101
+ version_requirements: *70312381187520
80
102
  description: ! 'Very simple Roles library without any authorization enforcement (built
81
103
  to use with cancan) supporting scope on resource: user.is_moderator?(Forum.first)
82
104
  => # return false if user is moderator of another Forum '
@@ -93,21 +115,43 @@ files:
93
115
  - LICENSE
94
116
  - README.rdoc
95
117
  - Rakefile
96
- - benchmarks/performance.rb
118
+ - UPGRADE.rdoc
97
119
  - lib/generators/rolify/role/role_generator.rb
98
120
  - lib/generators/rolify/role/templates/README
121
+ - lib/generators/rolify/role/templates/README-active_record
122
+ - lib/generators/rolify/role/templates/README-mongoid
99
123
  - lib/generators/rolify/role/templates/initializer.rb
100
124
  - lib/generators/rolify/role/templates/migration.rb
101
- - lib/generators/rolify/role/templates/role.rb
125
+ - lib/generators/rolify/role/templates/role-active_record.rb
126
+ - lib/generators/rolify/role/templates/role-mongoid.rb
102
127
  - lib/rolify.rb
128
+ - lib/rolify/adapters/active_record.rb
129
+ - lib/rolify/adapters/base.rb
130
+ - lib/rolify/adapters/mongoid.rb
131
+ - lib/rolify/configure.rb
132
+ - lib/rolify/dynamic.rb
133
+ - lib/rolify/railtie.rb
134
+ - lib/rolify/resource.rb
103
135
  - lib/rolify/role.rb
104
136
  - lib/rolify/version.rb
105
137
  - rolify.gemspec
106
138
  - spec/generators/rolify/role/role_generator_spec.rb
139
+ - spec/rolify/config_spec.rb
140
+ - spec/rolify/custom_spec.rb
141
+ - spec/rolify/resource_spec.rb
107
142
  - spec/rolify/role_spec.rb
143
+ - spec/rolify/shared_contexts.rb
144
+ - spec/rolify/shared_examples/shared_examples_for_dynamic.rb
145
+ - spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb
146
+ - spec/rolify/shared_examples/shared_examples_for_has_any_role.rb
147
+ - spec/rolify/shared_examples/shared_examples_for_has_no_role.rb
148
+ - spec/rolify/shared_examples/shared_examples_for_has_role_getter.rb
149
+ - spec/rolify/shared_examples/shared_examples_for_has_role_setter.rb
150
+ - spec/rolify/shared_examples/shared_examples_for_roles.rb
108
151
  - spec/spec_helper.rb
152
+ - spec/support/adapters/active_record.rb
153
+ - spec/support/adapters/mongoid.rb
109
154
  - spec/support/data.rb
110
- - spec/support/models.rb
111
155
  - spec/support/schema.rb
112
156
  homepage: https://github.com/EppO/rolify
113
157
  licenses: []
@@ -135,8 +179,20 @@ specification_version: 3
135
179
  summary: Roles library with resource scoping
136
180
  test_files:
137
181
  - spec/generators/rolify/role/role_generator_spec.rb
182
+ - spec/rolify/config_spec.rb
183
+ - spec/rolify/custom_spec.rb
184
+ - spec/rolify/resource_spec.rb
138
185
  - spec/rolify/role_spec.rb
186
+ - spec/rolify/shared_contexts.rb
187
+ - spec/rolify/shared_examples/shared_examples_for_dynamic.rb
188
+ - spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb
189
+ - spec/rolify/shared_examples/shared_examples_for_has_any_role.rb
190
+ - spec/rolify/shared_examples/shared_examples_for_has_no_role.rb
191
+ - spec/rolify/shared_examples/shared_examples_for_has_role_getter.rb
192
+ - spec/rolify/shared_examples/shared_examples_for_has_role_setter.rb
193
+ - spec/rolify/shared_examples/shared_examples_for_roles.rb
139
194
  - spec/spec_helper.rb
195
+ - spec/support/adapters/active_record.rb
196
+ - spec/support/adapters/mongoid.rb
140
197
  - spec/support/data.rb
141
- - spec/support/models.rb
142
198
  - spec/support/schema.rb
@@ -1,51 +0,0 @@
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)