# 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