Class: Shoes::DisplayService

Inherits:
Object
  • Object
show all
Extended by:
Log
Defined in:
lacci/lib/shoes/display_service.rb

Constant Summary

Constants included from Log

Log::DEFAULT_COMPONENT, Log::DEFAULT_DEBUG_LOG_CONFIG, Log::DEFAULT_LOG_CONFIG

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Log

configure_logger, log_init, logger

Class Method Details

.dispatch_event(event_name, event_target, *args, **kwargs) ⇒ Object

An event_target may be nil, to indicate there is no target.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lacci/lib/shoes/display_service.rb', line 36

def dispatch_event(event_name, event_target, *args, **kwargs)
  @@display_event_handlers ||= {}

  unless @log
    log_init("DisplayService")
  end

  raise "Cannot dispatch on event_name :any!" if event_name == :any

  @log.debug("Dispatch event: #{event_name.inspect} T: #{event_target.inspect} A: #{args.inspect} KW: #{kwargs.inspect}")

  # When true, this makes sure all events and properties are 100% strings, no symbols.
  if ENV["SCARPE_DEBUG"]
    args = JSON.parse JSON.dump(args)
    new_kw = {}
    kwargs.each do |k, v|
      new_kw[k] = JSON.parse JSON.dump(v)
    end
    kwargs = new_kw
  end

  same_name_handlers = @@display_event_handlers[event_name] || {}
  any_name_handlers = @@display_event_handlers[:any] || {}

  # Do we have any keys, in same_name_handlers or any_name_handlers, matching the target or :any?
  # Note that "nil" is a target like any other for these purposes -- subscribing to a nil target
  # won't get you non-nil-target events and vice-versa.
  handlers = [
    same_name_handlers[:any],           # Same name, any target
    same_name_handlers[event_target],   # Same name, same target
    any_name_handlers[:any],            # Any name, any target
    any_name_handlers[event_target],    # Any name, same target
  ].compact.inject([], &:+)
  kwargs[:event_name] = event_name
  kwargs[:event_target] = event_target if event_target
  handlers.each { |h| h[:handler].call(*args, **kwargs) }
end

.display_serviceObject



120
121
122
123
124
125
126
# File 'lacci/lib/shoes/display_service.rb', line 120

def display_service
  return @service if @service

  raise "No display service was set!" unless @display_service_klass

  @service = @display_service_klass.new
end

.full_reset!Object



109
110
111
112
# File 'lacci/lib/shoes/display_service.rb', line 109

def full_reset!
  @@display_event_handlers = {}
  @json_debug_serialize = nil
end

.set_display_service_class(klass) ⇒ Object



114
115
116
117
118
# File 'lacci/lib/shoes/display_service.rb', line 114

def set_display_service_class(klass)
  raise "Can only set a single display service class!" if @display_service_klass

  @display_service_klass = klass
end

.subscribe_to_event(event_name, event_target, &handler) ⇒ Object

It's permitted to subscribe to event_name :any for all event names, and event_target :any for all targets. An event_target of nil means "no target", and only matches events dispatched with a nil target.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lacci/lib/shoes/display_service.rb', line 76

def subscribe_to_event(event_name, event_target, &handler)
  @@display_event_handlers ||= {}
  @@display_event_unsub_id ||= 0
  unless handler
    raise "Must pass a block as a handler to DisplayService.subscribe_to_event!"
  end

  unless @log
    log_init("DisplayService")
  end

  @log.debug("Subscribe to event: #{event_name.inspect} T: #{event_target.inspect}")

  id = @@display_event_unsub_id
  @@display_event_unsub_id += 1

  @@display_event_handlers[event_name] ||= {}
  @@display_event_handlers[event_name][event_target] ||= []
  @@display_event_handlers[event_name][event_target] << { handler:, unsub_id: id }

  id
end

.unsub_from_events(unsub_id) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lacci/lib/shoes/display_service.rb', line 99

def unsub_from_events(unsub_id)
  raise "Must provide an unsubscribe ID!" if unsub_id.nil?

  @@display_event_handlers.each do |_e_name, target_hash|
    target_hash.each do |_target, h_list|
      h_list.delete_if { |item| item[:unsub_id] == unsub_id }
    end
  end
end

Instance Method Details

#create_display_widget_for(widget_class_name, widget_id, properties) ⇒ Object

These methods are an interface to DisplayService objects.



131
132
133
# File 'lacci/lib/shoes/display_service.rb', line 131

def create_display_widget_for(widget_class_name, widget_id, properties)
  raise "Override in DisplayService implementation!"
end

#destroyObject



149
150
151
# File 'lacci/lib/shoes/display_service.rb', line 149

def destroy
  raise "Override in DisplayService implementation!"
end

#query_display_widget_for(id, nil_ok: false) ⇒ Object



140
141
142
143
144
145
146
147
# File 'lacci/lib/shoes/display_service.rb', line 140

def query_display_widget_for(id, nil_ok: false)
  display_widget = @display_widget_for[id]
  unless display_widget || nil_ok
    raise "Could not find display widget for linkable ID #{id.inspect}!"
  end

  display_widget
end

#set_widget_pairing(id, display_widget) ⇒ Object



135
136
137
138
# File 'lacci/lib/shoes/display_service.rb', line 135

def set_widget_pairing(id, display_widget)
  @display_widget_for ||= {}
  @display_widget_for[id] = display_widget
end