rolify 3.1.0 → 3.2.0.rc2

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 (36) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +2 -4
  3. data/CHANGELOG.rdoc +17 -0
  4. data/README.md +42 -6
  5. data/lib/generators/rolify/role/role_generator.rb +11 -3
  6. data/lib/generators/rolify/role/templates/initializer.rb +2 -1
  7. data/lib/generators/rolify/role/templates/role-active_record.rb +2 -0
  8. data/lib/generators/rolify/role/templates/role-mongoid.rb +11 -9
  9. data/lib/rolify.rb +13 -5
  10. data/lib/rolify/adapters/active_record/resource_adapter.rb +11 -4
  11. data/lib/rolify/adapters/active_record/role_adapter.rb +11 -4
  12. data/lib/rolify/adapters/active_record/scopes.rb +27 -0
  13. data/lib/rolify/adapters/base.rb +5 -0
  14. data/lib/rolify/adapters/mongoid/resource_adapter.rb +9 -5
  15. data/lib/rolify/adapters/mongoid/role_adapter.rb +14 -2
  16. data/lib/rolify/adapters/mongoid/scopes.rb +27 -0
  17. data/lib/rolify/finders.rb +39 -0
  18. data/lib/rolify/railtie.rb +1 -1
  19. data/lib/rolify/resource.rb +2 -1
  20. data/lib/rolify/role.rb +12 -2
  21. data/lib/rolify/version.rb +1 -1
  22. data/rolify.gemspec +4 -4
  23. data/spec/generators/rolify/role/role_generator_spec.rb +17 -61
  24. data/spec/rolify/custom_spec.rb +12 -0
  25. data/spec/rolify/resource_spec.rb +31 -0
  26. data/spec/rolify/role_spec.rb +12 -0
  27. data/spec/rolify/shared_contexts.rb +12 -0
  28. data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +57 -0
  29. data/spec/rolify/shared_examples/shared_examples_for_finders.rb +77 -0
  30. data/spec/rolify/shared_examples/shared_examples_for_roles.rb +39 -27
  31. data/spec/rolify/shared_examples/shared_examples_for_scopes.rb +38 -0
  32. data/spec/spec_helper.rb +13 -0
  33. data/spec/support/adapters/active_record.rb +4 -0
  34. data/spec/support/adapters/mongoid.rb +23 -3
  35. data/spec/support/adapters/mongoid.yml +6 -0
  36. metadata +82 -30
@@ -4,7 +4,7 @@ require "rolify/shared_examples/shared_examples_for_has_role"
4
4
  require "rolify/shared_examples/shared_examples_for_has_all_roles"
5
5
  require "rolify/shared_examples/shared_examples_for_has_any_role"
6
6
  require "rolify/shared_examples/shared_examples_for_remove_role"
7
-
7
+ require "rolify/shared_examples/shared_examples_for_finders"
8
8
 
9
9
  shared_examples_for Rolify::Role do
10
10
  before(:all) do
@@ -16,17 +16,14 @@ shared_examples_for Rolify::Role do
16
16
  Group.resourcify :role_cname => role_class.to_s
17
17
  end
18
18
 
19
- context "in a Instance level" do
19
+ context "in the Instance level " do
20
20
  before(:all) do
21
21
  admin = user_class.first
22
22
  admin.add_role :admin
23
23
  admin.add_role :moderator, Forum.first
24
- admin
25
24
  end
26
25
 
27
- subject do
28
- user_class.first
29
- end
26
+ subject { user_class.first }
30
27
 
31
28
  [ :has_role, :grant, :add_role ].each do |method_alias|
32
29
  it { should respond_to(method_alias.to_sym).with(1).arguments }
@@ -49,30 +46,45 @@ shared_examples_for Rolify::Role do
49
46
 
50
47
  it { should_not respond_to(:is_admin?) }
51
48
  it { should_not respond_to(:is_moderator_of?) }
52
- end
49
+
50
+ describe "#has_role" do
51
+ it_should_behave_like "#add_role_examples", "String", :to_s
52
+ it_should_behave_like "#add_role_examples", "Symbol", :to_sym
53
+ end
53
54
 
54
- describe "#has_role" do
55
- it_should_behave_like "#add_role_examples", "String", :to_s
56
- it_should_behave_like "#add_role_examples", "Symbol", :to_sym
57
- end
55
+ describe "#has_role?" do
56
+ it_should_behave_like "#has_role?_examples", "String", :to_s
57
+ it_should_behave_like "#has_role?_examples", "Symbol", :to_sym
58
+ end
58
59
 
59
- describe "#has_role?" do
60
- it_should_behave_like "#has_role?_examples", "String", :to_s
61
- it_should_behave_like "#has_role?_examples", "Symbol", :to_sym
62
- end
60
+ describe "#has_all_roles?" do
61
+ it_should_behave_like "#has_all_roles?_examples", "String", :to_s
62
+ it_should_behave_like "#has_all_roles?_examples", "Symbol", :to_sym
63
+ end
63
64
 
64
- describe "#has_all_roles?" do
65
- it_should_behave_like "#has_all_roles?_examples", "String", :to_s
66
- it_should_behave_like "#has_all_roles?_examples", "Symbol", :to_sym
67
- end
68
-
69
- describe "#has_any_role?" do
70
- it_should_behave_like "#has_any_role?_examples", "String", :to_s
71
- it_should_behave_like "#has_any_role?_examples", "Symbol", :to_sym
65
+ describe "#has_any_role?" do
66
+ it_should_behave_like "#has_any_role?_examples", "String", :to_s
67
+ it_should_behave_like "#has_any_role?_examples", "Symbol", :to_sym
68
+ end
69
+
70
+ describe "#has_no_role" do
71
+ it_should_behave_like "#remove_role_examples", "String", :to_s
72
+ it_should_behave_like "#remove_role_examples", "Symbol", :to_sym
73
+ end
72
74
  end
73
-
74
- describe "#has_no_role" do
75
- it_should_behave_like "#remove_role_examples", "String", :to_s
76
- it_should_behave_like "#remove_role_examples", "Symbol", :to_sym
75
+ context "with new instance" do
76
+ let(:user) { user_class.new }
77
+ before do
78
+ user.add_role :admin
79
+ user.add_role :moderator, Forum.first
80
+ end
81
+ subject { user }
82
+ it { should have_role :admin }
83
+ it { should have_role :moderator, Forum.first }
84
+
85
+ end
86
+ context "on the Class level ", :scope => :mixed do
87
+ it_should_behave_like :finders, "String", :to_s
88
+ it_should_behave_like :finders, "Symbol", :to_sym
77
89
  end
78
90
  end
@@ -0,0 +1,38 @@
1
+ require "rolify/shared_contexts"
2
+
3
+ shared_examples_for "Role.scopes" do |param_name, param_method|
4
+ before(:all) do
5
+ role_class.destroy_all
6
+ end
7
+
8
+ subject { user_class.first }
9
+
10
+ describe ".global" do
11
+ let!(:admin_role) { subject.add_role :admin }
12
+ let!(:staff_role) { subject.add_role :staff }
13
+
14
+ it { subject.roles.global.should == [ admin_role, staff_role ] }
15
+ end
16
+
17
+ describe ".class_scoped" do
18
+ let!(:manager_role) { subject.add_role :manager, Group }
19
+ let!(:moderator_role) { subject.add_role :moderator, Forum }
20
+
21
+ it { subject.roles.class_scoped.should == [ manager_role, moderator_role ] }
22
+ it { subject.roles.class_scoped(Group).should == [ manager_role ] }
23
+ it { subject.roles.class_scoped(Forum).should == [ moderator_role ] }
24
+ end
25
+
26
+ describe ".instance_scoped" do
27
+ let!(:visitor_role) { subject.add_role :visitor, Forum.first }
28
+ let!(:zombie_role) { subject.add_role :visitor, Forum.last }
29
+ let!(:anonymous_role) { subject.add_role :anonymous, Group.last }
30
+
31
+ it { subject.roles.instance_scoped.should == [ visitor_role, zombie_role, anonymous_role ] }
32
+ it { subject.roles.instance_scoped(Forum).should == [ visitor_role, zombie_role ] }
33
+ it { subject.roles.instance_scoped(Forum.first).should == [ visitor_role ] }
34
+ it { subject.roles.instance_scoped(Forum.last).should == [ zombie_role ] }
35
+ it { subject.roles.instance_scoped(Group.last).should == [ anonymous_role ] }
36
+ it { subject.roles.instance_scoped(Group.first).should be_empty }
37
+ end
38
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'rubygems'
2
+ require "bundler/setup"
3
+
2
4
  require 'rolify'
3
5
  require 'ammeter/init'
4
6
 
@@ -10,4 +12,15 @@ load File.dirname(__FILE__) + '/support/data.rb'
10
12
  def reset_defaults
11
13
  Rolify.use_defaults
12
14
  Rolify.use_mongoid if ENV['ADAPTER'] == "mongoid"
15
+ end
16
+
17
+ def provision_user(user, roles)
18
+ roles.each do |role|
19
+ if role.is_a? Array
20
+ user.add_role *role
21
+ else
22
+ user.add_role role
23
+ end
24
+ end
25
+ user
13
26
  end
@@ -13,6 +13,8 @@ end
13
13
  class Role < ActiveRecord::Base
14
14
  has_and_belongs_to_many :users, :join_table => :users_roles
15
15
  belongs_to :resource, :polymorphic => true
16
+
17
+ extend Rolify::Adapter::Scopes
16
18
  end
17
19
 
18
20
  class Forum < ActiveRecord::Base
@@ -30,4 +32,6 @@ end
30
32
  class Privilege < ActiveRecord::Base
31
33
  has_and_belongs_to_many :customers, :join_table => :customers_privileges
32
34
  belongs_to :resource, :polymorphic => true
35
+
36
+ extend Rolify::Adapter::Scopes
33
37
  end
@@ -1,8 +1,6 @@
1
1
  require 'mongoid'
2
2
 
3
- Mongoid.configure do |config|
4
- config.master = Mongo::Connection.new.db("godfather")
5
- end
3
+ Mongoid.load!("spec/support/adapters/mongoid.yml", :test)
6
4
 
7
5
  ::Mongoid::Document.module_eval do
8
6
  def self.included(base)
@@ -26,6 +24,17 @@ class Role
26
24
  belongs_to :resource, :polymorphic => true
27
25
 
28
26
  field :name, :type => String
27
+ index({ :name => 1 }, { :unique => true })
28
+ index(
29
+ {
30
+ :name => 1,
31
+ :resource_type => 1,
32
+ :resource_id => 1
33
+ },
34
+ { :unique => true }
35
+ )
36
+
37
+ scopify
29
38
  end
30
39
 
31
40
  class Forum
@@ -55,4 +64,15 @@ class Privilege
55
64
  belongs_to :resource, :polymorphic => true
56
65
 
57
66
  field :name, :type => String
67
+ index({ :name => 1 }, { :unique => true })
68
+ index(
69
+ {
70
+ :name => 1,
71
+ :resource_type => 1,
72
+ :resource_id => 1
73
+ },
74
+ { :unique => true }
75
+ )
76
+
77
+ scopify
58
78
  end
@@ -0,0 +1,6 @@
1
+ test:
2
+ sessions:
3
+ default:
4
+ database: godfather
5
+ hosts:
6
+ - localhost:27017
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rolify
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
5
- prerelease:
4
+ version: 3.2.0.rc2
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Florent Monbillard
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-07 00:00:00.000000000 Z
12
+ date: 2012-07-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sqlite3
16
- requirement: &70359244800420 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,43 +21,63 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70359244800420
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
- name: activerecord
27
- requirement: &70359244799000 !ruby/object:Gem::Requirement
31
+ name: bson_ext
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
31
36
  - !ruby/object:Gem::Version
32
- version: 3.1.0
37
+ version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70359244799000
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
- name: mongoid
38
- requirement: &70359244797140 !ruby/object:Gem::Requirement
47
+ name: activerecord
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
42
52
  - !ruby/object:Gem::Version
43
- version: '2.3'
53
+ version: 3.1.0
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70359244797140
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 3.1.0
47
62
  - !ruby/object:Gem::Dependency
48
- name: bson_ext
49
- requirement: &70359244794900 !ruby/object:Gem::Requirement
63
+ name: mongoid
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
53
68
  - !ruby/object:Gem::Version
54
- version: '0'
69
+ version: '3.0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70359244794900
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '3.0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: ammeter
60
- requirement: &70359244792460 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70359244792460
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rake
71
- requirement: &70359244791380 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70359244791380
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: rspec
82
- requirement: &70359244788860 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70359244788860
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: bundler
93
- requirement: &70359244786160 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,9 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70359244786160
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  description: Very simple Roles library without any authorization enforcement supporting
103
- scope on resource objects (instance or class)
143
+ scope on resource objects (instance or class). Supports ActiveRecord and Mongoid
144
+ ORMs.
104
145
  email:
105
146
  - f.monbillard@gmail.com
106
147
  executables: []
@@ -126,11 +167,14 @@ files:
126
167
  - lib/rolify.rb
127
168
  - lib/rolify/adapters/active_record/resource_adapter.rb
128
169
  - lib/rolify/adapters/active_record/role_adapter.rb
170
+ - lib/rolify/adapters/active_record/scopes.rb
129
171
  - lib/rolify/adapters/base.rb
130
172
  - lib/rolify/adapters/mongoid/resource_adapter.rb
131
173
  - lib/rolify/adapters/mongoid/role_adapter.rb
174
+ - lib/rolify/adapters/mongoid/scopes.rb
132
175
  - lib/rolify/configure.rb
133
176
  - lib/rolify/dynamic.rb
177
+ - lib/rolify/finders.rb
134
178
  - lib/rolify/railtie.rb
135
179
  - lib/rolify/resource.rb
136
180
  - lib/rolify/role.rb
@@ -144,18 +188,22 @@ files:
144
188
  - spec/rolify/role_spec.rb
145
189
  - spec/rolify/shared_contexts.rb
146
190
  - spec/rolify/shared_examples/shared_examples_for_add_role.rb
191
+ - spec/rolify/shared_examples/shared_examples_for_callbacks.rb
147
192
  - spec/rolify/shared_examples/shared_examples_for_dynamic.rb
193
+ - spec/rolify/shared_examples/shared_examples_for_finders.rb
148
194
  - spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb
149
195
  - spec/rolify/shared_examples/shared_examples_for_has_any_role.rb
150
196
  - spec/rolify/shared_examples/shared_examples_for_has_role.rb
151
197
  - spec/rolify/shared_examples/shared_examples_for_remove_role.rb
152
198
  - spec/rolify/shared_examples/shared_examples_for_roles.rb
199
+ - spec/rolify/shared_examples/shared_examples_for_scopes.rb
153
200
  - spec/spec_helper.rb
154
201
  - spec/support/adapters/active_record.rb
155
202
  - spec/support/adapters/mongoid.rb
203
+ - spec/support/adapters/mongoid.yml
156
204
  - spec/support/data.rb
157
205
  - spec/support/schema.rb
158
- homepage: https://github.com/EppO/rolify
206
+ homepage: http://eppo.github.com/rolify/
159
207
  licenses: []
160
208
  post_install_message:
161
209
  rdoc_options: []
@@ -170,12 +218,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
218
  required_rubygems_version: !ruby/object:Gem::Requirement
171
219
  none: false
172
220
  requirements:
173
- - - ! '>='
221
+ - - ! '>'
174
222
  - !ruby/object:Gem::Version
175
- version: '0'
223
+ version: 1.3.1
176
224
  requirements: []
177
225
  rubyforge_project: rolify
178
- rubygems_version: 1.8.17
226
+ rubygems_version: 1.8.23
179
227
  signing_key:
180
228
  specification_version: 3
181
229
  summary: Roles library with resource scoping
@@ -187,14 +235,18 @@ test_files:
187
235
  - spec/rolify/role_spec.rb
188
236
  - spec/rolify/shared_contexts.rb
189
237
  - spec/rolify/shared_examples/shared_examples_for_add_role.rb
238
+ - spec/rolify/shared_examples/shared_examples_for_callbacks.rb
190
239
  - spec/rolify/shared_examples/shared_examples_for_dynamic.rb
240
+ - spec/rolify/shared_examples/shared_examples_for_finders.rb
191
241
  - spec/rolify/shared_examples/shared_examples_for_has_all_roles.rb
192
242
  - spec/rolify/shared_examples/shared_examples_for_has_any_role.rb
193
243
  - spec/rolify/shared_examples/shared_examples_for_has_role.rb
194
244
  - spec/rolify/shared_examples/shared_examples_for_remove_role.rb
195
245
  - spec/rolify/shared_examples/shared_examples_for_roles.rb
246
+ - spec/rolify/shared_examples/shared_examples_for_scopes.rb
196
247
  - spec/spec_helper.rb
197
248
  - spec/support/adapters/active_record.rb
198
249
  - spec/support/adapters/mongoid.rb
250
+ - spec/support/adapters/mongoid.yml
199
251
  - spec/support/data.rb
200
252
  - spec/support/schema.rb