Sha256: 29ab027b1b31a72140a12f6b8511ac60471156201f60bbaf5b25ff65028f7fd1

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

# frozen_string_literal: true
require "singleton"

module Capybara
  class Experience
    class Pool < Hash
      include Singleton

      def [](key)
        super(key) || begin
          driver, _session_name, app_object_id = key.split(":")
          take(driver: driver, app_object_id: app_object_id, key: key)
        end
      end

      def take(driver: Capybara.current_driver, app_object_id: Capybara.app.object_id, key: nil)
        session = idle.find { |s| s.mode == driver && s.app.object_id == app_object_id }
        if session
          idle.delete(session)
          self[key] = delete(session_key(session)) if key
        else
          session = ::Capybara::Session.new(driver.to_sym, Capybara.app)
          key ||= session_key(session)
          self[key] = session
        end

        session
      end

      def idle
        @idle ||= []
      end

      def taken
        values - idle
      end

      def reset_idle!
        to_h.each do |key, session|
          self[session_key(session)] = delete(key)
        end
        @idle = values

        nil
      end

      private

      def session_key(session)
        "#{session.mode}:#{session.object_id}:#{session.app.object_id}"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
capybara-experience-0.3.3 lib/capybara/experience/pool.rb