gotime-cassandra_object 4.11.5 → 4.11.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3f4ae8a2098007fdcbcd6847250f1f1a6ec7d796
4
- data.tar.gz: 1f771e3e05b8fd02c75368d9bb4d267625ae65c4
3
+ metadata.gz: 9fcf2ed65ff6d08d1702f76e7836b583ba931efb
4
+ data.tar.gz: 92826ba8e10ab9bf7c5adcbd3b91e8aa4fa1b588
5
5
  SHA512:
6
- metadata.gz: ba97e2ce536c92b6350a9a967276a8e75807c38b63c6e088041e29ed77110f2f5607ff9f820a5c449bc2e2445c9721548739aa3f7115e2ba8b75b6761b101756
7
- data.tar.gz: ecf1f7f1eec3c482cc31df0797c044bf28505285728169e47f49ab8aa8cf33dbc29ed63bad3bec0fd6b31654eb69904592c6937c37a6a51ecca9302b50743754
6
+ metadata.gz: efcb74eb7565da59f852cabf98bbff6576522711baed4e7606bc176e7ff7274b77a07613cced49800566e79492b514a25eccaf1012c878db02637a8f1a6ebd50
7
+ data.tar.gz: 5719eb66e60d9b435869d774e6f39fa31db7a0650233626ffbcdf4899ec5c1dbef5f8cc394c6fc5f511251b2da2983ceb0aeb45e0ddeb78574acf399b11c6e84
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'gotime-cassandra_object'
5
- s.version = '4.11.5'
5
+ s.version = '4.11.6'
6
6
  s.description = 'Cassandra ActiveModel'
7
7
  s.summary = 'Cassandra ActiveModel'
8
8
  s.authors = ["Michael Koziarski", "gotime"]
@@ -0,0 +1,47 @@
1
+ module CassandraObject
2
+ module Adapters
3
+ class AbstractAdapter
4
+ attr_reader :config
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ # === Options
10
+ # [:select]
11
+ # Only select certain fields
12
+ # [:limit]
13
+ # Limit the results
14
+ def select(ids, options ={}) # abstract
15
+ end
16
+
17
+ def write(id, attributes) # abstract
18
+ end
19
+
20
+ def delete(ids) # abstract
21
+ end
22
+
23
+ def execute_batch(statements) # abstract
24
+ end
25
+
26
+ def batching?
27
+ !@batch_statements.nil?
28
+ end
29
+
30
+ def batch
31
+ @batch_statements = []
32
+ yield
33
+ execute_batch(@batch_statements) if @batch_statements.any?
34
+ ensure
35
+ @batch_statements = nil
36
+ end
37
+
38
+ def execute_batchable(statement)
39
+ if @batch_statements
40
+ @batch_statements << statement
41
+ else
42
+ execute statement
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,158 @@
1
+ module CassandraObject
2
+ module Adapters
3
+ class CassandraAdapter < AbstractAdapter
4
+ def cql
5
+ @cql ||= CassandraCQL::Database.new(config.servers, {keyspace: config.keyspace}, config.thrift_options)
6
+ end
7
+
8
+ def execute(statement)
9
+ ActiveSupport::Notifications.instrument("cql.cassandra_object", cql: statement) do
10
+ cql.execute statement
11
+ end
12
+ end
13
+
14
+ def select(statement)
15
+ execute(statement).fetch do |cql_row|
16
+ attributes = cql_row.to_hash
17
+ key = attributes.delete(primary_key_column)
18
+ yield(key, attributes) unless attributes.empty?
19
+ end
20
+ end
21
+
22
+ def build_query(scope)
23
+ QueryBuilder.new(self, scope).to_query
24
+ end
25
+
26
+ class QueryBuilder
27
+ def initialize(adapter, scope)
28
+ @adapter = adapter
29
+ @scope = scope
30
+ end
31
+
32
+ def to_query
33
+ [
34
+ "SELECT #{select_string} FROM #{@scope.klass.column_family}",
35
+ @adapter.write_option_string,
36
+ where_string,
37
+ limit_string
38
+ ].delete_if(&:blank?) * ' '
39
+ end
40
+
41
+ def select_string
42
+ if @scope.select_values.any?
43
+ (['KEY'] | @scope.select_values) * ','
44
+ else
45
+ '*'
46
+ end
47
+ end
48
+
49
+ def where_string
50
+ if @scope.where_values.any?
51
+ wheres = []
52
+
53
+ @scope.where_values.map do |where_value|
54
+ wheres.concat format_where_statement(where_value)
55
+ end
56
+
57
+ "WHERE #{wheres * ' AND '}"
58
+ else
59
+ ''
60
+ end
61
+ end
62
+
63
+ def format_where_statement(where_value)
64
+ if where_value.is_a?(String)
65
+ [where_value]
66
+ elsif where_value.is_a?(Hash)
67
+ where_value.map do |column, value|
68
+ if value.is_a?(Array)
69
+ "#{column} IN (#{escape_where_value(value)})"
70
+ else
71
+ "#{column} = #{escape_where_value(value)}"
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def escape_where_value(value)
78
+ if value.is_a?(Array)
79
+ value.map { |v| escape_where_value(v) }.join(",")
80
+ elsif value.is_a?(String)
81
+ value = value.gsub("'", "''")
82
+ "'#{value}'"
83
+ else
84
+ value
85
+ end
86
+ end
87
+
88
+ def limit_string
89
+ if @scope.limit_value
90
+ "LIMIT #{@scope.limit_value}"
91
+ else
92
+ ""
93
+ end
94
+ end
95
+ end
96
+
97
+ def write(table, id, attributes)
98
+ if (not_nil_attributes = attributes.reject { |key, value| value.nil? }).any?
99
+ insert_attributes = {primary_key_column => id}.update(not_nil_attributes)
100
+ statement = "INSERT INTO #{table} (#{quote_columns(insert_attributes.keys) * ','}) VALUES (#{Array.new(insert_attributes.size, '?') * ','})#{write_option_string}"
101
+ execute_batchable sanitize(statement, *insert_attributes.values)
102
+ end
103
+
104
+ if (nil_attributes = attributes.select { |key, value| value.nil? }).any?
105
+ execute_batchable sanitize("DELETE #{quote_columns(nil_attributes.keys) * ','} FROM #{table}#{write_option_string} WHERE #{primary_key_column} = ?", id)
106
+ end
107
+ end
108
+
109
+ def delete(table, ids)
110
+ statement = "DELETE FROM #{table}#{write_option_string} WHERE "
111
+ statement += ids.is_a?(Array) ? "#{primary_key_column} IN (?)" : "#{primary_key_column} = ?"
112
+
113
+ execute_batchable sanitize(statement, ids)
114
+ end
115
+
116
+ def execute_batch(statements)
117
+ raise 'No can do' if statements.empty?
118
+
119
+ stmt = [
120
+ "BEGIN BATCH#{write_option_string(true)}",
121
+ statements * "\n",
122
+ 'APPLY BATCH'
123
+ ] * "\n"
124
+
125
+ execute stmt
126
+ end
127
+
128
+ def consistency
129
+ @consistency
130
+ end
131
+
132
+ def consistency=(val)
133
+ @consistency = val
134
+ end
135
+
136
+ def primary_key_column
137
+ 'KEY'
138
+ end
139
+
140
+ def write_option_string(ignore_batching = false)
141
+ if (ignore_batching || !batching?) && consistency
142
+ " USING CONSISTENCY #{consistency}"
143
+ end
144
+ end
145
+
146
+ private
147
+
148
+ def sanitize(statement, *bind_vars)
149
+ CassandraCQL::Statement.sanitize(statement, bind_vars).force_encoding(Encoding::UTF_8)
150
+ end
151
+
152
+ def quote_columns(column_names)
153
+ column_names.map { |name| "'#{name}'" }
154
+ end
155
+
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,6 @@
1
+ module CassandraObject
2
+ module ConnectionAdapters
3
+ class Adapter < AbstractAdapter
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module CassandraObject
2
+ module ConnectionAdapters
3
+ class Adapter < AbstractAdapter
4
+ end
5
+ end
6
+ end
@@ -24,6 +24,10 @@ module CassandraObject
24
24
  @@cql ||= CassandraCQL::Database.new(config.servers, {keyspace: config.keyspace}, config.thrift_options)
25
25
  end
26
26
 
27
+ def adapter
28
+ @@adapter ||= CassandraObject::Adapters::CassandraAdapter.new(config)
29
+ end
30
+
27
31
  def execute_cql(cql_string, *bind_vars)
28
32
  statement = CassandraCQL::Statement.sanitize(cql_string, bind_vars).force_encoding(Encoding::UTF_8)
29
33
 
@@ -9,10 +9,14 @@ module CassandraObject
9
9
  ensure
10
10
  self.default_consistency = previous
11
11
  end
12
- end
13
12
 
14
- included do
15
- class_attribute :default_consistency
13
+ def default_consistency=(value)
14
+ adapter.consistency = value
15
+ end
16
+
17
+ def default_consistency
18
+ adapter.consistency
19
+ end
16
20
  end
17
21
  end
18
22
  end
@@ -1,11 +1,26 @@
1
1
  module CassandraObject
2
2
  class LogSubscriber < ActiveSupport::LogSubscriber
3
+ def self.runtime=(value)
4
+ Thread.current["cassandra_object_request_runtime"] = value
5
+ end
6
+
7
+ def self.runtime
8
+ Thread.current["cassandra_object_request_runtime"] ||= 0
9
+ end
10
+
11
+ def self.reset_runtime
12
+ rt, self.runtime = runtime, 0
13
+ rt
14
+ end
15
+
3
16
  def initialize
4
17
  super
5
18
  @odd_or_even = false
6
19
  end
7
20
 
8
21
  def cql(event)
22
+ self.class.runtime += event.duration
23
+
9
24
  payload = event.payload
10
25
  name = '%s (%.1fms)' % [payload[:name], event.duration]
11
26
  cql = payload[:cql].squeeze(' ')
@@ -7,15 +7,12 @@ module CassandraObject
7
7
  end
8
8
 
9
9
  module ClassMethods
10
- def remove(id)
11
- statement = "DELETE FROM #{column_family}#{write_option_string} WHERE "
12
- statement += id.is_a?(Array) ? "KEY IN (?)" : "KEY = ?"
13
-
14
- execute_batchable_cql statement, id
10
+ def remove(ids)
11
+ adapter.delete column_family, ids
15
12
  end
16
13
 
17
14
  def delete_all
18
- execute_cql "TRUNCATE #{column_family}"
15
+ adapter.execute "TRUNCATE #{column_family}"
19
16
  end
20
17
 
21
18
  def create(attributes = {}, &block)
@@ -25,27 +22,15 @@ module CassandraObject
25
22
  end
26
23
 
27
24
  def write(id, attributes)
28
- if (encoded = encode_attributes(attributes)).any?
29
- insert_attributes = {'KEY' => id}.update(encoded)
30
- statement = "INSERT INTO #{column_family} (#{quote_columns(insert_attributes.keys) * ','}) VALUES (#{Array.new(insert_attributes.size, '?') * ','})#{write_option_string}"
31
- execute_batchable_cql statement, *insert_attributes.values
32
- end
33
-
34
- if (nil_attributes = attributes.select { |key, value| value.nil? }).any?
35
- execute_batchable_cql "DELETE #{quote_columns(nil_attributes.keys) * ','} FROM #{column_family}#{write_option_string} WHERE KEY = ?", id
36
- end
25
+ adapter.write column_family, id, encode_attributes(attributes)
37
26
  end
38
27
 
39
28
  def batching?
40
- !batch_statements.nil?
29
+ adapter.batching?
41
30
  end
42
31
 
43
- def batch
44
- self.batch_statements = []
45
- yield
46
- execute_cql(batch_statement) if batch_statements.any?
47
- ensure
48
- self.batch_statements = nil
32
+ def batch(&block)
33
+ adapter.batch(&block)
49
34
  end
50
35
 
51
36
  def instantiate(id, attributes)
@@ -60,7 +45,9 @@ module CassandraObject
60
45
  def encode_attributes(attributes)
61
46
  encoded = {}
62
47
  attributes.each do |column_name, value|
63
- unless value.nil?
48
+ if value.nil?
49
+ encoded[column_name] = nil
50
+ else
64
51
  encoded[column_name] = attribute_definitions[column_name].coder.encode(value)
65
52
  end
66
53
  end
@@ -73,24 +60,6 @@ module CassandraObject
73
60
  column_names.map { |name| "'#{name}'" }
74
61
  end
75
62
 
76
- def batch_statement
77
- return nil unless batch_statements.any?
78
-
79
- [
80
- "BEGIN BATCH#{write_option_string(true)}",
81
- batch_statements * "\n",
82
- 'APPLY BATCH'
83
- ] * "\n"
84
- end
85
-
86
- def execute_batchable_cql(cql_string, *bind_vars)
87
- if batch_statements
88
- batch_statements << CassandraCQL::Statement.sanitize(cql_string, bind_vars)
89
- else
90
- execute_cql cql_string, *bind_vars
91
- end
92
- end
93
-
94
63
  def typecast_persisted_attributes(object, attributes)
95
64
  attributes.each do |key, value|
96
65
  if definition = attribute_definitions[key]
@@ -108,12 +77,6 @@ module CassandraObject
108
77
 
109
78
  attributes
110
79
  end
111
-
112
- def write_option_string(ignore_batching = false)
113
- if (ignore_batching || !batching?) && base_class.default_consistency
114
- " USING CONSISTENCY #{base_class.default_consistency}"
115
- end
116
- end
117
80
  end
118
81
 
119
82
  def new_record?
@@ -3,5 +3,13 @@ module CassandraObject
3
3
  rake_tasks do
4
4
  load 'cassandra_object/tasks/ks.rake'
5
5
  end
6
+
7
+ # Expose database runtime to controller for logging.
8
+ initializer "cassandra_object.log_runtime" do |app|
9
+ require "cassandra_object/railties/controller_runtime"
10
+ ActiveSupport.on_load(:action_controller) do
11
+ include CassandraObject::Railties::ControllerRuntime
12
+ end
13
+ end
6
14
  end
7
15
  end
@@ -0,0 +1,45 @@
1
+ require 'active_support/core_ext/module/attr_internal'
2
+ require 'cassandra_object/log_subscriber'
3
+
4
+ module CassandraObject
5
+ module Railties # :nodoc:
6
+ module ControllerRuntime #:nodoc:
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods # :nodoc:
10
+ def log_process_action(payload)
11
+ messages, cassandra_object_runtime = super, payload[:cassandra_object_runtime]
12
+ if cassandra_object_runtime.to_i > 0
13
+ messages << ("CassandraObject: %.1fms" % cassandra_object_runtime.to_f)
14
+ end
15
+ messages
16
+ end
17
+ end
18
+
19
+ #private
20
+
21
+ attr_internal :cassandra_object_runtime
22
+
23
+ def process_action(action, *args)
24
+ # We also need to reset the runtime before each action
25
+ # because of queries in middleware or in cases we are streaming
26
+ # and it won't be cleaned up by the method below.
27
+ CassandraObject::LogSubscriber.reset_runtime
28
+ super
29
+ end
30
+
31
+ def cleanup_view_runtime
32
+ runtime_before_render = CassandraObject::LogSubscriber.reset_runtime
33
+ runtime = super
34
+ runtime_after_render = CassandraObject::LogSubscriber.reset_runtime
35
+ self.cassandra_object_runtime = runtime_before_render + runtime_after_render
36
+ runtime - runtime_after_render
37
+ end
38
+
39
+ def append_info_to_payload(payload)
40
+ super
41
+ payload[:cassandra_object_runtime] = (cassandra_object_runtime || 0) + CassandraObject::LogSubscriber.reset_runtime
42
+ end
43
+ end
44
+ end
45
+ end
@@ -36,21 +36,13 @@ module CassandraObject
36
36
  end
37
37
  end
38
38
 
39
- def instantiate_from_cql(cql_string, *args)
39
+ def instantiate_from_cql(cql_string)
40
40
  results = []
41
- klass.execute_cql(cql_string, *args).fetch do |cql_row|
42
- results << instantiate_cql_row(cql_row)
41
+ klass.adapter.select(cql_string) do |key, attributes|
42
+ results << klass.instantiate(key, attributes)
43
43
  end
44
44
  results.compact!
45
45
  results
46
46
  end
47
-
48
- def instantiate_cql_row(cql_row)
49
- attributes = cql_row.to_hash
50
- key = attributes.delete('KEY')
51
- if attributes.any?
52
- klass.instantiate(key, attributes)
53
- end
54
- end
55
47
  end
56
48
  end
@@ -24,7 +24,7 @@ module CassandraObject
24
24
  yield records
25
25
  break if next_record.nil?
26
26
 
27
- records = scope.where("KEY >= '#{next_record.id}'").to_a
27
+ records = scope.where("#{adapter.primary_key_column} >= '#{next_record.id}'").to_a
28
28
  end
29
29
  end
30
30
  end
@@ -24,10 +24,11 @@ module CassandraObject
24
24
  end
25
25
 
26
26
  private
27
+
27
28
  def find_one(id)
28
29
  if id.blank?
29
30
  raise CassandraObject::RecordNotFound, "Couldn't find #{self.name} with key #{id.inspect}"
30
- elsif record = where('KEY' => id).first
31
+ elsif record = where(adapter.primary_key_column => id).first
31
32
  record
32
33
  else
33
34
  raise CassandraObject::RecordNotFound
@@ -40,7 +41,7 @@ module CassandraObject
40
41
 
41
42
  ids = ids.compact.map(&:to_s).uniq
42
43
 
43
- where("KEY" => ids).to_a
44
+ where(adapter.primary_key_column => ids).to_a
44
45
  end
45
46
  end
46
47
  end
@@ -33,79 +33,12 @@ module CassandraObject
33
33
  end
34
34
 
35
35
  def to_cql
36
- [
37
- "SELECT #{select_string} FROM #{klass.column_family}",
38
- consistency_string,
39
- where_string,
40
- limit_string
41
- ].delete_if(&:blank?) * ' '
36
+ adapter.build_query(self)
42
37
  end
43
38
 
44
39
  def to_a
45
- instantiate_from_cql(to_cql)
40
+ instantiate_from_cql(adapter.build_query(self))
46
41
  end
47
-
48
- private
49
- def select_string
50
- if select_values.any?
51
- (['KEY'] | select_values) * ','
52
- else
53
- '*'
54
- end
55
- end
56
-
57
- def where_string
58
- if where_values.any?
59
- wheres = []
60
-
61
- where_values.map do |where_value|
62
- wheres.concat format_where_statement(where_value)
63
- end
64
-
65
- "WHERE #{wheres * ' AND '}"
66
- else
67
- ''
68
- end
69
- end
70
-
71
- def format_where_statement(where_value)
72
- if where_value.is_a?(String)
73
- [where_value]
74
- elsif where_value.is_a?(Hash)
75
- where_value.map do |column, value|
76
- if value.is_a?(Array)
77
- "#{column} IN (#{escape_where_value(value)})"
78
- else
79
- "#{column} = #{escape_where_value(value)}"
80
- end
81
- end
82
- end
83
- end
84
-
85
- def escape_where_value(value)
86
- if value.is_a?(Array)
87
- value.map { |v| escape_where_value(v) }.join(",")
88
- elsif value.is_a?(String)
89
- value = value.gsub("'", "''")
90
- "'#{value}'"
91
- else
92
- value
93
- end
94
- end
95
-
96
- def limit_string
97
- if limit_value
98
- "LIMIT #{limit_value}"
99
- else
100
- ""
101
- end
102
- end
103
-
104
- def consistency_string
105
- if klass.default_consistency
106
- "USING CONSISTENCY #{klass.default_consistency}"
107
- end
108
- end
109
42
  end
110
43
  end
111
44
  end
@@ -27,14 +27,6 @@ module CassandraObject
27
27
  autoload :Type
28
28
  autoload :Validations
29
29
 
30
- module BelongsTo
31
- extend ActiveSupport::Autoload
32
-
33
- autoload :Association
34
- autoload :Builder
35
- autoload :Reflection
36
- end
37
-
38
30
  module AttributeMethods
39
31
  extend ActiveSupport::Autoload
40
32
 
@@ -46,6 +38,22 @@ module CassandraObject
46
38
  end
47
39
  end
48
40
 
41
+ module Adapters
42
+ extend ActiveSupport::Autoload
43
+
44
+ autoload :AbstractAdapter
45
+ autoload :CassandraAdapter
46
+ autoload :HstoreAdapter
47
+ end
48
+
49
+ module BelongsTo
50
+ extend ActiveSupport::Autoload
51
+
52
+ autoload :Association
53
+ autoload :Builder
54
+ autoload :Reflection
55
+ end
56
+
49
57
  module Types
50
58
  extend ActiveSupport::Autoload
51
59
 
@@ -19,4 +19,8 @@ class CassandraObject::LogSubscriberTest < CassandraObject::TestCase
19
19
  assert_equal 1, @logger.logged(:debug).size
20
20
  assert_match "SELECT * FROM Issues", @logger.logged(:debug)[0]
21
21
  end
22
+
23
+ def test_initializes_runtime
24
+ Thread.new { assert_equal 0, CassandraObject::LogSubscriber.runtime }.join
25
+ end
22
26
  end
@@ -19,7 +19,7 @@ class CassandraObject::PersistenceTest < CassandraObject::TestCase
19
19
  )
20
20
 
21
21
  assert_equal(
22
- {},
22
+ {'description' => nil},
23
23
  klass.encode_attributes({'description' => nil})
24
24
  )
25
25
 
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+ require "cassandra_object/railties/controller_runtime"
3
+
4
+ class CassandraObject::Railties::ControllerRuntimeTest < MiniTest::Unit::TestCase
5
+ class TestRuntime
6
+ def self.log_process_action(payload)
7
+ ['sweet']
8
+ end
9
+
10
+ def cleanup_view_runtime
11
+ 12
12
+ end
13
+
14
+ def append_info_to_payload(payload)
15
+ payload[:foo] = 42
16
+ end
17
+ end
18
+
19
+ class CassandraRuntime < TestRuntime
20
+ include CassandraObject::Railties::ControllerRuntime
21
+ end
22
+
23
+ def test_cleanup_view_runtime
24
+ runtime = CassandraRuntime.new
25
+ CassandraObject::LogSubscriber.runtime = 10
26
+
27
+ runtime.cleanup_view_runtime
28
+
29
+ assert_equal 0, CassandraObject::LogSubscriber.runtime
30
+ end
31
+
32
+ def test_append_info_to_payload
33
+ runtime = CassandraRuntime.new
34
+ payload = {}
35
+ runtime.append_info_to_payload(payload)
36
+
37
+ assert_equal 42, payload[:foo]
38
+ assert payload.key?(:cassandra_object_runtime)
39
+ end
40
+
41
+ def test_log_process_action
42
+ payload = {cassandra_object_runtime: 12.3}
43
+ messages = CassandraRuntime.log_process_action(payload)
44
+
45
+ assert_equal 2, messages.size
46
+ assert_equal "CassandraObject: 12.3ms", messages.last
47
+ end
48
+ 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.11.5
4
+ version: 4.11.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Koziarski
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-01 00:00:00.000000000 Z
12
+ date: 2014-02-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -83,6 +83,10 @@ files:
83
83
  - README.rdoc
84
84
  - Rakefile
85
85
  - gotime-cassandra_object.gemspec
86
+ - lib/cassandra_object/adapters/abstract_adapter.rb
87
+ - lib/cassandra_object/adapters/cassandra_adapter.rb
88
+ - lib/cassandra_object/adapters/dynamo_adapter.rb
89
+ - lib/cassandra_object/adapters/hstore_adapter.rb
86
90
  - lib/cassandra_object/attribute_methods.rb
87
91
  - lib/cassandra_object/attribute_methods/definition.rb
88
92
  - lib/cassandra_object/attribute_methods/dirty.rb
@@ -106,6 +110,7 @@ files:
106
110
  - lib/cassandra_object/model.rb
107
111
  - lib/cassandra_object/persistence.rb
108
112
  - lib/cassandra_object/railtie.rb
113
+ - lib/cassandra_object/railties/controller_runtime.rb
109
114
  - lib/cassandra_object/schema.rb
110
115
  - lib/cassandra_object/schema/tasks.rb
111
116
  - lib/cassandra_object/scope.rb
@@ -153,6 +158,7 @@ files:
153
158
  - test/unit/inspect_test.rb
154
159
  - test/unit/log_subscriber_test.rb
155
160
  - test/unit/persistence_test.rb
161
+ - test/unit/railties/controller_runtime_test.rb
156
162
  - test/unit/schema/tasks_test.rb
157
163
  - test/unit/schema_test.rb
158
164
  - test/unit/scope/batches_test.rb