rolify 3.4.1 → 3.5.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.
- checksums.yaml +7 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.rdoc +8 -1
- data/CONTRIBUTORS +5 -0
- data/Gemfile +1 -0
- data/README.md +12 -10
- data/circle.yml +11 -0
- data/lib/generators/active_record/rolify_generator.rb +12 -10
- data/lib/generators/mongoid/rolify_generator.rb +12 -10
- data/lib/rolify.rb +6 -0
- data/lib/rolify/adapters/active_record/role_adapter.rb +1 -1
- data/lib/rolify/adapters/mongoid/role_adapter.rb +9 -7
- data/lib/rolify/configure.rb +16 -5
- data/lib/rolify/role.rb +7 -14
- data/lib/rolify/version.rb +1 -1
- data/rolify.gemspec +1 -1
- data/spec/generators/rolify/rolify_activerecord_generator_spec.rb +32 -31
- data/spec/generators/rolify/rolify_mongoid_generator_spec.rb +20 -19
- data/spec/generators_helper.rb +3 -1
- data/spec/rolify/resource_spec.rb +8 -0
- data/spec/rolify/role_spec.rb +11 -1
- data/spec/rolify/shared_examples/shared_examples_for_roles.rb +1 -6
- data/spec/spec_helper.rb +3 -0
- data/spec/support/schema.rb +6 -6
- data/spec/support/stream_helpers.rb +18 -0
- metadata +23 -33
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf5b355e4195b739b029a8567fd142b8e35bb12d
|
4
|
+
data.tar.gz: 9e9ed19d10b9eb0d41b1319602b69ded63bb16d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f1d687a86a7050e389650808e2abb072e1c7aa4387d4a4d6465e9c57091198f196a0dc2b84a1d2e5c0ebbf95db14c8212ee19597f353bac5b803f6331310c34f
|
7
|
+
data.tar.gz: 3a7cc52b331ad63e658a9027385efc5bb60266112633d2d6e01d3146b6b01112e8c7e02489d2ac551da275e5e3187c0821da5f6283f1e6baf292cca7422af1ae
|
data/.travis.yml
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
= 3.
|
1
|
+
= 3.5.0 (Jan 08, 2015)
|
2
|
+
* Removed `has_role` method alias for `add_role`
|
3
|
+
* Fixed regression in caching system
|
4
|
+
* Fix deprecation warning about timestamp on specs
|
5
|
+
* Copy Kernel#capture helper from Rails
|
6
|
+
* Add validation on Role.resource_type
|
7
|
+
|
8
|
+
= 3.4.1 (Sep 08, 2014)
|
2
9
|
* Fixed issue with migrations being generated without a file extension.
|
3
10
|
* Updated spec tests to work with Travis CI on Ruby up to 2.1.2 and Rails 4.1.x
|
4
11
|
* Made it possible for inheritance of resources.
|
data/CONTRIBUTORS
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# rolify [](http://badge.fury.io/rb/rolify) [](http://travis-ci.org/RolifyCommunity/rolify) [](https://gemnasium.com/RolifyCommunity/rolify) [](https://codeclimate.com/github/RolifyCommunity/rolify) [](https://coveralls.io/r/RolifyCommunity/rolify?branch=master)
|
2
2
|
|
3
3
|
|
4
4
|
Very simple Roles library without any authorization enforcement supporting scope on resource object.
|
@@ -10,7 +10,7 @@ user.has_role?(:moderator, Forum.first)
|
|
10
10
|
=> false # if user is moderator of another Forum
|
11
11
|
```
|
12
12
|
|
13
|
-
This library can be easily integrated with any authentication gem ([devise](https://github.com/plataformatec/devise), [Authlogic](https://github.com/binarylogic/authlogic), [Clearance](https://github.com/thoughtbot/clearance)) and authorization gem<span style="color: red"><strong>*</strong></span> ([
|
13
|
+
This library can be easily integrated with any authentication gem ([devise](https://github.com/plataformatec/devise), [Authlogic](https://github.com/binarylogic/authlogic), [Clearance](https://github.com/thoughtbot/clearance)) and authorization gem<span style="color: red"><strong>*</strong></span> ([CanCanCan](https://github.com/CanCanCommunity/cancancan), [authority](https://github.com/nathanl/authority))
|
14
14
|
|
15
15
|
<span style="color: red"><strong>*</strong></span>: authorization gem that doesn't provide a role class
|
16
16
|
|
@@ -184,6 +184,8 @@ Forum.with_role(:admin)
|
|
184
184
|
# => [ list of Forum instances that has role "admin" binded to it ]
|
185
185
|
Forum.with_role(:admin, current_user)
|
186
186
|
# => [ list of Forum instances that has role "admin" binded to it and belongs to current_user roles ]
|
187
|
+
Forum.with_roles([:admin, :user], current_user)
|
188
|
+
# => [ list of Forum instances that has role "admin" or "user" binded to it and belongs to current_user roles ]
|
187
189
|
|
188
190
|
User.with_any_role(:user, :admin)
|
189
191
|
# => [ list of User instances that has role "admin" or "user" binded to it ]
|
@@ -202,11 +204,11 @@ Forum.find_roles(:admin, current_user)
|
|
202
204
|
|
203
205
|
## Resources
|
204
206
|
|
205
|
-
* [Wiki](https://github.com/
|
206
|
-
* [Usage](https://github.com/
|
207
|
-
* [Tutorials](https://github.com/
|
208
|
-
* [How-To use rolify with Devise and CanCan](https://github.com/
|
209
|
-
* [Using rolify with Devise and Authority](https://github.com/
|
207
|
+
* [Wiki](https://github.com/RolifyCommunity/rolify/wiki)
|
208
|
+
* [Usage](https://github.com/RolifyCommunity/rolify/wiki/Usage): all the available commands
|
209
|
+
* [Tutorials](https://github.com/RolifyCommunity/rolify/wiki#wiki-tutorials):
|
210
|
+
* [How-To use rolify with Devise and CanCan](https://github.com/RolifyCommunity/rolify/wiki/Tutorial)
|
211
|
+
* [Using rolify with Devise and Authority](https://github.com/RolifyCommunity/rolify/wiki/Using-rolify-with-Devise-and-Authority)
|
210
212
|
* [Step-by-step tutorial](http://railsapps.github.com/tutorial-rails-bootstrap-devise-cancan.html) provided by [RailsApps](http://railsapps.github.com/)
|
211
213
|
|
212
214
|
## Upgrade from previous versions
|
@@ -215,12 +217,12 @@ Please read the [upgrade instructions](UPGRADE.rdoc).
|
|
215
217
|
|
216
218
|
## Known issues
|
217
219
|
|
218
|
-
* If you are using Mongoid and/or less-rails gem, please read [this](https://github.com/
|
220
|
+
* If you are using Mongoid and/or less-rails gem, please read [this](https://github.com/RolifyCommunity/rolify/wiki/FAQ#when-i-start-rails-using-server-console-whatever-i-get-this-error)
|
219
221
|
* Moped library (ruby driver for Mongodb used by Mongoid) doesn't support rubinius 2.2 yet (see https://github.com/mongoid/moped/issues/231)
|
220
|
-
* If you use Rails 4 and Mongoid, use Mongoid ~> 4
|
222
|
+
* If you use Rails 4 and Mongoid, use Mongoid ~> 4. rolify is fully tested with Rails 4 and Mongoid 4.
|
221
223
|
|
222
224
|
## Questions or Problems?
|
223
225
|
|
224
|
-
If you have any issue or feature request with/for rolify, please create an new [issue on GitHub](https://github.com/
|
226
|
+
If you have any issue or feature request with/for rolify, please create an new [issue on GitHub](https://github.com/RolifyCommunity/rolify/issues) **specifying the ruby runtime, rails and rolify versions you're using and the gems listed in your Gemfile**, or fork the project and send a pull request.
|
225
227
|
|
226
228
|
To get the specs running you should call `bundle` and then `rake`. See the spec/README for more information.
|
data/circle.yml
ADDED
@@ -5,42 +5,44 @@ module ActiveRecord
|
|
5
5
|
module Generators
|
6
6
|
class RolifyGenerator < ActiveRecord::Generators::Base
|
7
7
|
source_root File.expand_path("../templates", __FILE__)
|
8
|
-
|
8
|
+
|
9
9
|
argument :user_cname, :type => :string, :default => "User", :banner => "User"
|
10
|
-
|
10
|
+
|
11
11
|
def generate_model
|
12
12
|
invoke "active_record:model", [ name ], :migration => false
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def inject_role_class
|
16
16
|
inject_into_class(model_path, class_name, model_content)
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def copy_rolify_migration
|
20
20
|
migration_template "migration.rb", "db/migrate/rolify_create_#{table_name}.rb"
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def join_table
|
24
24
|
user_cname.constantize.table_name + "_" + table_name
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def user_reference
|
28
28
|
user_cname.demodulize.underscore
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def role_reference
|
32
32
|
class_name.demodulize.underscore
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def model_path
|
36
36
|
File.join("app", "models", "#{file_path}.rb")
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def model_content
|
40
40
|
content = <<RUBY
|
41
41
|
has_and_belongs_to_many :%{user_cname}, :join_table => :%{join_table}
|
42
42
|
belongs_to :resource, :polymorphic => true
|
43
|
-
|
43
|
+
|
44
|
+
validates :resource_type, :inclusion => { :in => Rolify.resource_types }
|
45
|
+
|
44
46
|
scopify
|
45
47
|
RUBY
|
46
48
|
content % { :user_cname => user_cname.constantize.table_name, :join_table => "#{user_cname.constantize.table_name}_#{table_name}"}
|
@@ -5,34 +5,34 @@ module Mongoid
|
|
5
5
|
module Generators
|
6
6
|
class RolifyGenerator < Rails::Generators::NamedBase
|
7
7
|
source_root File.expand_path("../templates", __FILE__)
|
8
|
-
|
8
|
+
|
9
9
|
argument :user_cname, :type => :string, :default => "User", :banner => "User"
|
10
|
-
|
10
|
+
|
11
11
|
def generate_model
|
12
12
|
invoke "mongoid:model", [ name ]
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def inject_role_class
|
16
16
|
inject_into_file(model_path, model_contents, :after => "include Mongoid::Document\n")
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def user_reference
|
20
20
|
user_cname.demodulize.underscore
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def role_reference
|
24
24
|
class_name.demodulize.underscore
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def model_path
|
28
28
|
File.join("app", "models", "#{file_path}.rb")
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def model_contents
|
32
32
|
content = <<RUBY
|
33
33
|
has_and_belongs_to_many :%{user_cname}
|
34
34
|
belongs_to :resource, :polymorphic => true
|
35
|
-
|
35
|
+
|
36
36
|
field :name, :type => String
|
37
37
|
|
38
38
|
index({
|
@@ -41,11 +41,13 @@ module Mongoid
|
|
41
41
|
:resource_id => 1
|
42
42
|
},
|
43
43
|
{ :unique => true})
|
44
|
-
|
44
|
+
|
45
|
+
validates :resource_type, :inclusion => { :in => Rolify.resource_types }
|
46
|
+
|
45
47
|
scopify
|
46
48
|
RUBY
|
47
49
|
content % { :user_cname => user_cname.constantize.collection_name }
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
51
|
-
end
|
53
|
+
end
|
data/lib/rolify.rb
CHANGED
@@ -10,6 +10,7 @@ module Rolify
|
|
10
10
|
extend Configure
|
11
11
|
|
12
12
|
attr_accessor :role_cname, :adapter, :role_join_table_name, :role_table_name
|
13
|
+
@@resource_types = []
|
13
14
|
|
14
15
|
def rolify(options = {})
|
15
16
|
include Role
|
@@ -49,6 +50,7 @@ module Rolify
|
|
49
50
|
has_many association_name, resourcify_options
|
50
51
|
|
51
52
|
self.adapter = Rolify::Adapter::Base.create("resource_adapter", self.role_cname, self.name)
|
53
|
+
@@resource_types << self.name
|
52
54
|
end
|
53
55
|
|
54
56
|
def scopify
|
@@ -60,4 +62,8 @@ module Rolify
|
|
60
62
|
return self.superclass.role_class unless self.instance_variable_defined? '@role_cname'
|
61
63
|
self.role_cname.constantize
|
62
64
|
end
|
65
|
+
|
66
|
+
def self.resource_types
|
67
|
+
@@resource_types
|
68
|
+
end
|
63
69
|
end
|
@@ -9,8 +9,8 @@ module Rolify
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
|
12
|
-
self.role_class.find_or_create_by(:name => role_name,
|
13
|
-
:resource_type => resource_type,
|
12
|
+
self.role_class.find_or_create_by(:name => role_name,
|
13
|
+
:resource_type => resource_type,
|
14
14
|
:resource_id => resource_id)
|
15
15
|
end
|
16
16
|
|
@@ -24,7 +24,7 @@ module Rolify
|
|
24
24
|
#roles.merge!({ :resource_id => resource.id }) if resource && !resource.is_a?(Class)
|
25
25
|
#roles_to_remove = relation.roles.where(roles)
|
26
26
|
#roles_to_remove.each do |role|
|
27
|
-
# # Deletion in n-n relations is unreliable. Sometimes it works, sometimes not.
|
27
|
+
# # Deletion in n-n relations is unreliable. Sometimes it works, sometimes not.
|
28
28
|
# # So, this does not work all the time: `relation.roles.delete(role)`
|
29
29
|
# # @see http://stackoverflow.com/questions/9132596/rails3-mongoid-many-to-many-relation-and-delete-operation
|
30
30
|
# # We instead remove ids from the Role object and the relation object.
|
@@ -37,10 +37,12 @@ module Rolify
|
|
37
37
|
cond[:resource_type] = (resource.is_a?(Class) ? resource.to_s : resource.class.name) if resource
|
38
38
|
cond[:resource_id] = resource.id if resource && !resource.is_a?(Class)
|
39
39
|
roles = relation.roles.where(cond)
|
40
|
-
roles.each do |role|
|
40
|
+
roles.each do |role|
|
41
41
|
relation.roles.delete(role)
|
42
42
|
role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).delete(relation)
|
43
|
-
|
43
|
+
if Rolify.remove_role_if_empty && role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).empty?
|
44
|
+
role.destroy
|
45
|
+
end
|
44
46
|
end if roles
|
45
47
|
roles
|
46
48
|
end
|
@@ -48,7 +50,7 @@ module Rolify
|
|
48
50
|
def exists?(relation, column)
|
49
51
|
relation.where(column.to_sym.ne => nil)
|
50
52
|
end
|
51
|
-
|
53
|
+
|
52
54
|
def scope(relation, conditions)
|
53
55
|
roles = where(role_class, conditions).map { |role| role.id }
|
54
56
|
return [] if roles.size.zero?
|
@@ -86,4 +88,4 @@ module Rolify
|
|
86
88
|
end
|
87
89
|
end
|
88
90
|
end
|
89
|
-
end
|
91
|
+
end
|
data/lib/rolify/configure.rb
CHANGED
@@ -2,7 +2,8 @@ module Rolify
|
|
2
2
|
module Configure
|
3
3
|
@@dynamic_shortcuts = false
|
4
4
|
@@orm = "active_record"
|
5
|
-
|
5
|
+
@@remove_role_if_empty = true
|
6
|
+
|
6
7
|
def configure(*role_cnames)
|
7
8
|
return if !sanity_check(role_cnames)
|
8
9
|
yield self if block_given?
|
@@ -27,7 +28,7 @@ module Rolify
|
|
27
28
|
def use_mongoid
|
28
29
|
self.orm = "mongoid"
|
29
30
|
end
|
30
|
-
|
31
|
+
|
31
32
|
def use_dynamic_shortcuts
|
32
33
|
self.dynamic_shortcuts = true
|
33
34
|
end
|
@@ -38,10 +39,20 @@ module Rolify
|
|
38
39
|
config.orm = "active_record"
|
39
40
|
end
|
40
41
|
end
|
41
|
-
|
42
|
+
|
43
|
+
def remove_role_if_empty=(is_remove)
|
44
|
+
@@remove_role_if_empty = is_remove
|
45
|
+
end
|
46
|
+
|
47
|
+
def remove_role_if_empty
|
48
|
+
@@remove_role_if_empty
|
49
|
+
end
|
50
|
+
|
42
51
|
private
|
43
|
-
|
52
|
+
|
44
53
|
def sanity_check(role_cnames)
|
54
|
+
return true if "assets:precompile"==ARGV[0]
|
55
|
+
|
45
56
|
role_cnames = [ "Role" ] if role_cnames.empty?
|
46
57
|
role_cnames.each do |role_cname|
|
47
58
|
role_class = role_cname.constantize
|
@@ -52,7 +63,7 @@ module Rolify
|
|
52
63
|
end
|
53
64
|
true
|
54
65
|
end
|
55
|
-
|
66
|
+
|
56
67
|
def role_table_missing?(role_class)
|
57
68
|
role_class.connected? && !role_class.table_exists?
|
58
69
|
end
|
data/lib/rolify/role.rb
CHANGED
@@ -3,11 +3,11 @@ require "rolify/finders"
|
|
3
3
|
module Rolify
|
4
4
|
module Role
|
5
5
|
extend Utils
|
6
|
-
|
6
|
+
|
7
7
|
def self.included(base)
|
8
8
|
base.extend Finders
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def add_role(role_name, resource = nil)
|
12
12
|
role = self.class.adapter.find_or_create_by(role_name.to_s,
|
13
13
|
(resource.is_a?(Class) ? resource.to_s : resource.class.name if resource),
|
@@ -20,20 +20,13 @@ module Rolify
|
|
20
20
|
role
|
21
21
|
end
|
22
22
|
alias_method :grant, :add_role
|
23
|
-
deprecate :has_role, :add_role
|
24
23
|
|
25
24
|
def has_role?(role_name, resource = nil)
|
26
|
-
@r_map ||= {}
|
27
|
-
role_n_resource = role_name.to_s + resource.to_s
|
28
|
-
@r_map[role_n_resource].nil? ? @r_map[role_n_resource] = has_role_helper(role_name, resource) : @r_map[role_n_resource]
|
29
|
-
end
|
30
|
-
|
31
|
-
def has_role_helper(role_name, resource = nil)
|
32
25
|
if new_record?
|
33
|
-
self.roles.detect { |r| r.name == role_name.to_s && (r.resource == resource || resource.nil?) }
|
26
|
+
self.roles.detect { |r| r.name.to_s == role_name.to_s && (r.resource == resource || resource.nil?) }
|
34
27
|
else
|
35
|
-
self.class.adapter.where(self.roles, :
|
36
|
-
end
|
28
|
+
self.class.adapter.where(self.roles, name: role_name, resource: resource)
|
29
|
+
end.present?
|
37
30
|
end
|
38
31
|
|
39
32
|
def has_all_roles?(*args)
|
@@ -56,7 +49,7 @@ module Rolify
|
|
56
49
|
self.class.adapter.where(self.roles, *args).size > 0
|
57
50
|
end
|
58
51
|
end
|
59
|
-
|
52
|
+
|
60
53
|
def only_has_role?(role_name, resource = nil)
|
61
54
|
return self.has_role?(role_name,resource) && self.roles.count == 1
|
62
55
|
end
|
@@ -64,7 +57,7 @@ module Rolify
|
|
64
57
|
def remove_role(role_name, resource = nil)
|
65
58
|
self.class.adapter.remove(self, role_name.to_s, resource)
|
66
59
|
end
|
67
|
-
|
60
|
+
|
68
61
|
alias_method :revoke, :remove_role
|
69
62
|
deprecate :has_no_role, :remove_role
|
70
63
|
|
data/lib/rolify/version.rb
CHANGED
data/rolify.gemspec
CHANGED
@@ -24,6 +24,6 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_development_dependency 'rake', '~> 10.3.2'
|
25
25
|
s.add_development_dependency 'rspec', '2.99.0'
|
26
26
|
s.add_development_dependency 'rspec-rails', '2.99.0'
|
27
|
-
s.add_development_dependency 'bundler', '~> 1.
|
27
|
+
s.add_development_dependency 'bundler', '~> 1.7.0'
|
28
28
|
s.add_development_dependency 'fuubar', '~> 1.3.3'
|
29
29
|
end
|
@@ -7,11 +7,11 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
7
7
|
# Tell the generator where to put its output (what it thinks of as Rails.root)
|
8
8
|
destination File.expand_path("../../../../tmp", __FILE__)
|
9
9
|
teardown :cleanup_destination_root
|
10
|
-
|
11
|
-
before {
|
10
|
+
|
11
|
+
before {
|
12
12
|
prepare_destination
|
13
13
|
}
|
14
|
-
|
14
|
+
|
15
15
|
def cleanup_destination_root
|
16
16
|
FileUtils.rm_rf destination_root
|
17
17
|
end
|
@@ -19,7 +19,7 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
19
19
|
describe 'specifying only Role class name' do
|
20
20
|
before(:all) { arguments %w(Role) }
|
21
21
|
|
22
|
-
before {
|
22
|
+
before {
|
23
23
|
capture(:stdout) {
|
24
24
|
generator.create_file "app/models/user.rb" do
|
25
25
|
<<-RUBY
|
@@ -29,9 +29,9 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
29
29
|
end
|
30
30
|
}
|
31
31
|
require File.join(destination_root, "app/models/user.rb")
|
32
|
-
run_generator
|
32
|
+
run_generator
|
33
33
|
}
|
34
|
-
|
34
|
+
|
35
35
|
describe 'config/initializers/rolify.rb' do
|
36
36
|
subject { file('config/initializers/rolify.rb') }
|
37
37
|
it { should exist }
|
@@ -39,23 +39,24 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
39
39
|
it { should contain "# config.use_dynamic_shortcuts" }
|
40
40
|
it { should contain "# config.use_mongoid" }
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
describe 'app/models/role.rb' do
|
44
44
|
subject { file('app/models/role.rb') }
|
45
45
|
it { should exist }
|
46
46
|
it { should contain "class Role < ActiveRecord::Base" }
|
47
47
|
it { should contain "has_and_belongs_to_many :users, :join_table => :users_roles" }
|
48
48
|
it { should contain "belongs_to :resource, :polymorphic => true" }
|
49
|
+
it { should contain "validates :resource_type, :inclusion => { :in => Rolify.resource_types }" }
|
49
50
|
end
|
50
|
-
|
51
|
+
|
51
52
|
describe 'app/models/user.rb' do
|
52
53
|
subject { file('app/models/user.rb') }
|
53
54
|
it { should contain /class User < ActiveRecord::Base\n rolify\n/ }
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
describe 'migration file' do
|
57
58
|
subject { migration_file('db/migrate/rolify_create_roles.rb') }
|
58
|
-
|
59
|
+
|
59
60
|
it { should be_a_migration }
|
60
61
|
it { should contain "create_table(:roles) do" }
|
61
62
|
it { should contain "create_table(:users_roles, :id => false) do" }
|
@@ -64,8 +65,8 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
64
65
|
|
65
66
|
describe 'specifying User and Role class names' do
|
66
67
|
before(:all) { arguments %w(AdminRole AdminUser) }
|
67
|
-
|
68
|
-
before {
|
68
|
+
|
69
|
+
before {
|
69
70
|
capture(:stdout) {
|
70
71
|
generator.create_file "app/models/admin_user.rb" do
|
71
72
|
"class AdminUser < ActiveRecord::Base\nend"
|
@@ -74,44 +75,44 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
74
75
|
require File.join(destination_root, "app/models/admin_user.rb")
|
75
76
|
run_generator
|
76
77
|
}
|
77
|
-
|
78
|
+
|
78
79
|
describe 'config/initializers/rolify.rb' do
|
79
80
|
subject { file('config/initializers/rolify.rb') }
|
80
|
-
|
81
|
+
|
81
82
|
it { should exist }
|
82
83
|
it { should contain "Rolify.configure(\"AdminRole\") do |config|"}
|
83
84
|
it { should contain "# config.use_dynamic_shortcuts" }
|
84
85
|
it { should contain "# config.use_mongoid" }
|
85
86
|
end
|
86
|
-
|
87
|
+
|
87
88
|
describe 'app/models/admin_role.rb' do
|
88
89
|
subject { file('app/models/admin_role.rb') }
|
89
|
-
|
90
|
+
|
90
91
|
it { should exist }
|
91
92
|
it { should contain "class AdminRole < ActiveRecord::Base" }
|
92
93
|
it { should contain "has_and_belongs_to_many :admin_users, :join_table => :admin_users_admin_roles" }
|
93
94
|
it { should contain "belongs_to :resource, :polymorphic => true" }
|
94
95
|
end
|
95
|
-
|
96
|
+
|
96
97
|
describe 'app/models/admin_user.rb' do
|
97
98
|
subject { file('app/models/admin_user.rb') }
|
98
|
-
|
99
|
+
|
99
100
|
it { should contain /class AdminUser < ActiveRecord::Base\n rolify :role_cname => 'AdminRole'\n/ }
|
100
101
|
end
|
101
|
-
|
102
|
+
|
102
103
|
describe 'migration file' do
|
103
104
|
subject { migration_file('db/migrate/rolify_create_admin_roles.rb') }
|
104
|
-
|
105
|
+
|
105
106
|
it { should be_a_migration }
|
106
107
|
it { should contain "create_table(:admin_roles)" }
|
107
108
|
it { should contain "create_table(:admin_users_admin_roles, :id => false) do" }
|
108
109
|
end
|
109
110
|
end
|
110
|
-
|
111
|
+
|
111
112
|
describe 'specifying namespaced User and Role class names' do
|
112
113
|
before(:all) { arguments %w(Admin::Role Admin::User) }
|
113
|
-
|
114
|
-
before {
|
114
|
+
|
115
|
+
before {
|
115
116
|
capture(:stdout) {
|
116
117
|
generator.create_file "app/models/admin/user.rb" do
|
117
118
|
<<-RUBY
|
@@ -126,34 +127,34 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'active_r
|
|
126
127
|
require File.join(destination_root, "app/models/admin/user.rb")
|
127
128
|
run_generator
|
128
129
|
}
|
129
|
-
|
130
|
+
|
130
131
|
describe 'config/initializers/rolify.rb' do
|
131
132
|
subject { file('config/initializers/rolify.rb') }
|
132
|
-
|
133
|
+
|
133
134
|
it { should exist }
|
134
135
|
it { should contain "Rolify.configure(\"Admin::Role\") do |config|"}
|
135
136
|
it { should contain "# config.use_dynamic_shortcuts" }
|
136
137
|
it { should contain "# config.use_mongoid" }
|
137
138
|
end
|
138
|
-
|
139
|
+
|
139
140
|
describe 'app/models/admin/role.rb' do
|
140
141
|
subject { file('app/models/admin/role.rb') }
|
141
|
-
|
142
|
+
|
142
143
|
it { should exist }
|
143
144
|
it { should contain "class Admin::Role < ActiveRecord::Base" }
|
144
145
|
it { should contain "has_and_belongs_to_many :admin_users, :join_table => :admin_users_admin_roles" }
|
145
146
|
it { should contain "belongs_to :resource, :polymorphic => true" }
|
146
147
|
end
|
147
|
-
|
148
|
+
|
148
149
|
describe 'app/models/admin/user.rb' do
|
149
150
|
subject { file('app/models/admin/user.rb') }
|
150
|
-
|
151
|
+
|
151
152
|
it { should contain /class User < ActiveRecord::Base\n rolify :role_cname => 'Admin::Role'\n/ }
|
152
153
|
end
|
153
|
-
|
154
|
+
|
154
155
|
describe 'migration file' do
|
155
156
|
subject { migration_file('db/migrate/rolify_create_admin_roles.rb') }
|
156
|
-
|
157
|
+
|
157
158
|
it { should be_a_migration }
|
158
159
|
it { should contain "create_table(:admin_roles)" }
|
159
160
|
it { should contain "create_table(:admin_users_admin_roles, :id => false) do" }
|
@@ -7,19 +7,19 @@ describe Rolify::Generators::RolifyGenerator, :if => ENV['ADAPTER'] == 'mongoid'
|
|
7
7
|
# Tell the generator where to put its output (what it thinks of as Rails.root)
|
8
8
|
destination File.expand_path("../../../../tmp", __FILE__)
|
9
9
|
teardown :cleanup_destination_root
|
10
|
-
|
11
|
-
before {
|
10
|
+
|
11
|
+
before {
|
12
12
|
prepare_destination
|
13
13
|
}
|
14
|
-
|
14
|
+
|
15
15
|
def cleanup_destination_root
|
16
16
|
FileUtils.rm_rf destination_root
|
17
17
|
end
|
18
18
|
|
19
|
-
describe 'specifying ORM adapter' do
|
19
|
+
describe 'specifying ORM adapter' do
|
20
20
|
before(:all) { arguments [ "Role", "User", "--orm=mongoid" ] }
|
21
|
-
|
22
|
-
before {
|
21
|
+
|
22
|
+
before {
|
23
23
|
capture(:stdout) {
|
24
24
|
generator.create_file "app/models/user.rb" do
|
25
25
|
<<-RUBY
|
@@ -34,7 +34,7 @@ RUBY
|
|
34
34
|
require File.join(destination_root, "app/models/user.rb")
|
35
35
|
run_generator
|
36
36
|
}
|
37
|
-
|
37
|
+
|
38
38
|
describe 'config/initializers/rolify.rb' do
|
39
39
|
subject { file('config/initializers/rolify.rb') }
|
40
40
|
it { should exist }
|
@@ -42,7 +42,7 @@ RUBY
|
|
42
42
|
it { should_not contain "# config.use_mongoid" }
|
43
43
|
it { should contain "# config.use_dynamic_shortcuts" }
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
describe 'app/models/role.rb' do
|
47
47
|
subject { file('app/models/role.rb') }
|
48
48
|
it { should exist }
|
@@ -56,18 +56,19 @@ RUBY
|
|
56
56
|
" { :resource_id => 1 }\n"
|
57
57
|
" },\n"
|
58
58
|
" { unique => true })"}
|
59
|
+
it { should contain "validates :resource_type, :inclusion => { :in => Rolify.resource_types }" }
|
59
60
|
end
|
60
|
-
|
61
|
+
|
61
62
|
describe 'app/models/user.rb' do
|
62
63
|
subject { file('app/models/user.rb') }
|
63
64
|
it { should contain /class User\n include Mongoid::Document\n rolify\n/ }
|
64
65
|
end
|
65
66
|
end
|
66
|
-
|
67
|
+
|
67
68
|
describe 'specifying namespaced User and Role class names and ORM adapter' do
|
68
69
|
before(:all) { arguments %w(Admin::Role Admin::User --orm=mongoid) }
|
69
|
-
|
70
|
-
before {
|
70
|
+
|
71
|
+
before {
|
71
72
|
capture(:stdout) {
|
72
73
|
generator.create_file "app/models/admin/user.rb" do
|
73
74
|
<<-RUBY
|
@@ -82,29 +83,29 @@ RUBY
|
|
82
83
|
require File.join(destination_root, "app/models/admin/user.rb")
|
83
84
|
run_generator
|
84
85
|
}
|
85
|
-
|
86
|
+
|
86
87
|
describe 'config/initializers/rolify.rb' do
|
87
88
|
subject { file('config/initializers/rolify.rb') }
|
88
|
-
|
89
|
+
|
89
90
|
it { should exist }
|
90
91
|
it { should contain "Rolify.configure(\"Admin::Role\") do |config|"}
|
91
92
|
it { should contain "# config.use_dynamic_shortcuts" }
|
92
93
|
it { should_not contain "# config.use_mongoid" }
|
93
94
|
end
|
94
|
-
|
95
|
+
|
95
96
|
describe 'app/models/admin/role.rb' do
|
96
97
|
subject { file('app/models/admin/role.rb') }
|
97
|
-
|
98
|
+
|
98
99
|
it { should exist }
|
99
100
|
it { should contain "class Admin::Role" }
|
100
101
|
it { should contain "has_and_belongs_to_many :admin_users" }
|
101
102
|
it { should contain "belongs_to :resource, :polymorphic => true" }
|
102
103
|
end
|
103
|
-
|
104
|
+
|
104
105
|
describe 'app/models/admin/user.rb' do
|
105
106
|
subject { file('app/models/admin/user.rb') }
|
106
|
-
|
107
|
+
|
107
108
|
it { should contain /class User\n include Mongoid::Document\n rolify :role_cname => 'Admin::Role'\n/ }
|
108
109
|
end
|
109
110
|
end
|
110
|
-
end
|
111
|
+
end
|
data/spec/generators_helper.rb
CHANGED
@@ -4,6 +4,8 @@ require "bundler/setup"
|
|
4
4
|
require 'rolify'
|
5
5
|
require 'rolify/matchers'
|
6
6
|
require 'rails'
|
7
|
+
require_relative 'support/stream_helpers'
|
8
|
+
include StreamHelpers
|
7
9
|
|
8
10
|
require 'coveralls'
|
9
11
|
Coveralls.wear_merged!
|
@@ -22,4 +24,4 @@ module TestApp
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
|
-
require 'ammeter/init'
|
27
|
+
require 'ammeter/init'
|
@@ -403,4 +403,12 @@ describe Rolify::Resource do
|
|
403
403
|
its(:applied_roles) { should_not include(forum_role, godfather_role, sneaky_role, tourist_role) }
|
404
404
|
end
|
405
405
|
end
|
406
|
+
|
407
|
+
describe '.resource_types' do
|
408
|
+
|
409
|
+
it 'include all models that call resourcify' do
|
410
|
+
Rolify.resource_types.should include("HumanResource", "Forum", "Group",
|
411
|
+
"Team", "Organization")
|
412
|
+
end
|
413
|
+
end
|
406
414
|
end
|
data/spec/rolify/role_spec.rb
CHANGED
@@ -12,9 +12,19 @@ describe Rolify do
|
|
12
12
|
def role_class
|
13
13
|
Role
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
it_behaves_like Rolify::Role
|
17
17
|
it_behaves_like "Role.scopes"
|
18
18
|
it_behaves_like Rolify::Dynamic
|
19
19
|
it_behaves_like "Rolify.callbacks"
|
20
|
+
|
21
|
+
context 'cache', pending: true do
|
22
|
+
let(:user) { User.first }
|
23
|
+
before { user.grant(:zombie) }
|
24
|
+
specify do
|
25
|
+
expect(user).to have_role(:zombie)
|
26
|
+
user.remove_role(:zombie)
|
27
|
+
expect(user).to_not have_role(:zombie)
|
28
|
+
end
|
29
|
+
end
|
20
30
|
end
|
@@ -29,7 +29,7 @@ shared_examples_for Rolify::Role do
|
|
29
29
|
|
30
30
|
subject { user_class.first }
|
31
31
|
|
32
|
-
[ :
|
32
|
+
[ :grant, :add_role ].each do |method_alias|
|
33
33
|
it { should respond_to(method_alias.to_sym).with(1).arguments }
|
34
34
|
it { should respond_to(method_alias.to_sym).with(2).arguments }
|
35
35
|
end
|
@@ -51,11 +51,6 @@ shared_examples_for Rolify::Role do
|
|
51
51
|
it { should_not respond_to(:is_admin?) }
|
52
52
|
it { should_not respond_to(:is_moderator_of?) }
|
53
53
|
|
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
|
58
|
-
|
59
54
|
describe "#has_role?" do
|
60
55
|
it_should_behave_like "#has_role?_examples", "String", :to_s
|
61
56
|
it_should_behave_like "#has_role?_examples", "Symbol", :to_sym
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/schema.rb
CHANGED
@@ -5,8 +5,8 @@ ActiveRecord::Schema.define do
|
|
5
5
|
create_table(table) do |t|
|
6
6
|
t.string :name
|
7
7
|
t.references :resource, :polymorphic => true
|
8
|
-
|
9
|
-
t.timestamps
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -20,17 +20,17 @@ ActiveRecord::Schema.define do
|
|
20
20
|
t.references :user
|
21
21
|
t.references :role
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
create_table(:human_resources_roles, :id => false) do |t|
|
25
25
|
t.references :human_resource
|
26
26
|
t.references :role
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
create_table(:customers_privileges, :id => false) do |t|
|
30
30
|
t.references :customer
|
31
31
|
t.references :privilege
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
create_table(:moderators_rights, :id => false) do |t|
|
35
35
|
t.references :moderator
|
36
36
|
t.references :right
|
@@ -44,7 +44,7 @@ ActiveRecord::Schema.define do
|
|
44
44
|
t.integer :parent_id
|
45
45
|
t.string :name
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
create_table(:teams, :id => false) do |t|
|
49
49
|
t.primary_key :team_code
|
50
50
|
t.string :name
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module StreamHelpers
|
2
|
+
def capture(stream)
|
3
|
+
stream = stream.to_s
|
4
|
+
captured_stream = Tempfile.new(stream)
|
5
|
+
stream_io = eval("$#{stream}")
|
6
|
+
origin_stream = stream_io.dup
|
7
|
+
stream_io.reopen(captured_stream)
|
8
|
+
|
9
|
+
yield
|
10
|
+
|
11
|
+
stream_io.rewind
|
12
|
+
return captured_stream.read
|
13
|
+
ensure
|
14
|
+
captured_stream.close
|
15
|
+
captured_stream.unlink
|
16
|
+
stream_io.reopen(origin_stream)
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,52 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rolify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
5
|
-
prerelease:
|
4
|
+
version: 3.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Florent Monbillard
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-01-08 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ammeter
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 1.1.2
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 1.1.2
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 10.3.2
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 10.3.2
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - '='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - '='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec-rails
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - '='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - '='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,33 +69,29 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: bundler
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- - ~>
|
73
|
+
- - "~>"
|
84
74
|
- !ruby/object:Gem::Version
|
85
|
-
version: 1.
|
75
|
+
version: 1.7.0
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- - ~>
|
80
|
+
- - "~>"
|
92
81
|
- !ruby/object:Gem::Version
|
93
|
-
version: 1.
|
82
|
+
version: 1.7.0
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: fuubar
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- - ~>
|
87
|
+
- - "~>"
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: 1.3.3
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- - ~>
|
94
|
+
- - "~>"
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: 1.3.3
|
110
97
|
description: Very simple Roles library without any authorization enforcement supporting
|
@@ -116,14 +103,16 @@ executables: []
|
|
116
103
|
extensions: []
|
117
104
|
extra_rdoc_files: []
|
118
105
|
files:
|
119
|
-
- .gitignore
|
120
|
-
- .travis.yml
|
106
|
+
- ".gitignore"
|
107
|
+
- ".travis.yml"
|
121
108
|
- CHANGELOG.rdoc
|
109
|
+
- CONTRIBUTORS
|
122
110
|
- Gemfile
|
123
111
|
- LICENSE
|
124
112
|
- README.md
|
125
113
|
- Rakefile
|
126
114
|
- UPGRADE.rdoc
|
115
|
+
- circle.yml
|
127
116
|
- gemfiles/Gemfile.rails-3.2
|
128
117
|
- gemfiles/Gemfile.rails-4.0
|
129
118
|
- gemfiles/Gemfile.rails-4.1
|
@@ -185,30 +174,30 @@ files:
|
|
185
174
|
- spec/support/adapters/mongoid.yml
|
186
175
|
- spec/support/data.rb
|
187
176
|
- spec/support/schema.rb
|
177
|
+
- spec/support/stream_helpers.rb
|
188
178
|
homepage: http://eppo.github.com/rolify/
|
189
179
|
licenses:
|
190
180
|
- MIT
|
181
|
+
metadata: {}
|
191
182
|
post_install_message:
|
192
183
|
rdoc_options: []
|
193
184
|
require_paths:
|
194
185
|
- lib
|
195
186
|
required_ruby_version: !ruby/object:Gem::Requirement
|
196
|
-
none: false
|
197
187
|
requirements:
|
198
|
-
- -
|
188
|
+
- - ">="
|
199
189
|
- !ruby/object:Gem::Version
|
200
190
|
version: '0'
|
201
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
|
-
none: false
|
203
192
|
requirements:
|
204
|
-
- -
|
193
|
+
- - ">="
|
205
194
|
- !ruby/object:Gem::Version
|
206
195
|
version: '0'
|
207
196
|
requirements: []
|
208
197
|
rubyforge_project: rolify
|
209
|
-
rubygems_version:
|
198
|
+
rubygems_version: 2.2.2
|
210
199
|
signing_key:
|
211
|
-
specification_version:
|
200
|
+
specification_version: 4
|
212
201
|
summary: Roles library with resource scoping
|
213
202
|
test_files:
|
214
203
|
- spec/README.rdoc
|
@@ -240,3 +229,4 @@ test_files:
|
|
240
229
|
- spec/support/adapters/mongoid.yml
|
241
230
|
- spec/support/data.rb
|
242
231
|
- spec/support/schema.rb
|
232
|
+
- spec/support/stream_helpers.rb
|