Module: Card::Set::All::EventViz

Extended by:
Card::Set
Defined in:
tmpsets/set/mod007-05_standard/all/event_viz.rb

Instance Method Summary collapse

Methods included from Card::Set

abstract_set?, all_set?, card_accessor, card_reader, card_writer, clean_empty_module_from_hash, clean_empty_modules, define_active_job, define_event_method, define_event_perform_later_method, define_on_format, ensure_set, event, extended, format, process_base_module_list, process_base_modules, register_set, register_set_format, shortname, view, write_tmp_file

Instance Method Details

#events(action) ⇒ Object

the events method is a developer’s tool for visualizing the event order for a given card. For example, from a console you might run

puts mycard.events :update

to see the order of events that will be executed on mycard. The indention and arrows (^v) indicate event dependencies.

Note: as of yet, the functionality is a bit rough. It does not display events that are called directly from within other events (like :stored), and certain event requirements (like the presence of a “current_act”) may prevent events from showing up in the tree.



15
16
17
18
19
20
# File 'tmpsets/set/mod007-05_standard/all/event_viz.rb', line 15

def events action
  @action = action
  events = [ events_tree(:validation), events_tree(:save) ]
  @action = nil
  puts_events events
end

#events_tree(filt) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
# File 'tmpsets/set/mod007-05_standard/all/event_viz.rb', line 52

def events_tree filt
  hash = {:name => filt }
  if respond_to? "_#{filt}_callbacks"
    send( "_#{filt}_callbacks" ).each do |callback|
      next unless callback.applies? self
      hash[callback.kind] ||= []
      hash[callback.kind] << events_tree( callback.filter )
    end
  end

  hash
end

#puts_events(events, prefix = '', depth = 0) ⇒ Object

private



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'tmpsets/set/mod007-05_standard/all/event_viz.rb', line 24

def puts_events events, prefix='', depth=0
  r = ''
  depth += 1
  events.each do |e|
    space = ' ' * (depth * 2)

    #FIXME - this is not right.  before and around callbacks are processed in declaration order regardless of kind.
    # not all befores then all arounds

    if e[:before]
      r += puts_events( e[:before], space+'v  ', depth)
    end
    if e[:around]
      r += puts_events( e[:around], space+'vv ', depth )
    end


    output = "#{prefix}#{e[:name]}"
    #warn output
    r+= "#{output}\n"

    if e[:after]
      r += puts_events( e[:after ].reverse, space+'^  ', depth )
    end
  end
  r
end