rolify 3.2.0 → 3.3.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/.gitignore +2 -0
- data/.travis.yml +13 -10
- data/CHANGELOG.rdoc +18 -0
- data/Gemfile +20 -3
- data/README.md +91 -73
- data/Rakefile +27 -2
- data/UPGRADE.rdoc +22 -0
- data/gemfiles/Gemfile.rails-3.2 +21 -0
- data/gemfiles/Gemfile.rails-4.0 +27 -0
- data/lib/generators/active_record/rolify_generator.rb +50 -0
- data/lib/generators/active_record/templates/README +8 -0
- data/lib/generators/active_record/templates/migration.rb +19 -0
- data/lib/generators/mongoid/rolify_generator.rb +51 -0
- data/lib/generators/mongoid/templates/README-mongoid +4 -0
- data/lib/generators/rolify/rolify_generator.rb +35 -0
- data/lib/generators/rolify/{role/templates/README-mongoid → templates/README} +1 -5
- data/lib/generators/rolify/{role/templates → templates}/initializer.rb +2 -2
- data/lib/generators/rolify/templates/role-active_record.rb +11 -0
- data/lib/generators/rolify/{role/templates → templates}/role-mongoid.rb +0 -2
- data/lib/generators/rolify/user_generator.rb +39 -0
- data/lib/rolify/adapters/active_record/resource_adapter.rb +8 -7
- data/lib/rolify/adapters/active_record/role_adapter.rb +17 -12
- data/lib/rolify/adapters/base.rb +1 -1
- data/lib/rolify/adapters/mongoid/resource_adapter.rb +2 -2
- data/lib/rolify/adapters/mongoid/role_adapter.rb +24 -14
- data/lib/rolify/configure.rb +16 -1
- data/lib/rolify/finders.rb +17 -16
- data/lib/rolify/matchers.rb +13 -0
- data/lib/rolify/railtie.rb +1 -1
- data/lib/rolify/resource.rb +7 -2
- data/lib/rolify/role.rb +5 -7
- data/lib/rolify/version.rb +1 -1
- data/lib/rolify.rb +21 -15
- data/rolify.gemspec +5 -11
- data/spec/README.rdoc +24 -0
- data/spec/generators/rolify/{role/role_generator_spec.rb → rolify_activerecord_generator_spec.rb} +49 -39
- data/spec/generators/rolify/rolify_mongoid_generator_spec.rb +112 -0
- data/spec/generators_helper.rb +21 -0
- data/spec/rolify/custom_spec.rb +10 -17
- data/spec/rolify/matchers_spec.rb +24 -0
- data/spec/rolify/namespace_spec.rb +24 -0
- data/spec/rolify/resource_spec.rb +56 -31
- data/spec/rolify/resourcifed_and_rolifed_spec.rb +24 -0
- data/spec/rolify/role_spec.rb +9 -16
- data/spec/rolify/shared_contexts.rb +9 -3
- data/spec/rolify/shared_examples/shared_examples_for_add_role.rb +2 -2
- data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +12 -4
- data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +45 -4
- data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +3 -3
- data/spec/rolify/shared_examples/shared_examples_for_only_has_role.rb +3 -3
- data/spec/rolify/shared_examples/shared_examples_for_remove_role.rb +59 -59
- data/spec/rolify/shared_examples/shared_examples_for_roles.rb +7 -5
- data/spec/rolify/shared_examples/shared_examples_for_scopes.rb +10 -10
- data/spec/spec_helper.rb +6 -2
- data/spec/support/adapters/active_record.rb +47 -9
- data/spec/support/adapters/mongoid.rb +85 -24
- data/spec/support/data.rb +15 -15
- data/spec/support/schema.rb +28 -17
- metadata +102 -83
- data/lib/generators/rolify/role/role_generator.rb +0 -49
- data/lib/generators/rolify/role/templates/README +0 -11
- data/lib/generators/rolify/role/templates/README-active_record +0 -21
- data/lib/generators/rolify/role/templates/migration.rb +0 -19
- data/lib/generators/rolify/role/templates/role-active_record.rb +0 -6
|
@@ -4,14 +4,10 @@ An initializer file has been created here: config/initializers/rolify.rb, you
|
|
|
4
4
|
can change rolify settings to match your needs.
|
|
5
5
|
Defaults values are commented out.
|
|
6
6
|
|
|
7
|
-
A Role class has been
|
|
7
|
+
A Role class has been created in app/models (with the name you gave as
|
|
8
8
|
argument otherwise the default is role.rb), you can add your own business logic
|
|
9
9
|
inside.
|
|
10
10
|
|
|
11
11
|
Inside your User class (or the name you gave as argument otherwise the default
|
|
12
12
|
is user.rb), rolify method has been inserted to provide rolify methods.
|
|
13
13
|
|
|
14
|
-
Now, if you are able to add the resourcify method inside all models you want
|
|
15
|
-
scoped by a role.
|
|
16
|
-
|
|
17
|
-
===============================================================================
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Rolify.configure do |config|
|
|
1
|
+
Rolify.configure<%= "(\"#{class_name.camelize.to_s}\")" if class_name != "Role" %> do |config|
|
|
2
2
|
# By default ORM adapter is ActiveRecord. uncomment to use mongoid
|
|
3
|
-
<%= "# " if
|
|
3
|
+
<%= "# " if options.orm == :active_record || !options.orm %>config.use_mongoid
|
|
4
4
|
|
|
5
5
|
# Dynamic shortcuts for User class (user.is_admin? like methods). Default is: false
|
|
6
6
|
# Enable this feature _after_ running rake db:migrate as it relies on the roles table
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class <%= role_cname.camelize %> < ActiveRecord::Base
|
|
2
|
+
<% if need_table_prefix?(role_cname) %>
|
|
3
|
+
def self.table_name_prefix
|
|
4
|
+
<%= table_prefix(role_cname) %>_
|
|
5
|
+
end
|
|
6
|
+
<% end %>
|
|
7
|
+
has_and_belongs_to_many :<%= user_cname.tableize %>, :join_table => :<%= "#{table_name(user_cname, true)}_#{table_name(role_cname, true)}" %>
|
|
8
|
+
belongs_to :resource, :polymorphic => true
|
|
9
|
+
|
|
10
|
+
scopify
|
|
11
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'rails/generators/migration'
|
|
2
|
+
require 'active_support/core_ext'
|
|
3
|
+
|
|
4
|
+
module Rolify
|
|
5
|
+
module Generators
|
|
6
|
+
class UserGenerator < Rails::Generators::NamedBase
|
|
7
|
+
argument :role_cname, :type => :string, :default => "Role"
|
|
8
|
+
class_option :orm, :type => :string, :default => "active_record"
|
|
9
|
+
|
|
10
|
+
desc "Inject rolify method in the User class."
|
|
11
|
+
|
|
12
|
+
def inject_user_content
|
|
13
|
+
inject_into_file(model_path, :after => inject_rolify_method) do
|
|
14
|
+
" rolify#{role_association}\n"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def inject_rolify_method
|
|
19
|
+
if options.orm == :active_record
|
|
20
|
+
/class #{class_name.camelize}\n|class #{class_name.camelize} .*\n|class #{class_name.demodulize.camelize}\n|class #{class_name.demodulize.camelize} .*\n/
|
|
21
|
+
else
|
|
22
|
+
/include Mongoid::Document\n|include Mongoid::Document .*\n/
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def model_path
|
|
27
|
+
File.join("app", "models", "#{file_path}.rb")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def role_association
|
|
31
|
+
if role_cname != "Role"
|
|
32
|
+
" :role_cname => '#{role_cname.camelize}'"
|
|
33
|
+
else
|
|
34
|
+
""
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
require 'rolify/adapters/base'
|
|
2
2
|
|
|
3
3
|
module Rolify
|
|
4
|
-
module Adapter
|
|
4
|
+
module Adapter
|
|
5
5
|
class ResourceAdapter < ResourceAdapterBase
|
|
6
6
|
def resources_find(roles_table, relation, role_name)
|
|
7
|
-
resources = relation.joins("INNER JOIN #{quote(roles_table)} ON #{quote(roles_table)}.resource_type = '#{relation.to_s}' AND
|
|
8
|
-
(#{quote(roles_table)}.resource_id IS NULL OR #{quote(roles_table)}.resource_id = #{quote(relation.table_name)}.
|
|
7
|
+
resources = relation.joins("INNER JOIN #{quote(roles_table)} ON #{quote(roles_table)}.resource_type = '#{relation.to_s}' AND
|
|
8
|
+
(#{quote(roles_table)}.resource_id IS NULL OR #{quote(roles_table)}.resource_id = #{quote(relation.table_name)}.#{relation.primary_key})")
|
|
9
9
|
resources = resources.where("#{quote(roles_table)}.name IN (?) AND #{quote(roles_table)}.resource_type = ?", Array(role_name), relation.to_s)
|
|
10
|
+
resources = resources.select("#{quote(relation.table_name)}.*")
|
|
10
11
|
resources
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def in(relation, user, role_names)
|
|
14
15
|
roles = user.roles.where(:name => role_names)
|
|
15
|
-
relation.where("#{quote(role_class.
|
|
16
|
+
relation.where("#{quote(role_class.table_name)}.#{role_class.primary_key} IN (?) AND ((resource_id = #{quote(relation.table_name)}.#{relation.primary_key}) OR (resource_id IS NULL))", roles)
|
|
16
17
|
end
|
|
17
|
-
|
|
18
|
+
|
|
18
19
|
private
|
|
19
|
-
|
|
20
|
+
|
|
20
21
|
def quote(column)
|
|
21
22
|
ActiveRecord::Base.connection.quote_column_name column
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
end
|
|
25
|
-
end
|
|
26
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'rolify/adapters/base'
|
|
2
2
|
|
|
3
3
|
module Rolify
|
|
4
|
-
module Adapter
|
|
4
|
+
module Adapter
|
|
5
5
|
class RoleAdapter < RoleAdapterBase
|
|
6
6
|
def where(relation, *args)
|
|
7
7
|
conditions, values = build_conditions(relation, args)
|
|
@@ -9,7 +9,7 @@ module Rolify
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def find_or_create_by(role_name, resource_type = nil, resource_id = nil)
|
|
12
|
-
role_class.
|
|
12
|
+
role_class.where(:name => role_name, :resource_type => resource_type, :resource_id => resource_id).first_or_create
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def add(relation, role)
|
|
@@ -17,13 +17,14 @@ module Rolify
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def remove(relation, role_name, resource = nil)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
cond = { :name => role_name }
|
|
21
|
+
cond[:resource_type] = (resource.is_a?(Class) ? resource.to_s : resource.class.name) if resource
|
|
22
|
+
cond[:resource_id] = resource.id if resource && !resource.is_a?(Class)
|
|
23
|
+
roles = relation.roles.where(cond)
|
|
23
24
|
if roles
|
|
24
25
|
relation.roles.delete(roles)
|
|
25
|
-
roles.each do |role|
|
|
26
|
-
role.destroy if role.send(user_class.
|
|
26
|
+
roles.each do |role|
|
|
27
|
+
role.destroy if role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).empty?
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
roles
|
|
@@ -32,9 +33,13 @@ module Rolify
|
|
|
32
33
|
def exists?(relation, column)
|
|
33
34
|
relation.where("#{column} IS NOT NULL")
|
|
34
35
|
end
|
|
35
|
-
|
|
36
|
+
|
|
36
37
|
def scope(relation, conditions)
|
|
37
|
-
|
|
38
|
+
if Rails.version < "4.0"
|
|
39
|
+
query = relation.scoped
|
|
40
|
+
else
|
|
41
|
+
query = relation.all
|
|
42
|
+
end
|
|
38
43
|
query = query.joins(:roles)
|
|
39
44
|
query = where(query, conditions)
|
|
40
45
|
query
|
|
@@ -66,10 +71,10 @@ module Rolify
|
|
|
66
71
|
values = [ role ]
|
|
67
72
|
if resource
|
|
68
73
|
query.insert(0, "(")
|
|
69
|
-
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id IS NULL))"
|
|
74
|
+
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id IS NULL))"
|
|
70
75
|
values << role << (resource.is_a?(Class) ? resource.to_s : resource.class.name)
|
|
71
76
|
if !resource.is_a? Class
|
|
72
|
-
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id = ?))"
|
|
77
|
+
query += " OR ((#{role_table}.name = ?) AND (#{role_table}.resource_type = ?) AND (#{role_table}.resource_id = ?))"
|
|
73
78
|
values << role << resource.class.name << resource.id
|
|
74
79
|
end
|
|
75
80
|
query += ")"
|
|
@@ -78,4 +83,4 @@ module Rolify
|
|
|
78
83
|
end
|
|
79
84
|
end
|
|
80
85
|
end
|
|
81
|
-
end
|
|
86
|
+
end
|
data/lib/rolify/adapters/base.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'rolify/adapters/base'
|
|
2
2
|
|
|
3
3
|
module Rolify
|
|
4
|
-
module Adapter
|
|
4
|
+
module Adapter
|
|
5
5
|
class ResourceAdapter < ResourceAdapterBase
|
|
6
6
|
def resources_find(roles_table, relation, role_name)
|
|
7
7
|
roles = roles_table.classify.constantize.where(:name.in => Array(role_name), :resource_type => relation.to_s)
|
|
@@ -13,7 +13,7 @@ module Rolify
|
|
|
13
13
|
resources << role.resource
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
|
-
resources.uniq
|
|
16
|
+
resources.compact.uniq
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def in(resources, user, role_names)
|
|
@@ -19,20 +19,30 @@ module Rolify
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def remove(relation, role_name, resource = nil)
|
|
22
|
-
roles = { :name => role_name }
|
|
23
|
-
roles.merge!({:resource_type => (resource.is_a?(Class) ? resource.to_s : resource.class.name)}) if resource
|
|
24
|
-
roles.merge!({ :resource_id => resource.id }) if resource && !resource.is_a?(Class)
|
|
25
|
-
roles_to_remove = relation.roles.where(roles)
|
|
26
|
-
roles_to_remove.each do |role|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
end
|
|
22
|
+
#roles = { :name => role_name }
|
|
23
|
+
#roles.merge!({:resource_type => (resource.is_a?(Class) ? resource.to_s : resource.class.name)}) if resource
|
|
24
|
+
#roles.merge!({ :resource_id => resource.id }) if resource && !resource.is_a?(Class)
|
|
25
|
+
#roles_to_remove = relation.roles.where(roles)
|
|
26
|
+
#roles_to_remove.each do |role|
|
|
27
|
+
# # Deletion in n-n relations is unreliable. Sometimes it works, sometimes not.
|
|
28
|
+
# # So, this does not work all the time: `relation.roles.delete(role)`
|
|
29
|
+
# # @see http://stackoverflow.com/questions/9132596/rails3-mongoid-many-to-many-relation-and-delete-operation
|
|
30
|
+
# # We instead remove ids from the Role object and the relation object.
|
|
31
|
+
# relation.role_ids.delete(role.id)
|
|
32
|
+
# role.send((user_class.to_s.underscore + '_ids').to_sym).delete(relation.id)
|
|
33
|
+
#
|
|
34
|
+
# role.destroy if role.send(user_class.to_s.tableize.to_sym).empty?
|
|
35
|
+
#end
|
|
36
|
+
cond = { :name => role_name }
|
|
37
|
+
cond[:resource_type] = (resource.is_a?(Class) ? resource.to_s : resource.class.name) if resource
|
|
38
|
+
cond[:resource_id] = resource.id if resource && !resource.is_a?(Class)
|
|
39
|
+
roles = relation.roles.where(cond)
|
|
40
|
+
roles.each do |role|
|
|
41
|
+
relation.roles.delete(role)
|
|
42
|
+
role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).delete(relation)
|
|
43
|
+
role.destroy if role.send(ActiveSupport::Inflector.demodulize(user_class).tableize.to_sym).empty?
|
|
44
|
+
end if roles
|
|
45
|
+
roles
|
|
36
46
|
end
|
|
37
47
|
|
|
38
48
|
def exists?(relation, column)
|
data/lib/rolify/configure.rb
CHANGED
|
@@ -3,7 +3,8 @@ module Rolify
|
|
|
3
3
|
@@dynamic_shortcuts = false
|
|
4
4
|
@@orm = "active_record"
|
|
5
5
|
|
|
6
|
-
def configure
|
|
6
|
+
def configure(*role_cnames)
|
|
7
|
+
return if !sanity_check(role_cnames)
|
|
7
8
|
yield self if block_given?
|
|
8
9
|
end
|
|
9
10
|
|
|
@@ -37,5 +38,19 @@ module Rolify
|
|
|
37
38
|
config.orm = "active_record"
|
|
38
39
|
end
|
|
39
40
|
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def sanity_check(role_cnames)
|
|
45
|
+
role_cnames = [ "Role" ] if role_cnames.empty?
|
|
46
|
+
role_cnames.each do |role_cname|
|
|
47
|
+
role_class = role_cname.constantize
|
|
48
|
+
if role_class.superclass.to_s == "ActiveRecord" && !role_class.table_exists?
|
|
49
|
+
warn "[WARN] table '#{role_cname}' doesn't exist. Did you run the migration ? Ignoring rolify config."
|
|
50
|
+
return false
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
true
|
|
54
|
+
end
|
|
40
55
|
end
|
|
41
56
|
end
|
data/lib/rolify/finders.rb
CHANGED
|
@@ -6,14 +6,7 @@ module Rolify
|
|
|
6
6
|
|
|
7
7
|
def with_all_roles(*args)
|
|
8
8
|
users = []
|
|
9
|
-
args
|
|
10
|
-
if arg.is_a? Hash
|
|
11
|
-
users_to_add = self.with_role(arg[:name], arg[:resource])
|
|
12
|
-
elsif arg.is_a?(String) || arg.is_a?(Symbol)
|
|
13
|
-
users_to_add = self.with_role(arg)
|
|
14
|
-
else
|
|
15
|
-
raise ArgumentError, "Invalid argument type: only hash or string or symbol allowed"
|
|
16
|
-
end
|
|
9
|
+
parse_args(args, users) do |users_to_add|
|
|
17
10
|
users = users_to_add if users.empty?
|
|
18
11
|
users &= users_to_add
|
|
19
12
|
return [] if users.empty?
|
|
@@ -23,17 +16,25 @@ module Rolify
|
|
|
23
16
|
|
|
24
17
|
def with_any_role(*args)
|
|
25
18
|
users = []
|
|
26
|
-
args
|
|
27
|
-
if arg.is_a? Hash
|
|
28
|
-
users_to_add = self.with_role(arg[:name], arg[:resource])
|
|
29
|
-
elsif arg.is_a?(String) || arg.is_a?(Symbol)
|
|
30
|
-
users_to_add = self.with_role(arg)
|
|
31
|
-
else
|
|
32
|
-
raise ArgumentError, "Invalid argument type: only hash or string or symbol allowed"
|
|
33
|
-
end
|
|
19
|
+
parse_args(args, users) do |users_to_add|
|
|
34
20
|
users += users_to_add
|
|
35
21
|
end
|
|
36
22
|
users.uniq
|
|
37
23
|
end
|
|
38
24
|
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def parse_args(args, users, &block)
|
|
29
|
+
args.each do |arg|
|
|
30
|
+
if arg.is_a? Hash
|
|
31
|
+
users_to_add = self.with_role(arg[:name], arg[:resource])
|
|
32
|
+
elsif arg.is_a?(String) || arg.is_a?(Symbol)
|
|
33
|
+
users_to_add = self.with_role(arg)
|
|
34
|
+
else
|
|
35
|
+
raise ArgumentError, "Invalid argument type: only hash or string or symbol allowed"
|
|
36
|
+
end
|
|
37
|
+
block.call(users_to_add)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
39
40
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
RSpec::Matchers.define :have_role do |*args|
|
|
2
|
+
match do |resource|
|
|
3
|
+
resource.has_role?(*args)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
failure_message_for_should do |resource|
|
|
7
|
+
"expected to have role #{args.map(&:inspect).join(" ")}"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
failure_message_for_should_not do |resource|
|
|
11
|
+
"expected not to have role #{args.map(&:inspect).join(" ")}"
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/rolify/railtie.rb
CHANGED
data/lib/rolify/resource.rb
CHANGED
|
@@ -8,12 +8,17 @@ module Rolify
|
|
|
8
8
|
def find_roles(role_name = nil, user = nil)
|
|
9
9
|
roles = user && (user != :any) ? user.roles : self.role_class
|
|
10
10
|
roles = roles.where(:resource_type => self.to_s)
|
|
11
|
-
roles = roles.where(:name => role_name) if role_name && (role_name != :any)
|
|
11
|
+
roles = roles.where(:name => role_name.to_s) if role_name && (role_name != :any)
|
|
12
12
|
roles
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def with_role(role_name, user = nil)
|
|
16
|
-
|
|
16
|
+
if role_name.is_a? Array
|
|
17
|
+
role_name.map!(&:to_s)
|
|
18
|
+
else
|
|
19
|
+
role_name = role_name.to_s
|
|
20
|
+
end
|
|
21
|
+
resources = self.adapter.resources_find(self.role_table_name, self, role_name)
|
|
17
22
|
user ? self.adapter.in(resources, user, role_name) : resources
|
|
18
23
|
end
|
|
19
24
|
alias :with_roles :with_role
|
data/lib/rolify/role.rb
CHANGED
|
@@ -52,7 +52,7 @@ module Rolify
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
def remove_role(role_name, resource = nil)
|
|
55
|
-
self.class.adapter.remove(self, role_name, resource)
|
|
55
|
+
self.class.adapter.remove(self, role_name.to_s, resource)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
alias_method :revoke, :remove_role
|
|
@@ -64,11 +64,9 @@ module Rolify
|
|
|
64
64
|
|
|
65
65
|
def method_missing(method, *args, &block)
|
|
66
66
|
if method.to_s.match(/^is_(\w+)_of[?]$/) || method.to_s.match(/^is_(\w+)[?]$/)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return has_role?("#{$1}", resource)
|
|
71
|
-
end
|
|
67
|
+
resource = args.first
|
|
68
|
+
self.class.define_dynamic_method $1, resource
|
|
69
|
+
return has_role?("#{$1}", resource)
|
|
72
70
|
end unless !Rolify.dynamic_shortcuts
|
|
73
71
|
super
|
|
74
72
|
end
|
|
@@ -84,4 +82,4 @@ module Rolify
|
|
|
84
82
|
end
|
|
85
83
|
end
|
|
86
84
|
end
|
|
87
|
-
end
|
|
85
|
+
end
|
data/lib/rolify/version.rb
CHANGED
data/lib/rolify.rb
CHANGED
|
@@ -9,42 +9,48 @@ require 'rolify/adapters/base'
|
|
|
9
9
|
module Rolify
|
|
10
10
|
extend Configure
|
|
11
11
|
|
|
12
|
-
attr_accessor :role_cname, :adapter
|
|
12
|
+
attr_accessor :role_cname, :adapter, :role_join_table_name, :role_table_name
|
|
13
13
|
|
|
14
14
|
def rolify(options = {})
|
|
15
15
|
include Role
|
|
16
16
|
extend Dynamic if Rolify.dynamic_shortcuts
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
options.reverse_merge!({:role_cname => 'Role'})
|
|
19
|
+
self.role_cname = options[:role_cname]
|
|
20
|
+
self.role_table_name = self.role_cname.tableize.gsub(/\//, "_")
|
|
21
|
+
|
|
22
|
+
default_join_table = "#{self.to_s.tableize.gsub(/\//, "_")}_#{self.role_table_name}"
|
|
23
|
+
options.reverse_merge!({:role_join_table_name => default_join_table})
|
|
24
|
+
self.role_join_table_name = options[:role_join_table_name]
|
|
19
25
|
|
|
20
26
|
rolify_options = { :class_name => options[:role_cname].camelize }
|
|
21
|
-
rolify_options.merge!({ :join_table =>
|
|
22
|
-
rolify_options.merge!(options.
|
|
27
|
+
rolify_options.merge!({ :join_table => self.role_join_table_name }) if Rolify.orm == "active_record"
|
|
28
|
+
rolify_options.merge!(options.reject{ |k,v| ![ :before_add, :after_add, :before_remove, :after_remove ].include? k.to_sym })
|
|
23
29
|
|
|
24
30
|
has_and_belongs_to_many :roles, rolify_options
|
|
25
31
|
|
|
26
|
-
self.adapter = Rolify::Adapter::Base.create("role_adapter",
|
|
27
|
-
self.role_cname = options[:role_cname]
|
|
28
|
-
|
|
32
|
+
self.adapter = Rolify::Adapter::Base.create("role_adapter", self.role_cname, self.name)
|
|
29
33
|
load_dynamic_methods if Rolify.dynamic_shortcuts
|
|
30
34
|
end
|
|
31
35
|
|
|
32
|
-
def resourcify(options = {})
|
|
36
|
+
def resourcify(association_name = :roles, options = {})
|
|
33
37
|
include Resource
|
|
34
|
-
|
|
38
|
+
|
|
35
39
|
options.reverse_merge!({ :role_cname => 'Role', :dependent => :destroy })
|
|
36
40
|
resourcify_options = { :class_name => options[:role_cname].camelize, :as => :resource, :dependent => options[:dependent] }
|
|
37
|
-
has_many :roles, resourcify_options
|
|
38
|
-
|
|
39
|
-
self.adapter = Rolify::Adapter::Base.create("resource_adapter", options[:role_cname], self.name)
|
|
40
41
|
self.role_cname = options[:role_cname]
|
|
42
|
+
self.role_table_name = self.role_cname.tableize.gsub(/\//, "_")
|
|
43
|
+
|
|
44
|
+
has_many association_name, resourcify_options
|
|
45
|
+
|
|
46
|
+
self.adapter = Rolify::Adapter::Base.create("resource_adapter", self.role_cname, self.name)
|
|
41
47
|
end
|
|
42
|
-
|
|
48
|
+
|
|
43
49
|
def scopify
|
|
44
50
|
require "rolify/adapters/#{Rolify.orm}/scopes.rb"
|
|
45
|
-
extend Rolify::Adapter::Scopes
|
|
51
|
+
extend Rolify::Adapter::Scopes
|
|
46
52
|
end
|
|
47
|
-
|
|
53
|
+
|
|
48
54
|
def role_class
|
|
49
55
|
self.role_cname.constantize
|
|
50
56
|
end
|
data/rolify.gemspec
CHANGED
|
@@ -15,22 +15,16 @@ Gem::Specification.new do |s|
|
|
|
15
15
|
s.rubyforge_project = s.name
|
|
16
16
|
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
|
18
|
-
s.test_files = `git ls-files --
|
|
18
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
20
|
s.require_paths = ["lib"]
|
|
21
21
|
|
|
22
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
|
23
|
-
s.add_development_dependency "activerecord-jdbcsqlite3-adapter"
|
|
24
|
-
else
|
|
25
|
-
s.add_development_dependency "sqlite3"
|
|
26
|
-
s.add_development_dependency "bson_ext" if RUBY_VERSION < "2.0.0"
|
|
27
|
-
end
|
|
28
|
-
s.add_development_dependency "activerecord", ">= 3.1.0"
|
|
29
|
-
s.add_development_dependency "mongoid", ">= 3.0"
|
|
30
22
|
s.add_development_dependency "ammeter"
|
|
31
23
|
s.add_development_dependency "rake"
|
|
32
24
|
s.add_development_dependency "rspec", ">= 2.0"
|
|
33
25
|
s.add_development_dependency "rspec-rails", ">= 2.0"
|
|
34
|
-
s.add_development_dependency "
|
|
35
|
-
s.add_development_dependency "
|
|
26
|
+
s.add_development_dependency "bundler"
|
|
27
|
+
s.add_development_dependency "fuubar"
|
|
28
|
+
s.add_development_dependency "activerecord", ">= 3.2.0"
|
|
29
|
+
s.add_development_dependency "mongoid", ">= 3.1"
|
|
36
30
|
end
|
data/spec/README.rdoc
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
= Rolify Specs
|
|
2
|
+
|
|
3
|
+
== Running the specs
|
|
4
|
+
|
|
5
|
+
To run the specs first run the +bundle+ command to install the necessary gems and the +rake+ command to run the specs.
|
|
6
|
+
|
|
7
|
+
bundle
|
|
8
|
+
rake
|
|
9
|
+
|
|
10
|
+
== Model Adapters
|
|
11
|
+
|
|
12
|
+
Rolify currently supports 2 different ORMs: ActiveRecord and Mongoid. By default it will use Active Record but you can change this by setting the +ADAPTER+ environment variable before running the specs. You can run the +bundle+ command with this as well to ensure you have all the required gems.
|
|
13
|
+
|
|
14
|
+
ADAPTER=mongoid bundle
|
|
15
|
+
ADAPTER=mongoid rake
|
|
16
|
+
|
|
17
|
+
The different model adapters you can specify are:
|
|
18
|
+
|
|
19
|
+
* active_record (default)
|
|
20
|
+
* mongoid
|
|
21
|
+
|
|
22
|
+
You can also run the +spec_all+ rake task to run specs for each adapter.
|
|
23
|
+
|
|
24
|
+
rake spec_all
|