cassandra_migrations 0.0.5 → 0.0.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 +15 -0
- data/lib/cassandra_migrations/cassandra/queries.rb +1 -1
- data/lib/cassandra_migrations/migration/table_definition.rb +6 -0
- metadata +78 -44
- data/spec/cassandra_migrations/cassandra/queries_spec.rb +0 -252
- data/spec/cassandra_migrations/cassandra_spec.rb +0 -92
- data/spec/cassandra_migrations/config_spec.rb +0 -48
- data/spec/cassandra_migrations_spec.rb +0 -168
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZTkyY2FiYmVjMzk2NGFlYzczZjJkYjE4MDE2MDc4NTM4ZmE5MzBlYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
Y2UxMzZlYWI3YjcwYzJjYTkyYjQ1ZmJkODg5YzBhYTRlOWRkYzVmZg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmU2YmZhMmVhYmM3ZjU3MzBmOWMxNjRhYmI0ZjBhNTU0NTUxNjJlZmExN2U5
|
10
|
+
MGM5ZTk5ZWU0ZGIwY2FiZTFiZGQ2NTZjYzNiMzlmNmY2YWIwZjc4OWM3OWNl
|
11
|
+
MWEyMWNlN2IxOWY0ZDJmZjkxYTk0ZGMxNDAxNjg3MTk3NTdlZDk=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OGI5YmNkZTE5ZjJjZjIxMzk2ZjJkZDBkMTY5ZDgzYzc1YWRlMGUzZGM5NzUw
|
14
|
+
ZTYyNmUzZDY2NWU5NGVmOTQwOGZkOTBmYmY0YjlmNjQyY2M1OGRmOWNhYmM5
|
15
|
+
YWFiMmU1MzhiOTFkYTkxMDNlOGVjZGVkNzQ1ZjcyNmMyYTEzZDU=
|
@@ -106,7 +106,7 @@ module CassandraMigrations
|
|
106
106
|
"'#{value}'"
|
107
107
|
elsif value.is_a?(Array)
|
108
108
|
type = get_column_type(table, column)
|
109
|
-
values = %[#{value.map {|v|
|
109
|
+
values = %[#{value.map { |v| to_cql_value(nil, v, nil) } * ', '}]
|
110
110
|
|
111
111
|
if type && type == :list
|
112
112
|
%[#{operation}[#{values}]]
|
@@ -67,6 +67,12 @@ module CassandraMigrations
|
|
67
67
|
define_primary_keys(column_name) if options[:primary_key]
|
68
68
|
end
|
69
69
|
|
70
|
+
def double(column_name, options={})
|
71
|
+
options[:limit] = 8
|
72
|
+
@columns_name_type_hash[column_name.to_sym] = column_type_for(:float, options)
|
73
|
+
define_primary_keys(column_name) if options[:primary_key]
|
74
|
+
end
|
75
|
+
|
70
76
|
def string(column_name, options={})
|
71
77
|
@columns_name_type_hash[column_name.to_sym] = column_type_for(:string, options)
|
72
78
|
define_primary_keys(column_name) if options[:primary_key]
|
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cassandra_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Henrique Gubert
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-27 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: cql-rb
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.
|
19
|
+
version: 1.1.2
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - '='
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.
|
26
|
+
version: 1.1.2
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,23 +41,20 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rails
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '3.2'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '3.2'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: colorize
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ~>
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ~>
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rspec
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: debugger
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ! '>='
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,71 +90,117 @@ dependencies:
|
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ! '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: coveralls
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
149
|
requirements:
|
107
150
|
- - ! '>='
|
108
151
|
- !ruby/object:Gem::Version
|
109
152
|
version: '0'
|
110
153
|
description: A gem to manage Cassandra database schema for Rails. This gem offers
|
111
|
-
migrations and environment
|
154
|
+
migrations and environment sific databases out-of-the-box for Rails users.
|
112
155
|
email: guberthenrique@hotmail.com
|
113
156
|
executables:
|
114
157
|
- prepare_for_cassandra
|
115
158
|
extensions: []
|
116
159
|
extra_rdoc_files: []
|
117
160
|
files:
|
118
|
-
- lib/cassandra_migrations.rb
|
119
|
-
- lib/cassandra_migrations/capistrano.rb
|
120
|
-
- lib/cassandra_migrations/migration.rb
|
121
|
-
- lib/cassandra_migrations/migrator.rb
|
122
|
-
- lib/cassandra_migrations/cassandra.rb
|
123
|
-
- lib/cassandra_migrations/railtie.rb
|
124
161
|
- lib/cassandra_migrations/cassandra/keyspace_operations.rb
|
125
|
-
- lib/cassandra_migrations/cassandra/query_result.rb
|
126
162
|
- lib/cassandra_migrations/cassandra/queries.rb
|
127
|
-
- lib/cassandra_migrations/
|
163
|
+
- lib/cassandra_migrations/cassandra/query_result.rb
|
128
164
|
- lib/cassandra_migrations/migration/table_operations.rb
|
129
|
-
- lib/cassandra_migrations/migration/column_operations.rb
|
130
165
|
- lib/cassandra_migrations/migration/table_definition.rb
|
131
|
-
- lib/cassandra_migrations/
|
166
|
+
- lib/cassandra_migrations/migration/column_operations.rb
|
167
|
+
- lib/cassandra_migrations/migration.rb
|
168
|
+
- lib/cassandra_migrations/errors.rb
|
169
|
+
- lib/cassandra_migrations/railtie.rb
|
170
|
+
- lib/cassandra_migrations/config.rb
|
171
|
+
- lib/cassandra_migrations/migrator.rb
|
172
|
+
- lib/cassandra_migrations/cassandra.rb
|
132
173
|
- lib/cassandra_migrations/railtie/generators/cassandra_migration/cassandra_migration_generator.rb
|
133
174
|
- lib/cassandra_migrations/railtie/generators/cassandra_migration/templates/empty_migration.rb.erb
|
134
175
|
- lib/cassandra_migrations/railtie/generators/cassandra_migration/USAGE
|
135
176
|
- lib/cassandra_migrations/railtie/tasks.rake
|
136
|
-
- lib/cassandra_migrations/
|
177
|
+
- lib/cassandra_migrations/railtie/initializer.rb
|
178
|
+
- lib/cassandra_migrations/capistrano.rb
|
179
|
+
- lib/cassandra_migrations.rb
|
137
180
|
- template/cassandra.yml
|
138
|
-
- spec/cassandra_migrations_spec.rb
|
139
|
-
- spec/cassandra_migrations/config_spec.rb
|
140
|
-
- spec/cassandra_migrations/cassandra/queries_spec.rb
|
141
|
-
- spec/cassandra_migrations/cassandra_spec.rb
|
142
181
|
- bin/prepare_for_cassandra
|
143
182
|
homepage: https://github.com/hsgubert/cassandra_migrations
|
144
183
|
licenses:
|
145
184
|
- MIT
|
185
|
+
metadata: {}
|
146
186
|
post_install_message:
|
147
187
|
rdoc_options: []
|
148
188
|
require_paths:
|
149
189
|
- lib
|
150
190
|
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
191
|
requirements:
|
153
192
|
- - ! '>='
|
154
193
|
- !ruby/object:Gem::Version
|
155
194
|
version: '0'
|
156
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
-
none: false
|
158
196
|
requirements:
|
159
197
|
- - ! '>='
|
160
198
|
- !ruby/object:Gem::Version
|
161
199
|
version: 1.8.0
|
162
200
|
requirements: []
|
163
201
|
rubyforge_project:
|
164
|
-
rubygems_version:
|
202
|
+
rubygems_version: 2.0.7
|
165
203
|
signing_key:
|
166
|
-
specification_version:
|
204
|
+
specification_version: 4
|
167
205
|
summary: Cassandra schema management for a multi-environment developer.
|
168
|
-
test_files:
|
169
|
-
- spec/cassandra_migrations_spec.rb
|
170
|
-
- spec/cassandra_migrations/config_spec.rb
|
171
|
-
- spec/cassandra_migrations/cassandra/queries_spec.rb
|
172
|
-
- spec/cassandra_migrations/cassandra_spec.rb
|
206
|
+
test_files: []
|
@@ -1,252 +0,0 @@
|
|
1
|
-
# encoding : utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe CassandraMigrations::Cassandra::Queries do
|
5
|
-
|
6
|
-
class TestQueryExecutor
|
7
|
-
extend CassandraMigrations::Cassandra::Queries
|
8
|
-
|
9
|
-
def self.column_type=(column_type)
|
10
|
-
@column_type = column_type
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def self.get_column_type(table, column)
|
16
|
-
@column_type
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '.write!' do
|
21
|
-
it 'should insert a record into the specified table' do
|
22
|
-
TestQueryExecutor.should_receive(:execute).with(
|
23
|
-
"INSERT INTO people (name, age, height_in_meters, birth_time) VALUES ('John', 24, 1.83, '1989-05-27 08:50:25+0000')"
|
24
|
-
)
|
25
|
-
|
26
|
-
TestQueryExecutor.write!('people',
|
27
|
-
:name => 'John',
|
28
|
-
:age => 24,
|
29
|
-
:height_in_meters => 1.83,
|
30
|
-
:birth_time => Time.new(1989, 05, 27, 8, 50, 25, 0)
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should set record TTL' do
|
35
|
-
TestQueryExecutor.should_receive(:execute).with(
|
36
|
-
"INSERT INTO people (name) VALUES ('John') USING TTL 3600"
|
37
|
-
)
|
38
|
-
|
39
|
-
TestQueryExecutor.write!('people', {:name => 'John'}, :ttl => 3600)
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'when dealing with collections' do
|
43
|
-
|
44
|
-
it 'should handle setting a set collection column value' do
|
45
|
-
TestQueryExecutor.column_type = :set
|
46
|
-
|
47
|
-
TestQueryExecutor.should_receive(:execute).with(
|
48
|
-
"INSERT INTO people (friends) VALUES ({'John', 'Ringo', 'Paul', 'George'})"
|
49
|
-
)
|
50
|
-
|
51
|
-
TestQueryExecutor.write!('people', {friends: ['John', 'Ringo', 'Paul', 'George']})
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should handle setting a list collection column value' do
|
55
|
-
TestQueryExecutor.column_type = :list
|
56
|
-
|
57
|
-
TestQueryExecutor.should_receive(:execute).with(
|
58
|
-
"INSERT INTO people (friends) VALUES (['John', 'Ringo', 'Paul', 'George'])"
|
59
|
-
)
|
60
|
-
|
61
|
-
TestQueryExecutor.write!('people', {friends: ['John', 'Ringo', 'Paul', 'George']})
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'should handle setting a map collection column value' do
|
65
|
-
TestQueryExecutor.column_type = :map
|
66
|
-
|
67
|
-
TestQueryExecutor.should_receive(:execute).with(
|
68
|
-
"INSERT INTO people (friends) VALUES ({ 'talent': 'John', 'drums': 'Ringo', 'voice': 'Paul', 'rhythm': 'George' })"
|
69
|
-
)
|
70
|
-
|
71
|
-
TestQueryExecutor.write!('people', {friends: {talent: 'John', drums: 'Ringo', voice: 'Paul', rhythm: 'George'}})
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe '.update!' do
|
77
|
-
it 'should update some record values' do
|
78
|
-
TestQueryExecutor.should_receive(:execute).with(
|
79
|
-
"UPDATE people SET height_in_meters = 1.93, birth_time = '1989-05-28 08:50:25+0000' WHERE name = 'John'"
|
80
|
-
)
|
81
|
-
|
82
|
-
TestQueryExecutor.update!('people', "name = 'John'",
|
83
|
-
:height_in_meters => 1.93,
|
84
|
-
:birth_time => Time.new(1989, 05, 28, 8, 50, 25, 0)
|
85
|
-
)
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should set record TTL' do
|
89
|
-
TestQueryExecutor.should_receive(:execute).with(
|
90
|
-
"UPDATE people USING TTL 3600 SET name = 'Johnny' WHERE name = 'John'"
|
91
|
-
)
|
92
|
-
|
93
|
-
TestQueryExecutor.update!('people', "name = 'John'", {:name => 'Johnny'}, :ttl => 3600)
|
94
|
-
end
|
95
|
-
|
96
|
-
context 'when dealing with collections' do
|
97
|
-
|
98
|
-
it 'should handle setting a set collection column' do
|
99
|
-
TestQueryExecutor.column_type = :set
|
100
|
-
|
101
|
-
TestQueryExecutor.should_receive(:execute).with(
|
102
|
-
"UPDATE people SET friends = {'John', 'Ringo', 'Paul', 'George'} WHERE name = 'Stuart'"
|
103
|
-
)
|
104
|
-
|
105
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'", {friends: ['John', 'Ringo', 'Paul', 'George']})
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'should handle adding elements to a set collection column' do
|
109
|
-
TestQueryExecutor.column_type = :set
|
110
|
-
|
111
|
-
TestQueryExecutor.should_receive(:execute).with(
|
112
|
-
"UPDATE people SET friends = friends + {'John', 'Ringo', 'Paul', 'George'} WHERE name = 'Stuart'"
|
113
|
-
)
|
114
|
-
|
115
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'",
|
116
|
-
{friends: ['John', 'Ringo', 'Paul', 'George']},
|
117
|
-
{operations: {friends: :+}})
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'should handle removing elements from a set collection column' do
|
121
|
-
TestQueryExecutor.column_type = :set
|
122
|
-
|
123
|
-
TestQueryExecutor.should_receive(:execute).with(
|
124
|
-
"UPDATE people SET friends = friends - {'John', 'Ringo', 'Paul', 'George'} WHERE name = 'Stuart'"
|
125
|
-
)
|
126
|
-
|
127
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'",
|
128
|
-
{friends: ['John', 'Ringo', 'Paul', 'George']},
|
129
|
-
{operations: {friends: :-}})
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'should handle setting a list collection column' do
|
133
|
-
TestQueryExecutor.column_type = :list
|
134
|
-
|
135
|
-
TestQueryExecutor.should_receive(:execute).with(
|
136
|
-
"UPDATE people SET friends = ['John', 'Ringo', 'Paul', 'George'] WHERE name = 'Stuart'"
|
137
|
-
)
|
138
|
-
|
139
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'", {friends: ['John', 'Ringo', 'Paul', 'George']})
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'should handle adding elements to a list collection column' do
|
143
|
-
TestQueryExecutor.column_type = :list
|
144
|
-
|
145
|
-
TestQueryExecutor.should_receive(:execute).with(
|
146
|
-
"UPDATE people SET friends = friends + ['John', 'Ringo', 'Paul', 'George'] WHERE name = 'Stuart'"
|
147
|
-
)
|
148
|
-
|
149
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'",
|
150
|
-
{friends: ['John', 'Ringo', 'Paul', 'George']},
|
151
|
-
{operations: {friends: :+}})
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'should handle removing elements from a list collection column' do
|
155
|
-
TestQueryExecutor.column_type = :list
|
156
|
-
|
157
|
-
TestQueryExecutor.should_receive(:execute).with(
|
158
|
-
"UPDATE people SET friends = friends - ['John', 'Ringo', 'Paul', 'George'] WHERE name = 'Stuart'"
|
159
|
-
)
|
160
|
-
|
161
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'",
|
162
|
-
{friends: ['John', 'Ringo', 'Paul', 'George']},
|
163
|
-
{operations: {friends: :-}})
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'should handle setting a map collection column' do
|
167
|
-
TestQueryExecutor.column_type = :map
|
168
|
-
|
169
|
-
TestQueryExecutor.should_receive(:execute).with(
|
170
|
-
"UPDATE people SET friends = { 'talent': 'John', 'drums': 'Ringo', 'voice': 'Paul', 'rhythm': 'George' } WHERE name = 'Stuart'"
|
171
|
-
)
|
172
|
-
|
173
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'", {friends: {talent: 'John', drums: 'Ringo', voice: 'Paul', rhythm: 'George'}})
|
174
|
-
end
|
175
|
-
|
176
|
-
it 'should handle adding elements to a map collection column' do
|
177
|
-
TestQueryExecutor.column_type = :map
|
178
|
-
|
179
|
-
TestQueryExecutor.should_receive(:execute).with(
|
180
|
-
"UPDATE people SET friends = friends + { 'talent': 'John', 'drums': 'Ringo', 'voice': 'Paul', 'rhythm': 'George' } WHERE name = 'Stuart'"
|
181
|
-
)
|
182
|
-
|
183
|
-
TestQueryExecutor.update!('people', "name = 'Stuart'",
|
184
|
-
{friends: {talent: 'John', drums: 'Ringo', voice: 'Paul', rhythm: 'George'}},
|
185
|
-
{operations: {friends: :+}})
|
186
|
-
end
|
187
|
-
|
188
|
-
it 'should handle removing elements from a map collection column' do
|
189
|
-
TestQueryExecutor.column_type = :map
|
190
|
-
|
191
|
-
TestQueryExecutor.should_receive(:execute).with(
|
192
|
-
"DELETE friends['drums'] FROM people WHERE name = 'Stuart'"
|
193
|
-
)
|
194
|
-
|
195
|
-
TestQueryExecutor.delete!('people', "name = 'Stuart'", :projection => "friends['drums']")
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
describe '.select' do
|
201
|
-
it 'should make select query with WHERE, ORDER BY and LIMIT' do
|
202
|
-
TestQueryExecutor.should_receive(:execute).with(
|
203
|
-
"SELECT * FROM people WHERE name = 'John' ORDER BY birth_time LIMIT 200"
|
204
|
-
)
|
205
|
-
|
206
|
-
TestQueryExecutor.select('people',
|
207
|
-
:selection => "name = 'John'",
|
208
|
-
:order_by => 'birth_time',
|
209
|
-
:limit => 200
|
210
|
-
)
|
211
|
-
end
|
212
|
-
|
213
|
-
it 'should allow to specify projection (columns loaded)' do
|
214
|
-
TestQueryExecutor.should_receive(:execute).with(
|
215
|
-
"SELECT age, birth_time FROM people WHERE name = 'John'"
|
216
|
-
)
|
217
|
-
|
218
|
-
TestQueryExecutor.select('people',
|
219
|
-
:selection => "name = 'John'",
|
220
|
-
:projection => 'age, birth_time'
|
221
|
-
)
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
describe '.delete!' do
|
226
|
-
it 'should delete rows based in a selection' do
|
227
|
-
TestQueryExecutor.should_receive(:execute).with(
|
228
|
-
"DELETE FROM people WHERE name IN ('John', 'Mike')"
|
229
|
-
)
|
230
|
-
|
231
|
-
TestQueryExecutor.delete!('people', "name IN ('John', 'Mike')")
|
232
|
-
end
|
233
|
-
|
234
|
-
it 'should delete column based in a selection and projection' do
|
235
|
-
TestQueryExecutor.should_receive(:execute).with(
|
236
|
-
"DELETE age FROM people WHERE name IN ('John', 'Mike')"
|
237
|
-
)
|
238
|
-
|
239
|
-
TestQueryExecutor.delete!('people', "name IN ('John', 'Mike')", :projection => :age)
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
describe '.truncate!' do
|
244
|
-
it 'should clear table' do
|
245
|
-
TestQueryExecutor.should_receive(:execute).with(
|
246
|
-
"TRUNCATE people"
|
247
|
-
)
|
248
|
-
|
249
|
-
TestQueryExecutor.truncate!('people')
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# encoding : utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe CassandraMigrations::Cassandra do
|
5
|
-
|
6
|
-
before do
|
7
|
-
Rails.stub(:root).and_return Pathname.new("spec/fixtures")
|
8
|
-
Rails.stub(:env).and_return ActiveSupport::StringInquirer.new("development")
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
CassandraMigrations::Cassandra.client = nil
|
13
|
-
CassandraMigrations::Config.config = nil
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '.execute' do
|
17
|
-
it 'should connect to cassandra using host and port configured' do
|
18
|
-
cql_client_mock = mock('cql_client')
|
19
|
-
Cql::Client.should_receive(:connect).with(:host => '127.0.0.1', :port => 9042).and_return(cql_client_mock)
|
20
|
-
cql_client_mock.should_receive(:execute).with('anything').and_return(nil)
|
21
|
-
|
22
|
-
CassandraMigrations::Cassandra.execute('anything').should be_nil
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'raise exception if there is something wrong with the connection' do
|
26
|
-
Cql::Client.should_receive(:connect).and_raise(Cql::Io::ConnectionError)
|
27
|
-
|
28
|
-
expect {
|
29
|
-
CassandraMigrations::Cassandra.execute('anything')
|
30
|
-
}.to raise_exception CassandraMigrations::Errors::ConnectionError
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should return a QueryResult if the query returns something' do
|
34
|
-
CassandraMigrations::Cassandra.client = mock('cql_client')
|
35
|
-
|
36
|
-
result_mock = mock('result_mock')
|
37
|
-
CassandraMigrations::Cassandra.client.should_receive(:execute).with('anything').and_return(result_mock)
|
38
|
-
|
39
|
-
result = CassandraMigrations::Cassandra.execute('anything')
|
40
|
-
result.should_not be_nil
|
41
|
-
result.should be_a(CassandraMigrations::Cassandra::QueryResult)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '.use' do
|
46
|
-
it 'should connect to cassandra using host and port configured' do
|
47
|
-
cql_client_mock = mock('cql_client')
|
48
|
-
Cql::Client.should_receive(:connect).with(:host => '127.0.0.1', :port => 9042).and_return(cql_client_mock)
|
49
|
-
cql_client_mock.should_receive(:use).with('anything').and_return(nil)
|
50
|
-
|
51
|
-
CassandraMigrations::Cassandra.use('anything').should be_nil
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should raise exception if configured keyspace does not exist" do
|
55
|
-
expect {
|
56
|
-
CassandraMigrations::Cassandra.use('anything')
|
57
|
-
}.to raise_exception CassandraMigrations::Errors::UnexistingKeyspaceError
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe ".start!" do
|
62
|
-
it "should use configured keyspace" do
|
63
|
-
CassandraMigrations::Cassandra.should_receive(:use).with('cassandra_migrations_development')
|
64
|
-
CassandraMigrations::Cassandra.start!
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should log missing configuration file or similar error, but swallow exception" do
|
68
|
-
Rails.stub(:root).and_return Pathname.new("spec/fake_fixture_path")
|
69
|
-
|
70
|
-
Rails.logger = mock('logger')
|
71
|
-
Rails.logger.should_receive(:warn).with('There is no config/cassandra.yml. Skipping connection to Cassandra...')
|
72
|
-
CassandraMigrations::Cassandra.start!
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe "query interface" do
|
77
|
-
it "should respond to query helper methods" do
|
78
|
-
CassandraMigrations::Cassandra.should respond_to :select
|
79
|
-
CassandraMigrations::Cassandra.should respond_to :write!
|
80
|
-
CassandraMigrations::Cassandra.should respond_to :update!
|
81
|
-
CassandraMigrations::Cassandra.should respond_to :delete!
|
82
|
-
CassandraMigrations::Cassandra.should respond_to :truncate!
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "keyspace interface" do
|
87
|
-
it "should respond to keyspace helper methods" do
|
88
|
-
CassandraMigrations::Cassandra.should respond_to :create_keyspace!
|
89
|
-
CassandraMigrations::Cassandra.should respond_to :drop_keyspace!
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# encoding : utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe CassandraMigrations::Config do
|
5
|
-
|
6
|
-
before do
|
7
|
-
CassandraMigrations::Config.config = nil
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'should fetch values in config for the right environment' do
|
11
|
-
Rails.stub(:root).and_return Pathname.new("spec/fixtures")
|
12
|
-
Rails.stub(:env).and_return ActiveSupport::StringInquirer.new("development")
|
13
|
-
|
14
|
-
CassandraMigrations::Config.keyspace.should == 'cassandra_migrations_development'
|
15
|
-
CassandraMigrations::Config.replication.should == {'class' => "SimpleStrategy", 'replication_factor' => 1 }
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should raise exception if there are no configs for environment' do
|
19
|
-
Rails.stub(:root).and_return Pathname.new("spec/fixtures")
|
20
|
-
Rails.stub(:env).and_return ActiveSupport::StringInquirer.new("fake_environment")
|
21
|
-
|
22
|
-
expect {
|
23
|
-
CassandraMigrations::Config.keyspace
|
24
|
-
}.to raise_exception CassandraMigrations::Errors::MissingConfigurationError
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should raise exception if there are no config file' do
|
28
|
-
Rails.stub(:root).and_return Pathname.new("spec/fake_path")
|
29
|
-
Rails.stub(:env).and_return ActiveSupport::StringInquirer.new("development")
|
30
|
-
|
31
|
-
expect {
|
32
|
-
CassandraMigrations::Config.keyspace
|
33
|
-
}.to raise_exception CassandraMigrations::Errors::MissingConfigurationError
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should allow ERB in the config file' do
|
37
|
-
Rails.stub(:root).and_return Pathname.new("spec/fixtures/with_erb")
|
38
|
-
Rails.stub(:env).and_return ActiveSupport::StringInquirer.new("test")
|
39
|
-
|
40
|
-
CassandraMigrations::Config.keyspace.should == 'cassandra_migrations_test'
|
41
|
-
|
42
|
-
CassandraMigrations::Config.config = nil
|
43
|
-
ENV.stub(:[]).with("CI").and_return("true")
|
44
|
-
|
45
|
-
CassandraMigrations::Config.keyspace.should == 'cassandra_migrations_ci'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
@@ -1,168 +0,0 @@
|
|
1
|
-
# encoding : utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
module CassandraMigrations
|
5
|
-
|
6
|
-
# Temporarily monkey path Migration to allow for testing generated CQL
|
7
|
-
# and suppress announcements
|
8
|
-
class Migration
|
9
|
-
attr_reader :cql
|
10
|
-
|
11
|
-
def execute(cql)
|
12
|
-
@cql = cql
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
def announce_migration(message); end
|
17
|
-
def announce_operation(message); end
|
18
|
-
def announce_suboperation(message); end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe CassandraMigrations do
|
23
|
-
|
24
|
-
it "should define modules" do
|
25
|
-
defined?(CassandraMigrations).should be_true
|
26
|
-
defined?(CassandraMigrations::Railtie).should be_true
|
27
|
-
defined?(CassandraMigrations::Cassandra).should be_true
|
28
|
-
defined?(CassandraMigrations::Errors).should be_true
|
29
|
-
defined?(CassandraMigrations::Migration).should be_true
|
30
|
-
defined?(CassandraMigrations::Migrator).should be_true
|
31
|
-
defined?(CassandraMigrations::Config).should be_true
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'a migration' do
|
35
|
-
before do
|
36
|
-
require_relative 'fixtures/migrations/migrations'
|
37
|
-
end
|
38
|
-
|
39
|
-
context 'without a primary key' do
|
40
|
-
before do
|
41
|
-
@migration = WithoutAPrimaryKey.new
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should be invalid' do
|
45
|
-
expect { @migration.up }.to raise_error(CassandraMigrations::Errors::MigrationDefinitionError, /No primary key defined./)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context 'that is valid' do
|
50
|
-
before do
|
51
|
-
@migration = CreateKitchenSink.new
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'should have a name' do
|
55
|
-
expect(@migration.send(:name)).to eq('CreateKitchenSink')
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should produce a valid CQL create statement' do
|
59
|
-
@migration.up
|
60
|
-
expected_cql = "CREATE TABLE kitchen_sink (id uuid, a_string varchar, a_timestamp timestamp, a_float float, a_list_of_strings list<varchar>, PRIMARY KEY(id))"
|
61
|
-
expect(@migration.cql).to eq(expected_cql)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'with a list collection column declaration' do
|
66
|
-
before do
|
67
|
-
@migration = CollectionsListMigration.new
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'should produce a valid CQL create statement' do
|
71
|
-
@migration.up
|
72
|
-
expected_cql = "CREATE TABLE collection_lists (id uuid, list_1 list<varchar>, PRIMARY KEY(id))"
|
73
|
-
expect(@migration.cql).to eq(expected_cql)
|
74
|
-
end
|
75
|
-
|
76
|
-
context 'using invalid types' do
|
77
|
-
before do
|
78
|
-
@migration = BadCollectionsListMigration.new
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'should be invalid' do
|
82
|
-
expect { @migration.up }.to raise_error(CassandraMigrations::Errors::MigrationDefinitionError, /Type 'chupacabra' is not valid for cassandra migration./)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
context 'with a set collection column declaration' do
|
88
|
-
before do
|
89
|
-
@migration = CollectionsSetMigration.new
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'should produce a valid CQL create statement' do
|
93
|
-
@migration.up
|
94
|
-
expected_cql = "CREATE TABLE collection_lists (id uuid, set_2 set<float>, PRIMARY KEY(id))"
|
95
|
-
expect(@migration.cql).to eq(expected_cql)
|
96
|
-
end
|
97
|
-
|
98
|
-
context 'using invalid types' do
|
99
|
-
before do
|
100
|
-
@migration = BadCollectionsSetMigration.new
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'should be invalid' do
|
104
|
-
expect { @migration.up }.to raise_error(CassandraMigrations::Errors::MigrationDefinitionError, /Type 'narwhal' is not valid for cassandra migration./)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
context 'with a map collection column declaration' do
|
110
|
-
before do
|
111
|
-
@migration = CollectionsMapMigration.new
|
112
|
-
end
|
113
|
-
|
114
|
-
it 'should produce a valid CQL create statement' do
|
115
|
-
@migration.up
|
116
|
-
expected_cql = "CREATE TABLE collection_lists (id uuid, map_1 map<varchar,float>, PRIMARY KEY(id))"
|
117
|
-
expect(@migration.cql).to eq(expected_cql)
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'using invalid types' do
|
121
|
-
before do
|
122
|
-
@migration = BadCollectionsMapMigration.new
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'should be invalid' do
|
126
|
-
expect { @migration.up }.to raise_error(CassandraMigrations::Errors::MigrationDefinitionError, /Type 'unicorns' is not valid for cassandra migration./)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
context 'with an secondary index definition' do
|
132
|
-
before do
|
133
|
-
@migration = MigrationWithSecondaryIndex.new
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'should produce a valid CQL create statement' do
|
137
|
-
@migration.up
|
138
|
-
expected_cql = "CREATE INDEX ON with_indexes (a_string)"
|
139
|
-
expect(@migration.cql).to eq(expected_cql)
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'should produce a valid CQL drop statement' do
|
143
|
-
@migration.down
|
144
|
-
expected_cql = "DROP INDEX with_indexes_a_string_idx"
|
145
|
-
expect(@migration.cql).to eq(expected_cql)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
context 'with a named secondary index definition' do
|
150
|
-
before do
|
151
|
-
@migration = MigrationWithANamedSecondaryIndex.new
|
152
|
-
end
|
153
|
-
|
154
|
-
it 'should produce a valid CQL create statement' do
|
155
|
-
@migration.up
|
156
|
-
expected_cql = "CREATE INDEX by_another_string ON with_indexes (another_string)"
|
157
|
-
expect(@migration.cql).to eq(expected_cql)
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should produce a valid CQL drop statement' do
|
161
|
-
@migration.down
|
162
|
-
expected_cql = "DROP INDEX by_another_string"
|
163
|
-
expect(@migration.cql).to eq(expected_cql)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
end
|