rom-cassandra 0.0.1
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 +7 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +9 -0
- data/.metrics +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -0
- data/.travis.yml +26 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +7 -0
- data/Guardfile +14 -0
- data/LICENSE +21 -0
- data/README.md +83 -0
- data/Rakefile +34 -0
- data/config/metrics/STYLEGUIDE +230 -0
- data/config/metrics/cane.yml +5 -0
- data/config/metrics/churn.yml +6 -0
- data/config/metrics/flay.yml +2 -0
- data/config/metrics/metric_fu.yml +14 -0
- data/config/metrics/reek.yml +1 -0
- data/config/metrics/roodi.yml +24 -0
- data/config/metrics/rubocop.yml +84 -0
- data/config/metrics/saikuro.yml +3 -0
- data/config/metrics/simplecov.yml +6 -0
- data/config/metrics/yardstick.yml +37 -0
- data/lib/rom-cassandra.rb +3 -0
- data/lib/rom/cassandra.rb +33 -0
- data/lib/rom/cassandra/commands.rb +53 -0
- data/lib/rom/cassandra/commands/batch.rb +54 -0
- data/lib/rom/cassandra/commands/create.rb +38 -0
- data/lib/rom/cassandra/commands/delete.rb +38 -0
- data/lib/rom/cassandra/commands/update.rb +38 -0
- data/lib/rom/cassandra/dataset.rb +102 -0
- data/lib/rom/cassandra/gateway.rb +115 -0
- data/lib/rom/cassandra/migrations.rb +30 -0
- data/lib/rom/cassandra/migrations/generator.rb +68 -0
- data/lib/rom/cassandra/migrations/generator/migration.erb +32 -0
- data/lib/rom/cassandra/migrations/logger.rb +28 -0
- data/lib/rom/cassandra/migrations/migration.rb +107 -0
- data/lib/rom/cassandra/migrations/migrator.rb +103 -0
- data/lib/rom/cassandra/migrations/runner.rb +119 -0
- data/lib/rom/cassandra/migrations/runner_down.rb +49 -0
- data/lib/rom/cassandra/migrations/runner_up.rb +50 -0
- data/lib/rom/cassandra/query.rb +43 -0
- data/lib/rom/cassandra/relation.rb +88 -0
- data/lib/rom/cassandra/session.rb +50 -0
- data/lib/rom/cassandra/tasks.rb +6 -0
- data/lib/rom/cassandra/version.rb +15 -0
- data/lib/tasks/db.rake +16 -0
- data/rom-cassandra.gemspec +33 -0
- data/spec/config/reset_cluster.rb +28 -0
- data/spec/config/rom.rb +3 -0
- data/spec/config/test_module.rb +7 -0
- data/spec/integration/batch_spec.rb +36 -0
- data/spec/integration/create_spec.rb +33 -0
- data/spec/integration/delete_spec.rb +33 -0
- data/spec/integration/migrate/20150825142003_create_users.rb +24 -0
- data/spec/integration/migrate/20150825142024_create_logs.rb +17 -0
- data/spec/integration/migrate_spec.rb +47 -0
- data/spec/integration/relation_spec.rb +27 -0
- data/spec/integration/update_spec.rb +33 -0
- data/spec/shared/fake_migrate_folder.rb +21 -0
- data/spec/shared/users.rb +20 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/unit/commands/batch_spec.rb +86 -0
- data/spec/unit/commands/create_spec.rb +77 -0
- data/spec/unit/commands/delete_spec.rb +77 -0
- data/spec/unit/commands/update_spec.rb +77 -0
- data/spec/unit/dataset_spec.rb +130 -0
- data/spec/unit/gateway_spec.rb +140 -0
- data/spec/unit/migrations/generator_spec.rb +31 -0
- data/spec/unit/migrations/logger_spec.rb +21 -0
- data/spec/unit/migrations/migration_spec.rb +59 -0
- data/spec/unit/migrations/migrator_spec.rb +120 -0
- data/spec/unit/migrations/runner_down_spec.rb +65 -0
- data/spec/unit/migrations/runner_spec.rb +142 -0
- data/spec/unit/migrations/runner_up_spec.rb +67 -0
- data/spec/unit/query_spec.rb +21 -0
- data/spec/unit/relation_spec.rb +142 -0
- data/spec/unit/session_spec.rb +55 -0
- data/spec/unit/tasks/create_migration_spec.rb +41 -0
- metadata +242 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
shared_examples :users do
|
4
|
+
|
5
|
+
let(:setup) { ROM.setup(:cassandra, hosts: ["127.0.0.1"], port: 9042) }
|
6
|
+
let(:gateway) { setup[:default] }
|
7
|
+
let(:rom) { setup.finalize }
|
8
|
+
let(:select) { rom.relation(:users) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
setup.relation(:users) do
|
12
|
+
dataset "auth.users"
|
13
|
+
|
14
|
+
def by_id(id)
|
15
|
+
where(id: id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end # shared examples
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "hexx-suit"
|
5
|
+
Hexx::Suit.load_metrics_for(self)
|
6
|
+
rescue LoadError
|
7
|
+
require "hexx-rspec"
|
8
|
+
Hexx::RSpec.load_metrics_for(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Loads the code under test
|
12
|
+
require "rom-cassandra"
|
13
|
+
|
14
|
+
# Configures RSpec
|
15
|
+
require "config/reset_cluster"
|
16
|
+
require "config/rom"
|
17
|
+
require "config/test_module"
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Commands::Batch do
|
4
|
+
|
5
|
+
let(:command) { described_class.new relation }
|
6
|
+
let(:relation) { double :relation, batch_query: batch }
|
7
|
+
let(:batch) { double :batch, foo: :updated_relation }
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
subject { command }
|
11
|
+
|
12
|
+
it { is_expected.to be_kind_of ROM::Command }
|
13
|
+
end # describe .new
|
14
|
+
|
15
|
+
describe "#relation" do
|
16
|
+
subject { command.relation }
|
17
|
+
|
18
|
+
it "restricts dataset by UPDATE statements" do
|
19
|
+
expect(subject).to eql batch
|
20
|
+
end
|
21
|
+
end # describe #relation
|
22
|
+
|
23
|
+
describe "#method_missing" do
|
24
|
+
subject { command.foo :bar }
|
25
|
+
|
26
|
+
it "returns a command" do
|
27
|
+
expect(subject).to be_kind_of described_class
|
28
|
+
end
|
29
|
+
|
30
|
+
it "updates the relation" do
|
31
|
+
expect(batch).to receive(:foo).with(:bar)
|
32
|
+
expect(subject.relation).to eql :updated_relation
|
33
|
+
end
|
34
|
+
end # describe #method_missing
|
35
|
+
|
36
|
+
describe "#respond_to_missing?" do
|
37
|
+
subject { command.respond_to? name }
|
38
|
+
|
39
|
+
context "method of #relation" do
|
40
|
+
let(:name) { :foo }
|
41
|
+
|
42
|
+
it { is_expected.to eql true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "method not defined for #relation" do
|
46
|
+
let(:name) { :bar }
|
47
|
+
|
48
|
+
it { is_expected.to eql false }
|
49
|
+
end
|
50
|
+
end # describe #respond_to_missing?
|
51
|
+
|
52
|
+
describe "#execute" do
|
53
|
+
let(:updated) { double :updated, to_a: result }
|
54
|
+
let(:result) { double :result }
|
55
|
+
|
56
|
+
context "without a block" do
|
57
|
+
subject { command.execute(1) }
|
58
|
+
|
59
|
+
it "applies #to_a" do
|
60
|
+
allow(command).to receive(:to_a) { result }
|
61
|
+
|
62
|
+
expect(subject).to eql(result)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with a block" do
|
67
|
+
subject { command.execute { foo } }
|
68
|
+
|
69
|
+
it "updates and finalizes the command" do
|
70
|
+
allow(command).to receive(:foo) { updated }
|
71
|
+
|
72
|
+
expect(subject).to eql(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # describe #execute
|
76
|
+
|
77
|
+
describe "#keyspace" do
|
78
|
+
subject { command.keyspace(:foo) }
|
79
|
+
|
80
|
+
it "returns query" do
|
81
|
+
expect(subject).to be_kind_of ROM::Cassandra::Query
|
82
|
+
expect(subject.use.to_s).to eql "USE foo;"
|
83
|
+
end
|
84
|
+
end # describe #keyspace
|
85
|
+
|
86
|
+
end # describe ROM::Cassandra::Commands::Batch
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Commands::Create do
|
4
|
+
|
5
|
+
let(:command) { described_class.new relation }
|
6
|
+
let(:relation) { double :relation, insert_query: insert }
|
7
|
+
let(:insert) { double :insert, foo: :updated_relation }
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
subject { command }
|
11
|
+
|
12
|
+
it { is_expected.to be_kind_of ROM::Commands::Create }
|
13
|
+
end # describe .new
|
14
|
+
|
15
|
+
describe "#relation" do
|
16
|
+
subject { command.relation }
|
17
|
+
|
18
|
+
it "restricts dataset by INSERT statements" do
|
19
|
+
expect(subject).to eql insert
|
20
|
+
end
|
21
|
+
end # describe #relation
|
22
|
+
|
23
|
+
describe "#method_missing" do
|
24
|
+
subject { command.foo :bar }
|
25
|
+
|
26
|
+
it "returns a command" do
|
27
|
+
expect(subject).to be_kind_of described_class
|
28
|
+
end
|
29
|
+
|
30
|
+
it "updates the relation" do
|
31
|
+
expect(insert).to receive(:foo).with(:bar)
|
32
|
+
expect(subject.relation).to eql :updated_relation
|
33
|
+
end
|
34
|
+
end # describe #method_missing
|
35
|
+
|
36
|
+
describe "#respond_to_missing?" do
|
37
|
+
subject { command.respond_to? name }
|
38
|
+
|
39
|
+
context "method of #relation" do
|
40
|
+
let(:name) { :foo }
|
41
|
+
|
42
|
+
it { is_expected.to eql true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "method not defined for #relation" do
|
46
|
+
let(:name) { :bar }
|
47
|
+
|
48
|
+
it { is_expected.to eql false }
|
49
|
+
end
|
50
|
+
end # describe #respond_to_missing?
|
51
|
+
|
52
|
+
describe "#execute" do
|
53
|
+
let(:updated) { double :updated, to_a: result }
|
54
|
+
let(:result) { double :result }
|
55
|
+
|
56
|
+
context "without a block" do
|
57
|
+
subject { command.execute(1) }
|
58
|
+
|
59
|
+
it "applies #to_a" do
|
60
|
+
allow(command).to receive(:to_a) { result }
|
61
|
+
|
62
|
+
expect(subject).to eql(result)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with a block" do
|
67
|
+
subject { command.execute { foo } }
|
68
|
+
|
69
|
+
it "updates and finalizes the command" do
|
70
|
+
allow(command).to receive(:foo) { updated }
|
71
|
+
|
72
|
+
expect(subject).to eql(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # describe #execute
|
76
|
+
|
77
|
+
end # describe ROM::Cassandra::Commands::Create
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Commands::Delete do
|
4
|
+
|
5
|
+
let(:command) { described_class.new relation }
|
6
|
+
let(:relation) { double :relation, delete_query: delete }
|
7
|
+
let(:delete) { double :delete, foo: :updated_relation }
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
subject { command }
|
11
|
+
|
12
|
+
it { is_expected.to be_kind_of ROM::Commands::Delete }
|
13
|
+
end # describe .new
|
14
|
+
|
15
|
+
describe "#relation" do
|
16
|
+
subject { command.relation }
|
17
|
+
|
18
|
+
it "restricts dataset by DELETE statements" do
|
19
|
+
expect(subject).to eql delete
|
20
|
+
end
|
21
|
+
end # describe #relation
|
22
|
+
|
23
|
+
describe "#method_missing" do
|
24
|
+
subject { command.foo :bar }
|
25
|
+
|
26
|
+
it "returns a command" do
|
27
|
+
expect(subject).to be_kind_of described_class
|
28
|
+
end
|
29
|
+
|
30
|
+
it "updates the relation" do
|
31
|
+
expect(delete).to receive(:foo).with(:bar)
|
32
|
+
expect(subject.relation).to eql :updated_relation
|
33
|
+
end
|
34
|
+
end # describe #method_missing
|
35
|
+
|
36
|
+
describe "#respond_to_missing?" do
|
37
|
+
subject { command.respond_to? name }
|
38
|
+
|
39
|
+
context "method of #relation" do
|
40
|
+
let(:name) { :foo }
|
41
|
+
|
42
|
+
it { is_expected.to eql true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "method not defined for #relation" do
|
46
|
+
let(:name) { :bar }
|
47
|
+
|
48
|
+
it { is_expected.to eql false }
|
49
|
+
end
|
50
|
+
end # describe #respond_to_missing?
|
51
|
+
|
52
|
+
describe "#execute" do
|
53
|
+
let(:updated) { double :updated, to_a: result }
|
54
|
+
let(:result) { double :result }
|
55
|
+
|
56
|
+
context "without a block" do
|
57
|
+
subject { command.execute(1) }
|
58
|
+
|
59
|
+
it "applies #to_a" do
|
60
|
+
allow(command).to receive(:to_a) { result }
|
61
|
+
|
62
|
+
expect(subject).to eql(result)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with a block" do
|
67
|
+
subject { command.execute { foo } }
|
68
|
+
|
69
|
+
it "updates and finalizes the command" do
|
70
|
+
allow(command).to receive(:foo) { updated }
|
71
|
+
|
72
|
+
expect(subject).to eql(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # describe #execute
|
76
|
+
|
77
|
+
end # describe ROM::Cassandra::Commands::Delete
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Commands::Update do
|
4
|
+
|
5
|
+
let(:command) { described_class.new relation }
|
6
|
+
let(:relation) { double :relation, update_query: update }
|
7
|
+
let(:update) { double :update, foo: :updated_relation }
|
8
|
+
|
9
|
+
describe ".new" do
|
10
|
+
subject { command }
|
11
|
+
|
12
|
+
it { is_expected.to be_kind_of ROM::Commands::Update }
|
13
|
+
end # describe .new
|
14
|
+
|
15
|
+
describe "#relation" do
|
16
|
+
subject { command.relation }
|
17
|
+
|
18
|
+
it "restricts dataset by UPDATE statements" do
|
19
|
+
expect(subject).to eql update
|
20
|
+
end
|
21
|
+
end # describe #relation
|
22
|
+
|
23
|
+
describe "#method_missing" do
|
24
|
+
subject { command.foo :bar }
|
25
|
+
|
26
|
+
it "returns a command" do
|
27
|
+
expect(subject).to be_kind_of described_class
|
28
|
+
end
|
29
|
+
|
30
|
+
it "updates the relation" do
|
31
|
+
expect(update).to receive(:foo).with(:bar)
|
32
|
+
expect(subject.relation).to eql :updated_relation
|
33
|
+
end
|
34
|
+
end # describe #method_missing
|
35
|
+
|
36
|
+
describe "#respond_to_missing?" do
|
37
|
+
subject { command.respond_to? name }
|
38
|
+
|
39
|
+
context "method of #relation" do
|
40
|
+
let(:name) { :foo }
|
41
|
+
|
42
|
+
it { is_expected.to eql true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "method not defined for #relation" do
|
46
|
+
let(:name) { :bar }
|
47
|
+
|
48
|
+
it { is_expected.to eql false }
|
49
|
+
end
|
50
|
+
end # describe #respond_to_missing?
|
51
|
+
|
52
|
+
describe "#execute" do
|
53
|
+
let(:updated) { double :updated, to_a: result }
|
54
|
+
let(:result) { double :result }
|
55
|
+
|
56
|
+
context "without a block" do
|
57
|
+
subject { command.execute(1) }
|
58
|
+
|
59
|
+
it "applies #to_a" do
|
60
|
+
allow(command).to receive(:to_a) { result }
|
61
|
+
|
62
|
+
expect(subject).to eql(result)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with a block" do
|
67
|
+
subject { command.execute { foo } }
|
68
|
+
|
69
|
+
it "updates and finalizes the command" do
|
70
|
+
allow(command).to receive(:foo) { updated }
|
71
|
+
|
72
|
+
expect(subject).to eql(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end # describe #execute
|
76
|
+
|
77
|
+
end # describe ROM::Cassandra::Commands::Update
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe ROM::Cassandra::Dataset do
|
4
|
+
|
5
|
+
let(:dataset) { described_class.new(session, keyspace, table, query) }
|
6
|
+
|
7
|
+
let(:session) { double :session }
|
8
|
+
let(:keyspace) { "foo" }
|
9
|
+
let(:table) { "bar" }
|
10
|
+
let(:query) { double :query }
|
11
|
+
|
12
|
+
describe "#session" do
|
13
|
+
subject { dataset.session }
|
14
|
+
|
15
|
+
it { is_expected.to eql session }
|
16
|
+
end # describe #session
|
17
|
+
|
18
|
+
describe "#keyspace" do
|
19
|
+
subject { dataset.keyspace }
|
20
|
+
|
21
|
+
it { is_expected.to eql :foo }
|
22
|
+
end # describe #keyspace
|
23
|
+
|
24
|
+
describe "#table" do
|
25
|
+
subject { dataset.table }
|
26
|
+
|
27
|
+
it { is_expected.to eql :bar }
|
28
|
+
end # describe #table
|
29
|
+
|
30
|
+
describe "#query" do
|
31
|
+
subject { dataset.query }
|
32
|
+
|
33
|
+
context "when it is set" do
|
34
|
+
it { is_expected.to eql query }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when it isn't set" do
|
38
|
+
let(:dataset) { described_class.new(session, keyspace, table) }
|
39
|
+
|
40
|
+
it "returns the context of table" do
|
41
|
+
expect(subject.select.to_s).to eql "SELECT * FROM foo.bar;"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end # describe #query
|
45
|
+
|
46
|
+
describe "#get" do
|
47
|
+
subject { dataset.get(:bar, :baz) }
|
48
|
+
|
49
|
+
let(:select) { double :select }
|
50
|
+
before { allow(query).to receive(:select).and_return(select) }
|
51
|
+
|
52
|
+
it "forwards calls to the #query" do
|
53
|
+
expect(query).to receive(:select).with(:bar, :baz)
|
54
|
+
subject
|
55
|
+
end
|
56
|
+
|
57
|
+
it "returns the dataset with updated query" do
|
58
|
+
expect(subject)
|
59
|
+
.to eql described_class.new(session, keyspace, table, select)
|
60
|
+
end
|
61
|
+
end # describe #get
|
62
|
+
|
63
|
+
describe "#batch" do
|
64
|
+
subject { dataset.batch }
|
65
|
+
|
66
|
+
let(:batch) { double :batch }
|
67
|
+
let(:builder) { double :builder, batch: batch }
|
68
|
+
before { allow(ROM::Cassandra::Query).to receive(:new) { builder } }
|
69
|
+
|
70
|
+
it "returns the dataset with updated query" do
|
71
|
+
expect(subject)
|
72
|
+
.to eql described_class.new(session, nil, nil, batch)
|
73
|
+
end
|
74
|
+
end # describe #batch
|
75
|
+
|
76
|
+
describe "#each" do
|
77
|
+
let(:result) { [:foo, :bar] }
|
78
|
+
before { allow(session).to receive(:call) { result } }
|
79
|
+
|
80
|
+
context "with a block" do
|
81
|
+
subject { dataset.map { |item| item } }
|
82
|
+
|
83
|
+
it "sends #query to #session and iterates through the result" do
|
84
|
+
expect(session).to receive(:call).with(query)
|
85
|
+
expect(subject).to eql result
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "without a block" do
|
90
|
+
subject { dataset.each }
|
91
|
+
|
92
|
+
it "sends #query to #session and returns #result's enumerator" do
|
93
|
+
expect(subject).to be_kind_of Enumerator
|
94
|
+
expect(subject.to_a).to eql result
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end # describe #each
|
98
|
+
|
99
|
+
describe "#respond_to?" do
|
100
|
+
subject { dataset.respond_to? :foo }
|
101
|
+
|
102
|
+
context "method defined for #query" do
|
103
|
+
before { allow(query).to receive(:foo) }
|
104
|
+
|
105
|
+
it { is_expected.to eql true }
|
106
|
+
end
|
107
|
+
|
108
|
+
context "method missing for #query" do
|
109
|
+
it { is_expected.to eql false }
|
110
|
+
end
|
111
|
+
end # describe #respond_to?
|
112
|
+
|
113
|
+
describe "#method_missing" do
|
114
|
+
subject { dataset.foo(:bar) }
|
115
|
+
|
116
|
+
let(:updated_query) { double :updated_query }
|
117
|
+
before { allow(query).to receive(:foo) { updated_query } }
|
118
|
+
|
119
|
+
it "forwards calls to the #query" do
|
120
|
+
expect(query).to receive(:foo).with(:bar)
|
121
|
+
subject
|
122
|
+
end
|
123
|
+
|
124
|
+
it "returns the dataset with updated query" do
|
125
|
+
expect(subject)
|
126
|
+
.to eql described_class.new(session, keyspace, table, updated_query)
|
127
|
+
end
|
128
|
+
end # describe #method_missing
|
129
|
+
|
130
|
+
end # describe ROM::Cassandra::Dataset
|