roqua-support 0.1.3 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43a3414d9e81150939fa2856d06119486f2901e2
4
- data.tar.gz: 0045f7cbe60fd4bf49ca7aea4eb53aaffcd5b1ad
3
+ metadata.gz: f8db8a86e0ea4abd9792e5cf25865306e7b0cba1
4
+ data.tar.gz: 6d2bc6551743ff667987df984710536a4185a7f1
5
5
  SHA512:
6
- metadata.gz: 5598469b76b2db4761c05b40ba12d533dac4a85160537fd7c6da0b8eeeaefeead355fef69e7c6c9abc8566b28e090dcc3eb344e1b15541c06addadbe60524f15
7
- data.tar.gz: d27f814a7fee1c1009656f386d547c0df7a05612dfba06c330513a4e4e5ace7ed5fefc90570975b0aca573273248ff05f7d0370a463867b12cc1e233f175e9c7
6
+ metadata.gz: 8e717a9ebca1e2e98436d258567ee3a5c27e569f020bc72d0fb4c8debcbacb373051fa74f0c470da4c11aaab247a228f2579192f0579f17f0792d4baa2b76c62
7
+ data.tar.gz: e8655d8edb9832d7d0c892666c893ede37593c2ba7f48d800db990de8a5e08ff01fa829df3e1cda33adc45f5e8762531123dce7d747ef36804a7771189715244
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.1.4 / 2014-02-25
2
+
3
+ * Add ActiveRecord \#uniq\_find\_or\_create\_by! method to find or create records with uniqueness constraints enforced by the database.
4
+ * Add some clarifying comments to the ActiveRecord extensions.
5
+
1
6
  ## 0.1.3 / 2014-02-24
2
7
 
3
8
  * Add ActiveRecord \#uniq\_find\_or\_create\_by method to find or create records with uniqueness constraints enforced by the database.
data/Gemfile CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in roqua-support.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'guard-rspec', '~> 4.2.6'
8
+ gem 'fuubar', '~> 1.3.2'
9
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roqua-support (0.1.3)
4
+ roqua-support (0.1.4)
5
5
  activesupport (>= 3.2, < 5.0)
6
6
 
7
7
  GEM
@@ -14,11 +14,46 @@ GEM
14
14
  thread_safe (~> 0.1)
15
15
  tzinfo (~> 0.3.37)
16
16
  atomic (1.1.14)
17
+ celluloid (0.15.2)
18
+ timers (~> 1.1.0)
19
+ celluloid-io (0.15.0)
20
+ celluloid (>= 0.15.0)
21
+ nio4r (>= 0.5.0)
22
+ coderay (1.1.0)
17
23
  diff-lcs (1.2.5)
24
+ ffi (1.9.3)
25
+ formatador (0.2.4)
26
+ fuubar (1.3.2)
27
+ rspec (>= 2.14.0, < 3.1.0)
28
+ ruby-progressbar (~> 1.3)
29
+ guard (2.4.0)
30
+ formatador (>= 0.2.4)
31
+ listen (~> 2.1)
32
+ lumberjack (~> 1.0)
33
+ pry (>= 0.9.12)
34
+ thor (>= 0.18.1)
35
+ guard-rspec (4.2.6)
36
+ guard (~> 2.1)
37
+ rspec (>= 2.14, < 4.0)
18
38
  i18n (0.6.9)
39
+ listen (2.5.0)
40
+ celluloid (>= 0.15.2)
41
+ celluloid-io (>= 0.15.0)
42
+ rb-fsevent (>= 0.9.3)
43
+ rb-inotify (>= 0.9)
44
+ lumberjack (1.0.4)
45
+ method_source (0.8.2)
19
46
  minitest (4.7.5)
20
47
  multi_json (1.8.4)
48
+ nio4r (1.0.0)
49
+ pry (0.9.12.6)
50
+ coderay (~> 1.0)
51
+ method_source (~> 0.8)
52
+ slop (~> 3.4)
21
53
  rake (10.1.1)
54
+ rb-fsevent (0.9.4)
55
+ rb-inotify (0.9.3)
56
+ ffi (>= 0.5.0)
22
57
  rspec (2.14.1)
23
58
  rspec-core (~> 2.14.0)
24
59
  rspec-expectations (~> 2.14.0)
@@ -27,8 +62,12 @@ GEM
27
62
  rspec-expectations (2.14.5)
28
63
  diff-lcs (>= 1.1.3, < 2.0)
29
64
  rspec-mocks (2.14.6)
65
+ ruby-progressbar (1.4.1)
66
+ slop (3.4.7)
67
+ thor (0.18.1)
30
68
  thread_safe (0.1.3)
31
69
  atomic
70
+ timers (1.1.0)
32
71
  tzinfo (0.3.38)
33
72
 
34
73
  PLATFORMS
@@ -36,6 +75,8 @@ PLATFORMS
36
75
 
37
76
  DEPENDENCIES
38
77
  bundler (~> 1.0)
78
+ fuubar (~> 1.3.2)
79
+ guard-rspec (~> 4.2.6)
39
80
  rake
40
81
  roqua-support!
41
82
  rspec (>= 2.12.0, < 4.0)
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec, cmd: 'bundle exec rspec --format Fuubar --colour' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
@@ -1,5 +1,5 @@
1
1
  module Roqua
2
2
  module Support
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
@@ -2,11 +2,26 @@ require 'active_support'
2
2
 
3
3
  module ActiveRecord
4
4
  class Base
5
+ # Use this method to find or create records that have uniqueness constraints enforced by the database.
6
+ # After calling the AR find_or_create_by method it queries the preexisting or created record by the attributes
7
+ # provided, thereby ensuring that a concurrently created record is returned when a AR RecordNotUnique error is
8
+ # raised. When no record can be found, because for instance validations fail on create, the created object
9
+ # containing the validation errors is returned instead.
5
10
  def self.uniq_find_or_create_by(attributes, &block)
6
11
  record = find_or_create_by(attributes, &block)
7
12
  rescue ActiveRecord::RecordNotUnique
8
13
  ensure
9
14
  return find_by(attributes) || record
10
15
  end
16
+
17
+ # Use this method if you want an exception to be raised when creating a new record fails due to some validation
18
+ # error other than uniqueness.
19
+ def self.uniq_find_or_create_by!(attributes, &block)
20
+ find_or_create_by!(attributes, &block)
21
+ rescue ActiveRecord::RecordNotUnique
22
+ rescue ActiveRecord::RecordInvalid => exception
23
+ ensure
24
+ return find_by(attributes) || raise(exception)
25
+ end
11
26
  end
12
27
  end
@@ -8,14 +8,17 @@ module ActiveRecord
8
8
 
9
9
  class RecordNotUnique < StandardError
10
10
  end
11
+
12
+ class RecordInvalid < StandardError
13
+ end
11
14
  end
12
15
 
13
16
  describe ActiveRecord::Base do
14
- describe '#uniq_find_or_create_by' do
15
- let(:attributes) { double('attributes') }
16
- let(:block) { -> {} }
17
- let(:record) { double('record') }
17
+ let(:attributes) { double('attributes') }
18
+ let(:block) { -> {} }
19
+ let(:record) { double('record') }
18
20
 
21
+ describe '#uniq_find_or_create_by' do
19
22
  it 'tries to find or create a record by the attributes provided' do
20
23
  expect(ActiveRecord::Base).to receive(:find_or_create_by).with(attributes, &block)
21
24
  ActiveRecord::Base.uniq_find_or_create_by attributes, &block
@@ -33,9 +36,35 @@ describe ActiveRecord::Base do
33
36
  expect(ActiveRecord::Base.uniq_find_or_create_by attributes, &block).to eq(record)
34
37
  end
35
38
 
36
- it 'returns a created record for inspection when saving fails for some reason' do
39
+ it 'returns the created record for inspection when validation fails' do
37
40
  allow(ActiveRecord::Base).to receive(:find_or_create_by).with(attributes, &block).and_return record
38
41
  expect(ActiveRecord::Base.uniq_find_or_create_by attributes, &block).to eq(record)
39
42
  end
40
43
  end
44
+
45
+ describe '#uniq_find_or_create_by!' do
46
+ it 'tries to find or create a record by the attributes provided' do
47
+ allow(ActiveRecord::Base).to receive(:find_by).with(attributes).and_return record
48
+ expect(ActiveRecord::Base).to receive(:find_or_create_by!).with(attributes, &block)
49
+ ActiveRecord::Base.uniq_find_or_create_by! attributes, &block
50
+ end
51
+
52
+ it 'returns a preexisting or created record by querying it' do
53
+ allow(ActiveRecord::Base).to receive(:find_by).with(attributes).and_return record
54
+ expect(ActiveRecord::Base.uniq_find_or_create_by! attributes, &block).to eq(record)
55
+ end
56
+
57
+ it 'returns a concurrenlty created record' do
58
+ allow(ActiveRecord::Base).to receive(:find_by).with(attributes).and_return record
59
+ allow(ActiveRecord::Base).to receive(:find_or_create_by!).with(attributes, &block)
60
+ .and_raise ActiveRecord::RecordNotUnique
61
+ expect(ActiveRecord::Base.uniq_find_or_create_by! attributes, &block).to eq(record)
62
+ end
63
+
64
+ it 'raises when creating a new record causes validation failures not due to concurrency' do
65
+ exception = ActiveRecord::RecordInvalid.new 'some_validation_error'
66
+ allow(ActiveRecord::Base).to receive(:find_or_create_by!).with(attributes, &block).and_raise exception
67
+ expect { ActiveRecord::Base.uniq_find_or_create_by! attributes, &block }.to raise_error(exception)
68
+ end
69
+ end
41
70
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roqua-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marten Veldthuis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-24 00:00:00.000000000 Z
11
+ date: 2014-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -90,6 +90,7 @@ files:
90
90
  - CHANGELOG.md
91
91
  - Gemfile
92
92
  - Gemfile.lock
93
+ - Guardfile
93
94
  - LICENSE.txt
94
95
  - README.md
95
96
  - Rakefile