zeevex_reliability 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in zeevex_reliability.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ namespace :spec do
10
+ desc "Run on three Rubies"
11
+ task :platforms do
12
+ current = %x{rvm-prompt v}
13
+
14
+ fail = false
15
+ %w{1.8.7 1.9.2}.each do |version|
16
+ puts "Switching to #{version}"
17
+ Bundler.with_clean_env do
18
+ system %{bash -c 'source ~/.rvm/scripts/rvm && rvm #{version} && bundle exec rake spec'}
19
+ end
20
+ if $?.exitstatus != 0
21
+ fail = true
22
+ break
23
+ end
24
+ end
25
+
26
+ system %{rvm #{current}}
27
+
28
+ exit (fail ? 1 : 0)
29
+ end
30
+ end
31
+
32
+ task :default => 'spec'
@@ -0,0 +1,48 @@
1
+ module ZeevexReliability
2
+ module OptimisticLockRetryable
3
+ def self.included(base)
4
+ base.class_eval do
5
+ include InstanceMethods
6
+ end
7
+ end
8
+
9
+ module InstanceMethods
10
+ # Options:
11
+ # * :tries - Number of retries to perform. Defaults to 3.
12
+ #
13
+ # If the final attempts also receives an exception, that exception
14
+ # will be raised.
15
+ #
16
+ # Example
17
+ # =======
18
+ # model.with_optimistic_retry(:tries => 5) do
19
+ # # your model frobbing code here
20
+ # model.save!
21
+ # end
22
+ #
23
+ def with_optimistic_retry(options = {}, &block)
24
+ opts = { :tries => 3 }.merge(options)
25
+ retries = opts[:tries]
26
+
27
+ # a retry may reload the object, so log a message that this
28
+ # may be used incorrectly
29
+ if changed?
30
+ logger.warn "WARNING: with_optimistic_retry called on changed object; if the save fails, changes will be lost!"
31
+ end
32
+
33
+ begin
34
+ return yield
35
+ rescue ActiveRecord::StaleObjectError
36
+ if (retries -= 1) > 0
37
+ self.reload
38
+ retry
39
+ else
40
+ raise
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+
@@ -0,0 +1,35 @@
1
+ module ZeevexReliability
2
+ module Retryable
3
+ # Options:
4
+ # * :tries - Number of retries to perform. Defaults to 3.
5
+ # * :on - The Exception on which a retry will be performed.
6
+ # Defaults to StandardError
7
+ #
8
+ # If the final attempts also receives an exception, that exception
9
+ # will be raised.
10
+ #
11
+ # Example
12
+ # =======
13
+ # retryable(:tries => 1, :on => OpenURI::HTTPError) do
14
+ # # your code here
15
+ # end
16
+ #
17
+ def self.retry(options = {}, &block)
18
+ opts = { :tries => 3, :on => StandardError }.merge(options)
19
+
20
+ retry_exception, retries = opts[:on], opts[:tries]
21
+
22
+ begin
23
+ return yield
24
+ rescue retry_exception
25
+ if (retries -= 1) > 0
26
+ retry
27
+ else
28
+ raise
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,3 @@
1
+ module ZeevexReliability
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,7 @@
1
+
2
+ module ZeevexReliability
3
+
4
+ end
5
+
6
+ require 'zeevex_reliability/retryable'
7
+ require 'zeevex_reliability/optimistic_lock_retryable'
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "zeevex_reliability/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "zeevex_reliability"
7
+ s.version = ZeevexReliability::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Robert Sanders"]
10
+ s.email = ["robert@zeevex.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Utility functions to automate retry loops}
13
+ s.description = %q{Includes a general and an ActiveRecord StaleObject-focused retry loop}
14
+
15
+ s.rubyforge_project = "zeevex_reliability"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency 'rspec', '~> 2.9.0'
23
+ s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'activerecord', '~> 2.3.0'
25
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zeevex_reliability
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Robert Sanders
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-05-07 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 9
30
+ - 0
31
+ version: 2.9.0
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rake
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 2
55
+ - 3
56
+ - 0
57
+ version: 2.3.0
58
+ type: :development
59
+ version_requirements: *id003
60
+ description: Includes a general and an ActiveRecord StaleObject-focused retry loop
61
+ email:
62
+ - robert@zeevex.com
63
+ executables: []
64
+
65
+ extensions: []
66
+
67
+ extra_rdoc_files: []
68
+
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - Rakefile
73
+ - lib/zeevex_reliability.rb
74
+ - lib/zeevex_reliability/optimistic_lock_retryable.rb
75
+ - lib/zeevex_reliability/retryable.rb
76
+ - lib/zeevex_reliability/version.rb
77
+ - zeevex_reliability.gemspec
78
+ has_rdoc: true
79
+ homepage: ""
80
+ licenses: []
81
+
82
+ post_install_message:
83
+ rdoc_options: []
84
+
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project: zeevex_reliability
104
+ rubygems_version: 1.3.6
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Utility functions to automate retry loops
108
+ test_files: []
109
+