active_record_patch_first_or_create 0.0.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4c3527b478c90a4703461e25825ec2c791915ee
4
- data.tar.gz: 18c3d931f8d3488462230f4b362e20dcfda45f06
3
+ metadata.gz: c5478264fa26b04687d1f600cec8ebcf8c26cf68
4
+ data.tar.gz: 26c207ae53c67c8b4b128d5c7d81aeeac0e598f8
5
5
  SHA512:
6
- metadata.gz: cd7c194effb1086fae26b403052a3aa68687204cd7307c82b5b908fda6ecd945ff9159e6b4a8d7185feb7d78b98ca14f038d41d8481b18f2e0f055d585c8a08f
7
- data.tar.gz: d2082aa45475d5b30a535dac09aae845b6a9c65f6696cbe369be4de0e57d7fea8a3f1e4338ac1e1c9ecb81efce03902f86cf0bc8aa59a31aa61c3e909e747daa
6
+ metadata.gz: 7742d1e4bc569d0288d14bb27e64755acacac0718edc1355efc5003ec31cecf6859c4e23bc61b8c4c2dac4705edcb6b8592d19c07a1bb87ed50d11613f57cb2a
7
+ data.tar.gz: 125ae54308548403d7ef4993f5ae457c786a55f94314ceb0a2e93fe237e7889ec9c11f572439e6eefe63e3ffe53997220352bfc6731bd596b9d438a978e3aa5e
data/Gemfile CHANGED
@@ -2,3 +2,17 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in active_record_patch_first_or_create.gemspec
4
4
  gemspec
5
+
6
+ group :testing do
7
+ gem "pry"
8
+ gem "pry-doc"
9
+
10
+ gem "guard"
11
+ gem "guard-minitest"
12
+ gem "guard-yard"
13
+
14
+ gem "rb-fsevent"
15
+ gem "terminal-notifier-guard"
16
+
17
+ gem 'simplecov', :require => false
18
+ end
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActiveRecordPatchFirstOrCreate
2
2
 
3
- TODO: Write a gem description
3
+ Real atomic first_or_create/find_or_create_by for Rails
4
4
 
5
5
  ## Installation
6
6
 
@@ -16,14 +16,25 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install active_record_patch_first_or_create
18
18
 
19
+ ## Solution
20
+
21
+ We find out that methods like first_or_create or find_or_create_by are not atomic, you can check docs here
22
+
23
+ "Please note *this method is not atomic*, it runs first a SELECT, and if there are no results an INSERT is attempted. If there are other threads or processes there is a race condition between both calls and it could be the case that you end up with two similar records."
24
+
19
25
  ## Usage
20
26
 
21
- TODO: Write usage instructions here
27
+ Finds the first record with the given attributes, or creates a record with the attributes if one is not found:
28
+
29
+ # Find the first user with uid "abc123" or create a new one.
30
+ User.where(uid: 'abc123').atomic_first_or_create(name: 'John', uid: 'abc123')
31
+ # => #<User id: 1, uid: "abc123", name: 'John'>
22
32
 
23
- ## Contributing
33
+ # Find the first user with uid "abc123" or create a new one.
34
+ # We already have one so the existing record will be returned.
35
+ User.where(uid: 'abc123').atomic_first_or_create(name: 'John', uid: 'abc123')
36
+ # => #<User id: 1, uid: "abc123", name: 'John'>
24
37
 
25
- 1. Fork it ( http://github.com/<my-github-username>/active_record_patch_first_or_create/fork )
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
38
+ # Find the first user with uid "abc1234" or create a new one
39
+ User.where(uid: 'abc123').atomic_first_or_create(name: 'Johansson', uid: 'abc1234')
40
+ # => #<User id: 2, uid: "abc1234", name: 'Johansson'>
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/**/test_*.rb']
7
+ end
@@ -20,4 +20,9 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.5"
22
22
  spec.add_development_dependency "rake", "~> 0"
23
+ spec.add_development_dependency "minitest"
24
+ spec.add_development_dependency "mocha"
25
+ spec.add_development_dependency "webmock"
26
+ spec.add_development_dependency "activerecord"
27
+ spec.add_development_dependency "sqlite3"
23
28
  end
@@ -31,7 +31,7 @@ end
31
31
 
32
32
  module ActiveRecord
33
33
  class Relation
34
- def atomic_first_or_create(attributes = nil, &block)
34
+ def atomic_first_or_create(attributes = nil)
35
35
  ActiveRecordPatchFirstOrCreate.first_or_create(self, attributes)
36
36
  end
37
37
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordPatchFirstOrCreate
2
- VERSION = "0.0.4"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_patch_first_or_create
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - NDrive DevOps Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-07 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,76 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
41
111
  description: This patch provides first_or_create method to be atomic, once the default
42
112
  one isn't!!!
43
113
  email: