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.
@@ -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