mongoid_retry 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,4 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- services: mongodb
4
+ services: mongodb
5
+ gemfile:
6
+ - Gemfile
7
+ - gemfiles/mongoid-2
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
- [![Build Status](https://secure.travis-ci.org/travisdahlke/mongoid_retry.png)](http://travis-ci.org/travisdahlke/mongoid_retry)
2
-
1
+ [![Build Status](https://travis-ci.org/travisdahlke/mongoid_retry.png?branch=master)](https://travis-ci.org/travisdahlke/mongoid_retry)
3
2
  # MongoidRetry
4
3
 
5
4
  Overcome duplicate key errors in MongoDB by catching the exception, finding the existing document, and updating it instead.
6
- This is currently only compatible with Mongoid 2.x.
5
+ Compatible with Mongoid 2 and 3.
7
6
 
8
7
  ## Installation
9
8
 
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+ gem "mongoid", "~> 2.0"
@@ -5,34 +5,64 @@ module Mongoid
5
5
 
6
6
  DUPLICATE_KEY_ERROR_CODES = [11000,11001]
7
7
 
8
+ if Mongoid::VERSION < '3'
9
+ def self.error_message(exception)
10
+ exception.message
11
+ end
12
+
13
+ def self.error_code(exception)
14
+ exception.error_code
15
+ end
16
+ else
17
+ def self.error_message(exception)
18
+ exception.details["err"]
19
+ end
20
+
21
+ def self.error_code(exception)
22
+ exception.details["code"]
23
+ end
24
+ end
25
+
26
+ def self.is_a_duplicate_key_error?(exception)
27
+ DUPLICATE_KEY_ERROR_CODES.include?(error_code(exception))
28
+ end
29
+
8
30
  # Catch a duplicate key error
9
31
  def save_and_retry
10
- begin
11
- save!
12
- rescue Mongo::OperationFailure => e
13
- if is_a_duplicate_key_error?(e)
14
- keys = duplicate_key(e)
15
- if (duplicate = find_duplicate(keys))
16
- update_document!(duplicate)
17
- end
18
- else
19
- raise e
32
+ if ::Mongoid::VERSION < '3'
33
+ begin
34
+ safely.save!
35
+ rescue Mongo::OperationFailure => e
36
+ retry_if_duplicate_key_error(e)
37
+ end
38
+ else
39
+ begin
40
+ with(safe: true).save!
41
+ rescue Moped::Errors::OperationFailure => e
42
+ retry_if_duplicate_key_error(e)
20
43
  end
21
44
  end
22
45
  end
23
46
 
24
- private
25
-
26
- def is_a_duplicate_key_error?(exception)
27
- DUPLICATE_KEY_ERROR_CODES.include?(exception.error_code)
47
+ def retry_if_duplicate_key_error(e)
48
+ if ::Mongoid::MongoidRetry.is_a_duplicate_key_error?(e)
49
+ keys = duplicate_key(e)
50
+ if (duplicate = find_duplicate(keys))
51
+ update_document!(duplicate)
52
+ end
53
+ else
54
+ raise e
55
+ end
28
56
  end
29
57
 
58
+ private
59
+
30
60
  def find_duplicate(keys)
31
- self.class.first(conditions: keys)
61
+ self.class.where(keys).first
32
62
  end
33
63
 
34
64
  def duplicate_key(exception)
35
- index = exception.message[/(?<=\.\$)\w*/,0]
65
+ index = ::Mongoid::MongoidRetry.error_message(exception)[/(?<=\.\$)\w*/,0]
36
66
  fields = index.split(/\d/).map{|s| s.gsub(/^_|_-?$/,'')}
37
67
  fields.inject({}) {|hash, key| hash[key] = send(key) if respond_to?(key); hash}
38
68
  end
@@ -1,3 +1,3 @@
1
1
  module MongoidRetry
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -15,7 +15,8 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = MongoidRetry::VERSION
17
17
 
18
- gem.add_runtime_dependency "mongoid", ['~> 2.0']
18
+ gem.add_runtime_dependency "mongoid", ['> 2.0']
19
19
  gem.add_development_dependency "rspec"
20
+ gem.add_development_dependency "database_cleaner"
20
21
  gem.add_development_dependency('rake', ['>= 0.9.2'])
21
22
  end
data/spec/spec_helper.rb CHANGED
@@ -3,13 +3,17 @@ require 'bundler/setup'
3
3
 
4
4
  require 'mongoid'
5
5
  require 'mongoid/mongoid_retry'
6
+ require 'database_cleaner'
6
7
 
7
8
  require 'rspec'
8
9
 
9
10
  Mongoid.configure do |config|
10
- config.master = Mongo::Connection.new.db('mongoid_retry_test')
11
- config.allow_dynamic_fields = false
12
- config.persist_in_safe_mode = true
11
+ if Mongoid::VERSION >= "3"
12
+ config.connect_to('mongoid_retry_test')
13
+ else
14
+ config.master = Mongo::Connection.new.db('mongoid_retry_test')
15
+ config.allow_dynamic_fields = false
16
+ end
13
17
  end
14
18
 
15
19
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -17,6 +21,6 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
17
21
  RSpec.configure do |config|
18
22
  config.mock_with :rspec
19
23
  config.after :each do
20
- Mongoid.master.collections.reject { |c| c.name =~ /^system\./ }.each(&:remove)
24
+ DatabaseCleaner.clean
21
25
  end
22
26
  end
@@ -6,6 +6,11 @@ class Thing
6
6
  field :color
7
7
  field :shape
8
8
 
9
- index :name, unique: true
10
- index ([[:color, Mongo::ASCENDING], [:shape, Mongo::DESCENDING]]), unique: true
9
+ if Mongoid::VERSION < '3'
10
+ index :name, unique: true
11
+ index ([[:color, Mongo::ASCENDING], [:shape, Mongo::DESCENDING]]), unique: true
12
+ else
13
+ index({name: 1}, {unique: true})
14
+ index({color: 1, shape: -1}, {unique: true})
15
+ end
11
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_retry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,14 +9,14 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-27 00:00:00.000000000 Z
12
+ date: 2013-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>'
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.0'
22
22
  type: :runtime
@@ -24,7 +24,7 @@ dependencies:
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ! '>'
28
28
  - !ruby/object:Gem::Version
29
29
  version: '2.0'
30
30
  - !ruby/object:Gem::Dependency
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: database_cleaner
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: rake
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +90,7 @@ files:
74
90
  - LICENSE
75
91
  - README.md
76
92
  - Rakefile
93
+ - gemfiles/mongoid-2
77
94
  - lib/mongoid/mongoid_retry.rb
78
95
  - lib/mongoid_retry.rb
79
96
  - lib/mongoid_retry/version.rb
@@ -93,12 +110,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
110
  - - ! '>='
94
111
  - !ruby/object:Gem::Version
95
112
  version: '0'
113
+ segments:
114
+ - 0
115
+ hash: -909191123557611916
96
116
  required_rubygems_version: !ruby/object:Gem::Requirement
97
117
  none: false
98
118
  requirements:
99
119
  - - ! '>='
100
120
  - !ruby/object:Gem::Version
101
121
  version: '0'
122
+ segments:
123
+ - 0
124
+ hash: -909191123557611916
102
125
  requirements: []
103
126
  rubyforge_project:
104
127
  rubygems_version: 1.8.24
@@ -109,4 +132,3 @@ test_files:
109
132
  - spec/retry_spec.rb
110
133
  - spec/spec_helper.rb
111
134
  - spec/support/models/thing.rb
112
- has_rdoc: