sessionm-cassandra_object 2.7.5 → 4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb5b78800e765ca3a4ef0e4bb4857471f1a2bd11
4
- data.tar.gz: bbfa6f43304cfb9fd57c4cbc6d9d20d7dfd17483
3
+ metadata.gz: c8c030402fac23c1c5582c18fb390760fafad77b
4
+ data.tar.gz: 153e5739c2ca48e426e244c9644386729c90d663
5
5
  SHA512:
6
- metadata.gz: abeee5225d15083515f2cb7a261a411b3136859ed3123591b4a43a64b22a364d9db6f0ab9461d0835ee53245807e283e878fa5b9b9070b8d1a0e6e32cff34d37
7
- data.tar.gz: 30463ca00ac7faef263340984e10e3cbae32d99eb9c451911c4d355d3efb6eb97caec09de8408346bf804efc15245d32d61fe93647be0a4a4c534fcb21d3f3a0
6
+ metadata.gz: 34bc064fa9b47e01e82deedd7c76ae77b981671bcb3f7e7cc13046e76d3a0732363851ca82fe77e73c37dcd5c03df20c63397e62f8c55be4338abccf8ec2cb80
7
+ data.tar.gz: 05abb454e907e44fa7defc4b98a1077449c5a38d6e032f1b49a141df72431c568af2a0371590fa79ae9b44897ff5911a5716add7442ea8e74fc38a5323dde593
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ cassandra_object
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.2.0
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "http://rubygems.org"
2
- gemspec
1
+ source 'http://gems.prod.sessionm.com'
3
2
 
4
- gem "mocha", :require => false
3
+ gem 'rails', :require => 'rails/all'
4
+
5
+ gem 'simple_uuid', '0.2.2'
6
+ gem 'cassandra-driver', :require => 'cassandra'
data/config/boot.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'openssl'
3
+ require 'yaml'
4
+
5
+ # Set up gems listed in the Gemfile.
6
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
7
+
8
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
9
+
@@ -0,0 +1,36 @@
1
+ development: &id001
2
+ servers: ['127.0.0.1:9160']
3
+ keyspace: greyhound_development
4
+ replication:
5
+ strategy: org.apache.cassandra.locator.SimpleStrategy
6
+ factor: 1
7
+ consistency:
8
+ read_default: quorum
9
+ write_default: quorum
10
+ column_family_defaults:
11
+ compaction_strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
12
+ row_cache_provider: org.apache.cassandra.cache.ConcurrentLinkedHashCacheProvider
13
+ thrift:
14
+ connect_timeout: 0.5
15
+ timeout: 3
16
+ retries: 2
17
+ production: *id001
18
+ test:
19
+ servers: ['127.0.0.1:9160']
20
+ keyspace: greyhound_test
21
+ replication:
22
+ strategy: org.apache.cassandra.locator.SimpleStrategy
23
+ factor: 1
24
+ consistency:
25
+ read_default: quorum
26
+ write_default: quorum
27
+ column_family_defaults:
28
+ compaction_strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
29
+ row_cache_provider: org.apache.cassandra.cache.ConcurrentLinkedHashCacheProvider
30
+ thrift:
31
+ connect_timeout: 0.5
32
+ timeout: 3
33
+ retries: 2
34
+ exception_class_overrides:
35
+ - CassandraThrift::InvalidRequestException
36
+ - CassandraThrift::NotFoundException
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+ require 'pathname'
3
+
4
+ ENV['RAILS_ENV'] ||= 'development'
5
+
6
+ Bundler.require :default, ENV['RAILS_ENV']
7
+
8
+ BASE_DIR = Pathname.new(File.expand_path('../..', __FILE__))
9
+
10
+ CASSANDRA_YAML = "#{BASE_DIR}/config/cassandra.yml"
11
+
12
+ DEFAULT_LOG_FILE = "#{BASE_DIR}/log/#{ENV['RAILS_ENV']}.log"
13
+
14
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
15
+ require 'cassandra_object'
16
+
17
+ CassandraObject::Base.config = YAML.load_file(CASSANDRA_YAML)[ENV['RAILS_ENV']]
@@ -26,6 +26,7 @@ module CassandraObject
26
26
  autoload :Schema
27
27
  autoload :RowTTL
28
28
  autoload :NestedAttributes
29
+ autoload :Adapters
29
30
 
30
31
  module Tasks
31
32
  extend ActiveSupport::Autoload
@@ -0,0 +1,7 @@
1
+ module CassandraObject
2
+ module Adapters
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :CassandraDriver
6
+ end
7
+ end
@@ -0,0 +1,121 @@
1
+ module CassandraObject
2
+ module Adapters
3
+ class CassandraDriver
4
+ attr_reader :config
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def cluster
11
+ @cluster ||= Cassandra.cluster cluster_config
12
+ end
13
+
14
+ def client
15
+ @client ||= Client.new(cluster.connect(config[:keyspace]))
16
+ end
17
+
18
+ def close
19
+ @client.try(:close)
20
+ @client = nil
21
+ end
22
+
23
+ def cluster_config
24
+ {
25
+ :hosts => config[:servers].map { |server| server.sub /:\d+/, '' },
26
+ :port => config[:port] || 9042,
27
+ :connect_timeout => config[:thrift][:connect_timeout] || 10,
28
+ :timeout => config[:thrift][:timeout] || 10,
29
+ :logger => Rails.logger || Logger.new(STDOUT),
30
+ :consistency => (config[:consistency] || {})[:write_default].try(:to_sym) || :one,
31
+ }
32
+ end
33
+
34
+ # The client class acts like the old cassandra gem
35
+ class Client
36
+ attr_reader :session
37
+
38
+ KEY_FIELD = 'key'
39
+ NAME_FIELD = 'column1'
40
+ VALUE_FIELD = 'value'
41
+
42
+ def initialize(session)
43
+ @session = session
44
+ end
45
+
46
+ def close
47
+ session.close
48
+ end
49
+
50
+ def execute(*args)
51
+ session.execute *args
52
+ end
53
+
54
+ def execute_async(*args)
55
+ session.execute_async *args
56
+ end
57
+
58
+ def insert(column_family, key, values, opts=nil)
59
+ ttl = opts.try(:[], :ttl)
60
+ async = opts.try(:[], :async)
61
+
62
+ insert_into_options = ttl ? " USING TTL #{ttl}" : ''
63
+ key = "textAsBlob('#{key}')"
64
+
65
+ query = "BEGIN BATCH\n"
66
+ query << values.map do |name, value|
67
+ " INSERT INTO \"#{column_family}\" (#{KEY_FIELD}, #{NAME_FIELD}, #{VALUE_FIELD}) VALUES (#{key}, '#{name}', '#{value}')#{insert_into_options}"
68
+ end.join("\n")
69
+ query << "\nAPPLY BATCH;"
70
+
71
+ async ? self.execute_async(query, execute_options(opts)) : self.execute(query, execute_options(opts))
72
+ end
73
+
74
+ def get(column_family, key, *columns_options)
75
+ opts = columns_options.pop if columns_options.last.is_a?(Hash)
76
+ async = opts.try(:[], :async)
77
+
78
+ columns = columns_options.flatten.compact
79
+
80
+ key = "textAsBlob('#{key}')"
81
+
82
+ query =
83
+ if columns.size == 1
84
+ "SELECT #{VALUE_FIELD} FROM \"#{column_family}\" WHERE #{KEY_FIELD} = #{key} AND #{NAME_FIELD} = '#{columns.first}'"
85
+ else
86
+ "SELECT #{NAME_FIELD}, #{VALUE_FIELD} FROM \"#{column_family}\" WHERE #{KEY_FIELD} = #{key}"
87
+ end
88
+
89
+ result = async ? self.execute_async(query, execute_options(opts)) : self.execute(query, execute_options(opts))
90
+ return result if async
91
+
92
+ if columns.size == 1
93
+ result.size > 0 ? result.first[VALUE_FIELD] : nil
94
+ else
95
+ data = result.inject({}) { |hsh, row| hsh[row[NAME_FIELD]] = row[VALUE_FIELD]; hsh }
96
+ columns.size > 0 ? data.slice(*columns.map(&:to_s)) : data
97
+ end
98
+ end
99
+
100
+ def add(column_family, key, by, field, opts=nil)
101
+ async = opts.try(:[], :async)
102
+ key = "textAsBlob('#{key}')"
103
+
104
+ query = "UPDATE \"#{column_family}\" SET #{VALUE_FIELD} = #{VALUE_FIELD} + #{by} WHERE #{KEY_FIELD} = #{key} AND #{NAME_FIELD} = '#{field}';"
105
+
106
+ async ? self.execute_async(query, execute_options(opts)) : self.execute(query, execute_options(opts))
107
+ end
108
+
109
+ def execute_options(opts)
110
+ opts.try(:slice,
111
+ :consistency,
112
+ :page_size,
113
+ :trace,
114
+ :timeout,
115
+ :serial_consistency
116
+ ) || {}
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -12,7 +12,8 @@ module CassandraObject
12
12
  autoload :OneToOne
13
13
 
14
14
  included do
15
- class_inheritable_hash :associations
15
+ class_attribute :associations
16
+ self.associations = {}
16
17
  end
17
18
 
18
19
  module ClassMethods
@@ -29,10 +30,11 @@ module CassandraObject
29
30
  end
30
31
 
31
32
  def association(association_name, options= {})
33
+ self.association = self.association.dup
32
34
  if options[:unique]
33
- write_inheritable_hash(:associations, {association_name => OneToOne.new(association_name, self, options)})
35
+ self.associations[association_name] = OneToOne.new(association_name, self, options)
34
36
  else
35
- write_inheritable_hash(:associations, {association_name => OneToMany.new(association_name, self, options)})
37
+ self.associations[association_name] = OneToMany.new(association_name, self, options)
36
38
  end
37
39
  end
38
40
 
@@ -43,8 +45,9 @@ module CassandraObject
43
45
  connection.remove(relationships_column_family, key.to_s, consistency: thrift_write_consistency)
44
46
  end
45
47
  end
46
- rescue Cassandra::AccessError => e
47
- raise e unless e.message =~ /Invalid column family/
48
+ rescue Cassandra::Error => e
49
+ # pretty sure this is not the correct message for cassandra-driver gem, will need to investigate the actual message
50
+ raise e unless e.message =~ /invalid column family/i
48
51
  end
49
52
  super
50
53
  end
@@ -75,19 +75,19 @@ module CassandraObject
75
75
  end
76
76
  end
77
77
 
78
- def method_missing(method_id, *args, &block)
79
- if !self.class.attribute_methods_generated?
80
- self.class.define_attribute_methods
81
- send(method_id, *args, &block)
82
- else
83
- super
84
- end
85
- end
78
+ # def method_missing(method_id, *args, &block)
79
+ # if !self.class.attribute_methods_generated?
80
+ # self.class.define_attribute_methods
81
+ # send(method_id, *args, &block)
82
+ # else
83
+ # super
84
+ # end
85
+ # end
86
86
 
87
- def respond_to?(*args)
88
- self.class.define_attribute_methods unless self.class.attribute_methods_generated?
89
- super
90
- end
87
+ # def respond_to?(*args)
88
+ # self.class.define_attribute_methods unless self.class.attribute_methods_generated?
89
+ # super
90
+ # end
91
91
 
92
92
  protected
93
93
  def attribute_method?(name)
@@ -46,7 +46,7 @@ module CassandraObject
46
46
  include Timestamps
47
47
  include NestedAttributes
48
48
 
49
- attr_accessor :key
49
+ attr_accessor :key, :schema_version
50
50
 
51
51
  include Serialization
52
52
  include Migrations
@@ -1,4 +1,4 @@
1
- require 'with_connection'
1
+ require 'active_record/connection_adapters/connection_specification'
2
2
 
3
3
  module CassandraObject
4
4
  module Connection
@@ -7,164 +7,20 @@ module CassandraObject
7
7
  included do
8
8
  class_attribute :connection_spec
9
9
 
10
- class_eval do
11
-
12
- @@schema = nil
13
- def self.new_connection(async, servers)
14
- spec = connection_spec.dup
15
-
16
- if async
17
- require 'thrift_client/event_machine'
18
- spec[:thrift] = spec[:thrift].dup.merge(:transport => Thrift::EventMachineTransport,
19
- :transport_wrapper => nil)
20
- end
21
-
22
- Cassandra.new(spec[:keyspace], servers || spec[:servers], spec[:thrift]).tap do |conn|
23
- conn.disable_node_auto_discovery! if spec[:disable_node_auto_discovery]
24
- if spec[:cache_schema]
25
- if @@schema
26
- conn.instance_variable_set '@schema', @@schema
27
- else
28
- begin
29
- @@schema = conn.schema
30
- rescue CassandraThrift::InvalidRequestException => e
31
- # initially the schema doesn't exists
32
- end
33
- end
34
- end
35
- end
36
- end
37
-
38
- def self.new_async_connection(servers=nil)
39
- new_connection true, servers
40
- end
41
-
42
- def self.new_sync_connection(servers=nil)
43
- new_connection false, servers
44
- end
45
-
46
- def self.new_async_connection_pool(servers=nil)
47
- adapter_method = Proc.new do
48
- self.new_async_connection servers
49
- end
50
- spec = ActiveRecord::Base::ConnectionSpecification.new self.connection_spec, adapter_method
51
- WithConnection::ConnectionPool.new "async cassandra", spec
52
- end
53
-
54
- def self.new_sync_connection_pool(servers=nil)
55
- adapter_method = Proc.new do
56
- self.new_sync_connection servers
57
- end
58
- spec = ActiveRecord::Base::ConnectionSpecification.new self.connection_spec, adapter_method
59
- WithConnection::ConnectionPool.new "sync cassandra", spec
60
- end
61
-
62
- @@ring = nil
63
- def self.ring
64
- @@ring ||= self.new_sync_connection.ring
65
- end
66
-
67
- def self.servers_and_ranges(datacenter)
68
- datacenter = datacenter.to_s
69
- ring.map do |t|
70
- {
71
- :start_token => t.start_token.to_i,
72
- :end_token => t.end_token.to_i == 0 ? 0xffffffffffffffffffffffffffffffff : (t.end_token.to_i - 1),
73
- :servers => t.endpoint_details.select { |d| d.datacenter == datacenter }.map { |d| "#{d.host}:9160" }
74
- }
75
- end
76
- end
77
-
78
- NEGATIVE_TEST = 0x80000000000000000000000000000000
79
- FLIP_BITS_MASK = 0xffffffffffffffffffffffffffffffff
80
- def self.ranged_connection_pool_key_algo
81
- Proc.new do |key|
82
- key = Digest::MD5.hexdigest(key.to_s).to_i(16)
83
-
84
- # https://github.com/datastax/java-driver/blob/2.0/driver-core/src/main/java/com/datastax/driver/core/Token.java:259
85
- # test to see if the unsigned integer is a negative singed value
86
- if (key & NEGATIVE_TEST) != 0
87
- # need to flip all the bits
88
- # abs
89
- (key ^ FLIP_BITS_MASK) + 1
90
- else
91
- key
92
- end
93
- end
94
- end
95
-
96
- def self.new_ranged_connection_pool(async)
97
- if self.connection_spec[:datacenter]
98
- require 'with_connection/ranged_connection_pool'
99
-
100
- default_pool = async ? new_async_connection_pool : new_sync_connection_pool
101
-
102
- ranges_and_pools = self.servers_and_ranges(self.connection_spec[:datacenter]).map do |info|
103
- pool = async ? new_async_connection_pool(info[:servers]) : new_sync_connection_pool(info[:servers])
104
- [WithConnection::RangedConnectionPool::BasicRange.new(info[:start_token], info[:end_token]), pool]
105
- end
106
-
107
- ranges_and_pools.size <= 1 ? default_pool : WithConnection::RangedConnectionPool.new(ranges_and_pools, default_pool, self.ranged_connection_pool_key_algo)
108
- else
109
- async ? new_async_connection_pool : new_sync_connection_pool
110
- end
111
- end
112
-
113
- @@sync_connection_pool = nil
114
- def self.sync_connection_pool
115
- @@sync_connection_pool ||= new_ranged_connection_pool(false)
116
- end
117
-
118
- @@async_connection_pool = nil
119
- def self.async_connection_pool
120
- @@async_connection_pool ||= new_ranged_connection_pool(true)
121
- end
122
-
123
- if defined?(EM)
124
- def self.connection_pool
125
- EM.reactor_running? ? self.async_connection_pool : self.sync_connection_pool
126
- end
127
- else
128
- def self.connection_pool
129
- self.sync_connection_pool
130
- end
131
- end
132
-
133
- def connection_pool
134
- self.class.connection_pool
135
- end
136
-
137
- def self.connection
138
- self.connection_pool.connection
139
- end
140
- def self.connection?; !!connection; end
141
-
142
- def self.with_connection(key=nil, read_write=nil, &block)
143
- self.connection_pool.with_connection(key, read_write, &block)
144
- end
145
-
146
- def with_connection(key=nil, read_write=nil, &block)
147
- self.class.with_connection(key, read_write, &block)
148
- end
149
-
150
- def self.disconnect!
151
- self.async_connection_pool.disconnect! if @@async_connection_pool
152
- self.sync_connection_pool.disconnect! if @@sync_connection_pool
153
- @@sync_connection_pool = nil
154
- @@async_connection_pool = nil
155
- end
10
+ def connection
11
+ self.class.connection
12
+ end
156
13
 
157
- def disconnect!
158
- self.class.disconnect!
159
- end
14
+ def connection?
15
+ self.class.connection?
16
+ end
160
17
 
161
- def connection
162
- defined?(@connection) ? @connection : singleton_class.connection
163
- end
18
+ def disconnect!
19
+ self.class.disconnect!
20
+ end
164
21
 
165
- def connection?
166
- !!connection
167
- end
22
+ def with_connection(*args)
23
+ yield
168
24
  end
169
25
  end
170
26
 
@@ -185,6 +41,23 @@ module CassandraObject
185
41
 
186
42
  self.connection_spec = spec
187
43
  end
44
+
45
+ def connection
46
+ @connection ||= CassandraObject::Adapters::CassandraDriver.new(self.connection_spec).client
47
+ end
48
+
49
+ def connection?
50
+ !! @connection
51
+ end
52
+
53
+ def disconnect!
54
+ @connection.try(:close)
55
+ @connection = nil
56
+ end
57
+
58
+ def with_connection(*args)
59
+ yield
60
+ end
188
61
  end
189
62
  end
190
63
  end
@@ -9,11 +9,11 @@ module CassandraObject
9
9
 
10
10
  module ClassMethods
11
11
  THRIFT_LEVELS = {
12
- :one => Cassandra::Consistency::ONE,
13
- :quorum => Cassandra::Consistency::QUORUM,
14
- :local_quorum => Cassandra::Consistency::LOCAL_QUORUM,
15
- :each_quorum => Cassandra::Consistency::EACH_QUORUM,
16
- :all => Cassandra::Consistency::ALL
12
+ :one => :one,
13
+ :quorum => :quorum,
14
+ :local_quorum => :local_quorum,
15
+ :each_quorum => :each_quorum,
16
+ :all => :all
17
17
  }
18
18
 
19
19
  DEFAULT_OPTIONS = {
@@ -2,22 +2,6 @@ module CassandraObject
2
2
  module FinderMethods
3
3
  extend ActiveSupport::Concern
4
4
  module ClassMethods
5
- def column_parent
6
- @column_parent ||= CassandraThrift::ColumnParent.new(:column_family => column_family)
7
- end
8
-
9
- def slice_range_count
10
- @slice_range_count ||= 100
11
- end
12
-
13
- def slice_range_count=(v)
14
- @slice_range_count = v
15
- end
16
-
17
- def slice_predicate
18
- @slice_predicate ||= CassandraThrift::SlicePredicate.new(:slice_range => CassandraThrift::SliceRange.new(:count => slice_range_count, :reversed => false, :start => '', :finish => ''))
19
- end
20
-
21
5
  def find(key, opts={})
22
6
  # kludge to play nice ActiveRecord association
23
7
  opts.assert_valid_keys(:conditions, :consistency)
@@ -29,7 +13,7 @@ module CassandraObject
29
13
  begin
30
14
  CassandraObject::Base.with_connection(key, :read) do
31
15
  ActiveSupport::Notifications.instrument("get.cassandra_object", column_family: column_family, key: key) do
32
- connection.get column_parent, key, slice_predicate, opts.slice(:consistency)
16
+ connection.get column_family, key, opts.slice(:consistency)
33
17
  end
34
18
  end
35
19
  end
@@ -102,6 +86,19 @@ module CassandraObject
102
86
  multi_get_by_expression(expression, options).values
103
87
  end
104
88
 
89
+ # Selecting a slice of a super column
90
+ def get_slice(key, start, finish, opts={})
91
+ CassandraObject::Base.with_connection(key, :read) do
92
+ connection.get_slice(column_family,
93
+ key,
94
+ start,
95
+ finish,
96
+ opts[:count] || 100,
97
+ opts[:reversed] || false,
98
+ opts[:consistency] || thrift_read_consistency)
99
+ end
100
+ end
101
+
105
102
  private
106
103
  def _columns_to_hash(columns)
107
104
  {}.tap do |hsh|
@@ -4,8 +4,9 @@ module CassandraObject
4
4
  extend ActiveSupport::Autoload
5
5
 
6
6
  included do
7
- class_inheritable_array :migrations
8
- class_inheritable_accessor :current_schema_version
7
+ class_attribute :migrations
8
+ self.migrations = []
9
+ class_attribute :current_schema_version
9
10
  self.current_schema_version = 0
10
11
  end
11
12
 
@@ -29,7 +30,8 @@ module CassandraObject
29
30
 
30
31
  module ClassMethods
31
32
  def migrate(version, &blk)
32
- write_inheritable_array(:migrations, [Migration.new(version, blk)])
33
+ self.migrations = self.migrations.dup
34
+ self.migrations << Migration.new(version, blk)
33
35
 
34
36
  if version > self.current_schema_version
35
37
  self.current_schema_version = version
@@ -60,8 +62,8 @@ module CassandraObject
60
62
  end
61
63
 
62
64
  super(key, attributes).tap do |record|
63
- original_attributes.diff(attributes).keys.each do |attribute|
64
- record.attribute_will_change! attribute
65
+ attributes.each do |name, _|
66
+ record.attribute_will_change!(name) unless original_attributes.has_key?(name)
65
67
  end
66
68
  end
67
69
  end
@@ -1,14 +1,9 @@
1
- require 'cassandra/mock'
2
1
  module CassandraObject
3
2
  module Mocking
4
3
  extend ActiveSupport::Concern
5
4
  module ClassMethods
6
5
  def use_mock!(really=true)
7
- if really
8
- self.connection_class = Cassandra::Mock
9
- else
10
- self.connection_class = Cassandra
11
- end
6
+ self.connection_class = Cassandra
12
7
  end
13
8
  end
14
9
  end
@@ -11,7 +11,7 @@ module CassandraObject
11
11
  extend ActiveSupport::Concern
12
12
 
13
13
  included do
14
- class_inheritable_accessor :nested_attributes_options, :instance_writer => false
14
+ class_attribute :nested_attributes_options
15
15
  self.nested_attributes_options = {}
16
16
  end
17
17
 
@@ -28,6 +28,7 @@ module CassandraObject
28
28
  if reflection = reflect_on_association(association_name)
29
29
  reflection.options[:autosave] = true
30
30
  add_autosave_association_callbacks(reflection)
31
+ self.nested_attributes_options = self.nested_attributes_options.dup
31
32
  nested_attributes_options[association_name.to_sym] = options
32
33
  type = (reflection.collection? ? :collection : :one_to_one)
33
34
 
@@ -50,7 +50,7 @@ module CassandraObject
50
50
 
51
51
  def self.get_all_versions
52
52
  cas = CassandraObject::Base.connection
53
- cas.multi_get(schema_migrations_column_family, ['all'])['all'].map {|(name, _value)| name.to_i}.sort
53
+ cas.get(schema_migrations_column_family, 'all').map {|(name, _value)| name.to_i}.sort
54
54
  end
55
55
 
56
56
  def self.current_version
@@ -27,6 +27,7 @@ module CassandraObject
27
27
  :column_type => 'Standard',
28
28
  }.merge(options)
29
29
 
30
+ # this won't work with cassandra-driver
30
31
  cf = Cassandra::ColumnFamily.new
31
32
  cf.name = name.to_s
32
33
  cf.keyspace = @keyspace.to_s
@@ -1,8 +1,6 @@
1
1
  namespace :ks do
2
2
  task :configure => :environment do
3
- @configs = YAML::load(ERB.new(IO.read(Rails.root.join('config', 'cassandra.yml'))).result)
4
- # use default thrift settings
5
- @configs.each { |_, section| section.delete 'thrift' }
3
+ @configs = YAML.load_file(Rails.root.join("config", "cassandra.yml"))
6
4
  @config = @configs[Rails.env || 'development']
7
5
  end
8
6
 
data/script/console.rb ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path('../../config/environment', __FILE__)
4
+ require "irb"
5
+
6
+ if __FILE__ == $0
7
+ IRB.start(__FILE__)
8
+ else
9
+ # check -e option
10
+ if /^-e$/ =~ $0
11
+ IRB.start(__FILE__)
12
+ else
13
+ IRB.setup(__FILE__)
14
+ end
15
+ end
16
+
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'sessionm-cassandra_object'
5
- s.version = '2.7.5'
5
+ s.version = '4.0.0'
6
6
  s.description = 'Cassandra ActiveModel'
7
7
  s.summary = 'Cassandra ActiveModel'
8
8
 
9
9
  s.authors = ["Michael Koziarski", "gotime", "sessionm"]
10
- s.email = 'klange@sessionm.com'
10
+ s.email = 'doug@sessionm.com'
11
11
  s.homepage = 'http://github.com/sessionm/cassandra_object'
12
12
 
13
13
  s.extra_rdoc_files = ["README.markdown"]
@@ -6,11 +6,11 @@ class CassandraObject::ConsistencyTest < CassandraObject::TestCase
6
6
 
7
7
  test 'thrift_write_consistency' do
8
8
  TestModel.write_consistency = :all
9
- assert_equal Cassandra::Consistency::ALL, TestModel.thrift_write_consistency
9
+ assert_equal :all, TestModel.thrift_write_consistency
10
10
  end
11
11
 
12
12
  test 'thrift_read_consistency' do
13
13
  TestModel.read_consistency = :all
14
- assert_equal Cassandra::Consistency::ALL, TestModel.thrift_read_consistency
14
+ assert_equal :all, TestModel.thrift_read_consistency
15
15
  end
16
16
  end
@@ -62,11 +62,11 @@ class CassandraObject::PersistenceTest < CassandraObject::TestCase
62
62
  CassandraObject::Consistency::ClassMethods.class_variable_set(:@@default_read_consistency, :quorum)
63
63
  Counter.write_consistency = nil
64
64
 
65
- Counter.connection.expects(:add).with(Counter.column_family, 'key', 2, 'column', :consistency => Cassandra::Consistency::QUORUM)
65
+ Counter.connection.expects(:add).with(Counter.column_family, 'key', 2, 'column', :consistency => :quorum)
66
66
  Counter.add('key', 2, 'column')
67
67
 
68
68
  Counter.write_consistency = :local_quorum
69
- Counter.connection.expects(:add).with(Counter.column_family, 'key', 2, 'column', :consistency => Cassandra::Consistency::LOCAL_QUORUM)
69
+ Counter.connection.expects(:add).with(Counter.column_family, 'key', 2, 'column', :consistency => :local_quorum)
70
70
  Counter.add('key', 2, 'column')
71
71
  ensure
72
72
  CassandraObject::Consistency::ClassMethods.class_variable_set(:@@default_read_consistency, old_class_write_cl)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sessionm-cassandra_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.5
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Koziarski
@@ -10,23 +10,30 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-05-05 00:00:00.000000000 Z
13
+ date: 2015-05-06 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Cassandra ActiveModel
16
- email: klange@sessionm.com
16
+ email: doug@sessionm.com
17
17
  executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files:
20
20
  - README.markdown
21
21
  files:
22
22
  - ".gitignore"
23
+ - ".ruby-gemset"
24
+ - ".ruby-version"
23
25
  - CHANGELOG
24
26
  - Gemfile
25
27
  - LICENSE
26
28
  - MIT-LICENSE
27
29
  - README.markdown
28
30
  - Rakefile
31
+ - config/boot.rb
32
+ - config/cassandra.yml
33
+ - config/environment.rb
29
34
  - lib/cassandra_object.rb
35
+ - lib/cassandra_object/adapters.rb
36
+ - lib/cassandra_object/adapters/cassandra_driver.rb
30
37
  - lib/cassandra_object/associations.rb
31
38
  - lib/cassandra_object/associations/one_to_many.rb
32
39
  - lib/cassandra_object/associations/one_to_one.rb
@@ -83,6 +90,7 @@ files:
83
90
  - lib/cassandra_object/types/time_with_zone_type.rb
84
91
  - lib/cassandra_object/types/utf8_string_type.rb
85
92
  - lib/cassandra_object/validations.rb
93
+ - script/console.rb
86
94
  - sessionm-cassandra_object.gemspec
87
95
  - test/README
88
96
  - test/active_model_test.rb
@@ -128,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
136
  version: '0'
129
137
  requirements: []
130
138
  rubyforge_project:
131
- rubygems_version: 2.4.5
139
+ rubygems_version: 2.4.6
132
140
  signing_key:
133
141
  specification_version: 4
134
142
  summary: Cassandra ActiveModel