Class: Ecoportal::API::V1::Job::Awaiter::Timer
- Inherits:
-
Struct
- Object
- Struct
- Ecoportal::API::V1::Job::Awaiter::Timer
- Defined in:
- lib/ecoportal/api/v1/job/awaiter/timer.rb
Overview
The class
Instance Attribute Summary collapse
-
#timestamp ⇒ Object
readonly
Returns the value of attribute timestamp.
Instance Method Summary collapse
- #complete? ⇒ Boolean
- #increased ⇒ Object
-
#initialize {|_self| ... } ⇒ Timer
constructor
A new instance of Timer.
- #job_id ⇒ Object
- #last ⇒ Object
- #lwaited ⇒ Object
- #net_waited ⇒ Object
- #new(**kargs, &block) ⇒ Object
- #on_timeout!(&block) ⇒ Object
- #original_last ⇒ Object
- #original_start ⇒ Object
- #pending ⇒ Object
- #progress ⇒ Object
- #start ⇒ Object
- #start_timeout! {|_self| ... } ⇒ Object
- #start_timeout? ⇒ Boolean
- #started? ⇒ Boolean
- #time_left ⇒ Object
- #time_left_to_start ⇒ Object
- #time_left_total ⇒ Object
- #timeout! {|_self| ... } ⇒ Object
-
#timeout? ⇒ Boolean
timeout library is evil.
- #timeout_in ⇒ Object
- #waited ⇒ Object
Constructor Details
#initialize {|_self| ... } ⇒ Timer
Returns a new instance of Timer.
18 19 20 21 22 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 18 def initialize(...) @timestamp = Time.now super yield(self) if block_given? end |
Instance Attribute Details
#timestamp ⇒ Object (readonly)
Returns the value of attribute timestamp.
16 17 18 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 16 def @timestamp end |
Instance Method Details
#complete? ⇒ Boolean
42 43 44 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 42 def complete? status.complete?(total) end |
#increased ⇒ Object
58 59 60 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 58 def increased status.progress_increase(lstatus) end |
#job_id ⇒ Object
38 39 40 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 38 def job_id status.id end |
#last ⇒ Object
30 31 32 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 30 def last original_last || start end |
#lwaited ⇒ Object
66 67 68 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 66 def lwaited - last end |
#net_waited ⇒ Object
70 71 72 73 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 70 def net_waited last_delay = ldelay || 0 waited - (last_delay / 2) end |
#new(**kargs, &block) ⇒ Object
34 35 36 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 34 def new(**kargs, &block) self.class.new(**new_kargs.merge(kargs), &block) end |
#on_timeout!(&block) ⇒ Object
107 108 109 110 111 112 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 107 def on_timeout!(&block) return start_timeout!(&block) if start_timeout? return timeout!(&block) if timeout? false end |
#original_last ⇒ Object
29 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 29 alias_method :original_last, :last |
#original_start ⇒ Object
24 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 24 alias_method :original_start, :start |
#pending ⇒ Object
50 51 52 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 50 def pending status.pending(total) end |
#progress ⇒ Object
54 55 56 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 54 def progress status.progress end |
#start ⇒ Object
25 26 27 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 25 def start original_start || end |
#start_timeout! {|_self| ... } ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 126 def start_timeout! return false unless start_timeout? yield(self) msg = "Job '#{job_id}' not started (size: #{total}).\n" msg << " Start timed out after #{max_start_delay} seconds.\n" msg << " Current status: #{status}" raise API::Errors::StartTimeOut, msg end |
#start_timeout? ⇒ Boolean
101 102 103 104 105 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 101 def start_timeout? return false if status.started? !time_left_to_start.positive? end |
#started? ⇒ Boolean
46 47 48 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 46 def started? status.started? end |
#time_left ⇒ Object
75 76 77 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 75 def time_left (timeout_in - waited).round(2) end |
#time_left_to_start ⇒ Object
83 84 85 86 87 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 83 def time_left_to_start return max_start_delay if started? (max_start_delay - waited).round(2) end |
#time_left_total ⇒ Object
79 80 81 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 79 def time_left_total (timeout - waited).round(2) end |
#timeout! {|_self| ... } ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 114 def timeout! return false unless timeout? yield(self) msg = "Job '#{job_id}' not complete (size: #{total}).\n" msg << " Timed out after #{timeout} seconds.\n" msg << " Current status: #{status}" raise API::Errors::TimeOut, msg end |
#timeout? ⇒ Boolean
timeout library is evil. So we make poor-man timeout. https://jvns.ca/blog/2015/11/27/why-rubys-timeout-is-dangerous-and-thread-dot-raise-is-terrifying/
97 98 99 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 97 def timeout? !time_left_total.positive? end |
#timeout_in ⇒ Object
89 90 91 92 93 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 89 def timeout_in return time_left_total if started? time_left_to_start end |
#waited ⇒ Object
62 63 64 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 62 def waited - start end |