gotime-cassandra_object 2.13.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'gotime-cassandra_object'
5
- s.version = '2.13.0'
5
+ s.version = '3.0.0'
6
6
  s.description = 'Cassandra ActiveModel'
7
7
  s.summary = 'Cassandra ActiveModel'
8
8
  s.authors = ["Michael Koziarski", "gotime"]
@@ -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
@@ -14,7 +14,7 @@ module CassandraObject
14
14
  end
15
15
 
16
16
  private
17
- def create_or_update #:nodoc:
17
+ def write #:nodoc:
18
18
  _run_save_callbacks { super }
19
19
  end
20
20
 
@@ -70,15 +70,7 @@ module CassandraObject
70
70
  end
71
71
 
72
72
  def save(*)
73
- begin
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(:validate => false)
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 create_or_update
112
- result = new_record? ? create : update
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
@@ -24,7 +24,12 @@ module CassandraObject
24
24
  end
25
25
 
26
26
  def save(options={})
27
- perform_validations(options) ? super : false
27
+ if perform_validations(options)
28
+ super
29
+ true
30
+ else
31
+ false
32
+ end
28
33
  end
29
34
 
30
35
  def save!
@@ -21,6 +21,7 @@ module CassandraObject
21
21
  autoload :Batches
22
22
  autoload :FinderMethods
23
23
  autoload :Timestamps
24
+ autoload :Transactions
24
25
  autoload :Type
25
26
  autoload :Schema
26
27
 
@@ -1,3 +1,4 @@
1
1
  class Issue < CassandraObject::Base
2
2
  string :description
3
+ before_save { self.description ||= 'funny' }
3
4
  end
data/test/test_helper.rb CHANGED
@@ -14,6 +14,8 @@ module CassandraObject
14
14
  def temp_object(&block)
15
15
  Class.new(CassandraObject::Base) do
16
16
  self.column_family = 'Issues'
17
+ string :force_save
18
+ before_save { self.force_save = 'junk' }
17
19
 
18
20
  def self.name
19
21
  'Issue'
@@ -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)
@@ -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', 'after_create', 'after_save'], issue.callback_history
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 ['after_update', 'after_save'], issue.callback_history
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: 2.13.0
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-05 00:00:00.000000000 Z
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: &70153896808960 !ruby/object:Gem::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: *70153896808960
25
+ version_requirements: *70172804588920
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: mcmire-cassandra
28
- requirement: &70153896808500 !ruby/object:Gem::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: *70153896808500
36
+ version_requirements: *70172804588460
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: thrift_client
39
- requirement: &70153896808040 !ruby/object:Gem::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: *70153896808040
47
+ version_requirements: *70172804588000
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler
50
- requirement: &70153896807660 !ruby/object:Gem::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: *70153896807660
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