Advertisement
Guest User

Capybara session pool

a guest
Sep 7th, 2016
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.47 KB | None | 0 0
  1. # frozen_string_literal: true
  2.  
  3. require 'capybara'
  4. require 'capybara/poltergeist'
  5.  
  6. class CapybaraSessionPool
  7.   attr_reader :size
  8.  
  9.   attr_reader :pool, :mutex
  10.   private     :pool, :mutex
  11.  
  12.   def initialize(size:)
  13.     @size = size.to_i
  14.     raise 'invalid session size' unless @size > 0
  15.  
  16.     @pool = []
  17.     @mutex = Mutex.new
  18.  
  19.     self.size.times { pool << Wrapper.new(Capybara::Session.new(:poltergeist), 0) }
  20.   end
  21.  
  22.   def get(time:)
  23.     mutex.synchronize do
  24.       expired, index = pool.each_with_index.select { |wrapper, _index| wrapper.expired? }.first
  25.       raise EmptyPoolError if expired.nil?
  26.       pool[index] = Wrapper.new expired.expire, time
  27.     end
  28.   end
  29.  
  30.   class EmptyPoolError < StandardError
  31.   end
  32.  
  33.   class Wrapper
  34.     attr_reader :session, :expires_in, :expired
  35.     private     :session, :expires_in, :expired
  36.  
  37.     def initialize(session, time)
  38.       @session = session
  39.       @expires_in = Time.now.utc + time
  40.       @expired = false
  41.     end
  42.  
  43.     def expired?
  44.       expired || Time.now.utc >= expires_in
  45.     end
  46.  
  47.     def expire
  48.       @expired = true
  49.       session.reset!
  50.       session
  51.     end
  52.  
  53.     def respond_to_missing?(method_name, include_private = false)
  54.       session.respond_to?(method_name, include_private)
  55.     end
  56.  
  57.     def method_missing(method_name, *args)
  58.       raise SessionExpiredError if expired
  59.       session.public_send(method_name, *args)
  60.     end
  61.  
  62.     class SessionExpiredError < StandardError
  63.     end
  64.   end
  65. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement