Sha256: 316ebd58c1a5ae2c382efa4f8ac034aa87af0361c322130cedc66ab38dbe8f1e

Contents?: true

Size: 1.43 KB

Versions: 18

Compression:

Stored size: 1.43 KB

Contents

# Mixin for the {RailsOps::Operation} class that provides *policies*. Policies
# are simple blocks of code that run at specific places in your operation and
# can be used to check conditions such as params or permissions. Policies are
# inherited to subclasses of operations.
module RailsOps::Mixins::Policies
  extend ActiveSupport::Concern

  POLICY_CHAIN_KEYS = [:on_init, :before_perform, :after_perform].freeze

  included do
    class_attribute :_policy_chains
    self._policy_chains = Hash[POLICY_CHAIN_KEYS.map { |key| [key, [].freeze] }]
  end

  module ClassMethods
    # Register a new policy block that will be executed in the given `chain`.
    # The policy block will be executed in the operation's instance context.
    def policy(chain = :before_perform, &block)
      unless POLICY_CHAIN_KEYS.include?(chain)
        fail "Unknown policy chain #{chain.inspect}, available are #{POLICY_CHAIN_KEYS.inspect}."
      end

      self._policy_chains = _policy_chains.dup
      _policy_chains[chain] += [block]
    end

    # Returns all registered validation blocks for this operation class.
    def policies_for(chain)
      unless POLICY_CHAIN_KEYS.include?(chain)
        fail "Unknown policy chain #{chain.inspect}, available are #{POLICY_CHAIN_KEYS.inspect}."
      end

      return _policy_chains[chain]
    end
  end

  def run_policies(chain)
    self.class.policies_for(chain).each do |block|
      instance_eval(&block)
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
rails_ops-1.0.2 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.1 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta15 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta14 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta13 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta12 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta11 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta10 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta9 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta8 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta7 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta6 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta5 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta4 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta3 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta2 lib/rails_ops/mixins/policies.rb
rails_ops-1.0.0.beta1 lib/rails_ops/mixins/policies.rb