cequel 1.10.0 → 2.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile +1 -0
  4. data/Gemfile.lock +93 -65
  5. data/README.md +26 -5
  6. data/Vagrantfile +2 -2
  7. data/lib/cequel/errors.rb +2 -0
  8. data/lib/cequel/instrumentation.rb +5 -4
  9. data/lib/cequel/metal/batch.rb +21 -18
  10. data/lib/cequel/metal/data_set.rb +17 -28
  11. data/lib/cequel/metal/inserter.rb +3 -2
  12. data/lib/cequel/metal/keyspace.rb +56 -33
  13. data/lib/cequel/metal/request_logger.rb +22 -8
  14. data/lib/cequel/metal/row_specification.rb +9 -8
  15. data/lib/cequel/metal/statement.rb +23 -7
  16. data/lib/cequel/metal/updater.rb +12 -10
  17. data/lib/cequel/metal/writer.rb +5 -13
  18. data/lib/cequel/record/association_collection.rb +6 -33
  19. data/lib/cequel/record/collection.rb +2 -1
  20. data/lib/cequel/record/errors.rb +6 -0
  21. data/lib/cequel/record/persistence.rb +2 -2
  22. data/lib/cequel/record/record_set.rb +3 -4
  23. data/lib/cequel/record/validations.rb +5 -5
  24. data/lib/cequel/schema/table.rb +3 -5
  25. data/lib/cequel/schema/table_reader.rb +73 -111
  26. data/lib/cequel/schema/table_updater.rb +9 -15
  27. data/lib/cequel/version.rb +1 -1
  28. data/spec/examples/metal/data_set_spec.rb +34 -46
  29. data/spec/examples/metal/keyspace_spec.rb +8 -6
  30. data/spec/examples/record/associations_spec.rb +8 -18
  31. data/spec/examples/record/persistence_spec.rb +6 -6
  32. data/spec/examples/record/record_set_spec.rb +39 -12
  33. data/spec/examples/record/timestamps_spec.rb +12 -5
  34. data/spec/examples/schema/keyspace_spec.rb +13 -37
  35. data/spec/examples/schema/table_reader_spec.rb +4 -1
  36. data/spec/examples/schema/table_updater_spec.rb +22 -7
  37. data/spec/examples/schema/table_writer_spec.rb +2 -3
  38. data/spec/examples/spec_helper.rb +1 -0
  39. data/spec/examples/spec_support/preparation_spec.rb +14 -7
  40. metadata +7 -8
@@ -28,10 +28,14 @@ describe Cequel::Record::Timestamps do
28
28
  end
29
29
 
30
30
  it 'should update updated_at after record update but not created_at' do
31
- future = Timecop.freeze(now + 2.minutes)
31
+ before = now
32
+ sleep 1
33
+ after = Time.now
34
+
32
35
  blog.name = 'name'
33
36
  blog.save!
34
- expect(blog.updated_at).to be_within(one_millisecond).of(future)
37
+ expect(blog.created_at).to be_within(one_millisecond).of(before)
38
+ expect(blog.updated_at).to be_within(one_millisecond).of(after)
35
39
  end
36
40
 
37
41
  it 'should cast the timestamp in the same way that Cassandra records it' do
@@ -55,11 +59,14 @@ describe Cequel::Record::Timestamps do
55
59
  end
56
60
 
57
61
  it 'should update updated_at after record update but not created_at' do
58
- future = Timecop.freeze(now + 2.minutes)
62
+ before = now
63
+ sleep 1
64
+ after = Time.now
65
+
59
66
  post.name = 'name'
60
67
  post.save!
61
- expect(post.created_at).to be_within(one_millisecond).of(now)
62
- expect(post.updated_at).to be_within(one_millisecond).of(future)
68
+ expect(post.created_at).to be_within(one_millisecond).of(before)
69
+ expect(post.updated_at).to be_within(one_millisecond).of(after)
63
70
  end
64
71
  end
65
72
  end
@@ -29,7 +29,7 @@ describe Cequel::Schema::Keyspace do
29
29
  end
30
30
 
31
31
  let(:schema_config) do
32
- connection.client.execute("SELECT * FROM system.schema_keyspaces WHERE keyspace_name = '#{keyspace_name}'").first
32
+ connection.send(:cluster).tap{|x| x.refresh_schema}.keyspace(keyspace_name)
33
33
  end
34
34
 
35
35
  context 'with default options' do
@@ -37,12 +37,8 @@ describe Cequel::Schema::Keyspace do
37
37
 
38
38
  it 'uses default keyspace configuration' do
39
39
  keyspace.create!
40
- expect(schema_config).to eq({
41
- "keyspace_name"=>keyspace_name,
42
- "durable_writes"=>true,
43
- "strategy_class"=>"org.apache.cassandra.locator.SimpleStrategy",
44
- "strategy_options"=>"{\"replication_factor\":\"1\"}"
45
- })
40
+ expect(schema_config.name).to eq keyspace_name
41
+ expect(schema_config.durable_writes?).to eq true
46
42
  end
47
43
  end
48
44
 
@@ -51,12 +47,8 @@ describe Cequel::Schema::Keyspace do
51
47
 
52
48
  it 'uses specified options' do
53
49
  keyspace.create! replication: { class: "SimpleStrategy", replication_factor: 2 }
54
- expect(schema_config).to eq({
55
- "keyspace_name"=>keyspace_name,
56
- "durable_writes"=>true,
57
- "strategy_class"=>"org.apache.cassandra.locator.SimpleStrategy",
58
- "strategy_options"=>"{\"replication_factor\":\"2\"}"
59
- })
50
+ expect(schema_config.name).to eq keyspace_name
51
+ expect(schema_config.durable_writes?).to eq true
60
52
  end
61
53
  end
62
54
 
@@ -65,12 +57,8 @@ describe Cequel::Schema::Keyspace do
65
57
 
66
58
  it 'accepts class and replication_factor options' do
67
59
  keyspace.create! class: "SimpleStrategy", replication_factor: 2
68
- expect(schema_config).to eq({
69
- "keyspace_name"=>keyspace_name,
70
- "durable_writes"=>true,
71
- "strategy_class"=>"org.apache.cassandra.locator.SimpleStrategy",
72
- "strategy_options"=>"{\"replication_factor\":\"2\"}"
73
- })
60
+ expect(schema_config.name).to eq keyspace_name
61
+ expect(schema_config.durable_writes?).to eq true
74
62
  end
75
63
 
76
64
  it "raises an error if a class other than SimpleStrategy is given" do
@@ -87,12 +75,8 @@ describe Cequel::Schema::Keyspace do
87
75
 
88
76
  it 'uses default keyspace configuration' do
89
77
  keyspace.create!
90
- expect(schema_config).to eq({
91
- "keyspace_name"=>keyspace_name,
92
- "durable_writes"=>true,
93
- "strategy_class"=>"org.apache.cassandra.locator.SimpleStrategy",
94
- "strategy_options"=>"{\"replication_factor\":\"3\"}"
95
- })
78
+ expect(schema_config.name).to eq keyspace_name
79
+ expect(schema_config.durable_writes?).to eq true
96
80
  end
97
81
  end
98
82
 
@@ -103,12 +87,8 @@ describe Cequel::Schema::Keyspace do
103
87
 
104
88
  it 'uses default keyspace configuration' do
105
89
  keyspace.create!
106
- expect(schema_config).to eq({
107
- "keyspace_name"=>keyspace_name,
108
- "durable_writes"=>true,
109
- "strategy_class"=>"org.apache.cassandra.locator.NetworkTopologyStrategy",
110
- "strategy_options"=>"{\"datacenter1\":\"3\",\"datacenter2\":\"2\"}"
111
- })
90
+ expect(schema_config.name).to eq keyspace_name
91
+ expect(schema_config.durable_writes?).to eq true
112
92
  end
113
93
  end
114
94
 
@@ -119,12 +99,8 @@ describe Cequel::Schema::Keyspace do
119
99
 
120
100
  it 'uses default keyspace configuration' do
121
101
  keyspace.create!
122
- expect(schema_config).to eq({
123
- "keyspace_name"=>keyspace_name,
124
- "durable_writes"=>false,
125
- "strategy_class"=>"org.apache.cassandra.locator.SimpleStrategy",
126
- "strategy_options"=>"{\"replication_factor\":\"1\"}"
127
- })
102
+ expect(schema_config.name).to eq keyspace_name
103
+ expect(schema_config.durable_writes?).to eq false
128
104
  end
129
105
  end
130
106
  end # describe 'creating keyspace'
@@ -13,6 +13,7 @@ describe Cequel::Schema::TableReader do
13
13
  describe 'reading simple key' do
14
14
  before do
15
15
  cequel.execute("CREATE TABLE #{table_name} (permalink text PRIMARY KEY)")
16
+ cequel.send(:cluster).refresh_schema
16
17
  end
17
18
 
18
19
  it 'should read name correctly' do
@@ -295,8 +296,10 @@ describe Cequel::Schema::TableReader do
295
296
  end
296
297
 
297
298
  it 'should read and simplify compression class' do
298
- expect(table.property(:compression)[:sstable_compression]).
299
+ expect(table.property(:compression)[:sstable_compression] ||
300
+ table.property(:compression)[:class]).
299
301
  to eq('DeflateCompressor')
302
+
300
303
  end
301
304
 
302
305
  it 'should read integer properties from compression class' do
@@ -121,16 +121,31 @@ describe Cequel::Schema::TableUpdater do
121
121
  end
122
122
 
123
123
  describe '#drop_index' do
124
- before do
125
- tab_name = table_name
126
- cequel.schema.alter_table(table_name) do
127
- create_index :title
128
- drop_index :"#{tab_name}_title_idx"
124
+ context 'index exists' do
125
+ before do
126
+ tab_name = table_name
127
+ cequel.schema.alter_table(table_name) do
128
+ create_index :title
129
+ drop_index :"#{tab_name}_title_idx"
130
+ end
131
+ end
132
+
133
+ it 'should drop the index' do
134
+ expect(table.data_column(:title)).not_to be_indexed
129
135
  end
130
136
  end
131
137
 
132
- it 'should drop the index' do
133
- expect(table.data_column(:title)).not_to be_indexed
138
+ context 'index does not exist' do
139
+ before do
140
+ tab_name = table_name
141
+ cequel.schema.alter_table(table_name) do
142
+ drop_index :"#{tab_name}_title_idx"
143
+ end
144
+ end
145
+
146
+ it 'should nop on non existent index' do
147
+ expect(table.data_column(:title)).not_to be_indexed
148
+ end
134
149
  end
135
150
  end
136
151
 
@@ -167,10 +167,9 @@ describe Cequel::Schema::TableWriter do
167
167
  end
168
168
 
169
169
  it 'should set map collection properties' do
170
- expect(table.property(:compression)).to eq({
171
- :sstable_compression => 'DeflateCompressor',
170
+ expect(table.property(:compression)).to include(
172
171
  :chunk_length_kb => 64
173
- })
172
+ )
174
173
  end
175
174
  end
176
175
 
@@ -2,6 +2,7 @@
2
2
  require File.expand_path('../../environment', __FILE__)
3
3
  require 'cequel'
4
4
  require 'tzinfo'
5
+ require 'pp'
5
6
 
6
7
  Dir.glob(File.expand_path('../../support/**/*.rb', __FILE__)).each do |file|
7
8
  require file
@@ -63,11 +63,12 @@ describe Cequel::SpecSupport::Preparation do
63
63
 
64
64
  it "allows keyspace can be created" do
65
65
  prep.create_keyspace
66
+ keyspace.cluster.refresh_schema
66
67
  expect(keyspace).to exist
67
68
  end
68
69
 
69
70
  it "causes #sync_schema to fail" do
70
- expect{ prep.sync_schema }.to raise_error(Cassandra::Errors::InvalidError)
71
+ expect{ prep.sync_schema }.to raise_error(Cequel::NoSuchKeyspaceError)
71
72
  end
72
73
  end
73
74
 
@@ -84,12 +85,18 @@ describe Cequel::SpecSupport::Preparation do
84
85
 
85
86
  matcher :contain_table do |table_name|
86
87
  match do |keyspace|
87
- keyspace.execute(<<-CQL).any?
88
- SELECT columnfamily_name
89
- FROM System.schema_columnfamilies
90
- WHERE keyspace_name='#{keyspace.name}'
91
- AND columnfamily_name='#{table_name}'
92
- CQL
88
+ keyspace.cluster.refresh_schema
89
+ ks = keyspace.cluster.keyspace(keyspace.name)
90
+
91
+ ks && ks.has_table?(table_name)
92
+ end
93
+
94
+ failure_message do |keyspace|
95
+ if keyspace.cluster.has_keyspace?(keyspace.name)
96
+ "no such keyspace #{keyspace.name}"
97
+ else
98
+ "no such table #{keyspace.name}.#{table_name}"
99
+ end
93
100
  end
94
101
  end
95
102
  end
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.10.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mat Brown
@@ -29,20 +29,20 @@ authors:
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2016-06-28 00:00:00.000000000 Z
32
+ date: 2016-10-02 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: activemodel
36
36
  requirement: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.0'
41
41
  type: :runtime
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '4.0'
48
48
  - !ruby/object:Gem::Dependency
@@ -51,14 +51,14 @@ dependencies:
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
54
+ version: '3.0'
55
55
  type: :runtime
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.0'
61
+ version: '3.0'
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: appraisal
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -326,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
326
326
  requirements:
327
327
  - Cassandra >= 2.0.0
328
328
  rubyforge_project:
329
- rubygems_version: 2.2.5
329
+ rubygems_version: 2.5.1
330
330
  signing_key:
331
331
  specification_version: 4
332
332
  summary: Full-featured, ActiveModel-compliant ORM for Cassandra using CQL3
@@ -361,4 +361,3 @@ test_files:
361
361
  - spec/examples/spec_support/preparation_spec.rb
362
362
  - spec/examples/type_spec.rb
363
363
  - spec/examples/uuids_spec.rb
364
- has_rdoc: true