[SCM] ci-tooling packaging branch, master, updated. 0ada158abc2d5ef521d2c5f509e59de5f1f0e374

Harald Sitter apachelogger-guest at moszumanska.debian.org
Tue Feb 24 09:25:59 UTC 2015


Gitweb-URL: http://git.debian.org/?p=pkg-kde/ci-tooling.git;a=commitdiff;h=1e9c555

The following commit has been merged in the master branch:
commit 1e9c555fe05f1fa0ccad343276858b164552ec56
Author: Harald Sitter <sitter at kde.org>
Date:   Tue Feb 24 10:25:31 2015 +0100

    retry: another common patter put in a module
    
    the retry module adds a retry_it method to a class that can also be called
    directly on the module, it does nothing more than yield back and catch
    a set of defined errors up to a certain count at which point it will
    raise the first error it gets back into the caller
---
 lib/retry.rb       | 18 ++++++++++++++
 test/test_retry.rb | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)

diff --git a/lib/retry.rb b/lib/retry.rb
new file mode 100644
index 0000000..4d05f1f
--- /dev/null
+++ b/lib/retry.rb
@@ -0,0 +1,18 @@
+# Helps with retrying an exception throwing code.
+module Retry
+  module_function
+
+  # Retry given block.
+  # @param tries [Integer] amount of tries
+  # @param errors [Array<Object>] errors to rescue
+  # @param sleep [Integer, nil] seconds to sleep between tries
+  # @yield yields to block which needs retrying
+  def retry_it(times: 1, errors: [StandardError], sleep: nil, silent: false)
+    yield
+    rescue *errors => e
+      raise e if (times -= 1) == 0
+      print "Error on job #{name} :: #{e}
" unless silent
+      Kernel.sleep(sleep) if sleep
+      retry
+  end
+end
diff --git a/test/test_retry.rb b/test/test_retry.rb
new file mode 100644
index 0000000..06ebc3f
--- /dev/null
+++ b/test/test_retry.rb
@@ -0,0 +1,69 @@
+require 'test/unit'
+
+require_relative '../lib/retry'
+
+class RetryHelper
+  attr_reader :count
+
+  def initialize(max_count: 0, errors: [])
+    @max_count = max_count
+    @errors = errors
+  end
+
+  def count_up
+    @count ||= 0
+    @count += 1
+    fail 'random' unless @count == @max_count
+  end
+
+  def error
+    @error_at ||= -1
+    return if @error_at >= @errors.size - 1
+    fail @errors[@error_at += 1].new('error')
+  end
+end
+
+# Test blocking thread pool.
+class RetryTest < Test::Unit::TestCase
+  def test_times
+    times = 5
+    helper = RetryHelper.new(max_count: times)
+    Retry.retry_it(times: times, silent: true) do
+      helper.count_up
+    end
+    assert_equal(times, helper.count)
+  end
+
+  def test_errors
+    errors = [NameError, LoadError]
+
+    helper = RetryHelper.new(errors: errors)
+    assert_nothing_raised do
+      Retry.retry_it(times: errors.size + 1, errors: errors, silent: true) do
+        helper.error
+      end
+    end
+
+    helper = RetryHelper.new(errors: errors)
+    assert_raise do
+      Retry.retry_it(times: errors.size + 1, errors: [], silent: true) do
+        helper.error
+      end
+    end
+  end
+
+  def test_sleep
+    sleep = 1
+    times = 2
+    helper = RetryHelper.new(max_count: times)
+    time_before = Time.new
+    Retry.retry_it(times: times, sleep: sleep, silent: true) do
+      helper.count_up
+    end
+    time_now = Time.new
+    delta_seconds = time_now - time_before
+    # Delta must be between actual sleep time and twice the sleep time.
+    assert(delta_seconds >= sleep, 'hasnt slept long enough')
+    assert(delta_seconds <= sleep * 2.0, 'has slept too long')
+  end
+end

-- 
ci-tooling packaging



More information about the pkg-kde-commits mailing list