Class: PaperTrailDiff::ActivityTransactionGroups

Inherits:
Object
  • Object
show all
Defined in:
lib/paper_trail_diff/activity_event.rb,
sig/generated/paper_trail_diff/activity_event.rbs

Overview

Resolves the branch union that PT-AT exposes atomically for one transaction.

Instance Method Summary collapse

Constructor Details

#initialize(events) ⇒ ActivityTransactionGroups

: (Array) -> void

Parameters:



68
69
70
71
72
# File 'lib/paper_trail_diff/activity_event.rb', line 68

def initialize(events)
  groups = grouped_events(events)
  @branches = build_groups(groups)
  @group_sizes = groups.transform_values(&:length)
end

Instance Method Details

#branches_for(event) ⇒ Array[String]?

: (ActivityEvent) -> Array?

Parameters:

Returns:

  • (Array[String], nil)


75
76
77
78
79
80
# File 'lib/paper_trail_diff/activity_event.rb', line 75

def branches_for(event)
  key = transaction_key(event)
  return event.branches unless key && @branches.key?(key)

  @branches[key]
end

#build_groups(groups) ⇒ Hash[Array[untyped], Array[String]?]

: (Hash[Array[untyped], Array[ActivityEvent]]) -> Hash[Array[untyped], Array[String]?]

Parameters:

Returns:

  • (Hash[Array[untyped], Array[String]?])


94
95
96
97
98
# File 'lib/paper_trail_diff/activity_event.rb', line 94

def build_groups(groups)
  groups.to_h do |key, selected_events|
    [key, group_branches(selected_events)]
  end
end

#group_branches(events) ⇒ Array[String]?

: (Array) -> Array?

Parameters:

Returns:

  • (Array[String], nil)


114
115
116
117
118
# File 'lib/paper_trail_diff/activity_event.rb', line 114

def group_branches(events)
  return if events.any?(&:root?)

  events.flat_map { |event| event.branches || [] }.uniq.sort.freeze
end

#grouped_events(events) ⇒ Hash[Array[untyped], Array[ActivityEvent]]

: (Array) -> Hash[Array[untyped], Array[ActivityEvent]]

Parameters:

Returns:



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/paper_trail_diff/activity_event.rb', line 101

def grouped_events(events)
  groups = {} #: Hash[Array[untyped], Array[ActivityEvent]]
  events.each do |event|
    key = transaction_key(event)
    next unless key

    groups[key] ||= [] #: Array[ActivityEvent]
    groups[key] << event
  end
  groups
end

#isolated?(event) ⇒ Boolean

: (ActivityEvent) -> bool

Parameters:

Returns:

  • (Boolean)


83
84
85
86
# File 'lib/paper_trail_diff/activity_event.rb', line 83

def isolated?(event)
  key = transaction_key(event)
  !key || @group_sizes.fetch(key, 0) == 1
end

#transaction_key(event) ⇒ Array[untyped]?

: (ActivityEvent) -> Array?

Parameters:

Returns:

  • (Array[untyped], nil)


121
122
123
124
125
126
# File 'lib/paper_trail_diff/activity_event.rb', line 121

def transaction_key(event)
  version = event.version
  return unless version.respond_to?(:transaction_id) && version.transaction_id

  [version.class.name, version.transaction_id]
end