sneaky-save 0.0.6 → 0.1.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 -13
- data/README.md +6 -3
- data/VERSION +1 -1
- data/lib/sneaky-save.rb +12 -1
- data/sneaky-save.gemspec +1 -1
- data/spec/lib/sneaky_save_spec.rb +62 -42
- data/spec/spec_helper.rb +2 -2
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YTcwMzBhNjJiOTY0ZjhiZDAyMTU4NTUzZWZlODRkYTVlOGIyZTlhNA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9819547cbb741ef5983b1583f0dba3ea21d5e683
|
4
|
+
data.tar.gz: 14647c2c9aba00d24aacf85167b5982fefb43b06
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YmYwMTk0YWQxMTY3OGMzOTEwMTliNjk5MDAzYTRlNWY2NjliNGU2Yzk4MWY5
|
11
|
-
YWUzOGZkYWMxMzQ3ZmU2OGFjOGZkNDljOWZhMGJkNGNjMjI2ZWY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YTk3OTBmMWE1ZTdiZTA0ZGVkNDU0NGY3OTgyNTBkODU2MTRiODM5MWU1YWIy
|
14
|
-
YmQzOThmNjFhY2E4ODZhNTZkM2IzYjlhMzM3OWNiMzljM2ZmNzI3OTBjMDkw
|
15
|
-
ZmQxMTE2ZmUyNmVkODI2MTBkMDQxMmFlMGYwMmU5YzU4ZjdhZDk=
|
6
|
+
metadata.gz: 64abcfe769be6e0e5011c11c45664247f33ed6e7b25e6b5d292e64569b1496b2f58281de78d9035af1b31a76e76ae41dd7d91794c3557bfd513802b9e7fe6e93
|
7
|
+
data.tar.gz: 174ab52ca4496909d2aa2f3fa2cc303836f6282fab665f79c2477bf2212fd21928ee399efcdc66815b509e42d71186b57d99f02d847277926af35c3ea2464eaa
|
data/README.md
CHANGED
@@ -17,11 +17,14 @@ gem 'sneaky-save', git: 'git://github.com/einzige/sneaky-save.git'
|
|
17
17
|
|
18
18
|
## Using
|
19
19
|
```ruby
|
20
|
-
# Update
|
21
|
-
|
20
|
+
# Update. Returns true on success, false otherwise.
|
21
|
+
existing_record.sneaky_save
|
22
22
|
|
23
|
-
# Insert
|
23
|
+
# Insert. Returns true on success, false otherwise.
|
24
24
|
Model.new.sneaky_save
|
25
|
+
|
26
|
+
# Raise exception on failure.
|
27
|
+
record.sneaky_save!
|
25
28
|
```
|
26
29
|
|
27
30
|
## Running specs
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/sneaky-save.rb
CHANGED
@@ -13,14 +13,25 @@ module SneakySave
|
|
13
13
|
# @return [false, true]
|
14
14
|
def sneaky_save
|
15
15
|
begin
|
16
|
-
|
16
|
+
sneaky_create_or_update
|
17
17
|
rescue ActiveRecord::StatementInvalid
|
18
18
|
false
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
# Saves the record raising an exception if it fails.
|
23
|
+
# @return [true] if save was successful.
|
24
|
+
# @raise [ActiveRecord::StatementInvalid] if save failed.
|
25
|
+
def sneaky_save!
|
26
|
+
sneaky_create_or_update
|
27
|
+
end
|
28
|
+
|
22
29
|
protected
|
23
30
|
|
31
|
+
def sneaky_create_or_update
|
32
|
+
new_record? ? sneaky_create : sneaky_update
|
33
|
+
end
|
34
|
+
|
24
35
|
# Makes INSERT query in database without running any callbacks
|
25
36
|
# @return [false, true]
|
26
37
|
def sneaky_create
|
data/sneaky-save.gemspec
CHANGED
@@ -1,67 +1,87 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SneakySave, use_connection: true do
|
4
|
-
after :each do
|
5
|
-
expect(subject.sneaky_save).to eq(true)
|
6
|
-
end
|
7
|
-
|
8
4
|
context 'new record' do
|
9
|
-
subject { Fake.new }
|
5
|
+
subject { Fake.new(name: 'test') }
|
10
6
|
|
11
|
-
|
7
|
+
describe '#sneaky_save' do
|
8
|
+
it 'returns true if everything is good' do
|
9
|
+
expect(subject.sneaky_save).to eq(true)
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
it 'inserts the new record' do
|
13
|
+
allow(subject).to receive(:sneaky_create).once.and_return(true)
|
14
|
+
expect(subject.sneaky_save).to eq(true)
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
it 'stores attributes in database' do
|
18
|
+
subject.name = 'test'
|
19
|
+
expect(subject.sneaky_save).to eq(true)
|
20
|
+
subject.reload
|
21
|
+
expect(subject.name).to eq('test')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'does not call any callback' do
|
25
|
+
Fake.any_instance.should_not_receive :before_save_callback
|
26
|
+
subject.sneaky_save
|
27
|
+
end
|
23
28
|
|
24
|
-
|
25
|
-
|
29
|
+
it 'does not call validations' do
|
30
|
+
expect_any_instance_of(Fake).to_not receive(:valid?)
|
31
|
+
subject.sneaky_save
|
32
|
+
end
|
26
33
|
end
|
27
34
|
|
28
|
-
|
29
|
-
|
35
|
+
describe '#sneaky_save!' do
|
36
|
+
it 'raises an exception when insert fails' do
|
37
|
+
subject.name = nil
|
38
|
+
expect { subject.sneaky_save! }.to raise_error(ActiveRecord::StatementInvalid)
|
39
|
+
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
|
33
43
|
context 'existing record' do
|
34
|
-
subject { Fake.create :name => 'test' }
|
44
|
+
subject { Fake.create! :name => 'test' }
|
35
45
|
|
36
|
-
|
37
|
-
|
38
|
-
|
46
|
+
describe '#sneaky_save' do
|
47
|
+
context 'record is not changed' do
|
48
|
+
it 'does nothing' do
|
49
|
+
Fake.should_not_receive(:update_all)
|
50
|
+
expect(subject.sneaky_save).to eq(true)
|
51
|
+
end
|
39
52
|
end
|
40
|
-
end
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
54
|
+
context 'record is changed' do
|
55
|
+
it 'updates attributes' do
|
56
|
+
subject.should_receive(:sneaky_update).once.and_return true
|
57
|
+
subject.name = 'new name'
|
58
|
+
expect(subject.sneaky_save).to eq(true)
|
59
|
+
end
|
46
60
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
61
|
+
it 'stores attributes in database' do
|
62
|
+
subject.name = 'new name'
|
63
|
+
expect(subject.sneaky_save).to eq(true)
|
64
|
+
subject.reload
|
65
|
+
expect(subject.name).to eq('new name')
|
66
|
+
expect(subject.sneaky_save).to eq(true)
|
67
|
+
end
|
51
68
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
expect(subject.name).to eq('new name')
|
57
|
-
end
|
69
|
+
it 'does not call any callback' do
|
70
|
+
subject.should_not_receive :before_save_callback
|
71
|
+
subject.sneaky_save
|
72
|
+
end
|
58
73
|
|
59
|
-
|
60
|
-
|
74
|
+
it 'does not call validations' do
|
75
|
+
subject.should_not_receive :valid?
|
76
|
+
subject.sneaky_save
|
77
|
+
end
|
61
78
|
end
|
79
|
+
end
|
62
80
|
|
63
|
-
|
64
|
-
|
81
|
+
describe '#sneaky_save!' do
|
82
|
+
it 'raises an exception when update fails' do
|
83
|
+
subject.name = nil
|
84
|
+
expect { subject.sneaky_save! }.to raise_error(ActiveRecord::StatementInvalid)
|
65
85
|
end
|
66
86
|
end
|
67
87
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,12 +7,12 @@ shared_context 'use connection', use_connection: true do
|
|
7
7
|
|
8
8
|
ActiveRecord::Schema.define do
|
9
9
|
create_table 'fakes' do |table|
|
10
|
-
table.column :name, :string
|
10
|
+
table.column :name, :string, null: false
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
class Fake < ActiveRecord::Base
|
15
|
-
|
15
|
+
validates :name, presence: true
|
16
16
|
|
17
17
|
before_save :before_save_callback
|
18
18
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sneaky-save
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergei Zinin (einzige)
|
@@ -14,28 +14,28 @@ dependencies:
|
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: ActiveRecord extension. Allows to save record without calling callbacks
|
@@ -46,8 +46,8 @@ extensions: []
|
|
46
46
|
extra_rdoc_files:
|
47
47
|
- README.md
|
48
48
|
files:
|
49
|
-
- .gitignore
|
50
|
-
- .travis.yml
|
49
|
+
- ".gitignore"
|
50
|
+
- ".travis.yml"
|
51
51
|
- Gemfile
|
52
52
|
- README.md
|
53
53
|
- Rakefile
|
@@ -68,17 +68,17 @@ require_paths:
|
|
68
68
|
- lib
|
69
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- -
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: '0'
|
74
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
|
-
- -
|
76
|
+
- - ">="
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.2.2
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: Allows to save record without calling callbacks and validations.
|