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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.travis.yml +13 -10
  4. data/CHANGELOG.rdoc +18 -0
  5. data/Gemfile +20 -3
  6. data/README.md +91 -73
  7. data/Rakefile +27 -2
  8. data/UPGRADE.rdoc +22 -0
  9. data/gemfiles/Gemfile.rails-3.2 +21 -0
  10. data/gemfiles/Gemfile.rails-4.0 +27 -0
  11. data/lib/generators/active_record/rolify_generator.rb +50 -0
  12. data/lib/generators/active_record/templates/README +8 -0
  13. data/lib/generators/active_record/templates/migration.rb +19 -0
  14. data/lib/generators/mongoid/rolify_generator.rb +51 -0
  15. data/lib/generators/mongoid/templates/README-mongoid +4 -0
  16. data/lib/generators/rolify/rolify_generator.rb +35 -0
  17. data/lib/generators/rolify/{role/templates/README-mongoid → templates/README} +1 -5
  18. data/lib/generators/rolify/{role/templates → templates}/initializer.rb +2 -2
  19. data/lib/generators/rolify/templates/role-active_record.rb +11 -0
  20. data/lib/generators/rolify/{role/templates → templates}/role-mongoid.rb +0 -2
  21. data/lib/generators/rolify/user_generator.rb +39 -0
  22. data/lib/rolify/adapters/active_record/resource_adapter.rb +8 -7
  23. data/lib/rolify/adapters/active_record/role_adapter.rb +17 -12
  24. data/lib/rolify/adapters/base.rb +1 -1
  25. data/lib/rolify/adapters/mongoid/resource_adapter.rb +2 -2
  26. data/lib/rolify/adapters/mongoid/role_adapter.rb +24 -14
  27. data/lib/rolify/configure.rb +16 -1
  28. data/lib/rolify/finders.rb +17 -16
  29. data/lib/rolify/matchers.rb +13 -0
  30. data/lib/rolify/railtie.rb +1 -1
  31. data/lib/rolify/resource.rb +7 -2
  32. data/lib/rolify/role.rb +5 -7
  33. data/lib/rolify/version.rb +1 -1
  34. data/lib/rolify.rb +21 -15
  35. data/rolify.gemspec +5 -11
  36. data/spec/README.rdoc +24 -0
  37. data/spec/generators/rolify/{role/role_generator_spec.rb → rolify_activerecord_generator_spec.rb} +49 -39
  38. data/spec/generators/rolify/rolify_mongoid_generator_spec.rb +112 -0
  39. data/spec/generators_helper.rb +21 -0
  40. data/spec/rolify/custom_spec.rb +10 -17
  41. data/spec/rolify/matchers_spec.rb +24 -0
  42. data/spec/rolify/namespace_spec.rb +24 -0
  43. data/spec/rolify/resource_spec.rb +56 -31
  44. data/spec/rolify/resourcifed_and_rolifed_spec.rb +24 -0
  45. data/spec/rolify/role_spec.rb +9 -16
  46. data/spec/rolify/shared_contexts.rb +9 -3
  47. data/spec/rolify/shared_examples/shared_examples_for_add_role.rb +2 -2
  48. data/spec/rolify/shared_examples/shared_examples_for_callbacks.rb +12 -4
  49. data/spec/rolify/shared_examples/shared_examples_for_dynamic.rb +45 -4
  50. data/spec/rolify/shared_examples/shared_examples_for_has_any_role.rb +3 -3
  51. data/spec/rolify/shared_examples/shared_examples_for_only_has_role.rb +3 -3
  52. data/spec/rolify/shared_examples/shared_examples_for_remove_role.rb +59 -59
  53. data/spec/rolify/shared_examples/shared_examples_for_roles.rb +7 -5
  54. data/spec/rolify/shared_examples/shared_examples_for_scopes.rb +10 -10
  55. data/spec/spec_helper.rb +6 -2
  56. data/spec/support/adapters/active_record.rb +47 -9
  57. data/spec/support/adapters/mongoid.rb +85 -24
  58. data/spec/support/data.rb +15 -15
  59. data/spec/support/schema.rb +28 -17
  60. metadata +102 -83
  61. data/lib/generators/rolify/role/role_generator.rb +0 -49
  62. data/lib/generators/rolify/role/templates/README +0 -11
  63. data/lib/generators/rolify/role/templates/README-active_record +0 -21
  64. data/lib/generators/rolify/role/templates/migration.rb +0 -19
  65. 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 been created in app/models (with the name you gave as
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 orm_adapter == "active_record" %>config.use_mongoid
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
@@ -5,8 +5,6 @@ class <%= role_cname.camelize %>
5
5
  belongs_to :resource, :polymorphic => true
6
6
 
7
7
  field :name, :type => String
8
- index({ :name => 1 }, { :unique => true })
9
-
10
8
 
11
9
  index({
12
10
  :name => 1,
@@ -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)}.id)")
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.to_s.tableize)}.id IN (?) AND ((resource_id = #{quote(relation.table_name)}.id) OR (resource_id IS NULL))", roles)
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.find_or_create_by_name_and_resource_type_and_resource_id(role_name, resource_type, resource_id)
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
- roles = relation.roles.where(:name => role_name)
21
- roles = roles.where(:resource_type => (resource.is_a?(Class) ? resource.to_s : resource.class.name)) if resource
22
- roles = roles.where(:resource_id => resource.id) if resource && !resource.is_a?(Class)
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.table_name.to_sym).empty?
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
- query = relation.scoped
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
@@ -15,7 +15,7 @@ module Rolify
15
15
  end
16
16
 
17
17
  def role_table
18
- @role_cname.tableize
18
+ role_class.table_name
19
19
  end
20
20
 
21
21
  def self.create(adapter, role_cname, user_cname)
@@ -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
- # 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
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)
@@ -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
@@ -6,14 +6,7 @@ module Rolify
6
6
 
7
7
  def with_all_roles(*args)
8
8
  users = []
9
- args.each do |arg|
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.each do |arg|
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
@@ -3,7 +3,7 @@ require 'rails'
3
3
 
4
4
  module Rolify
5
5
  class Railtie < Rails::Railtie
6
- initializer 'rolify.initialize' do
6
+ initializer 'rolify.initialize', :after do
7
7
  ActiveSupport.on_load(:active_record) do
8
8
  ActiveRecord::Base.send :extend, Rolify
9
9
  end
@@ -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
- resources = self.adapter.resources_find(self.role_class.to_s.tableize, self, role_name)
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
- if self.class.role_class.where(:name => $1).count > 0
68
- resource = args.first
69
- self.class.define_dynamic_method $1, resource
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
@@ -1,3 +1,3 @@
1
1
  module Rolify
2
- VERSION = "3.2.0"
2
+ VERSION = "3.3.0"
3
3
  end
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 => "#{self.to_s.tableize}_#{options[:role_cname].tableize}" }) if Rolify.orm == "active_record"
22
- rolify_options.merge!(options.select{ |k,v| [:before_add, :after_add, :before_remove, :after_remove].include? k.to_sym }) if Rolify.orm == "active_record"
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", options[:role_cname], self.name)
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 -- {test,spec,features}/*`.split("\n")
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 "mongoid-rspec", ">= 1.5"
35
- s.add_development_dependency "bundler"
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