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
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.
17 18 19 20 21 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 17 def initialize(...) @timestamp = Time.now super yield(self) if block_given? end |
Instance Attribute Details
#timestamp ⇒ Object (readonly)
Returns the value of attribute timestamp.
15 16 17 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 15 def @timestamp end |
Instance Method Details
#complete? ⇒ Boolean
41 42 43 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 41 def complete? status.complete?(total) end |
#increased ⇒ Object
57 58 59 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 57 def increased status.progress_increase(lstatus) end |
#job_id ⇒ Object
37 38 39 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 37 def job_id status.id end |
#last ⇒ Object
29 30 31 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 29 def last original_last || start end |
#lwaited ⇒ Object
65 66 67 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 65 def lwaited - last end |
#net_waited ⇒ Object
69 70 71 72 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 69 def net_waited last_delay = ldelay || 0 waited - (last_delay / 2) end |
#new(**kargs, &block) ⇒ Object
33 34 35 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 33 def new(**kargs, &block) self.class.new(**new_kargs.merge(kargs), &block) end |
#on_timeout!(&block) ⇒ Object
106 107 108 109 110 111 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 106 def on_timeout!(&block) return start_timeout!(&block) if start_timeout? return timeout!(&block) if timeout? false end |
#original_last ⇒ Object
28 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 28 alias_method :original_last, :last |
#original_start ⇒ Object
23 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 23 alias_method :original_start, :start |
#pending ⇒ Object
49 50 51 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 49 def pending status.pending(total) end |
#progress ⇒ Object
53 54 55 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 53 def progress status.progress end |
#start ⇒ Object
24 25 26 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 24 def start original_start || end |
#start_timeout! {|_self| ... } ⇒ Object
125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 125 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
100 101 102 103 104 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 100 def start_timeout? return false if status.started? !time_left_to_start.positive? end |
#started? ⇒ Boolean
45 46 47 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 45 def started? status.started? end |
#time_left ⇒ Object
74 75 76 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 74 def time_left (timeout_in - waited).round(2) end |
#time_left_to_start ⇒ Object
82 83 84 85 86 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 82 def time_left_to_start return max_start_delay if started? (max_start_delay - waited).round(2) end |
#time_left_total ⇒ Object
78 79 80 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 78 def time_left_total (timeout - waited).round(2) end |
#timeout! {|_self| ... } ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 113 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/
96 97 98 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 96 def timeout? !time_left_total.positive? end |
#timeout_in ⇒ Object
88 89 90 91 92 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 88 def timeout_in return time_left_total if started? time_left_to_start end |
#waited ⇒ Object
61 62 63 |
# File 'lib/ecoportal/api/v1/job/awaiter/timer.rb', line 61 def waited - start end |