rabarber 1.4.1 → 2.0.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.
@@ -1,20 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "singleton"
4
+
3
5
  module Rabarber
4
6
  class Configuration
5
7
  include Singleton
6
8
 
7
- attr_reader :audit_trail_enabled, :cache_enabled, :current_user_method, :must_have_roles,
8
- :when_actions_missing, :when_roles_missing, :when_unauthorized
9
+ attr_reader :audit_trail_enabled, :cache_enabled, :current_user_method, :must_have_roles
9
10
 
10
11
  def initialize
11
12
  @audit_trail_enabled = default_audit_trail_enabled
12
13
  @cache_enabled = default_cache_enabled
13
14
  @current_user_method = default_current_user_method
14
15
  @must_have_roles = default_must_have_roles
15
- @when_actions_missing = default_when_actions_missing
16
- @when_roles_missing = default_when_roles_missing
17
- @when_unauthorized = default_when_unauthorized
18
16
  end
19
17
 
20
18
  def audit_trail_enabled=(value)
@@ -41,24 +39,6 @@ module Rabarber
41
39
  ).process
42
40
  end
43
41
 
44
- def when_actions_missing=(callable)
45
- @when_actions_missing = Rabarber::Input::Types::Proc.new(
46
- callable, Rabarber::ConfigurationError, "Configuration 'when_actions_missing' must be a Proc"
47
- ).process
48
- end
49
-
50
- def when_roles_missing=(callable)
51
- @when_roles_missing = Rabarber::Input::Types::Proc.new(
52
- callable, Rabarber::ConfigurationError, "Configuration 'when_roles_missing' must be a Proc"
53
- ).process
54
- end
55
-
56
- def when_unauthorized=(callable)
57
- @when_unauthorized = Rabarber::Input::Types::Proc.new(
58
- callable, Rabarber::ConfigurationError, "Configuration 'when_unauthorized' must be a Proc"
59
- ).process
60
- end
61
-
62
42
  private
63
43
 
64
44
  def default_audit_trail_enabled
@@ -76,29 +56,5 @@ module Rabarber
76
56
  def default_must_have_roles
77
57
  false
78
58
  end
79
-
80
- def default_when_actions_missing
81
- -> (missing_actions, context) {
82
- raise(Rabarber::Error, "'grant_access' method called with non-existent actions: #{missing_actions}, context: '#{context[:controller]}'")
83
- }
84
- end
85
-
86
- def default_when_roles_missing
87
- -> (missing_roles, context) {
88
- delimiter = context[:action] ? "#" : ""
89
- message = "'grant_access' method called with non-existent roles: #{missing_roles}, context: '#{context[:controller]}#{delimiter}#{context[:action]}'"
90
- Rabarber::Logger.log(:warn, message)
91
- }
92
- end
93
-
94
- def default_when_unauthorized
95
- -> (controller) do
96
- if controller.request.format.html?
97
- controller.redirect_back fallback_location: controller.main_app.root_path
98
- else
99
- controller.head(:unauthorized)
100
- end
101
- end
102
- end
103
59
  end
104
60
  end
@@ -4,6 +4,8 @@ module Rabarber
4
4
  module Authorization
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ include Rabarber::Core::Roleable
8
+
7
9
  included do
8
10
  before_action :verify_access
9
11
  end
@@ -25,21 +27,17 @@ module Rabarber
25
27
  private
26
28
 
27
29
  def verify_access
28
- Rabarber::Missing::Actions.new(self.class).handle
29
- Rabarber::Missing::Roles.new(self.class).handle
30
+ Rabarber::Core::PermissionsIntegrityChecker.new(self.class).run! unless Rails.configuration.eager_load
30
31
 
31
- roleable = send(Rabarber::Configuration.instance.current_user_method)
32
+ return if Rabarber::Core::Permissions.access_granted?(roleable_roles, self.class, action_name.to_sym, self)
32
33
 
33
- return if Rabarber::Core::Permissions.access_granted?(
34
- roleable ? roleable.roles : [], self.class, action_name.to_sym, self
35
- )
34
+ Rabarber::Audit::Events::UnauthorizedAttempt.trigger(roleable, path: request.path)
36
35
 
37
- Rabarber::Logger.audit(
38
- :warn,
39
- "[Unauthorized Attempt] #{Rabarber::Logger.roleable_identity(roleable, with_roles: true)} attempted to access '#{request.path}'"
40
- )
36
+ when_unauthorized
37
+ end
41
38
 
42
- Rabarber::Configuration.instance.when_unauthorized.call(self)
39
+ def when_unauthorized
40
+ request.format.html? ? redirect_back(fallback_location: root_path) : head(:unauthorized)
43
41
  end
44
42
  end
45
43
  end
@@ -15,7 +15,9 @@ module Rabarber
15
15
  end
16
16
 
17
17
  def action_accessible?(roles, controller, action, dynamic_rule_receiver)
18
- action_rules[controller].any? { |rule| rule.verify_access(roles, dynamic_rule_receiver, action) }
18
+ action_rules[controller].any? do |rule|
19
+ rule.action == action && rule.verify_access(roles, dynamic_rule_receiver)
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rabarber
4
+ module Core
5
+ module Cache
6
+ extend self
7
+
8
+ CACHE_PREFIX = "rabarber"
9
+ private_constant :CACHE_PREFIX
10
+
11
+ def fetch(roleable_id, options = { expires_in: 1.hour, race_condition_ttl: 5.seconds }, &block)
12
+ enabled? ? Rails.cache.fetch(key_for(roleable_id), **options, &block) : yield
13
+ end
14
+
15
+ def delete(*roleable_ids)
16
+ keys = roleable_ids.map { |roleable_id| key_for(roleable_id) }
17
+ Rails.cache.delete_multi(keys) if enabled? && keys.any?
18
+ end
19
+
20
+ def enabled?
21
+ Rabarber::Configuration.instance.cache_enabled
22
+ end
23
+
24
+ def clear
25
+ Rails.cache.delete_matched(/^#{CACHE_PREFIX}/o)
26
+ end
27
+
28
+ private
29
+
30
+ def key_for(id)
31
+ "#{CACHE_PREFIX}:roles_#{id}"
32
+ end
33
+ end
34
+ end
35
+
36
+ module Cache
37
+ def clear
38
+ Rabarber::Core::Cache.clear
39
+ end
40
+ module_function :clear
41
+ end
42
+ end
@@ -3,6 +3,8 @@
3
3
  require_relative "access"
4
4
  require_relative "rule"
5
5
 
6
+ require "singleton"
7
+
6
8
  module Rabarber
7
9
  module Core
8
10
  class Permissions
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rabarber
4
+ module Core
5
+ class PermissionsIntegrityChecker
6
+ attr_reader :controller
7
+
8
+ def initialize(controller = nil)
9
+ @controller = controller
10
+ end
11
+
12
+ def run!
13
+ return if missing_list.empty?
14
+
15
+ raise(
16
+ Rabarber::Error,
17
+ "Following actions were passed to 'grant_access' method but are not defined in the controller: #{missing_list}"
18
+ )
19
+ end
20
+
21
+ private
22
+
23
+ def missing_list
24
+ @missing_list ||= action_rules.each_with_object([]) do |(controller, rules), arr|
25
+ missing_actions = rules.map(&:action) - controller.action_methods.map(&:to_sym)
26
+ arr << { controller => missing_actions } if missing_actions.any?
27
+ end
28
+ end
29
+
30
+ def action_rules
31
+ if controller
32
+ Rabarber::Core::Permissions.action_rules.slice(controller)
33
+ else
34
+ Rabarber::Core::Permissions.action_rules
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rabarber
4
+ module Core
5
+ module Roleable
6
+ def roleable
7
+ send(Rabarber::Configuration.instance.current_user_method)
8
+ end
9
+
10
+ def roleable_roles
11
+ roleable&.roles.to_a
12
+ end
13
+ end
14
+ end
15
+ end
@@ -12,18 +12,14 @@ module Rabarber
12
12
  @negated_dynamic_rule = negated_dynamic_rule
13
13
  end
14
14
 
15
- def verify_access(user_roles, dynamic_rule_receiver, action_name = nil)
16
- action_accessible?(action_name) && roles_permitted?(user_roles) && dynamic_rule_followed?(dynamic_rule_receiver)
15
+ def verify_access(roleable_roles, dynamic_rule_receiver)
16
+ roles_permitted?(roleable_roles) && dynamic_rule_followed?(dynamic_rule_receiver)
17
17
  end
18
18
 
19
- def action_accessible?(action_name)
20
- action_name.nil? || action_name == action
21
- end
22
-
23
- def roles_permitted?(user_roles)
24
- return false if Rabarber::Configuration.instance.must_have_roles && user_roles.empty?
19
+ def roles_permitted?(roleable_roles)
20
+ return false if Rabarber::Configuration.instance.must_have_roles && roleable_roles.empty?
25
21
 
26
- roles.empty? || (roles & user_roles).any?
22
+ roles.empty? || roles.intersection(roleable_roles).any?
27
23
  end
28
24
 
29
25
  def dynamic_rule_followed?(dynamic_rule_receiver)
@@ -2,14 +2,16 @@
2
2
 
3
3
  module Rabarber
4
4
  module Helpers
5
+ include Rabarber::Core::Roleable
6
+
5
7
  def visible_to(*roles, &block)
6
- return unless send(Rabarber::Configuration.instance.current_user_method).has_role?(*roles)
8
+ return unless roleable_roles.intersection(Rabarber::Input::Roles.new(roles).process).any?
7
9
 
8
10
  capture(&block)
9
11
  end
10
12
 
11
13
  def hidden_from(*roles, &block)
12
- return if send(Rabarber::Configuration.instance.current_user_method).has_role?(*roles)
14
+ return if roleable_roles.intersection(Rabarber::Input::Roles.new(roles).process).any?
13
15
 
14
16
  capture(&block)
15
17
  end
@@ -15,13 +15,11 @@ module Rabarber
15
15
  end
16
16
 
17
17
  def roles
18
- Rabarber::Cache.fetch(Rabarber::Cache.key_for(roleable_id), expires_in: 1.hour, race_condition_ttl: 5.seconds) do
19
- rabarber_roles.names
20
- end
18
+ Rabarber::Core::Cache.fetch(roleable_id) { rabarber_roles.names }
21
19
  end
22
20
 
23
21
  def has_role?(*role_names)
24
- (roles & process_role_names(role_names)).any?
22
+ roles.intersection(process_role_names(role_names)).any?
25
23
  end
26
24
 
27
25
  def assign_roles(*role_names, create_new: true)
@@ -29,16 +27,13 @@ module Rabarber
29
27
 
30
28
  create_new_roles(processed_role_names) if create_new
31
29
 
32
- roles_to_assign = Rabarber::Role.where(name: processed_role_names) - rabarber_roles
30
+ roles_to_assign = Rabarber::Role.where(name: processed_role_names - rabarber_roles.names)
33
31
 
34
32
  if roles_to_assign.any?
35
33
  delete_roleable_cache
36
34
  rabarber_roles << roles_to_assign
37
35
 
38
- Rabarber::Logger.audit(
39
- :info,
40
- "[Role Assignment] #{Rabarber::Logger.roleable_identity(self, with_roles: false)} has been assigned the following roles: #{roles_to_assign.pluck(:name).map(&:to_sym)}, current roles: #{roles}"
41
- )
36
+ Rabarber::Audit::Events::RolesAssigned.trigger(self, roles_to_assign: roles_to_assign.names, current_roles: roles)
42
37
  end
43
38
 
44
39
  roles
@@ -52,10 +47,7 @@ module Rabarber
52
47
  delete_roleable_cache
53
48
  self.rabarber_roles -= roles_to_revoke
54
49
 
55
- Rabarber::Logger.audit(
56
- :info,
57
- "[Role Revocation] #{Rabarber::Logger.roleable_identity(self, with_roles: false)} has been revoked from the following roles: #{roles_to_revoke.pluck(:name).map(&:to_sym)}, current roles: #{roles}"
58
- )
50
+ Rabarber::Audit::Events::RolesRevoked.trigger(self, roles_to_revoke: roles_to_revoke.names, current_roles: roles)
59
51
  end
60
52
 
61
53
  roles
@@ -78,7 +70,7 @@ module Rabarber
78
70
  end
79
71
 
80
72
  def delete_roleable_cache
81
- Rabarber::Cache.delete(Rabarber::Cache.key_for(roleable_id))
73
+ Rabarber::Core::Cache.delete(roleable_id)
82
74
  end
83
75
 
84
76
  def roleable_id
@@ -18,8 +18,6 @@ module Rabarber
18
18
 
19
19
  return false if exists?(name: name)
20
20
 
21
- delete_roles_cache
22
-
23
21
  !!create!(name: name)
24
22
  end
25
23
 
@@ -29,7 +27,6 @@ module Rabarber
29
27
 
30
28
  return false if !role || exists?(name: name) || assigned_to_roleables(role).any? && !force
31
29
 
32
- delete_roles_cache
33
30
  delete_roleables_cache(role)
34
31
 
35
32
  role.update!(name: name)
@@ -40,13 +37,12 @@ module Rabarber
40
37
 
41
38
  return false if !role || assigned_to_roleables(role).any? && !force
42
39
 
43
- delete_roles_cache
44
40
  delete_roleables_cache(role)
45
41
 
46
42
  !!role.destroy!
47
43
  end
48
44
 
49
- def assignees_for(name)
45
+ def assignees(name)
50
46
  Rabarber::HasRoles.roleable_class.joins(:rabarber_roles).where(
51
47
  rabarber_roles: { name: Rabarber::Input::Role.new(name).process }
52
48
  )
@@ -54,18 +50,15 @@ module Rabarber
54
50
 
55
51
  private
56
52
 
57
- def delete_roles_cache
58
- Rabarber::Cache.delete(Rabarber::Cache::ALL_ROLES_KEY)
59
- end
60
-
61
53
  def delete_roleables_cache(role)
62
- keys = assigned_to_roleables(role).map { |roleable_id| Rabarber::Cache.key_for(roleable_id) }
63
- Rabarber::Cache.delete(*keys) if keys.any?
54
+ Rabarber::Core::Cache.delete(*assigned_to_roleables(role))
64
55
  end
65
56
 
66
57
  def assigned_to_roleables(role)
67
58
  ActiveRecord::Base.connection.select_values(
68
- "SELECT roleable_id FROM rabarber_roles_roleables WHERE role_id = #{role.id}"
59
+ ActiveRecord::Base.sanitize_sql(
60
+ ["SELECT roleable_id FROM rabarber_roles_roleables WHERE role_id = ?", role.id]
61
+ )
69
62
  )
70
63
  end
71
64
 
@@ -6,13 +6,7 @@ module Rabarber
6
6
  class Railtie < Rails::Railtie
7
7
  initializer "rabarber.after_initialize" do |app|
8
8
  app.config.after_initialize do
9
- Rabarber::Missing::Actions.new.handle
10
- Rabarber::Missing::Roles.new.handle if Rabarber::Role.table_exists?
11
-
12
- Rabarber::Logger.log(
13
- :warn,
14
- "DEPRECATION WARNING: Configurations 'when_actions_missing' and 'when_roles_missing' are deprecated and will be removed in v2.0.0"
15
- )
9
+ Rabarber::Core::PermissionsIntegrityChecker.new.run! if Rails.configuration.eager_load
16
10
  end
17
11
  end
18
12
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rabarber
4
- VERSION = "1.4.1"
4
+ VERSION = "2.0.0"
5
5
  end
data/lib/rabarber.rb CHANGED
@@ -1,9 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "singleton"
4
-
5
3
  require_relative "rabarber/version"
6
- require_relative "rabarber/logger"
7
4
  require_relative "rabarber/configuration"
8
5
 
9
6
  require "active_record"
@@ -18,11 +15,14 @@ require_relative "rabarber/input/types/boolean"
18
15
  require_relative "rabarber/input/types/proc"
19
16
  require_relative "rabarber/input/types/symbol"
20
17
 
21
- require_relative "rabarber/missing/base"
22
- require_relative "rabarber/missing/actions"
23
- require_relative "rabarber/missing/roles"
18
+ require_relative "rabarber/core/cache"
19
+
20
+ require_relative "rabarber/audit/events/base"
21
+ require_relative "rabarber/audit/events/roles_assigned"
22
+ require_relative "rabarber/audit/events/roles_revoked"
23
+ require_relative "rabarber/audit/events/unauthorized_attempt"
24
24
 
25
- require_relative "rabarber/cache"
25
+ require_relative "rabarber/core/roleable"
26
26
 
27
27
  require_relative "rabarber/controllers/concerns/authorization"
28
28
  require_relative "rabarber/helpers/helpers"
@@ -30,12 +30,11 @@ require_relative "rabarber/models/concerns/has_roles"
30
30
  require_relative "rabarber/models/role"
31
31
 
32
32
  require_relative "rabarber/core/permissions"
33
+ require_relative "rabarber/core/permissions_integrity_checker"
33
34
 
34
35
  require_relative "rabarber/railtie"
35
36
 
36
37
  module Rabarber
37
- module_function
38
-
39
38
  class Error < StandardError; end
40
39
  class ConfigurationError < Rabarber::Error; end
41
40
  class InvalidArgumentError < Rabarber::Error; end
@@ -43,4 +42,5 @@ module Rabarber
43
42
  def configure
44
43
  yield(Rabarber::Configuration.instance)
45
44
  end
45
+ module_function :configure
46
46
  end
data/rabarber.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.summary = "Simple role-based authorization library for Ruby on Rails."
12
12
  spec.homepage = "https://github.com/enjaku4/rabarber"
13
13
  spec.license = "MIT"
14
- spec.required_ruby_version = ">= 3.0"
14
+ spec.required_ruby_version = ">= 3.0", "< 3.4"
15
15
 
16
16
  spec.files = [
17
17
  "rabarber.gemspec", "README.md", "CHANGELOG.md", "LICENSE.txt"
@@ -19,5 +19,5 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_runtime_dependency "rails", ">= 6.1"
22
+ spec.add_runtime_dependency "rails", ">= 6.1", "< 7.2"
23
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabarber
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - enjaku4
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-04-09 00:00:00.000000000 Z
12
+ date: 2024-04-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -18,6 +18,9 @@ dependencies:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '6.1'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '7.2'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -25,6 +28,9 @@ dependencies:
25
28
  - - ">="
26
29
  - !ruby/object:Gem::Version
27
30
  version: '6.1'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '7.2'
28
34
  description:
29
35
  email:
30
36
  - rabarber_gem@icloud.com
@@ -38,11 +44,18 @@ files:
38
44
  - lib/generators/rabarber/roles_generator.rb
39
45
  - lib/generators/rabarber/templates/create_rabarber_roles.rb.erb
40
46
  - lib/rabarber.rb
41
- - lib/rabarber/cache.rb
47
+ - lib/rabarber/audit/events/base.rb
48
+ - lib/rabarber/audit/events/roles_assigned.rb
49
+ - lib/rabarber/audit/events/roles_revoked.rb
50
+ - lib/rabarber/audit/events/unauthorized_attempt.rb
51
+ - lib/rabarber/audit/logger.rb
42
52
  - lib/rabarber/configuration.rb
43
53
  - lib/rabarber/controllers/concerns/authorization.rb
44
54
  - lib/rabarber/core/access.rb
55
+ - lib/rabarber/core/cache.rb
45
56
  - lib/rabarber/core/permissions.rb
57
+ - lib/rabarber/core/permissions_integrity_checker.rb
58
+ - lib/rabarber/core/roleable.rb
46
59
  - lib/rabarber/core/rule.rb
47
60
  - lib/rabarber/helpers/helpers.rb
48
61
  - lib/rabarber/input/action.rb
@@ -53,10 +66,6 @@ files:
53
66
  - lib/rabarber/input/types/boolean.rb
54
67
  - lib/rabarber/input/types/proc.rb
55
68
  - lib/rabarber/input/types/symbol.rb
56
- - lib/rabarber/logger.rb
57
- - lib/rabarber/missing/actions.rb
58
- - lib/rabarber/missing/base.rb
59
- - lib/rabarber/missing/roles.rb
60
69
  - lib/rabarber/models/concerns/has_roles.rb
61
70
  - lib/rabarber/models/role.rb
62
71
  - lib/rabarber/railtie.rb
@@ -76,6 +85,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
85
  - - ">="
77
86
  - !ruby/object:Gem::Version
78
87
  version: '3.0'
88
+ - - "<"
89
+ - !ruby/object:Gem::Version
90
+ version: '3.4'
79
91
  required_rubygems_version: !ruby/object:Gem::Requirement
80
92
  requirements:
81
93
  - - ">="
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rabarber
4
- module Cache
5
- module_function
6
-
7
- ALL_ROLES_KEY = "rabarber:roles"
8
-
9
- def fetch(key, options, &block)
10
- enabled? ? Rails.cache.fetch(key, options, &block) : yield
11
- end
12
-
13
- def delete(*keys)
14
- Rails.cache.delete_multi(keys) if enabled?
15
- end
16
-
17
- def enabled?
18
- Rabarber::Configuration.instance.cache_enabled
19
- end
20
-
21
- def key_for(id)
22
- "rabarber:roles_#{id}"
23
- end
24
-
25
- def clear
26
- Rails.cache.delete_matched(/^rabarber/)
27
- end
28
- end
29
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rabarber
4
- class Logger
5
- include Singleton
6
-
7
- attr_reader :rails_logger, :audit_logger
8
-
9
- def initialize
10
- @rails_logger = Rails.logger
11
- @audit_logger = ::Logger.new(Rails.root.join("log/rabarber_audit.log"))
12
- end
13
-
14
- class << self
15
- def log(log_level, message)
16
- instance.rails_logger.tagged("Rabarber") { instance.rails_logger.public_send(log_level, message) }
17
- end
18
-
19
- def audit(log_level, message)
20
- return unless Rabarber::Configuration.instance.audit_trail_enabled
21
-
22
- instance.audit_logger.public_send(log_level, message)
23
- end
24
-
25
- def roleable_identity(roleable, with_roles:)
26
- if roleable
27
- model_name = roleable.model_name.human
28
- primary_key = roleable.class.primary_key
29
- roleable_id = roleable.public_send(primary_key)
30
-
31
- roles = with_roles ? ", roles: #{roleable.roles}" : ""
32
-
33
- "#{model_name} with #{primary_key}: '#{roleable_id}'#{roles}"
34
- else
35
- "Unauthenticated user"
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Rabarber
4
- module Missing
5
- class Actions < Rabarber::Missing::Base
6
- private
7
-
8
- def check_controller_rules
9
- nil
10
- end
11
-
12
- def check_action_rules
13
- action_rules.each do |controller, controller_action_rules|
14
- missing_actions = controller_action_rules.map(&:action) - controller.action_methods.map(&:to_sym)
15
- missing_list << Rabarber::Missing::Item.new(missing_actions, controller, nil) if missing_actions.present?
16
- end
17
- end
18
-
19
- def configuration_name
20
- :when_actions_missing
21
- end
22
- end
23
- end
24
- end