Class: Lyra::Visualization::Timeline

Inherits:
Object
  • Object
show all
Defined in:
lib/lyra/visualization/timeline.rb

Overview

Timeline visualization for event flows

Instance Method Summary collapse

Constructor Details

#initialize(events) ⇒ Timeline

Returns a new instance of Timeline.



5
6
7
# File 'lib/lyra/visualization/timeline.rb', line 5

def initialize(events)
  @events = events.sort_by { |e| event_timestamp(e) }
end

Instance Method Details

#to_ascii ⇒ Object

Generate ASCII timeline



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/lyra/visualization/timeline.rb', line 91

def to_ascii
  lines = ["Event Timeline", "=" * 80, ""]

  @events.each do |event|
    time_str = event_timestamp(event).strftime("%Y-%m-%d %H:%M:%S")
    pii_marker = has_pii?(event) ? " [PII]" : ""

    lines << "#{time_str} | #{event_model_class(event)}##{event_model_id(event)}"
    lines << "  └─ #{event_operation(event).to_s.upcase}#{pii_marker}"

    changes = event_changes(event)
    if changes.any?
      changes.each do |field, (old_val, new_val)|
        lines << "     • #{field}: #{old_val} → #{new_val}"
      end
    end

    lines << ""
  end

  lines.join("\n")
end

#to_d3_json ⇒ Object

Generate JSON for D3.js visualization



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/lyra/visualization/timeline.rb', line 115

def to_d3_json
  {
    nodes: @events.map.with_index do |event, i|
      {
        id: event.event_id,
        index: i,
        timestamp: event_timestamp(event).to_i,
        label: "#{event_model_class(event)}##{event_model_id(event)}",
        operation: event_operation(event),
        has_pii: has_pii?(event),
        group: event_model_class(event),
        user_id: event.[:user_id]
      }
    end,
    links: build_links(@events)
  }.to_json
end

#to_data ⇒ Object

Generate timeline data for visualization



58
59
60
61
62
63
64
# File 'lib/lyra/visualization/timeline.rb', line 58

def to_data
  {
    events: timeline_events,
    groups: event_groups,
    metadata: 
  }
end

#to_html ⇒ Object

Generate timeline HTML



67
68
69
# File 'lib/lyra/visualization/timeline.rb', line 67

def to_html
  TimelineHtmlBuilder.new(@events).build
end

#to_mermaid ⇒ Object

Generate Mermaid diagram



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/lyra/visualization/timeline.rb', line 72

def to_mermaid
  lines = ["gantt"]
  lines << "    title Event Timeline"
  lines << "    dateFormat YYYY-MM-DD HH:mm:ss"
  lines << ""

  @events.group_by { |e| event_model_class(e) }.each do |model_class, events|
    lines << "    section #{model_class}"
    events.each do |event|
      label = "#{event_operation(event)} ##{event_model_id(event)}"
      timestamp = event_timestamp(event).strftime("%Y-%m-%d %H:%M:%S")
      lines << "    #{label} :#{timestamp}, 1s"
    end
  end

  lines.join("\n")
end