rolify 2.2.2 → 3.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.
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)