Class: PaperTrailDiff::ActivityRange

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

Overview

Tests activity versions against a historical-version or wall-clock range end.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(start_boundary, end_boundary) ⇒ ActivityRange

: (untyped, untyped) -> void

Parameters:

  • (Object)
  • (Object)


11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/paper_trail_diff/activity_range.rb', line 11

def initialize(start_boundary, end_boundary)
  @start_boundary = start_boundary
  @end_boundary = end_boundary
  @start_key = if Endpoint.version?(start_boundary)
                 Support.chronological_version_key(start_boundary)
               end
  @start_time = Endpoint.version?(start_boundary) ? start_boundary.created_at : start_boundary
  @end_time = Endpoint.version?(end_boundary) ? end_boundary.created_at : end_boundary
  @end_key = if Endpoint.version?(end_boundary)
               Support.chronological_version_key(end_boundary)
             end
end

Instance Attribute Details

#end_timeObject (readonly)

Signature:

  • untyped

Returns:

  • (Object)


8
9
10
# File 'lib/paper_trail_diff/activity_range.rb', line 8

def end_time
  @end_time
end

#start_timeObject (readonly)

Signature:

  • untyped

Returns:

  • (Object)


7
8
9
# File 'lib/paper_trail_diff/activity_range.rb', line 7

def start_time
  @start_time
end

Instance Method Details

#after_start?(version, key) ⇒ Boolean

: (untyped, Array) -> bool

Parameters:

  • (Object)
  • (Array[untyped])

Returns:

  • (Boolean)


51
52
53
54
55
56
# File 'lib/paper_trail_diff/activity_range.rb', line 51

def after_start?(version, key)
  start_key = @start_key
  return key_before_or_equal?(start_key, key) if start_key

  version.created_at >= @start_time
end

#before_end?(version, key) ⇒ Boolean

: (untyped, Array) -> bool

Parameters:

  • (Object)
  • (Array[untyped])

Returns:

  • (Boolean)


59
60
61
62
63
64
# File 'lib/paper_trail_diff/activity_range.rb', line 59

def before_end?(version, key)
  end_key = @end_key
  return key_before_or_equal?(key, end_key) if end_key

  version.created_at <= @end_boundary
end

#current_end?Boolean

: () -> bool

Returns:

  • (Boolean)


38
39
40
# File 'lib/paper_trail_diff/activity_range.rb', line 38

def current_end?
  !Endpoint.version?(@end_boundary)
end

#include?(version) ⇒ Boolean

: (untyped) -> bool

Parameters:

  • (Object)

Returns:

  • (Boolean)


25
26
27
28
# File 'lib/paper_trail_diff/activity_range.rb', line 25

def include?(version)
  key = Support.chronological_version_key(version)
  after_start?(version, key) && before_end?(version, key)
end

#key_before_or_equal?(left, right) ⇒ Boolean

: (Array, Array) -> bool

Parameters:

  • (Array[untyped])
  • (Array[untyped])

Returns:

  • (Boolean)


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

def key_before_or_equal?(left, right)
  comparison = left <=> right
  raise ConfigurationError, 'versions have incomparable timestamps' unless comparison

  comparison <= 0
end

#scope(relation) ⇒ Object

Narrows an Active Record version relation by timestamp. Exact tie-breaking remains in #include? so this works for integer, UUID, and custom version IDs. : (untyped) -> untyped

Parameters:

  • (Object)

Returns:

  • (Object)


33
34
35
# File 'lib/paper_trail_diff/activity_range.rb', line 33

def scope(relation)
  relation.where(created_at: @start_time..end_time)
end