mongoid_retry 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 85cfaa98a33299febfd6e306fc4df74cf7e6bd69
4
+ data.tar.gz: 78788d07abb8a1e486a883b97d4d1e08fc78630a
5
+ SHA512:
6
+ metadata.gz: 2f6a21f82f65d737c6270cb135c770955385f2ad1eeac4e51b5672d2e98da7d2d248eb436948b8c1ef2178bd46a4a0bcf8c44be6162e0ca8ad4f4199a6ff6188
7
+ data.tar.gz: 78df40f589ffd83681982a753a6ce2e0279ddab80a1e0e1564d802101d05f6bbba883bb80f3b076261ad82df75713e5d2bc9dcd4e2ce98cc16a3ed744ace7328
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.1.0
4
+ - 2.0.0
3
5
  - 1.9.3
4
6
  services: mongodb
5
7
  gemfile:
6
8
  - Gemfile
7
- - gemfiles/mongoid-2
9
+ - gemfiles/mongoid-2
data/README.md CHANGED
@@ -32,6 +32,12 @@ end
32
32
 
33
33
  Fruit.new(type: 'apple').save_and_retry
34
34
 
35
+ `#save_and_retry` takes a hash of options:
36
+
37
+ - `:retries` Specifies the number of times to retry before failing. Defaults to 3.
38
+ - `:allow_delete` If true, this will delete any conflicting documents if a duplicate key error is encountered.
39
+
40
+
35
41
  ## Contributing
36
42
 
37
43
  1. Fork it
@@ -4,6 +4,7 @@ module Mongoid
4
4
  module MongoidRetry
5
5
 
6
6
  DUPLICATE_KEY_ERROR_CODES = [11000,11001]
7
+ MAX_RETRIES = 3
7
8
 
8
9
  if Mongoid::VERSION < '3'
9
10
  def self.error_message(exception)
@@ -28,27 +29,33 @@ module Mongoid
28
29
  end
29
30
 
30
31
  # Catch a duplicate key error
31
- def save_and_retry
32
+ def save_and_retry(options = {})
32
33
  if ::Mongoid::VERSION < '3'
33
34
  begin
34
35
  safely.save!
35
36
  rescue Mongo::OperationFailure => e
36
- retry_if_duplicate_key_error(e)
37
+ retry_if_duplicate_key_error(e, options)
37
38
  end
38
39
  else
39
40
  begin
40
41
  with(safe: true).save!
41
42
  rescue Moped::Errors::OperationFailure => e
42
- retry_if_duplicate_key_error(e)
43
+ retry_if_duplicate_key_error(e, options)
43
44
  end
44
45
  end
45
46
  end
46
47
 
47
- def retry_if_duplicate_key_error(e)
48
- if ::Mongoid::MongoidRetry.is_a_duplicate_key_error?(e)
48
+ def retry_if_duplicate_key_error(e, options)
49
+ retries = options.fetch(:retries, MAX_RETRIES)
50
+ if ::Mongoid::MongoidRetry.is_a_duplicate_key_error?(e) && retries > 0
49
51
  keys = duplicate_key(e)
50
52
  if (duplicate = find_duplicate(keys))
51
- update_document!(duplicate)
53
+ if options[:allow_delete]
54
+ duplicate.delete
55
+ save_and_retry(options)
56
+ else
57
+ update_document!(duplicate, options.merge(retries: retries - 1))
58
+ end
52
59
  end
53
60
  else
54
61
  raise e
@@ -67,11 +74,11 @@ module Mongoid
67
74
  fields.inject({}) {|hash, key| hash[key] = send(key) if respond_to?(key); hash}
68
75
  end
69
76
 
70
- def update_document!(duplicate)
77
+ def update_document!(duplicate, options = {})
71
78
  attributes.except("_id").each_pair do |key, value|
72
79
  duplicate[key] = value
73
80
  end
74
- duplicate.save_and_retry
81
+ duplicate.save_and_retry(options)
75
82
  end
76
83
 
77
84
  end
@@ -1,3 +1,3 @@
1
1
  module MongoidRetry
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -50,6 +50,32 @@ describe Mongoid::MongoidRetry do
50
50
  Thing.count.should == 1
51
51
  end
52
52
  end
53
+
54
+ describe "with conflicting documents" do
55
+ before(:each) do
56
+ Thing.create(name: 'banana', color: 'yellow')
57
+ Thing.create(name: 'apple', color: 'red')
58
+ end
59
+
60
+ subject { Thing.new(name: 'banana', color: 'red') }
61
+
62
+ it "should raise error" do
63
+ expect { subject.save_and_retry }.to raise_error
64
+ end
65
+
66
+ it "should delete conflicting document" do
67
+ subject.save_and_retry(allow_delete: true)
68
+ expect(Thing.count).to eq(1)
69
+ end
70
+
71
+ it "should save the new document" do
72
+ subject.save_and_retry(allow_delete: true)
73
+ expect(Thing.all.last.name).to eq('banana')
74
+ expect(Thing.all.last.color).to eq('red')
75
+ end
76
+
77
+ end
78
+
53
79
  end
54
80
 
55
- end
81
+ end
metadata CHANGED
@@ -1,78 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_retry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Travis Dahlke
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-30 00:00:00.000000000 Z
11
+ date: 2014-05-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: mongoid
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>'
17
+ - - ">"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '2.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>'
24
+ - - ">"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '2.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: database_cleaner
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: 0.9.2
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: 0.9.2
78
69
  description: Provides a 'save_and_retry' method that will attempt to save a document
@@ -84,8 +75,8 @@ executables: []
84
75
  extensions: []
85
76
  extra_rdoc_files: []
86
77
  files:
87
- - .gitignore
88
- - .travis.yml
78
+ - ".gitignore"
79
+ - ".travis.yml"
89
80
  - Gemfile
90
81
  - LICENSE
91
82
  - README.md
@@ -100,33 +91,26 @@ files:
100
91
  - spec/support/models/thing.rb
101
92
  homepage: http://www.github.com/travisdahlke/mongoid_retry
102
93
  licenses: []
94
+ metadata: {}
103
95
  post_install_message:
104
96
  rdoc_options: []
105
97
  require_paths:
106
98
  - lib
107
99
  required_ruby_version: !ruby/object:Gem::Requirement
108
- none: false
109
100
  requirements:
110
- - - ! '>='
101
+ - - ">="
111
102
  - !ruby/object:Gem::Version
112
103
  version: '0'
113
- segments:
114
- - 0
115
- hash: -909191123557611916
116
104
  required_rubygems_version: !ruby/object:Gem::Requirement
117
- none: false
118
105
  requirements:
119
- - - ! '>='
106
+ - - ">="
120
107
  - !ruby/object:Gem::Version
121
108
  version: '0'
122
- segments:
123
- - 0
124
- hash: -909191123557611916
125
109
  requirements: []
126
110
  rubyforge_project:
127
- rubygems_version: 1.8.24
111
+ rubygems_version: 2.2.2
128
112
  signing_key:
129
- specification_version: 3
113
+ specification_version: 4
130
114
  summary: Catch mongo duplicate key errors and retry
131
115
  test_files:
132
116
  - spec/retry_spec.rb