rescue_each 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -1,5 +1,5 @@
1
1
  # `rescue_each`
2
- ## Rescue multiple exceptions when working with Enumerable objects.
2
+ ## Rescue multiple exceptions when enumerating over Enumerable or ActiveRecord objects.
3
3
 
4
4
  Say you have a batch rake task which runs from cron which consists of many independent tasks ran in a loop.
5
5
  These tasks could be anything from updating cached database entries to file conversions.
@@ -33,12 +33,12 @@ transforms into:
33
33
  raise 'example'
34
34
  end
35
35
 
36
- You'll probably find this handy if your batch task normally has its own status output.
36
+ You'll probably find this handy if your batch task has its own status output as this mode will output an error summary inline.
37
37
 
38
38
  #### Other Methods
39
39
 
40
- `rescue_each` provides proxies for `each_with_index`, `find_each` and `find_in_batches`.
41
- If you want to call another method on an `Enumerable`, you can use `rescue_send`:
40
+ `rescue_each` also provides proxies for `map`, `each_with_index`, `find_each` and `find_in_batches`.
41
+ You can also use `rescue_each` on any method taking a block by calling `rescue_send`:
42
42
 
43
43
  odds = (1..5).rescue_send(:reject) { |i| i%2 == 0 }
44
44
 
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ begin
19
19
  require 'jeweler'
20
20
  Jeweler::Tasks.new do |gem|
21
21
  gem.name = "rescue_each"
22
- gem.summary = "Rescue multiple exceptions when working with Enumerable objects"
22
+ gem.summary = "Rescue multiple exceptions when enumerating over Enumerable or ActiveRecord objects"
23
23
  gem.email = "jason@jasoncodes.com"
24
24
  gem.homepage = "http://github.com/jasoncodes/rescue_each"
25
25
  gem.authors = ["Jason Weathered"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2
data/lib/rescue_each.rb CHANGED
@@ -4,10 +4,11 @@ module RescueEach
4
4
 
5
5
  class Error < StandardError
6
6
 
7
- attr_reader :errors
7
+ attr_reader :errors, :aborted
8
8
 
9
- def initialize(errors)
9
+ def initialize(errors, aborted=false)
10
10
  @errors = errors
11
+ @aborted = aborted
11
12
  end
12
13
 
13
14
  class Item < Struct.new :exception, :args
@@ -56,6 +57,7 @@ module RescueEach
56
57
  msg << "\n"
57
58
  end
58
59
  msg << "rescue_each caught #{errors.size} errors"
60
+ msg << ", and then aborted." if aborted
59
61
  msg.join
60
62
  end
61
63
 
@@ -65,7 +67,7 @@ module RescueEach
65
67
 
66
68
  module Object
67
69
 
68
- RESCUE_EACH_OPTIONS = [:stderr]
70
+ RESCUE_EACH_OPTIONS = [:stderr, :error_limit]
69
71
 
70
72
  def rescue_each(options = {})
71
73
 
@@ -96,6 +98,10 @@ module RescueEach
96
98
 
97
99
  errors << item
98
100
 
101
+ if options[:error_limit] && errors.size >= options[:error_limit]
102
+ raise RescueEach::Error.new(errors, true)
103
+ end
104
+
99
105
  end
100
106
  end
101
107
  raise RescueEach::Error, errors unless errors.empty?
@@ -16,14 +16,35 @@ class RescueEachTest < ActiveSupport::TestCase
16
16
  end
17
17
 
18
18
  test "continues after an error" do
19
+ error_object = nil
19
20
  output = []
20
- assert_raise RescueEach::Error do
21
+ begin
21
22
  (1..5).rescue_each do |x|
22
23
  output << x
23
24
  raise 'test' if x == 3
24
25
  end
26
+ rescue RescueEach::Error => e
27
+ error_object = e
25
28
  end
26
29
  assert_equal (1..5).collect, output
30
+ assert_false error_object.aborted
31
+ assert_no_match /and then aborted/, error_object.to_s.lines.collect.last
32
+ end
33
+
34
+ test "stops after error limit" do
35
+ error_object = nil
36
+ output = []
37
+ begin
38
+ (1..10).rescue_each :error_limit => 3 do |x|
39
+ output << x
40
+ raise 'test' if x%2 == 0
41
+ end
42
+ rescue RescueEach::Error => e
43
+ error_object = e
44
+ end
45
+ assert_equal (1..6).collect, output
46
+ assert_true error_object.aborted
47
+ assert_match /and then aborted/, error_object.to_s.lines.collect.last
27
48
  end
28
49
 
29
50
  test "empty array doesn't call block" do
@@ -183,11 +204,17 @@ class RescueEachTest < ActiveSupport::TestCase
183
204
  assert_match /lorem ipsum/, err
184
205
  end
185
206
 
186
- test "rescue_send returns output of proxied method" do
207
+ test "rescue_map returns output of proxied method" do
187
208
  output = (1..5).rescue_map { |x| x*x }
188
209
  assert_equal [1,4,9,16,25], output
189
210
  end
190
211
 
212
+ test "rescue_send calls correct method and returns result" do
213
+ odds = (1..5).rescue_send(:reject) { |i| i%2 == 0 }
214
+ assert_false odds.empty?
215
+ assert_true odds.all? &:odd?
216
+ end
217
+
191
218
  test "find_each exists on active record objects" do
192
219
  [:find_each, :find_in_batches].each do |method|
193
220
  assert_true ActiveRecord::Base.methods.include? "#{method}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rescue_each
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Weathered
@@ -77,7 +77,7 @@ rubyforge_project:
77
77
  rubygems_version: 1.3.5
78
78
  signing_key:
79
79
  specification_version: 3
80
- summary: Rescue multiple exceptions when working with Enumerable objects
80
+ summary: Rescue multiple exceptions when enumerating over Enumerable or ActiveRecord objects
81
81
  test_files:
82
82
  - test/rescue_each_test.rb
83
83
  - test/test_helper.rb