Class: Cucumber::Core::EventBus

Inherits:
Object
  • Object
show all
Defined in:
lib/cucumber/core/event_bus.rb

Overview

Event Bus

Implements an in-process pub-sub event broadcaster allowing multiple observers to subscribe to events that fire as your tests are executed.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry = Events.registry) ⇒ EventBus

Returns a new instance of EventBus.

Parameters:

  • registry (Hash{Symbol => Class}) (defaults to: Events.registry)

    a hash of event types to use on the bus



15
16
17
18
19
# File 'lib/cucumber/core/event_bus.rb', line 15

def initialize(registry = Events.registry)
  @event_types = registry.freeze
  @handlers = {}
  @event_queue = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(event_id, *args) ⇒ Object



36
37
38
39
# File 'lib/cucumber/core/event_bus.rb', line 36

def method_missing(event_id, *args)
  event_class = event_types.fetch(event_id) { super }
  broadcast event_class.new(*args)
end

Instance Attribute Details

#event_typesObject (readonly)

Returns the value of attribute event_types.



12
13
14
# File 'lib/cucumber/core/event_bus.rb', line 12

def event_types
  @event_types
end

Instance Method Details

#broadcast(event) ⇒ Object

Raises:

  • (ArgumentError)


30
31
32
33
34
# File 'lib/cucumber/core/event_bus.rb', line 30

def broadcast(event)
  raise ArgumentError, "Event type #{event.class} is not registered. Try one of these:\n#{event_types.values.join("\n")}" unless registered_type?(event.class)
  handlers_for(event.class).each { |handler| handler.call(event) }
  @event_queue << event
end

#on(event_id, handler_object = nil, &handler_proc) ⇒ Object

Register for an event. The handler proc will be called back with each of the attributes of the event



22
23
24
25
26
27
28
# File 'lib/cucumber/core/event_bus.rb', line 22

def on(event_id, handler_object = nil, &handler_proc)
  handler = handler_proc || handler_object
  validate_handler_and_event_id!(handler, event_id)
  event_class = event_types[event_id]
  handlers_for(event_class) << handler
  broadcast_queued_events_to handler, event_class
end

#respond_to_missing?(event_id, *args) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/cucumber/core/event_bus.rb', line 41

def respond_to_missing?(event_id, *args)
  event_types.key?(event_id) || super
end