Module: Crew::Util

Included in:
Context, Task, Task::Test, Tester
Defined in:
lib/crew/util.rb

Instance Method Summary collapse

Instance Method Details

#assert(value, message = nil) ⇒ Object



8
9
10
11
12
13
# File 'lib/crew/util.rb', line 8

def assert(value, message = nil)
  value or begin
    message ||= "expected #{value.inspect} to be true at #{caller.first}"
    raise AssertionError, message
  end
end

#escape(*words) ⇒ Object



66
67
68
# File 'lib/crew/util.rb', line 66

def escape(*words)
  Shellwords.shelljoin(words)
end

#loggerObject



37
38
39
# File 'lib/crew/util.rb', line 37

def logger
  @home ? @home.logger : @logger
end

#poll(name, opts = {}) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/crew/util.rb', line 41

def poll(name, opts = {})
  interval = opts[:interval] || 1
  timeout = opts[:timeout]
  spinner = logger.spinner(name)
  val = nil
  begin
    logger.muted do
      Timeout::timeout(timeout) do
        begin
          val = yield
        rescue
          spinner[false]
          sleep interval
          retry
        else
          spinner[true]
        end
      end
    end
  rescue Timeout::Error
    assert false, "timeout of #{timeout} exceeded"
  end
  val
end

#retryable(opts = {}) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/crew/util.rb', line 15

def retryable(opts = {})
  intervals = 10.times.map { 0.1 }.to_a
  timeout = opts[:timeout]
  max = opts[:max] || 1.0
  out = nil
  begin
    Timeout::timeout(max) do
      begin
        Timeout::timeout(timeout) { out = yield }
      end
    end
  rescue
    if intervals.empty?
      raise
    else
      sleep intervals.shift
      retry
    end
  end
  out
end