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.
@@ -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