cequel 1.0.4 → 1.1.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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +3 -0
  3. data/CHANGELOG.md +7 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/Gemfile +5 -4
  6. data/Gemfile.lock +215 -22
  7. data/README.md +19 -6
  8. data/Vagrantfile +6 -1
  9. data/lib/cequel.rb +3 -2
  10. data/lib/cequel/metal/batch.rb +16 -1
  11. data/lib/cequel/metal/data_set.rb +63 -39
  12. data/lib/cequel/metal/deleter.rb +2 -2
  13. data/lib/cequel/metal/incrementer.rb +2 -2
  14. data/lib/cequel/metal/inserter.rb +8 -6
  15. data/lib/cequel/metal/keyspace.rb +127 -34
  16. data/lib/cequel/metal/logger.rb +1 -1
  17. data/lib/cequel/metal/row.rb +3 -4
  18. data/lib/cequel/metal/updater.rb +2 -2
  19. data/lib/cequel/metal/writer.rb +18 -12
  20. data/lib/cequel/record/associations.rb +7 -1
  21. data/lib/cequel/record/bound.rb +1 -1
  22. data/lib/cequel/record/callbacks.rb +10 -6
  23. data/lib/cequel/record/data_set_builder.rb +13 -2
  24. data/lib/cequel/record/persistence.rb +14 -12
  25. data/lib/cequel/record/properties.rb +3 -3
  26. data/lib/cequel/record/railtie.rb +1 -1
  27. data/lib/cequel/record/record_set.rb +12 -12
  28. data/lib/cequel/record/schema.rb +5 -1
  29. data/lib/cequel/schema/keyspace.rb +1 -1
  30. data/lib/cequel/schema/table_property.rb +1 -1
  31. data/lib/cequel/type.rb +44 -10
  32. data/lib/cequel/uuids.rb +46 -0
  33. data/lib/cequel/version.rb +1 -1
  34. data/spec/examples/metal/data_set_spec.rb +93 -0
  35. data/spec/examples/metal/keyspace_spec.rb +74 -0
  36. data/spec/examples/record/associations_spec.rb +84 -0
  37. data/spec/examples/record/persistence_spec.rb +23 -0
  38. data/spec/examples/record/properties_spec.rb +1 -1
  39. data/spec/examples/record/record_set_spec.rb +12 -3
  40. data/spec/examples/record/schema_spec.rb +1 -1
  41. data/spec/examples/record/secondary_index_spec.rb +1 -1
  42. data/spec/examples/schema/table_reader_spec.rb +2 -3
  43. data/spec/examples/spec_helper.rb +8 -0
  44. data/spec/examples/type_spec.rb +7 -5
  45. data/spec/examples/uuids_spec.rb +22 -0
  46. data/spec/support/helpers.rb +25 -19
  47. data/templates/config/cequel.yml +5 -5
  48. metadata +40 -33
@@ -93,7 +93,7 @@ describe Cequel::Record::Schema do
93
93
  its(:data_columns) { should == [Cequel::Schema::Column.new(:data, :text)] }
94
94
  end
95
95
 
96
- context 'existing model' do
96
+ context 'existing model', thrift: true do
97
97
  before do
98
98
  legacy_connection.execute(<<-CQL2)
99
99
  CREATE COLUMNFAMILY legacy_posts (blog_subdomain text PRIMARY KEY)
@@ -9,7 +9,7 @@ describe Cequel::Record::SecondaryIndexes do
9
9
  column :author_id, :uuid, :index => true
10
10
  end
11
11
 
12
- let(:uuids) { Array.new(2) { CassandraCQL::UUID.new }}
12
+ let(:uuids) { Array.new(2) { Cequel.uuid }}
13
13
 
14
14
  let!(:posts) do
15
15
  3.times.map do |i|
@@ -352,7 +352,7 @@ describe Cequel::Schema::TableReader do
352
352
  [Cequel::Schema::DataColumn.new(:data, :text)] }
353
353
  end
354
354
 
355
- describe 'skinny-row legacy table' do
355
+ describe 'skinny-row legacy table', thrift: true do
356
356
  before do
357
357
  legacy_connection.execute <<-CQL
358
358
  CREATE TABLE posts (permalink text PRIMARY KEY, title text, body text)
@@ -369,7 +369,7 @@ describe Cequel::Schema::TableReader do
369
369
  Cequel::Schema::DataColumn.new(:body, :text)] }
370
370
  end
371
371
 
372
- describe 'wide-row legacy table' do
372
+ describe 'wide-row legacy table', thrift: true do
373
373
  before do
374
374
  legacy_connection.execute(<<-CQL2)
375
375
  CREATE COLUMNFAMILY posts (blog_subdomain text PRIMARY KEY)
@@ -386,5 +386,4 @@ describe Cequel::Schema::TableReader do
386
386
  its(:data_columns) { should ==
387
387
  [Cequel::Schema::DataColumn.new(:value, :text)] }
388
388
  end
389
-
390
389
  end
@@ -1,6 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  require File.expand_path('../../environment', __FILE__)
3
3
  require 'cequel'
4
+ require 'tzinfo'
4
5
 
5
6
  Dir.glob(File.expand_path('../../support/**/*.rb', __FILE__)).each do |file|
6
7
  require file
@@ -18,9 +19,16 @@ RSpec.configure do |config|
18
19
  satisfied_by?(Gem::Version.new(ActiveSupport::VERSION::STRING))
19
20
  }
20
21
 
22
+ unless defined? CassandraCQL
23
+ config.filter_run_excluding thrift: true
24
+ end
25
+
21
26
  config.before(:all) do
22
27
  cequel.schema.create!
23
28
  Cequel::Record.connection = cequel
29
+ Time.zone = 'UTC'
30
+ I18n.enforce_available_locales = false
31
+ SafeYAML::OPTIONS[:default_mode] = :safe if defined? SafeYAML
24
32
  end
25
33
 
26
34
  config.after(:all) do
@@ -178,12 +178,14 @@ describe Cequel::Type do
178
178
  should == 'org.apache.cassandra.db.marshal.UUIDType' }
179
179
 
180
180
  describe '#cast' do
181
- let(:uuid) { CassandraCQL::UUID.new }
181
+ let(:uuid) { Cequel.uuid }
182
182
  specify { subject.cast(uuid).should == uuid }
183
- specify { subject.cast(SimpleUUID::UUID.new(uuid)).
184
- should be_a(CassandraCQL::UUID) }
185
- specify { subject.cast(uuid.to_guid).should == uuid }
186
- specify { subject.cast(uuid.to_i).should == uuid }
183
+ specify { subject.cast(uuid.to_s).should == uuid }
184
+ specify { subject.cast(uuid.value).should == uuid }
185
+ if defined? SimpleUUID::UUID
186
+ specify { subject.cast(SimpleUUID::UUID.new(uuid.value))
187
+ .should == uuid }
188
+ end
187
189
  end
188
190
  end
189
191
 
@@ -0,0 +1,22 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require_relative 'spec_helper'
3
+
4
+ describe Cequel::Uuids do
5
+ describe '#uuid' do
6
+ specify { Cequel.uuid.is_a?(Cql::TimeUuid) }
7
+ specify { Cequel.uuid != Cequel.uuid }
8
+ specify { time = Time.now; Cequel.uuid(time).to_time == time }
9
+ specify { time = DateTime.now; Cequel.uuid(time).to_time == time.to_time }
10
+ specify { time = Time.zone.now; Cequel.uuid(time).to_time == time.to_time }
11
+ specify { val = Cequel.uuid.value; Cequel.uuid(val).value == val }
12
+ specify { str = Cequel.uuid.to_s; Cequel.uuid(str).to_s == str }
13
+ end
14
+
15
+ describe '#uuid?' do
16
+ specify { Cequel.uuid?(Cequel.uuid) }
17
+ specify { !Cequel.uuid?(Cequel.uuid.to_s) }
18
+ if defined? SimpleUUID::UUID
19
+ specify { !Cequel.uuid?(SimpleUUID::UUID.new) }
20
+ end
21
+ end
22
+ end
@@ -45,7 +45,7 @@ module Cequel
45
45
  end
46
46
 
47
47
  def uuid(name)
48
- let(name) { CassandraCQL::UUID.new }
48
+ let(name) { Cequel.uuid }
49
49
  end
50
50
  end
51
51
 
@@ -54,15 +54,22 @@ module Cequel
54
54
  def self.cequel
55
55
  @cequel ||= Cequel.connect(
56
56
  host: host,
57
- keyspace: keyspace_name,
58
- thrift: {retries: 5, cached_connections: true}
57
+ keyspace: keyspace_name
59
58
  ).tap do |cequel|
60
- cequel.logger = Logger.new(STDOUT) if ENV['CEQUEL_LOG_QUERIES']
59
+ if ENV['CEQUEL_LOG_QUERIES']
60
+ cequel.logger = Logger.new(STDOUT)
61
+ else
62
+ cequel.logger = Logger.new(File.open('/dev/null', 'a'))
63
+ end
61
64
  end
62
65
  end
63
66
 
64
67
  def self.host
65
- ENV['CEQUEL_TEST_HOST'] || '127.0.0.1:9160'
68
+ ENV['CEQUEL_TEST_HOST'] || '127.0.0.1:9042'
69
+ end
70
+
71
+ def self.legacy_host
72
+ ENV['CEQUEL_TEST_LEGACY_HOST'] || '127.0.0.1:9160'
66
73
  end
67
74
 
68
75
  def self.keyspace_name
@@ -70,29 +77,21 @@ module Cequel
70
77
  end
71
78
 
72
79
  def self.legacy_connection
80
+ require 'cassandra-cql'
73
81
  @legacy_connection ||= CassandraCQL::Database.new(
74
- Cequel::SpecSupport::Helpers.host,
75
- :keyspace => Cequel::SpecSupport::Helpers.keyspace_name,
82
+ legacy_host,
83
+ :keyspace => keyspace_name,
76
84
  :cql_version => '2.0.0'
77
85
  )
78
86
  end
79
87
 
80
88
  def min_uuid(time = Time.now)
81
- CassandraCQL::UUID.new(time, :randomize => false)
89
+ Cql::TimeUuid::Generator.new(0, 0).from_time(time, 0)
82
90
  end
83
91
 
84
92
  def max_uuid(time = Time.now)
85
- time = time.stamp * 10 + SimpleUUID::UUID::GREGORIAN_EPOCH_OFFSET
86
- # See http://github.com/spectra/ruby-uuid/
87
- byte_array = [
88
- time & 0xFFFF_FFFF,
89
- time >> 32,
90
- ((time >> 48) & 0x0FFF) | 0x1000,
91
- (2**13 - 1) | SimpleUUID::UUID::VARIANT,
92
- 2**16 - 1,
93
- 2**32 - 1
94
- ]
95
- CassandraCQL::UUID.new(byte_array.pack("NnnnnN"))
93
+ Cql::TimeUuid::Generator.new(0x3fff, 0xffffffffffff).
94
+ from_time(time, 999)
96
95
  end
97
96
 
98
97
  def cequel
@@ -110,6 +109,13 @@ module Cequel
110
109
  def disallow_queries!
111
110
  cequel.should_not_receive(:execute)
112
111
  end
112
+
113
+ def expect_query_with_consistency(matcher, consistency)
114
+ expect(cequel.client).to receive(:execute).with(matcher, consistency)
115
+ .and_call_original
116
+ yield
117
+ RSpec::Mocks.proxy_for(cequel.client).reset
118
+ end
113
119
  end
114
120
  end
115
121
  end
@@ -1,17 +1,17 @@
1
1
  <% app_name = Cequel::Record::Railtie.app_name -%>
2
2
  development:
3
- host: '127.0.0.1:9160'
3
+ host: '127.0.0.1:9042'
4
4
  keyspace: <%= app_name %>_development
5
5
 
6
6
  test:
7
- host: '127.0.0.1:9160'
7
+ host: '127.0.0.1:9042'
8
8
  keyspace: <%= app_name %>_test
9
9
 
10
10
  production:
11
11
  hosts:
12
- - 'cass1.<%= app_name %>.biz:9160'
13
- - 'cass2.<%= app_name %>.biz:9160'
14
- - 'cass3.<%= app_name %>.biz:9160'
12
+ - 'cass1.<%= app_name %>.biz:9042'
13
+ - 'cass2.<%= app_name %>.biz:9042'
14
+ - 'cass3.<%= app_name %>.biz:9042'
15
15
  keyspace: <%= app_name %>_production
16
16
  thrift:
17
17
  retries: 10
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mat Brown
@@ -11,13 +11,14 @@ authors:
11
11
  - Louis Simoneau
12
12
  - Peter Williams
13
13
  - Kenneth Hoffman
14
+ - Antti Tapio
14
15
  autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
- date: 2014-03-15 00:00:00.000000000 Z
18
+ date: 2014-03-16 00:00:00.000000000 Z
18
19
  dependencies:
19
20
  - !ruby/object:Gem::Dependency
20
- name: activesupport
21
+ name: activemodel
21
22
  requirement: !ruby/object:Gem::Requirement
22
23
  requirements:
23
24
  - - ">="
@@ -31,7 +32,7 @@ dependencies:
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3.1'
33
34
  - !ruby/object:Gem::Dependency
34
- name: activemodel
35
+ name: cql-rb
35
36
  requirement: !ruby/object:Gem::Requirement
36
37
  requirements:
37
38
  - - ">="
@@ -45,49 +46,49 @@ dependencies:
45
46
  - !ruby/object:Gem::Version
46
47
  version: '0'
47
48
  - !ruby/object:Gem::Dependency
48
- name: cassandra-cql
49
+ name: appraisal
49
50
  requirement: !ruby/object:Gem::Requirement
50
51
  requirements:
51
52
  - - "~>"
52
53
  - !ruby/object:Gem::Version
53
- version: '1.2'
54
- type: :runtime
54
+ version: '0.5'
55
+ type: :development
55
56
  prerelease: false
56
57
  version_requirements: !ruby/object:Gem::Requirement
57
58
  requirements:
58
59
  - - "~>"
59
60
  - !ruby/object:Gem::Version
60
- version: '1.2'
61
+ version: '0.5'
61
62
  - !ruby/object:Gem::Dependency
62
- name: connection_pool
63
+ name: rspec
63
64
  requirement: !ruby/object:Gem::Requirement
64
65
  requirements:
65
66
  - - "~>"
66
67
  - !ruby/object:Gem::Version
67
- version: '1.1'
68
- type: :runtime
68
+ version: '2.0'
69
+ type: :development
69
70
  prerelease: false
70
71
  version_requirements: !ruby/object:Gem::Requirement
71
72
  requirements:
72
73
  - - "~>"
73
74
  - !ruby/object:Gem::Version
74
- version: '1.1'
75
+ version: '2.0'
75
76
  - !ruby/object:Gem::Dependency
76
- name: i18n
77
+ name: yard
77
78
  requirement: !ruby/object:Gem::Requirement
78
79
  requirements:
79
- - - ">="
80
+ - - "~>"
80
81
  - !ruby/object:Gem::Version
81
- version: '0'
82
- type: :runtime
82
+ version: '0.6'
83
+ type: :development
83
84
  prerelease: false
84
85
  version_requirements: !ruby/object:Gem::Requirement
85
86
  requirements:
86
- - - ">="
87
+ - - "~>"
87
88
  - !ruby/object:Gem::Version
88
- version: '0'
89
+ version: '0.6'
89
90
  - !ruby/object:Gem::Dependency
90
- name: appraisal
91
+ name: rake
91
92
  requirement: !ruby/object:Gem::Requirement
92
93
  requirements:
93
94
  - - ">="
@@ -101,35 +102,35 @@ dependencies:
101
102
  - !ruby/object:Gem::Version
102
103
  version: '0'
103
104
  - !ruby/object:Gem::Dependency
104
- name: rspec
105
+ name: rubocop
105
106
  requirement: !ruby/object:Gem::Requirement
106
107
  requirements:
107
- - - "~>"
108
+ - - ">="
108
109
  - !ruby/object:Gem::Version
109
- version: '2.0'
110
+ version: '0'
110
111
  type: :development
111
112
  prerelease: false
112
113
  version_requirements: !ruby/object:Gem::Requirement
113
114
  requirements:
114
- - - "~>"
115
+ - - ">="
115
116
  - !ruby/object:Gem::Version
116
- version: '2.0'
117
+ version: '0'
117
118
  - !ruby/object:Gem::Dependency
118
- name: yard
119
+ name: travis
119
120
  requirement: !ruby/object:Gem::Requirement
120
121
  requirements:
121
- - - "~>"
122
+ - - ">="
122
123
  - !ruby/object:Gem::Version
123
- version: '0.6'
124
+ version: '0'
124
125
  type: :development
125
126
  prerelease: false
126
127
  version_requirements: !ruby/object:Gem::Requirement
127
128
  requirements:
128
- - - "~>"
129
+ - - ">="
129
130
  - !ruby/object:Gem::Version
130
- version: '0.6'
131
+ version: '0'
131
132
  - !ruby/object:Gem::Dependency
132
- name: rake
133
+ name: travis-lint
133
134
  requirement: !ruby/object:Gem::Requirement
134
135
  requirements:
135
136
  - - ">="
@@ -143,7 +144,7 @@ dependencies:
143
144
  - !ruby/object:Gem::Version
144
145
  version: '0'
145
146
  - !ruby/object:Gem::Dependency
146
- name: rubocop
147
+ name: tzinfo
147
148
  requirement: !ruby/object:Gem::Requirement
148
149
  requirements:
149
150
  - - ">="
@@ -164,7 +165,8 @@ description: |
164
165
  email: mat.a.brown@gmail.com
165
166
  executables: []
166
167
  extensions: []
167
- extra_rdoc_files: []
168
+ extra_rdoc_files:
169
+ - README.md
168
170
  files:
169
171
  - Appraisals
170
172
  - CHANGELOG.md
@@ -234,9 +236,11 @@ files:
234
236
  - lib/cequel/schema/update_table_dsl.rb
235
237
  - lib/cequel/type.rb
236
238
  - lib/cequel/util.rb
239
+ - lib/cequel/uuids.rb
237
240
  - lib/cequel/version.rb
238
241
  - spec/environment.rb
239
242
  - spec/examples/metal/data_set_spec.rb
243
+ - spec/examples/metal/keyspace_spec.rb
240
244
  - spec/examples/record/associations_spec.rb
241
245
  - spec/examples/record/callbacks_spec.rb
242
246
  - spec/examples/record/dirty_spec.rb
@@ -260,6 +264,7 @@ files:
260
264
  - spec/examples/schema/table_writer_spec.rb
261
265
  - spec/examples/spec_helper.rb
262
266
  - spec/examples/type_spec.rb
267
+ - spec/examples/uuids_spec.rb
263
268
  - spec/shared/readable_dictionary.rb
264
269
  - spec/support/helpers.rb
265
270
  - spec/support/result_stub.rb
@@ -292,6 +297,7 @@ specification_version: 4
292
297
  summary: Full-featured, ActiveModel-compliant ORM for Cassandra using CQL3
293
298
  test_files:
294
299
  - spec/examples/metal/data_set_spec.rb
300
+ - spec/examples/metal/keyspace_spec.rb
295
301
  - spec/examples/record/associations_spec.rb
296
302
  - spec/examples/record/callbacks_spec.rb
297
303
  - spec/examples/record/dirty_spec.rb
@@ -315,4 +321,5 @@ test_files:
315
321
  - spec/examples/schema/table_writer_spec.rb
316
322
  - spec/examples/spec_helper.rb
317
323
  - spec/examples/type_spec.rb
318
- has_rdoc: false
324
+ - spec/examples/uuids_spec.rb
325
+ has_rdoc: true