Sha256: 4b2c5197d761e9fa82b9e3f62231acfb5924756f80c1e8de11e178e5b0781780

Contents?: true

Size: 1.53 KB

Versions: 3

Compression:

Stored size: 1.53 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]

      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)
        fail 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

3 entries across 3 versions & 1 rubygems

Version Path
influxer-0.5.0 lib/influxer/metrics/scoping.rb
influxer-0.4.0 lib/influxer/metrics/scoping.rb
influxer-0.3.1 lib/influxer/metrics/scoping.rb