Class: Cycle
- Inherits:
-
Object
- Object
- Cycle
- Includes:
- Log::Dependency
- Defined in:
- lib/cycle/log.rb,
lib/cycle/cycle.rb,
lib/cycle/defaults.rb,
lib/cycle/controls/time.rb
Direct Known Subclasses
Defined Under Namespace
Modules: Controls, Defaults, Substitute, Telemetry Classes: Log
Constant Summary collapse
- Error =
Class.new(RuntimeError)
Instance Attribute Summary collapse
- #delay_condition ⇒ Object
- #interval_milliseconds ⇒ Object
-
#timeout_milliseconds ⇒ Object
Returns the value of attribute timeout_milliseconds.
Class Method Summary collapse
- .build(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil) ⇒ Object
- .call(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, &action) ⇒ Object
- .configure(receiver, attr_name: nil, interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, cycle: nil) ⇒ Object
- .none ⇒ Object
- .register_telemetry_sink(cycle) ⇒ Object
Instance Method Summary collapse
- #call(&action) ⇒ Object
- #configure ⇒ Object
- #delay(elapsed_milliseconds) ⇒ Object
- #invoke(cycle, &action) ⇒ Object
Instance Attribute Details
#delay_condition ⇒ Object
17 18 19 |
# File 'lib/cycle/cycle.rb', line 17 def delay_condition @delay_condition ||= Defaults.delay_condition end |
#interval_milliseconds ⇒ Object
10 11 12 |
# File 'lib/cycle/cycle.rb', line 10 def interval_milliseconds @interval_milliseconds ||= Defaults.interval_milliseconds end |
#timeout_milliseconds ⇒ Object
Returns the value of attribute timeout_milliseconds.
14 15 16 |
# File 'lib/cycle/cycle.rb', line 14 def timeout_milliseconds @timeout_milliseconds end |
Class Method Details
.build(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/cycle/cycle.rb', line 21 def self.build(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil) instance = new instance.interval_milliseconds = interval_milliseconds instance.timeout_milliseconds = timeout_milliseconds instance.delay_condition = delay_condition instance.configure instance end |
.call(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, &action) ⇒ Object
54 55 56 57 |
# File 'lib/cycle/cycle.rb', line 54 def self.call(interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, &action) instance = build(interval_milliseconds: interval_milliseconds, timeout_milliseconds: timeout_milliseconds, delay_condition: delay_condition) instance.call(&action) end |
.configure(receiver, attr_name: nil, interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, cycle: nil) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/cycle/cycle.rb', line 33 def self.configure(receiver, attr_name: nil, interval_milliseconds: nil, timeout_milliseconds: nil, delay_condition: nil, cycle: nil) attr_name ||= :cycle if !cycle.nil? instance = cycle else instance = build(interval_milliseconds: interval_milliseconds, timeout_milliseconds: timeout_milliseconds, delay_condition: delay_condition) end receiver.public_send "#{attr_name}=", instance end |
.none ⇒ Object
45 46 47 |
# File 'lib/cycle/cycle.rb', line 45 def self.none None.build end |
Instance Method Details
#call(&action) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/cycle/cycle.rb', line 59 def call(&action) stop_time = nil stop_time_iso8601 = nil if !timeout_milliseconds.nil? stop_time = clock.now + (timeout_milliseconds.to_f / 1000.0) stop_time_iso8601 = clock.iso8601(stop_time, precision: 5) end logger.trace { "Cycling (Interval Milliseconds: #{interval_milliseconds}, Timeout Milliseconds: #{timeout_milliseconds.inspect}, Stop Time: #{stop_time_iso8601})" } cycle = -1 result = nil loop do cycle += 1 telemetry.record :cycle, cycle result, elapsed_milliseconds = invoke(cycle, &action) if delay_condition.(result) logger.debug { "Got no results from action (Cycle: #{cycle})" } delay(elapsed_milliseconds) else logger.debug { "Got results from action (Cycle: #{cycle})" } telemetry.record :got_result break end if !timeout_milliseconds.nil? now = clock.now if now >= stop_time logger.debug { "Timeout has lapsed (Cycle: #{cycle}, Stop Time: #{stop_time_iso8601}, Timeout Milliseconds: #{timeout_milliseconds})" } telemetry.record :timed_out, now break end end end logger.debug { "Cycled (Iterations: #{cycle + 1}, Interval Milliseconds: #{interval_milliseconds}, Timeout Milliseconds: #{timeout_milliseconds.inspect}, Stop Time: #{stop_time_iso8601})" } return result end |
#configure ⇒ Object
49 50 51 52 |
# File 'lib/cycle/cycle.rb', line 49 def configure Clock::UTC.configure self ::Telemetry.configure self end |
#delay(elapsed_milliseconds) ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/cycle/cycle.rb', line 122 def delay(elapsed_milliseconds) delay_milliseconds = interval_milliseconds - elapsed_milliseconds logger.trace { "Delaying (Delay Milliseconds: #{delay_milliseconds}, Interval Milliseconds: #{interval_milliseconds}, Elapsed Milliseconds: #{elapsed_milliseconds})" } if delay_milliseconds <= 0 logger.debug { "Elapsed time exceeds or equals interval. Not delayed. (Delay Milliseconds: #{delay_milliseconds}, Interval Milliseconds: #{interval_milliseconds}, Elapsed Milliseconds: #{elapsed_milliseconds})" } return end delay_seconds = (delay_milliseconds.to_f / 1000.0) sleep delay_seconds telemetry.record :delayed, delay_milliseconds logger.debug { "Finished delaying (Delay Milliseconds: #{delay_milliseconds}, Interval Milliseconds: #{interval_milliseconds}, Elapsed Milliseconds: #{elapsed_milliseconds})" } end |
#invoke(cycle, &action) ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/cycle/cycle.rb', line 101 def invoke(cycle, &action) if action.nil? raise Error, "Cycle must be actuated with a block" end action_start_time = clock.now logger.trace { "Invoking action (Cycle: #{cycle}, Start Time: #{clock.iso8601(action_start_time, precision: 5)})" } result = action.call(cycle) action_end_time = clock.now elapsed_milliseconds = clock.elapsed_milliseconds(action_start_time, action_end_time) telemetry.record :invoked_action, elapsed_milliseconds logger.debug { "Invoked action (Cycle: #{cycle}, Elapsed Milliseconds: #{elapsed_milliseconds}, Start Time: #{clock.iso8601(action_start_time, precision: 5)}, End Time: #{clock.iso8601(action_end_time, precision: 5)})" } [result, elapsed_milliseconds] end |