Sha256: c9bb7516c79d7e604ece3bd6be8446fe6e3bdd1cea28c13b2c12167c95c442c8

Contents?: true

Size: 1.54 KB

Versions: 4

Compression:

Stored size: 1.54 KB

Contents

require 'active_support/per_thread_registry'
require 'influxer/metrics/scoping/default'
require 'influxer/metrics/scoping/named'

module Influxer
  # Clone of ActiveRecord::Relation scoping
  module Scoping # :nodoc:
    extend ActiveSupport::Concern

    class Error < StandardError; end

    included do
      include Default
      include Named
    end

    module ClassMethods # :nodoc:
      def current_scope
        ScopeRegistry.value_for(:current_scope, name)
      end

      def current_scope=(scope)
        ScopeRegistry.set_value_for(:current_scope, name, scope)
      end
    end

    class ScopeRegistry # :nodoc:
      extend ActiveSupport::PerThreadRegistry

      VALID_SCOPE_TYPES = [:current_scope].freeze

      def initialize
        @registry = Hash.new { |hash, key| hash[key] = {} }
      end

      # Obtains the value for a given +scope_name+ and +variable_name+.
      def value_for(scope_type, variable_name)
        raise_invalid_scope_type!(scope_type)
        @registry[scope_type][variable_name]
      end

      # Sets the +value+ for a given +scope_type+ and +variable_name+.
      def set_value_for(scope_type, variable_name, value)
        raise_invalid_scope_type!(scope_type)
        @registry[scope_type][variable_name] = value
      end

      private

      def raise_invalid_scope_type!(scope_type)
        return if VALID_SCOPE_TYPES.include?(scope_type)
        raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. \
        Scope types  must be included in VALID_SCOPE_TYPES"
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
influxer-0.5.4 lib/influxer/metrics/scoping.rb
influxer-0.5.3 lib/influxer/metrics/scoping.rb
influxer-0.5.2 lib/influxer/metrics/scoping.rb
influxer-0.5.1 lib/influxer/metrics/scoping.rb