rescue_unique_constraint 1.4.0 → 1.5.0
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 +5 -5
- data/.ruby-version +1 -0
- data/lib/rescue_unique_constraint/adapter/sqlite_adapter.rb +11 -1
- data/lib/rescue_unique_constraint/rescue_handler.rb +1 -1
- data/lib/rescue_unique_constraint/version.rb +1 -1
- data/rescue_unique_constraint.gemspec +1 -0
- data/spec/rescue_unique_constraint_spec.rb +31 -5
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5f12a5f4ccf1af041c90798ddde6b3f8f8b548cdbc2993b692dcf443d25d09ef
|
4
|
+
data.tar.gz: 6a7e89ed993cf44c928db9725018ded393744c0b77880228e6f53b40433ed614
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b84fb7fba8e0337d08ac29daaa4620ade43460ac004bedb4dba0ef8e492850c226dab1daa094f0ee4d2e3285b1e5ff040ed2c2b43251fcc0ffdf22e1e2dce7d9
|
7
|
+
data.tar.gz: f3afed3102872303e40808aa92a314e1831dffc3b77cc83506ce7a2c39b54293f9c86026634ca5413b030b250ae1565ce8b259eb74535b5e166582f550b1c6a0
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.5.1
|
@@ -1,8 +1,18 @@
|
|
1
1
|
module RescueUniqueConstraint
|
2
2
|
module Adapter
|
3
3
|
class SqliteAdapter
|
4
|
+
def initialize(table_name)
|
5
|
+
@table_name = table_name
|
6
|
+
end
|
7
|
+
|
8
|
+
# Sample error message returned by ActiveRecord for Sqlite Unique exception:
|
9
|
+
# 'SQLite3::ConstraintException: UNIQUE constraint failed: things.code, things.score: INSERT INTO "things" ("name", "test", "code", "score") VALUES (?, ?, ?, ?)'
|
10
|
+
#
|
11
|
+
# Step1: extract column names from above message on which unique constraint failed.
|
12
|
+
# Step2: Check if this index's field is among those columns.
|
4
13
|
def index_error?(index, error_message)
|
5
|
-
error_message
|
14
|
+
column_names = error_message.scan(%r{(?<=#{@table_name}\.)\w+})
|
15
|
+
column_names.include?(index.field)
|
6
16
|
end
|
7
17
|
end
|
8
18
|
end
|
@@ -2,17 +2,20 @@ require 'active_record'
|
|
2
2
|
require 'rescue_unique_constraint'
|
3
3
|
|
4
4
|
describe RescueUniqueConstraint do
|
5
|
-
before do
|
5
|
+
before :all do
|
6
6
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
7
7
|
ActiveRecord::Schema.verbose = false
|
8
8
|
ActiveRecord::Schema.define(:version => 1) do
|
9
9
|
create_table :things do |t|
|
10
10
|
t.string :name
|
11
11
|
t.string :test
|
12
|
+
t.integer :code
|
13
|
+
t.integer :score
|
12
14
|
end
|
13
15
|
|
14
16
|
add_index :things, :name, unique: true, name: "idx_things_on_name_unique"
|
15
17
|
add_index :things, :test, unique: true, name: "idx_things_on_test_unique"
|
18
|
+
add_index :things, [:code, :score], unique: true, name: "idx_things_on_code_and_score_unique"
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
@@ -20,13 +23,36 @@ describe RescueUniqueConstraint do
|
|
20
23
|
include RescueUniqueConstraint
|
21
24
|
rescue_unique_constraint index: "idx_things_on_name_unique", field: "name"
|
22
25
|
rescue_unique_constraint index: "idx_things_on_test_unique", field: "test"
|
26
|
+
rescue_unique_constraint index: "idx_things_on_code_and_score_unique", field: "score"
|
27
|
+
end
|
28
|
+
|
29
|
+
before :each do
|
30
|
+
Thing.destroy_all
|
23
31
|
end
|
24
32
|
|
25
33
|
it "rescues unique constraint violations as activerecord errors" do
|
26
|
-
thing = Thing.create(name: "foo", test: 'bar')
|
27
|
-
dupe = Thing.new(name: "foo", test: '
|
34
|
+
thing = Thing.create(name: "foo", test: 'bar', code: 123, score: 1000)
|
35
|
+
dupe = Thing.new(name: "foo", test: 'baz', code: 456, score: 2000)
|
36
|
+
expect(dupe.save).to eql false
|
37
|
+
expect(dupe.errors.messages.keys).to contain_exactly(:name)
|
38
|
+
expect(dupe.errors[:name].first).to match /has already been taken/
|
39
|
+
end
|
40
|
+
|
41
|
+
it "adds error message to atrribute which caused unique-voilation" do
|
42
|
+
thing = Thing.create(name: "foo", test: 'bar', code: 123, score: 1000)
|
43
|
+
dupe = Thing.new(name: "lorem", test: 'bar', code: 456, score: 2000)
|
28
44
|
expect(dupe.save).to eql false
|
29
|
-
expect(dupe.errors
|
30
|
-
expect(dupe.errors[:test].first).to match /taken/
|
45
|
+
expect(dupe.errors.messages.keys).to contain_exactly(:test)
|
46
|
+
expect(dupe.errors[:test].first).to match /has already been taken/
|
47
|
+
end
|
48
|
+
|
49
|
+
context "When unique contraint is voilated by a composite index" do
|
50
|
+
it "adds error message to user defined atrribute" do
|
51
|
+
thing = Thing.create(name: "foo", test: 'bar', code: 123, score: 1000)
|
52
|
+
dupe = Thing.new(name: "lorem", test: 'ipsum', code: 123, score: 1000)
|
53
|
+
expect(dupe.save).to eql false
|
54
|
+
expect(dupe.errors.messages.keys).to contain_exactly(:score)
|
55
|
+
expect(dupe.errors[:score].first).to match /has already been taken/
|
56
|
+
end
|
31
57
|
end
|
32
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rescue_unique_constraint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tam Dang
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -115,6 +115,20 @@ dependencies:
|
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: gem-release
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
118
132
|
description: Rescues unique constraint violations and turns them into ActiveRecord
|
119
133
|
errors
|
120
134
|
email:
|
@@ -126,6 +140,7 @@ extra_rdoc_files: []
|
|
126
140
|
files:
|
127
141
|
- ".gitignore"
|
128
142
|
- ".rubocop.yml"
|
143
|
+
- ".ruby-version"
|
129
144
|
- Gemfile
|
130
145
|
- LICENSE.txt
|
131
146
|
- README.md
|
@@ -159,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
174
|
version: '0'
|
160
175
|
requirements: []
|
161
176
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.6
|
177
|
+
rubygems_version: 2.7.6
|
163
178
|
signing_key:
|
164
179
|
specification_version: 4
|
165
180
|
summary: Turns ActiveRecord::RecordNotUnique errors into ActiveRecord errors
|