class SiteWatcher

Constants

VERSION

Public Class Methods

new(before_hooks, pages, after_hooks, delay, logger) click to toggle source
# File lib/site_watcher.rb, line 28
def initialize(before_hooks, pages, after_hooks, delay, logger)
  @before_hooks = before_hooks
  @pages = pages
  @after_hooks = after_hooks
  @delay = delay
  @logger = logger
  @force = false
end
watch(opts={}, &block) click to toggle source
# File lib/site_watcher.rb, line 10
def self.watch(opts={}, &block)
  trap(:SIGINT) { abort(?\n) }

  dsl = DSL::Top.new
  dsl.instance_eval(&block)

  delay = opts.fetch(:every, 5)
  logger = opts.fetch(:logger, ::Logger.new($stderr))

  new(
    dsl.__sw_before_hooks,
    dsl.__sw_pages,
    dsl.__sw_after_hooks,
    delay,
    logger
  ).watch
end

Public Instance Methods

watch() click to toggle source
# File lib/site_watcher.rb, line 37
def watch
  capture_signals do
    loop do
      break if @pages.empty?

      force = @force
      @force &&= false

      @pages.each do |page|
        begin
          page.__sw_run!(force)
          @pages.delete(page) if page.__sw_remove_on_fulfillment
        rescue ::RSpec::Expectations::ExpectationNotMetError
        rescue => e
          @logger.warn("Exception on #{page.__sw_url}: #{e.inspect}")
        end
      end

      sleep(@delay)
    end
  end
end

Private Instance Methods

capture_signals() { || ... } click to toggle source
# File lib/site_watcher.rb, line 62
def capture_signals
  ::Signal.trap(:INT) { abort(?\n) }

  ::Signal.trap(:USR1) do
    ::Thread.new do
      @logger.warn("Received USR1, next round of tests will force fulfillment")
    end.join

    @force = true
  end

  @before_hooks.each(&:call)
  yield
ensure
  ::Signal.trap(:INT, "DEFAULT")
  ::Signal.trap(:USR1, "DEFAULT")

  @after_hooks.each(&:call)
end