Sha256: 2750ef05f30a0a51aed6b49853f8ff487f7d3b0ff0ed2a50ae53491d2b6bfb84

Contents?: true

Size: 1.06 KB

Versions: 9

Compression:

Stored size: 1.06 KB

Contents

class Gimei
  class RetryLimitExceeded < StandardError; end

  class UniqueGenerator
    class << self
      def previous_results
        @previous_results ||= Hash.new { |hash, key| hash[key] = Set.new }
      end
    end

    def initialize(klass, max_retries)
      @klass = klass
      @max_retries = max_retries
    end

    def previous_results
      self.class.previous_results
    end

    def clear(key = nil)
      if key
        previous_results[key.to_sym].clear
      else
        previous_results.clear
      end
    end

    def define_unique_method(method_name, previous_result_key = method_name)
      define_singleton_method method_name do |*args|
        max_retries.times do
          result = klass.public_send(method_name, *args)

          next if previous_results[previous_result_key].include?(result.to_s)

          previous_results[previous_result_key] << result.to_s
          return result
        end

        raise RetryLimitExceeded, "Retry limit exceeded for #{method_name}"
      end
    end

    private

    attr_reader :klass, :max_retries
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
gimei-1.3.2 lib/gimei/unique_generator.rb
gimei-1.3.1 lib/gimei/unique_generator.rb
gimei-1.3.0 lib/gimei/unique_generator.rb
gimei-1.2.0 lib/gimei/unique_generator.rb
gimei-1.1.0 lib/gimei/unique_generator.rb
gimei-1.0.1 lib/gimei/unique_generator.rb
gimei-1.0.0 lib/gimei/unique_generator.rb
gimei-0.5.1 lib/gimei/unique_generator.rb
gimei-0.5.0 lib/gimei/unique_generator.rb