bigrecord 0.0.11 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'rubygems'
2
2
 
3
- DATA_STORES = ["hbase"]
3
+ DATA_STORES = ["hbase", "cassandra"]
4
4
  ROOT = File.expand_path(File.dirname(__FILE__)) + '/'
5
5
 
6
- load 'tasks/data_store.rake'
7
- load 'tasks/gem.rake'
8
- load 'tasks/rdoc.rake'
9
- load 'tasks/spec.rake'
6
+ require ROOT + 'tasks/data_store.rb'
7
+ require ROOT + 'tasks/gem.rb'
8
+ require ROOT + 'tasks/rdoc.rb'
9
+ require ROOT + 'tasks/spec.rb'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.11
1
+ 0.1.0
@@ -1,10 +1,9 @@
1
1
  module BigRecord
2
2
 
3
- class Base < AbstractBase
3
+ class Base < Model
4
4
 
5
5
  attr_accessor :modified_attributes
6
6
 
7
-
8
7
  def self.inherited(child) #:nodoc:
9
8
  @@subclasses[self] ||= []
10
9
  @@subclasses[self] << child
@@ -388,7 +387,7 @@ module BigRecord
388
387
  end
389
388
 
390
389
  def table_name
391
- (superclass == BigRecord::Base) ? @table_name : superclass.table_name
390
+ @table_name || superclass.table_name
392
391
  end
393
392
 
394
393
  def set_table_name(name)
@@ -0,0 +1,349 @@
1
+ module BigRecord
2
+ class Base
3
+ def self.cassandra_connection(config) # :nodoc:
4
+ begin
5
+ require 'cassandra'
6
+ rescue LoadError => e
7
+ puts "[BigRecord] The 'cassandra' gem is needed for CassandraAdapter. Install it with: gem install cassandra"
8
+ raise e
9
+ end
10
+
11
+ config = config.symbolize_keys
12
+
13
+ client = Cassandra.new(config[:keyspace], config[:servers])
14
+ ConnectionAdapters::CassandraAdapter.new(client, logger, [], config)
15
+ end
16
+ end
17
+
18
+ module ConnectionAdapters
19
+ class CassandraAdapter < AbstractAdapter
20
+ @@emulate_booleans = true
21
+ cattr_accessor :emulate_booleans
22
+
23
+ LOST_CONNECTION_ERROR_MESSAGES = [
24
+ "Server shutdown in progress",
25
+ "Broken pipe",
26
+ "Lost connection to HBase server during query",
27
+ "HBase server has gone away"
28
+ ]
29
+
30
+ # data types
31
+ TYPE_NULL = 0x00;
32
+ TYPE_STRING = 0x01; # utf-8 strings
33
+ TYPE_BOOLEAN = 0x04; # delegate to YAML
34
+ TYPE_BINARY = 0x07; # byte[] => no conversion
35
+
36
+ # string charset
37
+ CHARSET = "utf-8"
38
+
39
+ # utility constants
40
+ NULL = "\000"
41
+
42
+ def initialize(connection, logger, connection_options, config)
43
+ super(connection, logger)
44
+ @connection_options, @config = connection_options, config
45
+ end
46
+
47
+ def configuration
48
+ @config.clone
49
+ end
50
+
51
+ def adapter_name #:nodoc:
52
+ 'Cassandra'
53
+ end
54
+
55
+ def supports_migrations? #:nodoc:
56
+ false
57
+ end
58
+
59
+ # CONNECTION MANAGEMENT ====================================
60
+
61
+ def disconnect!
62
+ @connection.disconnect!
63
+ super
64
+ end
65
+
66
+ # DATABASE STATEMENTS ======================================
67
+
68
+ def update_raw(table_name, row, values, timestamp)
69
+ result = nil
70
+ log "UPDATE #{table_name} SET #{values.inspect if values} WHERE ROW=#{row};" do
71
+ result = @connection.insert(table_name, row, data_to_cassandra_format(values), {:consistency => Cassandra::Consistency::QUORUM})
72
+ end
73
+ result
74
+ end
75
+
76
+ def update(table_name, row, values, timestamp)
77
+ serialized_collection = {}
78
+ values.each do |column, value|
79
+ serialized_collection[column] = serialize(value)
80
+ end
81
+ update_raw(table_name, row, serialized_collection, timestamp)
82
+ end
83
+
84
+ def get_raw(table_name, row, column, options={})
85
+ result = nil
86
+ log "SELECT (#{column}) FROM #{table_name} WHERE ROW=#{row};" do
87
+ super_column, name = column.split(":")
88
+ result = @connection.get(table_name, row, super_column, name)
89
+ end
90
+ result
91
+ end
92
+
93
+ def get(table_name, row, column, options={})
94
+ serialized_result = get_raw(table_name, row, column, options)
95
+ result = nil
96
+ if serialized_result.is_a?(Array)
97
+ result = serialized_result.collect{|e| deserialize(e)}
98
+ else
99
+ result = deserialize(serialized_result)
100
+ end
101
+ result
102
+ end
103
+
104
+ def get_columns_raw(table_name, row, columns, options={})
105
+ result = {}
106
+
107
+ log "SELECT (#{columns.join(", ")}) FROM #{table_name} WHERE ROW=#{row};" do
108
+ requested_columns = columns_to_cassandra_format(columns)
109
+ super_columns = requested_columns.keys
110
+
111
+ if super_columns.size == 1 && requested_columns[super_columns.first].size > 0
112
+ column_names = requested_columns[super_columns.first]
113
+
114
+ values = @connection.get_columns(table_name, row, super_columns.first, column_names)
115
+
116
+ result["id"] = row if values && values.compact.size > 0
117
+ column_names.each_index do |id|
118
+ full_key = super_columns.first + ":" + column_names[id].to_s
119
+ result[full_key] = values[id] unless values[id].nil?
120
+ end
121
+ else
122
+ values = @connection.get_columns(table_name, row, super_columns)
123
+ result["id"] = row if values && values.compact.size > 0
124
+ super_columns.each_index do |id|
125
+ next if values[id].nil?
126
+
127
+ values[id].each do |column_name, value|
128
+ next if value.nil?
129
+
130
+ full_key = super_columns[id] + ":" + column_name
131
+ result[full_key] = value
132
+ end
133
+ end
134
+ end
135
+ end
136
+ result
137
+ end
138
+
139
+ def get_columns(table_name, row, columns, options={})
140
+ row_cols = get_columns_raw(table_name, row, columns, options)
141
+ return nil unless row_cols && !row_cols.empty?
142
+
143
+ result = {}
144
+ row_cols.each do |key,value|
145
+ begin
146
+ result[key] =
147
+ if key == 'id'
148
+ value
149
+ else
150
+ deserialize(value)
151
+ end
152
+ rescue Exception => e
153
+ puts "Could not load column value #{key} for row=#{row.name}"
154
+ end
155
+ end
156
+ result
157
+ end
158
+
159
+ def get_consecutive_rows_raw(table_name, start_row, limit, columns, stop_row = nil)
160
+ result = []
161
+ log "SCAN (#{columns.join(", ")}) FROM #{table_name} WHERE START_ROW=#{start_row} AND STOP_ROW=#{stop_row} LIMIT=#{limit};" do
162
+ options = {}
163
+ options[:start] = start_row if start_row
164
+ options[:finish] = stop_row if stop_row
165
+ options[:count] = limit if limit
166
+
167
+ keys = @connection.get_range(table_name, options)
168
+
169
+ # This will be refactored. Don't make fun of me yet.
170
+ if !keys.empty?
171
+ keys.each do |key|
172
+ row = {}
173
+ row["id"] = key.key
174
+
175
+ key.columns.each do |s_col|
176
+ super_column = s_col.super_column
177
+ super_column_name = super_column.name
178
+
179
+ super_column.columns.each do |column|
180
+ full_key = super_column_name + ":" + column.name
181
+ row[full_key] = column.value
182
+ end
183
+ end
184
+
185
+ result << row if row.keys.size > 1
186
+ end
187
+ end
188
+ end
189
+ result
190
+ end
191
+
192
+ def get_consecutive_rows(table_name, start_row, limit, columns, stop_row = nil)
193
+ rows = get_consecutive_rows_raw(table_name, start_row, limit, columns, stop_row)
194
+
195
+ result = rows.collect do |row|
196
+ cols = {}
197
+ row.each do |key,value|
198
+ begin
199
+ cols[key] = (key == "id") ? value : deserialize(value)
200
+ rescue Exception => e
201
+ puts "Could not load column value #{key} for row=#{row.name}"
202
+ end
203
+ end
204
+ cols
205
+ end
206
+ result
207
+ end
208
+
209
+ def delete(table_name, row)
210
+ result = nil
211
+ log "DELETE FROM #{table_name} WHERE ROW=#{row};" do
212
+ result = @connection.remove(table_name.to_s, row, {:consistency => Cassandra::Consistency::QUORUM})
213
+ end
214
+ result
215
+ end
216
+
217
+ def delete_all(table_name)
218
+ raise NotImplementedError
219
+ end
220
+
221
+ # SERIALIZATION STATEMENTS =================================
222
+
223
+ # Serialize the given value
224
+ def serialize(value)
225
+ case value
226
+ when NilClass then NULL
227
+ when String then build_serialized_value(TYPE_STRING, value)
228
+ else value.to_yaml
229
+ end
230
+ end
231
+
232
+ # Serialize an object in a given type
233
+ def build_serialized_value(type, value)
234
+ type.chr + value
235
+ end
236
+
237
+ # Deserialize the given string. This method supports both the pure YAML format and
238
+ # the type header format.
239
+ def deserialize(str)
240
+ return unless str
241
+
242
+ # stay compatible with the old serialization code
243
+ # YAML documents start with "--- " so if we find that sequence at the beginning we
244
+ # consider it as a serialized YAML value, else it's the new format with the type header
245
+ if str[0..3] == "--- "
246
+ YAML::load(str) if str
247
+ else
248
+ deserialize_with_header(str)
249
+ end
250
+ end
251
+
252
+ # Deserialize the given string assumed to be in the type header format.
253
+ def deserialize_with_header(data)
254
+ return unless data and data.size >= 2
255
+
256
+ # the type of the data is encoded in the first byte
257
+ type = data[0];
258
+
259
+ case type
260
+ when TYPE_NULL then nil
261
+ when TYPE_STRING then data[1..-1]
262
+ when TYPE_BINARY then data[1..-1]
263
+ else data
264
+ end
265
+ end
266
+
267
+ protected
268
+
269
+ def data_to_cassandra_format(data = {})
270
+ super_columns = {}
271
+
272
+ data.each do |name, value|
273
+ super_column, column = name.split(":")
274
+ super_columns[super_column.to_s] = {} unless super_columns.has_key?(super_column.to_s)
275
+ super_columns[super_column.to_s][column.to_s] = value
276
+ end
277
+
278
+ return super_columns
279
+ end
280
+
281
+ def columns_to_cassandra_format(column_names = [])
282
+ super_columns = {}
283
+
284
+ column_names.each do |name|
285
+ super_column, sub_column = name.split(":")
286
+
287
+ super_columns[super_column.to_s] = [] unless super_columns.has_key?(super_column.to_s)
288
+ super_columns[super_column.to_s] << sub_column
289
+ end
290
+
291
+ return super_columns
292
+ end
293
+
294
+ def log(str, name = nil)
295
+ if block_given?
296
+ if @logger and @logger.level <= Logger::INFO
297
+ result = nil
298
+ seconds = Benchmark.realtime { result = yield }
299
+ @runtime += seconds
300
+ log_info(str, name, seconds)
301
+ result
302
+ else
303
+ yield
304
+ end
305
+ else
306
+ log_info(str, name, 0)
307
+ nil
308
+ end
309
+ rescue Exception => e
310
+ # Log message and raise exception.
311
+ # Set last_verfication to 0, so that connection gets verified
312
+ # upon reentering the request loop
313
+ @last_verification = 0
314
+ message = "#{e.class.name}: #{e.message}: #{str}"
315
+ log_info(message, name, 0)
316
+ raise e
317
+ end
318
+
319
+ def log_info(str, name, runtime)
320
+ return unless @logger
321
+
322
+ @logger.debug(
323
+ format_log_entry(
324
+ "#{name.nil? ? "CASSANDRA" : name} (#{sprintf("%f", runtime)})",
325
+ str.gsub(/ +/, " ")
326
+ )
327
+ )
328
+ end
329
+
330
+ def format_log_entry(message, dump = nil)
331
+ if BigRecord::Base.colorize_logging
332
+ if @@row_even
333
+ @@row_even = false
334
+ message_color, dump_color = "4;36;1", "0;1"
335
+ else
336
+ @@row_even = true
337
+ message_color, dump_color = "4;35;1", "0"
338
+ end
339
+
340
+ log_entry = " \e[#{message_color}m#{message}\e[0m "
341
+ log_entry << "\e[#{dump_color}m%#{String === dump ? 's' : 'p'}\e[0m" % dump if dump
342
+ log_entry
343
+ else
344
+ "%s %s" % [message, dump]
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
@@ -32,7 +32,7 @@ module BigRecord
32
32
  #
33
33
  # == Types and Options
34
34
  #
35
- # @see BigRecord::AbstractBase.column
35
+ # @see BigRecord::Model.column
36
36
  #
37
37
  class Column
38
38
  module Format
@@ -9,3 +9,4 @@ require dir + '/abstract/connection_specification'
9
9
  require dir + '/abstract_adapter'
10
10
  require dir + '/hbase_adapter'
11
11
  require dir + '/hbase_rest_adapter'
12
+ require dir + '/cassandra_adapter'
@@ -44,7 +44,9 @@ module BigRecord
44
44
 
45
45
  # Returns the column object for the named attribute.
46
46
  def column_for_attribute_with_dynamic_schema(name)
47
- self.columns_hash[name.to_s]
47
+ name_string = name.to_s
48
+ self.columns_hash[name_string] || self.columns_hash["#{self.class.default_column_prefix}#{name_string}"] ||
49
+ self.columns.select{|c|c.alias==name_string}.first
48
50
  end
49
51
 
50
52
  # Initializes the attributes array with keys matching the columns from the linked table and
@@ -123,7 +123,7 @@ module BigRecord
123
123
  # Now any subsequent access to that book object we just saved to will have
124
124
  # a WebLink record available with it.
125
125
  #
126
- class Embedded < AbstractBase
126
+ class Embedded < Model
127
127
 
128
128
  def initialize(attrs = nil)
129
129
  super
@@ -64,7 +64,7 @@ module BigRecord
64
64
  # ignore methods '=' and '?' (e.g. 'normalized_srf_ief:231=')
65
65
  return if name =~ /=|\?$/
66
66
 
67
- column = self.columns_hash[name]
67
+ column = column_for_attribute_without_family_span_columns(name)
68
68
  unless column
69
69
  family = BigRecord::ConnectionAdapters::Column.extract_family(name)
70
70
  column = self.columns_hash[family] if family
@@ -52,7 +52,7 @@ module BigRecord
52
52
  end
53
53
  end
54
54
 
55
- class AbstractBase
55
+ class Model
56
56
  require 'rubygems'
57
57
  require 'uuidtools'
58
58
 
@@ -1069,7 +1069,7 @@ private
1069
1069
  end
1070
1070
 
1071
1071
  def default_columns
1072
- raise NotImplemented
1072
+ {}
1073
1073
  end
1074
1074
 
1075
1075
  def default_views
data/lib/big_record.rb CHANGED
@@ -36,7 +36,7 @@ rescue LoadError
36
36
  end
37
37
 
38
38
  require dir + '/routing_ext'
39
- require dir + '/abstract_base'
39
+ require dir + '/model'
40
40
  require dir + '/base'
41
41
  require dir + '/embedded'
42
42
  require dir + '/validations'
@@ -1,7 +1,7 @@
1
- hbase:
1
+ hbase_rest:
2
2
  adapter: hbase_rest
3
3
  api_address: http://localhost:8080
4
- hbase_brd:
4
+ hbase:
5
5
  adapter: hbase
6
6
  zookeeper_quorum: localhost
7
7
  zookeeper_client_port: 2181
@@ -9,7 +9,7 @@ hbase_brd:
9
9
  drb_port: 50001
10
10
  cassandra:
11
11
  adapter: cassandra
12
- address: localhost
13
- port: 9160
14
- drb_host: localhost
15
- drb_port: 50002
12
+ keyspace: Bigrecord
13
+ servers:
14
+ - localhost:9160
15
+ - 127.0.0.1:9160
@@ -5,8 +5,6 @@ describe BigRecord::ConnectionAdapters::HbaseAdapter do
5
5
 
6
6
  before do
7
7
  # Make sure the connection is defined in spec/connections/bigrecord.yml
8
- BigRecord::Base.establish_connection 'hbase'
9
-
10
8
  @adapter = BigRecord::Base.connection
11
9
  end
12
10
 
@@ -1,5 +1,5 @@
1
1
  # Defined as a shared spec because embedded_spec uses it as well
2
- describe BigRecord::AbstractBase, :shared => true do
2
+ describe BigRecord::Model, :shared => true do
3
3
 
4
4
  before(:all) do
5
5
  Book.delete_all
@@ -174,7 +174,7 @@ describe BigRecord::AbstractBase, :shared => true do
174
174
  end
175
175
 
176
176
  it 'should be handled properly' do
177
- pending "this still needs to be implemented in BigRecord::AbstractBase"
177
+ pending "this still needs to be implemented in BigRecord::Model"
178
178
 
179
179
  # readonly is the readonly attribute here
180
180
  @company = Company.new(:name => "The Company", :address => "Unknown", :readonly => "secret")
@@ -2,7 +2,7 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
2
  require File.expand_path(File.join(File.dirname(__FILE__), 'attributes_spec'))
3
3
 
4
4
  describe BigRecord::Base do
5
- it_should_behave_like "BigRecord::AbstractBase"
5
+ it_should_behave_like "BigRecord::Model"
6
6
 
7
7
  describe 'column functionality' do
8
8
 
@@ -0,0 +1,35 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
+
3
+ describe BigRecord::Base do
4
+
5
+ class FlaggedDeletionBook < Book
6
+ column :deleted, :boolean
7
+ end
8
+
9
+ before(:all) do
10
+ FlaggedDeletionBook.delete_all
11
+ @book = FlaggedDeletionBook.create(:title => "I Am Legend", :author => "Richard Matheson")
12
+ @book.destroy
13
+ end
14
+
15
+ after(:all) do
16
+ FlaggedDeletionBook.delete_all
17
+ end
18
+
19
+ describe "flagged deletion functionality" do
20
+
21
+ it "should not be found by normal finders" do
22
+ lambda {
23
+ FlaggedDeletionBook.find(@book)
24
+ }.should raise_error BigRecord::RecordNotFound
25
+ end
26
+
27
+ it "should be found using the :include_deleted option" do
28
+ lambda {
29
+ FlaggedDeletionBook.find(@book, :include_deleted => true)
30
+ }.should_not raise_error
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -12,7 +12,7 @@ describe BigRecord::Embedded do
12
12
  Zoo.delete_all
13
13
  end
14
14
 
15
- it_should_behave_like "BigRecord::AbstractBase"
15
+ it_should_behave_like "BigRecord::Model"
16
16
 
17
17
  describe "embedded within a BigRecord::Base model" do
18
18
 
@@ -40,4 +40,14 @@ describe BigRecord::Embedded do
40
40
 
41
41
  end
42
42
 
43
+ describe "standalone behavior" do
44
+
45
+ it "should generate the id in the constructor" do
46
+ link = Embedded::WebLink.new
47
+ link.attributes['id'].should_not be_nil
48
+ link.id.should_not be_nil
49
+ end
50
+
51
+ end
52
+
43
53
  end
File without changes
@@ -6,7 +6,7 @@ begin
6
6
  gemspec.authors = ["openplaces.org"]
7
7
  gemspec.email = "bigrecord@openplaces.org"
8
8
  gemspec.homepage = "http://www.bigrecord.org"
9
- gemspec.summary = "Object mapper for supporting column-oriented data stores (supports #{DATA_STORES.join(" ")}) in Ruby on Rails."
9
+ gemspec.summary = "Object mapper for supporting column-oriented data stores (supports #{DATA_STORES.join(", ")}) in Ruby on Rails."
10
10
  gemspec.description = "BigRecord is built from ActiveRecord, and intended to seamlessly integrate into your Ruby on Rails applications."
11
11
  gemspec.files = FileList["{examples,guides,generators,lib,rails,spec,tasks}/**/*","init.rb","install.rb","Rakefile","VERSION"].to_a
12
12
  gemspec.extra_rdoc_files = FileList["guides/**/*","LICENSE","README.rdoc"].to_a
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bigrecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - openplaces.org
@@ -9,49 +14,59 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-12 00:00:00 -05:00
17
+ date: 2010-04-27 00:00:00 -04:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
23
29
  version: "0"
24
- version:
30
+ type: :development
31
+ version_requirements: *id001
25
32
  - !ruby/object:Gem::Dependency
26
33
  name: uuidtools
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
39
+ segments:
40
+ - 2
41
+ - 0
42
+ - 0
33
43
  version: 2.0.0
34
- version:
44
+ type: :runtime
45
+ version_requirements: *id002
35
46
  - !ruby/object:Gem::Dependency
36
47
  name: activesupport
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
40
50
  requirements:
41
51
  - - ">="
42
52
  - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
43
55
  version: "0"
44
- version:
56
+ type: :runtime
57
+ version_requirements: *id003
45
58
  - !ruby/object:Gem::Dependency
46
59
  name: activerecord
47
- type: :runtime
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
60
+ prerelease: false
61
+ requirement: &id004 !ruby/object:Gem::Requirement
50
62
  requirements:
51
63
  - - ">="
52
64
  - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
53
67
  version: "0"
54
- version:
68
+ type: :runtime
69
+ version_requirements: *id004
55
70
  description: BigRecord is built from ActiveRecord, and intended to seamlessly integrate into your Ruby on Rails applications.
56
71
  email: bigrecord@openplaces.org
57
72
  executables: []
@@ -82,7 +97,6 @@ files:
82
97
  - init.rb
83
98
  - install.rb
84
99
  - lib/big_record.rb
85
- - lib/big_record/abstract_base.rb
86
100
  - lib/big_record/action_view_extensions.rb
87
101
  - lib/big_record/ar_associations.rb
88
102
  - lib/big_record/ar_associations/association_collection.rb
@@ -111,6 +125,7 @@ files:
111
125
  - lib/big_record/connection_adapters/abstract/database_statements.rb
112
126
  - lib/big_record/connection_adapters/abstract/quoting.rb
113
127
  - lib/big_record/connection_adapters/abstract_adapter.rb
128
+ - lib/big_record/connection_adapters/cassandra_adapter.rb
114
129
  - lib/big_record/connection_adapters/column.rb
115
130
  - lib/big_record/connection_adapters/hbase_adapter.rb
116
131
  - lib/big_record/connection_adapters/hbase_rest_adapter.rb
@@ -122,6 +137,7 @@ files:
122
137
  - lib/big_record/family_span_columns.rb
123
138
  - lib/big_record/fixtures.rb
124
139
  - lib/big_record/migration.rb
140
+ - lib/big_record/model.rb
125
141
  - lib/big_record/routing_ext.rb
126
142
  - lib/big_record/timestamp.rb
127
143
  - lib/big_record/validations.rb
@@ -158,6 +174,7 @@ files:
158
174
  - spec/unit/attributes_spec.rb
159
175
  - spec/unit/br_associations_spec.rb
160
176
  - spec/unit/columns_spec.rb
177
+ - spec/unit/deletion_spec.rb
161
178
  - spec/unit/embedded_spec.rb
162
179
  - spec/unit/find_spec.rb
163
180
  - spec/unit/hash_helper_spec.rb
@@ -166,10 +183,10 @@ files:
166
183
  - spec/unit/scanner_spec.rb
167
184
  - spec/unit/validations_spec.rb
168
185
  - tasks/bigrecord_tasks.rake
169
- - tasks/data_store.rake
170
- - tasks/gem.rake
171
- - tasks/rdoc.rake
172
- - tasks/spec.rake
186
+ - tasks/data_store.rb
187
+ - tasks/gem.rb
188
+ - tasks/rdoc.rb
189
+ - tasks/spec.rb
173
190
  - LICENSE
174
191
  - README.rdoc
175
192
  has_rdoc: true
@@ -185,20 +202,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
185
202
  requirements:
186
203
  - - ">="
187
204
  - !ruby/object:Gem::Version
205
+ segments:
206
+ - 0
188
207
  version: "0"
189
- version:
190
208
  required_rubygems_version: !ruby/object:Gem::Requirement
191
209
  requirements:
192
210
  - - ">="
193
211
  - !ruby/object:Gem::Version
212
+ segments:
213
+ - 0
194
214
  version: "0"
195
- version:
196
215
  requirements: []
197
216
 
198
217
  rubyforge_project:
199
- rubygems_version: 1.3.5
218
+ rubygems_version: 1.3.6
200
219
  signing_key:
201
220
  specification_version: 3
202
- summary: Object mapper for supporting column-oriented data stores (supports hbase) in Ruby on Rails.
221
+ summary: Object mapper for supporting column-oriented data stores (supports hbase, cassandra) in Ruby on Rails.
203
222
  test_files: []
204
223