module RailsReadonlyInjector

Constants

ALIASED_METHOD_NAME
VERSION

Public Class Methods

config() { |configuration| ... } click to toggle source

Sets the desired configuration object, if a block is provided, and then returns the current configuration object. @return [Configuration] The current configuration object.

# File lib/rails_readonly_injector.rb, line 44
def self.config
  yield configuration if block_given?

  configuration
end
in_read_only_mode?() click to toggle source

Returns the currently loaded `config.read_only` value. @return [Boolean] Whether the currently loaded config is set to read-only.

# File lib/rails_readonly_injector.rb, line 32
def self.in_read_only_mode?
  if config.dirty? && config.changed_attributes.key?(:read_only)
    # Return the previously stored value
    config.changed_attributes[:read_only]
  else
    config.send(:read_only)
  end
end
reload!() click to toggle source

Applies changes defined in the `config` object and resets `config.dirty?` to false

# File lib/rails_readonly_injector.rb, line 9
def self.reload!
  config.classes_to_include.each do |klass|
    # Ensure we restore classes that we want to exclude, to their defaults
    # in case they were previously marked as read-only.
    if config.classes_to_exclude.include? klass
      restore_readonly_method(klass)
      next
    end

    if config.send(:read_only)
      override_readonly_method(klass)
    else
      restore_readonly_method(klass)
    end
  end

  inject_error_handler_into_actioncontroller_base

  config.send(:reset_dirty_status!)
end

Private Class Methods

configuration() click to toggle source

@return [Configuration] The current configuration object

# File lib/rails_readonly_injector/configuration.rb, line 99
def self.configuration
  @config ||= Configuration.new
end
inject_error_handler_into_actioncontroller_base() click to toggle source
# File lib/rails_readonly_injector.rb, line 72
def self.inject_error_handler_into_actioncontroller_base
  ActionController::Base.class_eval do
    rescue_from ActiveRecord::ReadOnlyRecord, with: :rescue_from_readonly_failure

    protected

    def rescue_from_readonly_failure
      instance_eval &RailsReadonlyInjector.config.controller_rescue_action
    end
  end
end
override_readonly_method(klass) click to toggle source
# File lib/rails_readonly_injector.rb, line 54
def self.override_readonly_method(klass)
  klass.class_eval do
    alias_method ALIASED_METHOD_NAME, :readonly?

    def readonly?
      true
    end
  end
end
reset_configuration!() click to toggle source

Resets the current configuration to the defaults and reloads RailsReadonlyInjector

# File lib/rails_readonly_injector/configuration.rb, line 105
def self.reset_configuration!
  @config = Configuration.new

  reload!
end
restore_readonly_method(klass) click to toggle source
# File lib/rails_readonly_injector.rb, line 64
def self.restore_readonly_method(klass)
  klass.class_eval do
    def readonly?
      super
    end
  end
end

Private Instance Methods

readonly?() click to toggle source
# File lib/rails_readonly_injector.rb, line 58
def readonly?
  true
end
rescue_from_readonly_failure() click to toggle source
# File lib/rails_readonly_injector.rb, line 78
def rescue_from_readonly_failure
  instance_eval &RailsReadonlyInjector.config.controller_rescue_action
end