module SiteHealth::EventEmitter

Public Class Methods

define(*event_names) click to toggle source

Returns an event emitter class with given event names @return [Object] the event emitter class @param [String, Symbol] event_names @example Simple event emitter

class CrawlEvent < EventEmitter.define(:found_url, :page_title)
end

event = CrawlEvent.new do |on|
  on.every_found_url { {|url| puts "Found URL: #{url}" }
  on.every_page_title { {|title| puts "Page title: #{title}" }
  # you can add multiple blocks
  on.every_page_title do |title|
    puts "[WARNING] Title too long!: #{title}" if title.length > 155
  end
end

event.emit_page_title(page_title)
event.emmit_found_url(url)
# File lib/site_health/event_emitter.rb, line 23
def self.define(*event_names)
  # rubocop:disable Metrics/BlockLength
  Class.new do
    def initialize
      yield(self) if block_given?
    end

    define_method(:events) { event_names }

    event_names.each do |name|
      define_method(:emit) do |*args|
        public_send("emit_#{args.shift}", *args)
      end

      define_method("emit_#{name}") do |*args|
        blocks_for(name).each { |block| block.call(*args) }
      end

      define_method(:emit_each) do |*args|
        public_send("emit_each_#{args.shift}", *args)
      end

      define_method("emit_each_#{name}") do |array|
        blocks_for(name).each do |block|
          array.each { |o| block.call(o) }
        end
      end

      define_method("every_#{name}") do |*_args, &block|
        raise(ArgumentError, 'block must be given!') unless block

        blocks_for(name) << block
      end

      define_method(:blocks_for) do |block_name|
        variable_name = "@#{block_name}_blocks"
        if value = instance_variable_get(variable_name)
          value
        else
          instance_variable_set(variable_name, [])
        end
      end
    end
  end
  # rubocop:enable Metrics/BlockLength
end
new() { |self| ... } click to toggle source
# File lib/site_health/event_emitter.rb, line 26
def initialize
  yield(self) if block_given?
end