class Portal::Timeline

@api private @since 0.1.0

Attributes

internal_time[R]

@return [Time]

@api private @since 0.1.0

lock[R]

@return [Sidekiq::Portal::Lock]

@api private @since 0.1.0

time_plan[R]

@return [Fugit::Duration, Fugit::Cron]

@api private @since 0.1.0

timezoner[R]

@return [ActiveSupport::TimeZone]

@api private @since 0.1.0

Public Class Methods

new(initial_time, timezoner, time_plan) click to toggle source

@param initial_time [Time] @param timezoner [ActiveSupport::TimeZone] @param time_plan [Fugit::Duration, Fugit::Cron] @return [void]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 15
def initialize(initial_time, timezoner, time_plan)
  @timezoner = timezoner
  @time_plan = time_plan
  @internal_time = initial_time
  @lock = Sidekiq::Portal::Lock.new
end

Public Instance Methods

actualize_time!() click to toggle source

@return [void]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 26
def actualize_time!
  @internal_time = next_time_point
end
current_time_point() click to toggle source

@return [Time]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 34
def current_time_point
  thread_safe { timezoner.at(internal_time) }
end
next_time_point() click to toggle source

@return [Time]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 42
def next_time_point
  thread_safe { timezoner.at(time_plan.next_time(current_time_point).seconds) }
end
time_has_come?() click to toggle source

@return [Boolean]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 71
def time_has_come?
  thread_safe { global_time_point >= next_time_point }
end
time_points() click to toggle source

@param target_time [Time] @return [Array<Time>]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 51
def time_points
  thread_safe do
    start_time  = current_time_point
    target_time = global_time_point

    [].tap do |future_points|
      while start_time <= target_time
        future_point = timezoner.at(time_plan.next_time(start_time).seconds)
        next if start_time > future_point
        future_points.push(future_point)
        start_time = future_point
      end
    end
  end
end

Private Instance Methods

global_time_point() click to toggle source

@return [Time]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 114
def global_time_point
  timezoner.at(Time.current)
end
thread_safe(&block) click to toggle source

@param block [Block] @return [void]

@api private @since 0.1.0

# File lib/portal/timeline.rb, line 106
def thread_safe(&block)
  lock.thread_safe(&block)
end