mongoid_retry 0.0.2 → 0.0.3
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.
- checksums.yaml +7 -0
- data/.travis.yml +3 -1
- data/README.md +6 -0
- data/lib/mongoid/mongoid_retry.rb +15 -8
- data/lib/mongoid_retry/version.rb +1 -1
- data/spec/retry_spec.rb +27 -1
- metadata +17 -33
checksums.yaml
ADDED
@@ -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
|
data/.travis.yml
CHANGED
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
|
-
|
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
|
-
|
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
|
data/spec/retry_spec.rb
CHANGED
@@ -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.
|
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:
|
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:
|
111
|
+
rubygems_version: 2.2.2
|
128
112
|
signing_key:
|
129
|
-
specification_version:
|
113
|
+
specification_version: 4
|
130
114
|
summary: Catch mongo duplicate key errors and retry
|
131
115
|
test_files:
|
132
116
|
- spec/retry_spec.rb
|