module Current

Constants

VERSION

Public Class Methods

attribute(name, *args, &block) click to toggle source
# File lib/rails_current.rb, line 50
def Current.attribute(name, *args, &block)
  options = Map.options_for!(args)

  name = name.to_s

  attribute_names.push(name)
  attribute_names.uniq!

  if options.has_key?(:default)
    default = options[:default]
    if default.respond_to?(:call)
      block ||= default
    else
      data[name] = default
    end
  end

  if !args.empty?
    value = args.shift
    data[name] = value
  end

  if block
    generators[name] = block
  end

  define_attribute_method(name)

  self
end
attribute?(name) click to toggle source
# File lib/rails_current.rb, line 119
def Current.attribute?(name)
  attribute_names.include?(name.to_s)
end
attribute_names() click to toggle source
# File lib/rails_current.rb, line 123
def Current.attribute_names
  @attribute_names ||= []
end
attributes() click to toggle source
# File lib/rails_current.rb, line 127
def Current.attributes
  attribute_names.inject(Map.new){|map, name| map.update(name => send(name))}
end
clear() click to toggle source
# File lib/rails_current.rb, line 34
def Current.clear
  data.clear
  self
end
data() click to toggle source
# File lib/rails_current.rb, line 30
def Current.data
  Thread.current[:current] ||= Map.new
end
define_attribute_method(name) click to toggle source
# File lib/rails_current.rb, line 81
def Current.define_attribute_method(name)
  name = name.to_s
  unless respond_to?(name)
    singleton_class.module_eval do
      define_method(name) do
        value = data[name]
        if value.nil? and generator = generators[name]
          value = generator.call
          data[name] = value
        end
        value
      end

      define_method(name + '=') do |value|
        data[name] = value
      end

      define_method(name + '?') do |*args|
        send(name)
      end
    end
  end
end
dependencies() click to toggle source
# File lib/rails_current.rb, line 9
def Current.dependencies
  {
    'map' => [ 'map', ' ~> 6.0' ]
  }
end
description() click to toggle source
# File lib/rails_current.rb, line 15
def Current.description
  "track 'current_user' et all in a tidy, global, and thread-safe fashion for your rails apps"
end
ensure_rails_application(&block) click to toggle source
# File lib/rails_current.rb, line 211
def Current.ensure_rails_application(&block)
  require 'rails' unless defined?(Rails)
  if Rails.application.nil?
    mock = Class.new(Rails::Application)
    Rails.application = mock.instance
    if defined?(Rails.application.config.secret_key_base)
      Rails.application.config.secret_key_base = '42'
    end
    begin
      block.call()
    ensure
      Rails.application = nil
    end
  else
    block.call()
  end
end
generators() click to toggle source
# File lib/rails_current.rb, line 46
def Current.generators
  @generators ||= Map.new
end
install_before_action!() click to toggle source
# File lib/rails_current.rb, line 261
def Current.install_before_action!
  if defined?(::ActionController::Base)
    ::ActionController::Base.module_eval do
      prepend_before_action do |controller|
        Current.clear
        Current.controller = Current.proxy_for(controller)
        Current.action = controller ? controller.send(:action_name) : nil
      end

      extend Current
      include Current
      helper{ include Current }
    end
  end
end
method_missing(method, *args, &block) click to toggle source
# File lib/rails_current.rb, line 131
def Current.method_missing(method, *args, &block)
  case method.to_s
    when /^(.*)[=]$/
      name = $1
      value = args.shift
      attribute(name, value)
      value

    when /^(.*)[?]$/
      nil

    else
      if block
        name = method.to_s
        attribute(name, &block)
        block
      else
        nil
      end
  end
end
mock_controller(options = {}) click to toggle source
# File lib/rails_current.rb, line 163
def Current.mock_controller(options = {})
  ensure_rails_application do
    require 'action_controller'
    require 'action_dispatch/testing/test_request.rb'
    require 'action_dispatch/testing/test_response.rb'

    store = ActiveSupport::Cache::MemoryStore.new

    controller = mock_controller_class.new
    controller.perform_caching = true
    controller.cache_store = store

    request = ActionDispatch::TestRequest.create
    response = ActionDispatch::TestResponse.create

    controller.request = request
    controller.response = response

    singleton_class =
      class << controller
        self
      end

    singleton_class.module_eval do
      define_method(:default_url_options) do
        @default_url_options ||= (
          defined?(DefaultUrlOptions) ? DefaultUrlOptions.dup : {}
        )
      end
    end

    Current.proxy_for(controller)
  end
end
mock_controller_class() click to toggle source
# File lib/rails_current.rb, line 198
def Current.mock_controller_class
  unless const_defined?(:Controller)
    controller_class =
      if defined?(::ApplicationController)
        Class.new(::ApplicationController)
      else
        Class.new(::ActionController::Base)
      end
    const_set(:Controller, controller_class)
  end
  return const_get(:Controller)
end
proxy_for(object) click to toggle source
# File lib/rails_current.rb, line 243
def Current.proxy_for(object)
  Proxy.new(object)
end
reset() click to toggle source
# File lib/rails_current.rb, line 39
def Current.reset
  attribute_names.each{|name| undefine_attribute_method(name)}
  attribute_names.clear
  generators.clear
  clear
end
singleton_class() click to toggle source
# File lib/rails_current.rb, line 115
def Current.singleton_class
  @singleton_class ||= class << self; self; end
end
undefine_attribute_method(name) click to toggle source
# File lib/rails_current.rb, line 105
def Current.undefine_attribute_method(name)
  if respond_to?(name)
    singleton_class.module_eval do
      remove_method(name)
      remove_method(name + '=')
      remove_method(name + '?')
    end
  end
end
version() click to toggle source
# File lib/rails_current.rb, line 5
def Current.version
  VERSION
end

Public Instance Methods

method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/rails_current.rb, line 153
def method_missing(method, *args, &block)
  case method.to_s
    when /^current_(.*)$/
      msg = $1
      Current.send(msg, *args, &block)
    else
      super
  end
end