monarchy 1.1.5 → 2.0.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +26 -0
  3. data/.gitignore +6 -6
  4. data/.rubocop.yml +3 -3
  5. data/CHANGELOG.md +11 -0
  6. data/Gemfile +4 -3
  7. data/Gemfile.lock +54 -53
  8. data/README.md +1 -0
  9. data/app/models/monarchy/hierarchy.rb +0 -1
  10. data/docs/acts_as_hierarchy.md +45 -0
  11. data/docs/acts_as_resource.md +103 -0
  12. data/docs/acts_as_user.md +52 -0
  13. data/docs/configuration.md +54 -0
  14. data/docs/installation.md +30 -0
  15. data/docs/usage.md +22 -0
  16. data/dummy/.rspec +2 -0
  17. data/dummy/README.rdoc +28 -0
  18. data/dummy/Rakefile +7 -0
  19. data/dummy/app/assets/images/.keep +0 -0
  20. data/dummy/app/assets/javascripts/application.js +13 -0
  21. data/dummy/app/assets/stylesheets/application.css +15 -0
  22. data/dummy/app/controllers/application_controller.rb +6 -0
  23. data/dummy/app/controllers/concerns/.keep +0 -0
  24. data/dummy/app/helpers/application_helper.rb +3 -0
  25. data/dummy/app/mailers/.keep +0 -0
  26. data/dummy/app/models/.keep +0 -0
  27. data/dummy/app/models/concerns/.keep +0 -0
  28. data/dummy/app/models/member.rb +4 -0
  29. data/dummy/app/models/memo.rb +5 -0
  30. data/dummy/app/models/project.rb +12 -0
  31. data/dummy/app/models/resource.rb +4 -0
  32. data/dummy/app/models/role.rb +4 -0
  33. data/dummy/app/models/status.rb +5 -0
  34. data/dummy/app/models/task.rb +5 -0
  35. data/dummy/app/models/user.rb +4 -0
  36. data/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/dummy/bin/bundle +4 -0
  38. data/dummy/bin/rails +5 -0
  39. data/dummy/bin/rake +5 -0
  40. data/dummy/bin/setup +30 -0
  41. data/dummy/config/application.rb +25 -0
  42. data/dummy/config/boot.rb +6 -0
  43. data/dummy/config/database.yml +10 -0
  44. data/dummy/config/environment.rb +6 -0
  45. data/dummy/config/environments/development.rb +42 -0
  46. data/dummy/config/environments/production.rb +80 -0
  47. data/dummy/config/environments/test.rb +43 -0
  48. data/dummy/config/initializers/assets.rb +12 -0
  49. data/dummy/config/initializers/backtrace_silencers.rb +8 -0
  50. data/dummy/config/initializers/cookies_serializer.rb +4 -0
  51. data/dummy/config/initializers/filter_parameter_logging.rb +5 -0
  52. data/dummy/config/initializers/inflections.rb +17 -0
  53. data/dummy/config/initializers/mime_types.rb +5 -0
  54. data/dummy/config/initializers/monarchy.rb +46 -0
  55. data/dummy/config/initializers/session_store.rb +4 -0
  56. data/dummy/config/initializers/wrap_parameters.rb +15 -0
  57. data/dummy/config/locales/en.yml +23 -0
  58. data/dummy/config/routes.rb +57 -0
  59. data/dummy/config/secrets.yml +22 -0
  60. data/dummy/config.ru +5 -0
  61. data/dummy/db/migrate/20160220215254_monarchy_create_users.rb +7 -0
  62. data/dummy/db/migrate/20160221132205_monarchy_create_hierarchies.rb +22 -0
  63. data/dummy/db/migrate/20160221133215_monarchy_create_memberships.rb +38 -0
  64. data/dummy/db/migrate/20160221142305_create_memo_resource.rb +8 -0
  65. data/dummy/db/migrate/20160221142309_create_project_resource.rb +8 -0
  66. data/dummy/db/migrate/20160221154113_create_resource_resource.rb +8 -0
  67. data/dummy/db/migrate/20160306124820_add_memo_to_resource.rb +6 -0
  68. data/dummy/db/migrate/20160502212213_parent_as_setup.rb +7 -0
  69. data/dummy/db/migrate/20160815163909_task_model.rb +10 -0
  70. data/dummy/db/migrate/20160818205534_status.rb +9 -0
  71. data/dummy/db/schema.rb +111 -0
  72. data/dummy/lib/assets/.keep +0 -0
  73. data/dummy/public/404.html +67 -0
  74. data/dummy/public/422.html +67 -0
  75. data/dummy/public/500.html +66 -0
  76. data/dummy/public/favicon.ico +0 -0
  77. data/dummy/spec +1 -0
  78. data/lib/generators/templates/config.rb +44 -7
  79. data/lib/monarchy/acts_as_hierarchy.rb +12 -11
  80. data/lib/monarchy/acts_as_member.rb +8 -17
  81. data/lib/monarchy/acts_as_resource.rb +35 -22
  82. data/lib/monarchy/acts_as_user.rb +51 -39
  83. data/lib/monarchy/exceptions.rb +135 -0
  84. data/lib/monarchy/tasks.rb +1 -1
  85. data/lib/monarchy/validators.rb +83 -0
  86. data/lib/monarchy/version.rb +1 -1
  87. data/lib/monarchy.rb +21 -8
  88. data/monarchy.gemspec +4 -4
  89. metadata +85 -13
@@ -13,10 +13,7 @@ module Monarchy
13
13
  after_update :assign_parent
14
14
  after_create :ensure_hierarchy, :assign_parent
15
15
 
16
- has_many :members, through: :hierarchy, class_name: "::#{Monarchy.member_class}"
17
- has_many :users, through: :members, class_name: "::#{Monarchy.user_class}"
18
- has_one :hierarchy, as: :resource, dependent: :destroy, class_name: 'Monarchy::Hierarchy'
19
-
16
+ include_relationships
20
17
  include_scopes
21
18
 
22
19
  include Monarchy::ActsAsResource::InstanceMethods
@@ -24,7 +21,16 @@ module Monarchy
24
21
  end
25
22
 
26
23
  module SupportMethods
27
- attr_accessor :parentize, :acting_as_resource, :automatic_hierarchy
24
+ attr_accessor :automatic_hierarchy
25
+ attr_reader :acting_as_resource, :parentize_name
26
+
27
+ def default_role_name
28
+ Monarchy.configuration.inherited_default_role
29
+ end
30
+
31
+ def default_role
32
+ @default_role ||= Monarchy.role_class.find_by(name: default_role_name)
33
+ end
28
34
 
29
35
  private
30
36
 
@@ -35,18 +41,26 @@ module Monarchy
35
41
  end
36
42
 
37
43
  def parent_as(name)
38
- self.parentize = name
44
+ @parentize_name = name
39
45
  end
40
46
 
41
47
  def include_scopes
42
- scope :in, (lambda do |resource|
43
- joins(:hierarchy).where(monarchy_hierarchies: { parent_id: resource.hierarchy.self_and_descendants })
48
+ scope :in, (lambda do |resource, descendants = true|
49
+ Monarchy::Validators.resource(resource)
50
+ hierarchies = Monarchy.hierarchy_class.in(resource.hierarchy, descendants)
51
+ joins(:hierarchy).where(monarchy_hierarchies: { id: hierarchies })
44
52
  end)
45
53
 
46
54
  scope :accessible_for, (lambda do |user|
47
- joins(:hierarchy).where(monarchy_hierarchies: { id: Monarchy::Hierarchy.accessible_for(user) })
55
+ joins(:hierarchy).where(monarchy_hierarchies: { id: Monarchy.hierarchy_class.accessible_for(user) })
48
56
  end)
49
57
  end
58
+
59
+ def include_relationships
60
+ has_many :members, through: :hierarchy, class_name: "::#{Monarchy.member_class}"
61
+ has_many :users, through: :members, class_name: "::#{Monarchy.user_class}"
62
+ has_one :hierarchy, as: :resource, dependent: :destroy, class_name: "::#{Monarchy.hierarchy_class}"
63
+ end
50
64
  end
51
65
 
52
66
  module InstanceMethods
@@ -55,11 +69,9 @@ module Monarchy
55
69
  end
56
70
 
57
71
  def parent=(resource)
58
- if hierarchy
59
- hierarchy.update(parent: resource.try(:ensure_hierarchy))
60
- else
61
- @parent = resource
62
- end
72
+ Monarchy::Validators.resource(resource, true)
73
+ hierarchy&.update(parent: resource.try(:ensure_hierarchy))
74
+ @parent = resource
63
75
  end
64
76
 
65
77
  def children
@@ -67,12 +79,12 @@ module Monarchy
67
79
  end
68
80
 
69
81
  def children=(array)
70
- hierarchy.update(children: hierarchies_for(array)) if hierarchy
82
+ hierarchy&.update(children: hierarchies_for(array))
71
83
  @children = array
72
84
  end
73
85
 
74
86
  def ensure_hierarchy(force = false)
75
- self.hierarchy ||= Monarchy::Hierarchy.create(
87
+ self.hierarchy ||= Monarchy.hierarchy_class.create(
76
88
  resource: self,
77
89
  parent: parent.try(:hierarchy),
78
90
  children: hierarchies_for(children)
@@ -82,12 +94,12 @@ module Monarchy
82
94
  private
83
95
 
84
96
  def assign_parent(force = false)
85
- parentize = self.class.parentize
97
+ parentize = self.class.parentize_name
98
+ return unless parentize
86
99
 
87
- if parentize
88
- was_changed = changes["#{parentize}_id"] || changes["#{parentize}_type"]
89
- self.parent = send(parentize) if was_changed || force
90
- end
100
+ was_changed = changes["#{parentize}_id"] || changes["#{parentize}_type"]
101
+ Monarchy::Validators.resource(send(parentize), true, false)
102
+ self.parent = send(parentize) if was_changed || force
91
103
  end
92
104
 
93
105
  def children_resources
@@ -97,7 +109,8 @@ module Monarchy
97
109
  end
98
110
 
99
111
  def hierarchies_for(array)
100
- Array(array).map(&:hierarchy)
112
+ array&.compact!
113
+ Array(array).map { |resource| Monarchy::Validators.resource(resource).hierarchy }
101
114
  end
102
115
  end
103
116
  end
@@ -6,10 +6,10 @@ module Monarchy
6
6
  module ClassMethods
7
7
  def acts_as_user
8
8
  has_many :members, class_name: "::#{Monarchy.member_class}", dependent: :destroy
9
- has_many :hierarchies, through: :members, class_name: 'Monarchy::Hierarchy'
9
+ has_many :hierarchies, through: :members, class_name: "::#{Monarchy.hierarchy_class}"
10
10
 
11
11
  scope :accessible_for, (lambda do |user|
12
- where(id: Monarchy::Hierarchy.accessible_for(user)
12
+ where(id: Monarchy.hierarchy_class.accessible_for(user)
13
13
  .joins(members: [:user]).select(:user_id)).union(where(id: user.id))
14
14
  end)
15
15
 
@@ -18,24 +18,26 @@ module Monarchy
18
18
  end
19
19
 
20
20
  module InstanceMethods
21
- def roles_for(resource, inheritence = true)
22
- return Monarchy.role_class.none unless resource.hierarchy
23
- accessible_roles_for(resource, inheritence)
21
+ def roles_for(resource, inheritance = true)
22
+ Monarchy::Validators.resource(resource, false, false)
23
+ accessible_roles_for(resource, inheritance)
24
24
  end
25
25
 
26
26
  def member_for(resource)
27
+ Monarchy::Validators.resource(resource)
27
28
  resource.hierarchy.members.where(monarchy_members: { user_id: id }).first
28
29
  end
29
30
 
30
- def grant(role_name, resource)
31
+ def grant(*role_names, resource)
31
32
  ActiveRecord::Base.transaction do
32
- grant_or_create_member(role_name, resource)
33
+ grant_or_create_member(role_names, resource)
33
34
  end
34
35
  end
35
36
 
36
- def revoke_access(resource, hierarchy_ids = nil)
37
- hierarchy_ids ||= resource.hierarchy.self_and_descendant_ids
38
- members_for(hierarchy_ids).delete_all
37
+ def revoke_access(resource, hierarchies = nil)
38
+ Monarchy::Validators.resource(resource)
39
+ hierarchies ||= resource.hierarchy.self_and_descendants
40
+ members_for(hierarchies).delete_all
39
41
  end
40
42
 
41
43
  def revoke_role(role_name, resource)
@@ -43,14 +45,15 @@ module Monarchy
43
45
  end
44
46
 
45
47
  def revoke_role!(role_name, resource)
46
- revoking_role(role_name, resource, true)
48
+ revoking_role(role_name, resource, Monarchy.configuration.revoke_strategy)
47
49
  end
48
50
 
49
51
  private
50
52
 
51
53
  def accessible_roles_for(resource, inheritnce)
54
+ return Monarchy.role_class.none unless resource.hierarchy
52
55
  accessible_roles = if inheritnce
53
- resource_and_inheritence_roles(resource)
56
+ resource_and_inheritance_roles(resource)
54
57
  else
55
58
  resource_roles(resource).order('level desc')
56
59
  end
@@ -58,7 +61,7 @@ module Monarchy
58
61
  accessible_roles.present? ? accessible_roles : descendant_role(resource)
59
62
  end
60
63
 
61
- def resource_and_inheritence_roles(resource)
64
+ def resource_and_inheritance_roles(resource)
62
65
  hierarchy_ids = resource.hierarchy.ancestors.select(:id)
63
66
  Monarchy.role_class.where(id:
64
67
  Monarchy.role_class.joins(:members).where('monarchy_members.user_id': id)
@@ -71,52 +74,61 @@ module Monarchy
71
74
  def resource_roles(resource)
72
75
  Monarchy.role_class.joins(:members)
73
76
  .where('monarchy_members.hierarchy_id': resource.hierarchy.id, 'monarchy_members.user_id': id)
74
- .distinct
75
77
  end
76
78
 
77
79
  def descendant_role(resource)
78
- descendant_ids = resource.hierarchy.descendant_ids
79
- children_access = members_for(descendant_ids).present?
80
- children_access ? Monarchy.role_class.where(id: default_role) : Monarchy.role_class.none
80
+ descendants = resource.hierarchy.descendants
81
+ children_access = members_for(descendants).present?
82
+ children_access ? Monarchy.role_class.where(id: inherited_default_role) : Monarchy.role_class.none
81
83
  end
82
84
 
83
- def revoking_role(role_name, resource, force = false)
84
- member_roles = member_for(resource).try(:members_roles)
85
+ def revoking_role(role_name, resource, strategy = nil)
86
+ Monarchy::Validators.resource(resource)
87
+ role = Monarchy::Validators.role_name(role_name)
88
+
89
+ member = member_for(resource)
90
+ member_roles = member.try(:members_roles)
85
91
  return 0 if member_roles.nil?
86
92
 
87
- return revoke_access(resource) if last_role?(member_roles, role_name) && force
88
- member_roles.joins(:role).where(monarchy_roles: { name: role_name }).delete_all
93
+ revoking_last_role(role, resource, strategy) if Monarchy::Validators.last_role?(member, role)
94
+ member_roles.where(role: role).delete_all
89
95
  end
90
96
 
91
- def grant_or_create_member(role_name, resource)
92
- role = Monarchy.role_class.find_by(name: role_name)
93
- raise 'Role does not exist' unless role
97
+ def revoking_last_role(role, resource, strategy)
98
+ case strategy
99
+ when :revoke_access
100
+ return revoke_access(resource)
101
+ when :revoke_member
102
+ return member_for(resource).delete
103
+ else
104
+ default_role = Monarchy::Validators.default_role?(resource, role)
105
+ raise Monarchy::Exceptions::RoleNotRevokable if default_role
106
+
107
+ grant(resource.class.default_role_name, resource)
108
+ end
109
+ end
94
110
 
111
+ def grant_or_create_member(role_names, resource)
112
+ Monarchy::Validators.resource(resource)
113
+ roles = Monarchy::Validators.role_names(role_names)
95
114
  member = member_for(resource)
115
+
96
116
  if member
97
- Monarchy::MembersRole.create(member: member, role: role)
117
+ member_roles = roles.map { |role| { member: member, role: role } }
118
+ Monarchy::MembersRole.create(member_roles)
98
119
  else
99
- member = Monarchy.member_class.create(user: self, hierarchy: resource.hierarchy, roles: [role])
120
+ member = Monarchy.member_class.create(user: self, hierarchy: resource.hierarchy, roles: roles)
100
121
  end
101
122
 
102
123
  member
103
124
  end
104
125
 
105
- def members_for(hierarchy_ids)
106
- Monarchy.member_class.where(hierarchy_id: hierarchy_ids, user_id: id)
107
- end
108
-
109
- def default_role
110
- @default_role ||= Monarchy.role_class.find_by(name: Monarchy.configuration.default_role.name)
111
- end
112
-
113
- def last_role?(member_roles, role_name = nil)
114
- role_name ||= default_role.name
115
- member_roles.count == 1 && member_roles.first.role.name == role_name.to_s
126
+ def members_for(hierarchies)
127
+ Monarchy.member_class.where(hierarchy: hierarchies, user_id: id)
116
128
  end
117
129
 
118
- def default_role?(role_name)
119
- default_role.name.to_s == role_name.to_s
130
+ def inherited_default_role
131
+ @inherited_default_role ||= Monarchy.role_class.find_by(name: Monarchy.configuration.inherited_default_role)
120
132
  end
121
133
  end
122
134
  end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+ module Monarchy
3
+ module Exceptions
4
+ class Error < StandardError; end
5
+
6
+ class ClassNotDefined < Error
7
+ def initialize(class_name)
8
+ @class_name = class_name
9
+ end
10
+
11
+ def message
12
+ "#{@class_name} class has to be initialized or exist!"
13
+ end
14
+ end
15
+
16
+ class ConfigNotDefined < Error
17
+ def initialize(property)
18
+ @property = property
19
+ end
20
+
21
+ def message
22
+ "Monarchy requires a #{@property} to be configured!"
23
+ end
24
+ end
25
+
26
+ class RoleNotExist < Error
27
+ def initialize(role_name)
28
+ @role_name = role_name
29
+ end
30
+
31
+ def message
32
+ "Role '#{@role_name}' does not exist"
33
+ end
34
+ end
35
+
36
+ class ModelNotResource < Error
37
+ def initialize(resource)
38
+ @resource = resource
39
+ end
40
+
41
+ def message
42
+ "Model '#{@resource.class}' is not acting as resource!"
43
+ end
44
+ end
45
+
46
+ class ModelNotHierarchy < Error
47
+ def initialize(resource)
48
+ @resource = resource
49
+ end
50
+
51
+ def message
52
+ "Model '#{@resource.class}' is not a hierarchy!"
53
+ end
54
+ end
55
+
56
+ class ModelNotMember < Error
57
+ def initialize(member)
58
+ @member = member
59
+ end
60
+
61
+ def message
62
+ "Model '#{@member.class}' is not acting as member!"
63
+ end
64
+ end
65
+
66
+ class ModelNotRole < Error
67
+ def initialize(role)
68
+ @role = role
69
+ end
70
+
71
+ def message
72
+ "Model '#{@role.class}' is not acting as role!"
73
+ end
74
+ end
75
+
76
+ class ModelNotUser < Error
77
+ def initialize(user)
78
+ @user = user
79
+ end
80
+
81
+ def message
82
+ "Model '#{@user.class}' is not acting as user!"
83
+ end
84
+ end
85
+
86
+ class RoleNotRevokable < Error
87
+ def message
88
+ "Can not revoke default role when no more roles exists! \
89
+ (Use 'revoke_role!' if you know what you are doing )"
90
+ end
91
+ end
92
+
93
+ class ResourceIsNil < Error
94
+ def message
95
+ 'Resource can NOT be nil!'
96
+ end
97
+ end
98
+
99
+ class HierarchyIsNil < Error
100
+ def message
101
+ 'Hierarchy can NOT be nil!'
102
+ end
103
+ end
104
+
105
+ class UserIsNil < Error
106
+ def message
107
+ 'User can NOT be nil!'
108
+ end
109
+ end
110
+
111
+ class MemberIsNil < Error
112
+ def message
113
+ 'Member can NOT be nil!'
114
+ end
115
+ end
116
+
117
+ class RoleIsNil < Error
118
+ def message
119
+ 'Role can NOT be nil!'
120
+ end
121
+ end
122
+
123
+ class ResourceNotPersist < Error
124
+ def message
125
+ 'Resource has to persisted!'
126
+ end
127
+ end
128
+
129
+ class HierarchyNotPersist < Error
130
+ def message
131
+ 'Resource has to persisted!'
132
+ end
133
+ end
134
+ end
135
+ end
@@ -31,7 +31,7 @@ module Monarchy
31
31
  end
32
32
  end
33
33
 
34
- Monarchy::Hierarchy.rebuild!
34
+ Monarchy.hierarchy_class.rebuild!
35
35
  p 'Monarchy reparentize ended!'
36
36
  end
37
37
  end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+ module Monarchy
3
+ module Validators
4
+ class << self
5
+ def last_role?(member, role)
6
+ member(member)
7
+ role(role)
8
+ (member.roles - [role]).empty?
9
+ end
10
+
11
+ def default_role?(resource, role)
12
+ resource(resource)
13
+ role(role)
14
+
15
+ role == resource.class.default_role
16
+ end
17
+
18
+ def role_name(role_name)
19
+ role = Monarchy.role_class.find_by(name: role_name)
20
+ role || raise(Monarchy::Exceptions::RoleNotExist, role_name)
21
+ end
22
+
23
+ def role_names(*role_names)
24
+ role_names.flatten!
25
+ roles = Monarchy.role_class.where(name: role_names)
26
+ wrong_names = role_names.map(&:to_s) - roles.map(&:name)
27
+ wrong_names.each { |name| raise(Monarchy::Exceptions::RoleNotExist, name) }
28
+ roles
29
+ end
30
+
31
+ def resource(resource, allow_nil = false, persistance = true)
32
+ raise Monarchy::Exceptions::ResourceIsNil if !resource && !allow_nil
33
+
34
+ model = check_model_class(resource, 'ModelNotResource') do
35
+ resource.class.try(:acting_as_resource)
36
+ end
37
+
38
+ persistance && resource && !resource.persisted? ? raise(Monarchy::Exceptions::ResourceNotPersist) : model
39
+ end
40
+
41
+ def hierarchy(hierarchy, allow_nil = false, persistance = true)
42
+ raise Monarchy::Exceptions::HierarchyIsNil if !hierarchy && !allow_nil
43
+
44
+ model = check_model_class(hierarchy, 'ModelNotHierarchy') do
45
+ hierarchy.is_a?(Monarchy.hierarchy_class)
46
+ end
47
+
48
+ persistance && hierarchy && !hierarchy.persisted? ? raise(Monarchy::Exceptions::HierarchyNotPersist) : model
49
+ end
50
+
51
+ def user(user, allow_nil = false)
52
+ raise Monarchy::Exceptions::UserIsNil if !user && !allow_nil
53
+ model_is_class(user, Monarchy.user_class, 'ModelNotUser')
54
+ end
55
+
56
+ def member(member, allow_nil = false)
57
+ raise Monarchy::Exceptions::MemberIsNil if !member && !allow_nil
58
+ model_is_class(member, Monarchy.member_class, 'ModelNotMember')
59
+ end
60
+
61
+ def role(role, allow_nil = false)
62
+ raise Monarchy::Exceptions::RoleIsNil if !role && !allow_nil
63
+ model_is_class(role, Monarchy.role_class, 'ModelNotRole')
64
+ end
65
+
66
+ private
67
+
68
+ def check_model_class(model, exception_class)
69
+ if yield
70
+ model
71
+ elsif model
72
+ raise "Monarchy::Exceptions::#{exception_class}".constantize, model
73
+ end
74
+ end
75
+
76
+ def model_is_class(model, klass, exception_class)
77
+ check_model_class(model, exception_class) do
78
+ model.is_a?(klass)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Monarchy
3
- VERSION = '1.1.5'
3
+ VERSION = '2.0.0-beta.1'
4
4
  end
data/lib/monarchy.rb CHANGED
@@ -3,12 +3,14 @@ require 'closure_tree'
3
3
  require 'configurations'
4
4
  require 'active_record_union'
5
5
 
6
+ require 'monarchy/exceptions'
7
+ require 'monarchy/validators'
6
8
  require 'monarchy/tasks'
7
9
  require 'monarchy/engine'
8
10
 
9
- require 'monarchy/acts_as_user'
10
11
  require 'monarchy/acts_as_role'
11
12
  require 'monarchy/acts_as_member'
13
+ require 'monarchy/acts_as_user'
12
14
  require 'monarchy/acts_as_resource'
13
15
  require 'monarchy/acts_as_hierarchy'
14
16
 
@@ -24,23 +26,34 @@ module Monarchy
24
26
  configuration_defaults do |config|
25
27
  config.member_class_name = 'Monarchy::Member'
26
28
  config.role_class_name = 'Monarchy::Role'
27
- config.member_force_revoke = false
29
+ config.hierarchy_class_name = 'Monarchy::Hierarchy'
30
+ config.members_access_revoke = false
31
+ config.revoke_strategy = :revoke_member
28
32
  end
29
33
 
30
- not_configured do |prop|
31
- raise NoMethodError, "Monarchy requires a #{prop} to be configured"
34
+ not_configured do |property|
35
+ raise Monarchy::Exceptions::ConfigNotDefined, property
32
36
  end
33
37
 
34
38
  def self.member_class
35
- Monarchy.configuration.member_class_name.safe_constantize
39
+ Monarchy.configuration.member_class_name.safe_constantize || class_not_defined('Member')
36
40
  end
37
41
 
38
42
  def self.role_class
39
- Monarchy.configuration.role_class_name.safe_constantize
43
+ Monarchy.configuration.role_class_name.safe_constantize || class_not_defined('Role')
40
44
  end
41
45
 
42
46
  def self.user_class
43
- klass = Monarchy.configuration.user_class_name.safe_constantize
44
- klass ? klass : raise(ArgumentError, 'User class has to be initialized or exist!')
47
+ Monarchy.configuration.user_class_name.safe_constantize || class_not_defined('User')
48
+ end
49
+
50
+ def self.hierarchy_class
51
+ Monarchy.configuration.hierarchy_class_name.safe_constantize || class_not_defined('Hierarchy')
52
+ end
53
+
54
+ private
55
+
56
+ def class_not_defined(class_name)
57
+ raise Monarchy::Exceptions::ClassNotDefined, class_name
45
58
  end
46
59
  end
data/monarchy.gemspec CHANGED
@@ -25,13 +25,13 @@ Gem::Specification.new do |s|
25
25
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  s.require_paths = ['lib']
27
27
 
28
- s.add_runtime_dependency 'rails', '~> 4.2', '>= 4.2.4'
29
- s.add_dependency 'closure_tree', '6.1.0'
30
- s.add_dependency 'configurations', '2.2.0'
28
+ s.add_runtime_dependency 'rails', '~> 4.2', '>= 4.2.7.1'
29
+ s.add_dependency 'closure_tree', '6.2.0'
30
+ s.add_dependency 'configurations', '2.2.1'
31
31
  s.add_dependency 'active_record_union', '1.2.0'
32
32
  s.add_dependency 'tqdm', '0.3.0'
33
33
 
34
34
  s.add_development_dependency 'bundler', '~> 1.12'
35
- s.add_development_dependency 'rake', '~> 11.1'
35
+ s.add_development_dependency 'rake', '~> 11.3'
36
36
  s.add_development_dependency 'rspec', '3.5.0'
37
37
  end