gotime-cassandra_object 2.13.0 → 3.0.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.
- data/gotime-cassandra_object.gemspec +1 -1
- data/lib/cassandra_object/base.rb +2 -1
- data/lib/cassandra_object/callbacks.rb +1 -1
- data/lib/cassandra_object/persistence.rb +4 -18
- data/lib/cassandra_object/transactions.rb +77 -0
- data/lib/cassandra_object/validations.rb +6 -1
- data/lib/gotime-cassandra_object.rb +1 -0
- data/test/support/issue.rb +1 -0
- data/test/test_helper.rb +2 -0
- data/test/unit/base_test.rb +2 -2
- data/test/unit/callbacks_test.rb +2 -2
- data/test/unit/persistence_test.rb +0 -1
- data/test/unit/transactions_test.rb +25 -0
- metadata +12 -10
@@ -36,13 +36,14 @@ module CassandraObject
|
|
36
36
|
include Persistence
|
37
37
|
include Batches
|
38
38
|
include AttributeMethods
|
39
|
+
include Validations
|
39
40
|
include AttributeMethods::Dirty
|
40
41
|
include AttributeMethods::PrimaryKey
|
41
42
|
include AttributeMethods::Typecasting
|
42
43
|
include BelongsTo
|
43
|
-
include Validations
|
44
44
|
include Callbacks, ActiveModel::Observing
|
45
45
|
include Timestamps
|
46
|
+
include Transactions
|
46
47
|
|
47
48
|
include Serialization
|
48
49
|
include Migrations
|
@@ -70,15 +70,7 @@ module CassandraObject
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def save(*)
|
73
|
-
|
74
|
-
create_or_update
|
75
|
-
rescue CassandraObject::RecordInvalid
|
76
|
-
false
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def save!
|
81
|
-
create_or_update || raise(RecordNotSaved)
|
73
|
+
new_record? ? create : update
|
82
74
|
end
|
83
75
|
|
84
76
|
def destroy
|
@@ -90,7 +82,7 @@ module CassandraObject
|
|
90
82
|
def update_attribute(name, value)
|
91
83
|
name = name.to_s
|
92
84
|
send("#{name}=", value)
|
93
|
-
save(:
|
85
|
+
save(validate: false)
|
94
86
|
end
|
95
87
|
|
96
88
|
def update_attributes(attributes)
|
@@ -108,18 +100,12 @@ module CassandraObject
|
|
108
100
|
end
|
109
101
|
|
110
102
|
private
|
111
|
-
def
|
112
|
-
|
113
|
-
result != false
|
103
|
+
def update
|
104
|
+
write
|
114
105
|
end
|
115
106
|
|
116
107
|
def create
|
117
|
-
write
|
118
108
|
@new_record = false
|
119
|
-
id
|
120
|
-
end
|
121
|
-
|
122
|
-
def update
|
123
109
|
write
|
124
110
|
end
|
125
111
|
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module CassandraObject
|
2
|
+
module Transactions
|
3
|
+
class State
|
4
|
+
attr_accessor :action, :record, :original_attributes
|
5
|
+
def initialize(action, record)
|
6
|
+
@action = action
|
7
|
+
@record = record
|
8
|
+
@original_attributes = record.changed_attributes.deep_dup
|
9
|
+
end
|
10
|
+
|
11
|
+
def rollback!
|
12
|
+
case action
|
13
|
+
when :create
|
14
|
+
record.class.remove(record.id)
|
15
|
+
when :update
|
16
|
+
record.class.write(record.id, original_attributes)
|
17
|
+
when :destroy
|
18
|
+
record.class.write(record.id, original_attributes)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class Savepoint
|
24
|
+
attr_accessor :states
|
25
|
+
def initialize
|
26
|
+
self.states = []
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_state(action, record)
|
30
|
+
states << State.new(action, record)
|
31
|
+
end
|
32
|
+
|
33
|
+
def rollback!
|
34
|
+
states.reverse_each(&:rollback!)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
extend ActiveSupport::Concern
|
39
|
+
|
40
|
+
included do
|
41
|
+
class_attribute :savepoints
|
42
|
+
self.savepoints = []
|
43
|
+
end
|
44
|
+
|
45
|
+
module ClassMethods
|
46
|
+
def transaction
|
47
|
+
self.savepoints.push Savepoint.new
|
48
|
+
yield
|
49
|
+
savepoints.pop
|
50
|
+
rescue => e
|
51
|
+
savepoints.pop.rollback!
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_savepoint_state(action, record)
|
55
|
+
unless savepoints.empty?
|
56
|
+
savepoints.last.add_state(action, record)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def destroy
|
62
|
+
self.class.add_savepoint_state(:destroy, self)
|
63
|
+
super
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
def create
|
68
|
+
self.class.add_savepoint_state(:create, self)
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
def update
|
73
|
+
self.class.add_savepoint_state(:update, self)
|
74
|
+
super
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/test/support/issue.rb
CHANGED
data/test/test_helper.rb
CHANGED
data/test/unit/base_test.rb
CHANGED
@@ -29,8 +29,8 @@ class CassandraObject::BaseTest < CassandraObject::TestCase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
test 'equality' do
|
32
|
-
first_issue = Issue.create
|
33
|
-
second_issue = Issue.create
|
32
|
+
first_issue = Issue.create description: 'poop'
|
33
|
+
second_issue = Issue.create description: 'poop'
|
34
34
|
|
35
35
|
assert_equal first_issue, first_issue
|
36
36
|
assert_equal first_issue, Issue.find(first_issue.id)
|
data/test/unit/callbacks_test.rb
CHANGED
@@ -23,7 +23,7 @@ class CassandraObject::CallbacksTest < CassandraObject::TestCase
|
|
23
23
|
test 'create' do
|
24
24
|
issue = TestIssue.create
|
25
25
|
|
26
|
-
assert_equal ['before_validation', 'after_validation', '
|
26
|
+
assert_equal ['before_validation', 'after_validation', 'after_save', 'after_create'], issue.callback_history
|
27
27
|
end
|
28
28
|
|
29
29
|
test 'update' do
|
@@ -32,7 +32,7 @@ class CassandraObject::CallbacksTest < CassandraObject::TestCase
|
|
32
32
|
|
33
33
|
issue.update_attribute :description, 'foo'
|
34
34
|
|
35
|
-
assert_equal ['
|
35
|
+
assert_equal ['after_save', 'after_update'], issue.callback_history
|
36
36
|
end
|
37
37
|
|
38
38
|
test 'destroy' do
|
@@ -99,7 +99,6 @@ class CassandraObject::PersistenceTest < CassandraObject::TestCase
|
|
99
99
|
fresh_issue = Issue.find(persisted_issue.id)
|
100
100
|
fresh_issue.update_attribute(:description, 'say what')
|
101
101
|
|
102
|
-
assert_nil persisted_issue.description
|
103
102
|
persisted_issue.reload
|
104
103
|
assert_equal 'say what', persisted_issue.description
|
105
104
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::TransactionsTest < CassandraObject::TestCase
|
4
|
+
test 'rollback create' do
|
5
|
+
Issue.transaction do
|
6
|
+
issue = Issue.create description: 'foo'
|
7
|
+
raise 'lol'
|
8
|
+
end
|
9
|
+
|
10
|
+
assert_nil Issue.first
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
test 'rollback update' do
|
15
|
+
issue = Issue.create description: 'foo'
|
16
|
+
|
17
|
+
Issue.transaction do
|
18
|
+
issue.update_attributes description: 'bar'
|
19
|
+
raise 'lol'
|
20
|
+
end
|
21
|
+
|
22
|
+
issue = Issue.find issue.id
|
23
|
+
assert_equal 'foo', issue.description
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gotime-cassandra_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
17
|
-
requirement: &
|
17
|
+
requirement: &70172804588920 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '3.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70172804588920
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: mcmire-cassandra
|
28
|
-
requirement: &
|
28
|
+
requirement: &70172804588460 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.12.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70172804588460
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: thrift_client
|
39
|
-
requirement: &
|
39
|
+
requirement: &70172804588000 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.8.0
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70172804588000
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: bundler
|
50
|
-
requirement: &
|
50
|
+
requirement: &70172804587620 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70172804587620
|
59
59
|
description: Cassandra ActiveModel
|
60
60
|
email: gems@gotime.com
|
61
61
|
executables: []
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- lib/cassandra_object/tasks/keyspace.rb
|
109
109
|
- lib/cassandra_object/tasks/ks.rake
|
110
110
|
- lib/cassandra_object/timestamps.rb
|
111
|
+
- lib/cassandra_object/transactions.rb
|
111
112
|
- lib/cassandra_object/type.rb
|
112
113
|
- lib/cassandra_object/types.rb
|
113
114
|
- lib/cassandra_object/types/array_type.rb
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- test/unit/persistence_test.rb
|
145
146
|
- test/unit/tasks/column_family_test.rb
|
146
147
|
- test/unit/timestamps_test.rb
|
148
|
+
- test/unit/transactions_test.rb
|
147
149
|
- test/unit/types/array_type_test.rb
|
148
150
|
- test/unit/types/base_type_test.rb
|
149
151
|
- test/unit/types/boolean_type_test.rb
|