attempt_to 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+ gem "rspec"
3
+ gem "rake"
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ attempt_to
2
+ ==========
3
+
4
+ Small gem for attempting to do something and returning errors if it fails.
5
+
6
+ Usage:
7
+
8
+ # Try to connect 3 times to the network, otherwise exit.
9
+ attempt_to('connect to the network', 3) {
10
+ TCPSocket.new("some.very.weird.domain.name", 9342)
11
+ }
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env rake
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('../lib/attempt_to/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'attempt_to'
6
+ gem.version = AttemptTo::VERSION
7
+ gem.date = Date.today.to_s
8
+
9
+ gem.summary = "AttemptTo is a small utility for attempting a code block multiple times"
10
+ gem.description = "AttemptTo calls a code block and re-tries it if it throws an exception. Otherwise exits"
11
+
12
+ gem.authors = ['Bas Vodde']
13
+ gem.email = 'basv@odd-e.com'
14
+ gem.homepage = 'https://github.com/basvodde/attempt_to'
15
+
16
+ gem.add_dependency('rake')
17
+ gem.add_development_dependency('rspec', [">= 2.0.0"])
18
+
19
+ gem.files = `git ls-files -- {.,test,spec,lib}/*`.split("\n")
20
+ end
data/lib/attempt_to.rb ADDED
@@ -0,0 +1,2 @@
1
+
2
+ require 'attempt_to/attempt_to.rb'
@@ -0,0 +1,21 @@
1
+
2
+
3
+ module AttemptTo
4
+ def self.attempt_to(something, amount)
5
+ amount.times { |times|
6
+ begin
7
+ return yield
8
+ rescue Exception => ex
9
+ Kernel.puts "Failed attempt ##{times+1} to #{something}. Error message: #{ex.message}"
10
+ if times+1 == amount
11
+ Kernel.puts "Attempted #{amount} times to #{something}. Giving up..."
12
+ exit
13
+ end
14
+ end
15
+ }
16
+ end
17
+ end
18
+
19
+ def attempt_to(something, amount, &code_block)
20
+ AttemptTo.attempt_to(something, amount, &code_block)
21
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module AttemptTo
3
+ VERSION = "0.3"
4
+ end
@@ -0,0 +1,53 @@
1
+
2
+ require 'attempt_to'
3
+ require 'socket'
4
+
5
+ describe "Attempt to do something a couple of times, if it fails, bail out." do
6
+
7
+ before(:each) {
8
+ @attempts = 0
9
+ }
10
+
11
+ it "calls the block only once when it succeeds" do
12
+ attempt_to("do this", 3) {
13
+ @attempts += 1
14
+ }
15
+ @attempts.should == 1
16
+ end
17
+
18
+ it "returns whatever the code block returns" do
19
+ attempt_to("do this", 2) {
20
+ "returns"
21
+ }.should == "returns"
22
+ end
23
+
24
+ it "calls the block multiple times when it fails " do
25
+ Kernel.should_receive(:puts).with("Failed attempt #1 to do something. Error message: wrong 1")
26
+ attempt_to("do something", 3) {
27
+ @attempts += 1
28
+ raise(Exception, "wrong #{@attempts}") if @attempts == 1
29
+ }
30
+ @attempts.should == 2
31
+ end
32
+
33
+ it "bails out aften the maximum amount of attempts" do
34
+ Kernel.should_receive(:puts).exactly(3).times
35
+ Kernel.should_receive(:puts).with("Attempted 3 times to do this. Giving up...")
36
+ lambda {
37
+ attempt_to("do this", 3) {
38
+ @attempts += 1
39
+ raise(Exception, "wrong!")
40
+ }
41
+ }.should raise_error(SystemExit)
42
+
43
+ @attempts.should == 3
44
+ end
45
+
46
+ # it "Can run the example code" do
47
+ # attempt_to('connect to the network', 3) {
48
+ # TCPSocket.new("some.very.weird.domain.name", 9342)
49
+ # }
50
+ #
51
+ # end
52
+
53
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attempt_to
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: "0.3"
6
+ platform: ruby
7
+ authors:
8
+ - Bas Vodde
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-12-03 00:00:00 +08:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rake
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 2.0.0
36
+ type: :development
37
+ version_requirements: *id002
38
+ description: AttemptTo calls a code block and re-tries it if it throws an exception. Otherwise exits
39
+ email: basv@odd-e.com
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - Gemfile
48
+ - README.md
49
+ - Rakefile
50
+ - attempt_to.gemfile
51
+ - lib/attempt_to.rb
52
+ - lib/attempt_to/attempt_to.rb
53
+ - lib/attempt_to/version.rb
54
+ - spec/attempt_to_spec.rb
55
+ has_rdoc: true
56
+ homepage: https://github.com/basvodde/attempt_to
57
+ licenses: []
58
+
59
+ post_install_message:
60
+ rdoc_options: []
61
+
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ requirements: []
77
+
78
+ rubyforge_project:
79
+ rubygems_version: 1.6.2
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: AttemptTo is a small utility for attempting a code block multiple times
83
+ test_files: []
84
+