query_builder 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 +25 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +7 -0
- data/Guardfile +14 -0
- data/LICENSE +21 -0
- data/README.md +95 -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 +80 -0
- data/config/metrics/saikuro.yml +3 -0
- data/config/metrics/simplecov.yml +6 -0
- data/config/metrics/yardstick.yml +37 -0
- data/lib/query_builder.rb +9 -0
- data/lib/query_builder/core.rb +19 -0
- data/lib/query_builder/core/attribute.rb +54 -0
- data/lib/query_builder/core/attribute_error.rb +25 -0
- data/lib/query_builder/core/base.rb +102 -0
- data/lib/query_builder/core/clause.rb +46 -0
- data/lib/query_builder/core/statement.rb +55 -0
- data/lib/query_builder/cql.rb +80 -0
- data/lib/query_builder/cql/contexts.rb +21 -0
- data/lib/query_builder/cql/contexts/aggregate.rb +42 -0
- data/lib/query_builder/cql/contexts/column.rb +59 -0
- data/lib/query_builder/cql/contexts/field.rb +48 -0
- data/lib/query_builder/cql/contexts/function.rb +46 -0
- data/lib/query_builder/cql/contexts/index.rb +44 -0
- data/lib/query_builder/cql/contexts/keyspace.rb +107 -0
- data/lib/query_builder/cql/contexts/permission.rb +59 -0
- data/lib/query_builder/cql/contexts/role.rb +51 -0
- data/lib/query_builder/cql/contexts/table.rb +140 -0
- data/lib/query_builder/cql/contexts/trigger.rb +42 -0
- data/lib/query_builder/cql/contexts/type.rb +52 -0
- data/lib/query_builder/cql/contexts/user.rb +53 -0
- data/lib/query_builder/cql/modifiers.rb +61 -0
- data/lib/query_builder/cql/modifiers/add_column.rb +50 -0
- data/lib/query_builder/cql/modifiers/add_field.rb +49 -0
- data/lib/query_builder/cql/modifiers/allow_filtering.rb +45 -0
- data/lib/query_builder/cql/modifiers/alter.rb +44 -0
- data/lib/query_builder/cql/modifiers/called_on_null.rb +47 -0
- data/lib/query_builder/cql/modifiers/clustering_order.rb +51 -0
- data/lib/query_builder/cql/modifiers/column.rb +59 -0
- data/lib/query_builder/cql/modifiers/compact_storage.rb +46 -0
- data/lib/query_builder/cql/modifiers/count.rb +47 -0
- data/lib/query_builder/cql/modifiers/counter.rb +45 -0
- data/lib/query_builder/cql/modifiers/delete.rb +48 -0
- data/lib/query_builder/cql/modifiers/distinct.rb +45 -0
- data/lib/query_builder/cql/modifiers/finalfunc.rb +47 -0
- data/lib/query_builder/cql/modifiers/if.rb +44 -0
- data/lib/query_builder/cql/modifiers/if_exists.rb +46 -0
- data/lib/query_builder/cql/modifiers/if_not_exists.rb +46 -0
- data/lib/query_builder/cql/modifiers/initcond.rb +49 -0
- data/lib/query_builder/cql/modifiers/insert.rb +68 -0
- data/lib/query_builder/cql/modifiers/limit.rb +49 -0
- data/lib/query_builder/cql/modifiers/norecursive.rb +45 -0
- data/lib/query_builder/cql/modifiers/or_replace.rb +44 -0
- data/lib/query_builder/cql/modifiers/order.rb +50 -0
- data/lib/query_builder/cql/modifiers/password.rb +49 -0
- data/lib/query_builder/cql/modifiers/primary_key.rb +51 -0
- data/lib/query_builder/cql/modifiers/returns.rb +49 -0
- data/lib/query_builder/cql/modifiers/selected.rb +54 -0
- data/lib/query_builder/cql/modifiers/sfunc.rb +47 -0
- data/lib/query_builder/cql/modifiers/statement.rb +47 -0
- data/lib/query_builder/cql/modifiers/stype.rb +47 -0
- data/lib/query_builder/cql/modifiers/superuser.rb +54 -0
- data/lib/query_builder/cql/modifiers/timestamp.rb +50 -0
- data/lib/query_builder/cql/modifiers/unlogged.rb +45 -0
- data/lib/query_builder/cql/modifiers/update.rb +44 -0
- data/lib/query_builder/cql/modifiers/using.rb +48 -0
- data/lib/query_builder/cql/modifiers/using_options.rb +51 -0
- data/lib/query_builder/cql/modifiers/where.rb +44 -0
- data/lib/query_builder/cql/modifiers/where_clustered.rb +51 -0
- data/lib/query_builder/cql/modifiers/with.rb +44 -0
- data/lib/query_builder/cql/modifiers/with_options.rb +42 -0
- data/lib/query_builder/cql/operators.rb +29 -0
- data/lib/query_builder/cql/operators/cql.rb +23 -0
- data/lib/query_builder/cql/operators/cql_composite.rb +20 -0
- data/lib/query_builder/cql/operators/cql_dec.rb +21 -0
- data/lib/query_builder/cql/operators/cql_element.rb +23 -0
- data/lib/query_builder/cql/operators/cql_entries.rb +20 -0
- data/lib/query_builder/cql/operators/cql_frozen.rb +20 -0
- data/lib/query_builder/cql/operators/cql_full.rb +20 -0
- data/lib/query_builder/cql/operators/cql_gt.rb +23 -0
- data/lib/query_builder/cql/operators/cql_gte.rb +23 -0
- data/lib/query_builder/cql/operators/cql_in.rb +23 -0
- data/lib/query_builder/cql/operators/cql_inc.rb +21 -0
- data/lib/query_builder/cql/operators/cql_keys.rb +20 -0
- data/lib/query_builder/cql/operators/cql_list.rb +21 -0
- data/lib/query_builder/cql/operators/cql_literal.rb +84 -0
- data/lib/query_builder/cql/operators/cql_lt.rb +23 -0
- data/lib/query_builder/cql/operators/cql_lte.rb +23 -0
- data/lib/query_builder/cql/operators/cql_map.rb +25 -0
- data/lib/query_builder/cql/operators/cql_set.rb +21 -0
- data/lib/query_builder/cql/operators/cql_token.rb +21 -0
- data/lib/query_builder/cql/operators/cql_token_value.rb +23 -0
- data/lib/query_builder/cql/operators/cql_ttl.rb +20 -0
- data/lib/query_builder/cql/operators/cql_tuple.rb +21 -0
- data/lib/query_builder/cql/operators/cql_tuple_value.rb +23 -0
- data/lib/query_builder/cql/operators/cql_writetime.rb +20 -0
- data/lib/query_builder/cql/statements.rb +25 -0
- data/lib/query_builder/cql/statements/alter_column.rb +27 -0
- data/lib/query_builder/cql/statements/alter_field.rb +27 -0
- data/lib/query_builder/cql/statements/alter_keyspace.rb +25 -0
- data/lib/query_builder/cql/statements/alter_role.rb +26 -0
- data/lib/query_builder/cql/statements/alter_table.rb +25 -0
- data/lib/query_builder/cql/statements/alter_user.rb +26 -0
- data/lib/query_builder/cql/statements/batch.rb +31 -0
- data/lib/query_builder/cql/statements/create_aggregate.rb +36 -0
- data/lib/query_builder/cql/statements/create_column.rb +35 -0
- data/lib/query_builder/cql/statements/create_field.rb +25 -0
- data/lib/query_builder/cql/statements/create_function.rb +38 -0
- data/lib/query_builder/cql/statements/create_index.rb +41 -0
- data/lib/query_builder/cql/statements/create_keyspace.rb +26 -0
- data/lib/query_builder/cql/statements/create_role.rb +26 -0
- data/lib/query_builder/cql/statements/create_table.rb +30 -0
- data/lib/query_builder/cql/statements/create_trigger.rb +29 -0
- data/lib/query_builder/cql/statements/create_type.rb +26 -0
- data/lib/query_builder/cql/statements/create_user.rb +27 -0
- data/lib/query_builder/cql/statements/delete.rb +32 -0
- data/lib/query_builder/cql/statements/drop_aggregate.rb +25 -0
- data/lib/query_builder/cql/statements/drop_column.rb +23 -0
- data/lib/query_builder/cql/statements/drop_function.rb +25 -0
- data/lib/query_builder/cql/statements/drop_index.rb +25 -0
- data/lib/query_builder/cql/statements/drop_keyspace.rb +25 -0
- data/lib/query_builder/cql/statements/drop_role.rb +25 -0
- data/lib/query_builder/cql/statements/drop_table.rb +25 -0
- data/lib/query_builder/cql/statements/drop_trigger.rb +25 -0
- data/lib/query_builder/cql/statements/drop_type.rb +25 -0
- data/lib/query_builder/cql/statements/drop_user.rb +25 -0
- data/lib/query_builder/cql/statements/grant.rb +31 -0
- data/lib/query_builder/cql/statements/insert.rb +27 -0
- data/lib/query_builder/cql/statements/list_permissions.rb +35 -0
- data/lib/query_builder/cql/statements/list_roles.rb +23 -0
- data/lib/query_builder/cql/statements/list_users.rb +23 -0
- data/lib/query_builder/cql/statements/rename_column.rb +27 -0
- data/lib/query_builder/cql/statements/rename_field.rb +25 -0
- data/lib/query_builder/cql/statements/revoke.rb +31 -0
- data/lib/query_builder/cql/statements/select.rb +35 -0
- data/lib/query_builder/cql/statements/truncate.rb +23 -0
- data/lib/query_builder/cql/statements/update.rb +31 -0
- data/lib/query_builder/cql/statements/use.rb +23 -0
- data/lib/query_builder/rspec.rb +25 -0
- data/lib/query_builder/version.rb +9 -0
- data/query_builder.gemspec +31 -0
- data/spec/integration/alter_keyspace_spec.rb +17 -0
- data/spec/integration/alter_role_spec.rb +28 -0
- data/spec/integration/alter_table_add_spec.rb +21 -0
- data/spec/integration/alter_table_alter_spec.rb +15 -0
- data/spec/integration/alter_table_drop_spec.rb +15 -0
- data/spec/integration/alter_table_rename_spec.rb +15 -0
- data/spec/integration/alter_table_with_spec.rb +17 -0
- data/spec/integration/alter_type_add_spec.rb +15 -0
- data/spec/integration/alter_type_alter_spec.rb +15 -0
- data/spec/integration/alter_type_rename_spec.rb +15 -0
- data/spec/integration/alter_user_spec.rb +28 -0
- data/spec/integration/batch_spec.rb +32 -0
- data/spec/integration/create_aggregate_spec.rb +31 -0
- data/spec/integration/create_function_spec.rb +29 -0
- data/spec/integration/create_index_spec.rb +35 -0
- data/spec/integration/create_keyspace_spec.rb +24 -0
- data/spec/integration/create_role_spec.rb +26 -0
- data/spec/integration/create_table_spec.rb +34 -0
- data/spec/integration/create_trigger_spec.rb +21 -0
- data/spec/integration/create_type_spec.rb +20 -0
- data/spec/integration/create_user_spec.rb +23 -0
- data/spec/integration/delete_spec.rb +28 -0
- data/spec/integration/drop_aggregate_spec.rb +21 -0
- data/spec/integration/drop_function_spec.rb +21 -0
- data/spec/integration/drop_index_spec.rb +21 -0
- data/spec/integration/drop_keyspace_spec.rb +18 -0
- data/spec/integration/drop_role_spec.rb +18 -0
- data/spec/integration/drop_table_spec.rb +18 -0
- data/spec/integration/drop_trigger_spec.rb +21 -0
- data/spec/integration/drop_type_spec.rb +18 -0
- data/spec/integration/drop_user_spec.rb +18 -0
- data/spec/integration/grant_spec.rb +29 -0
- data/spec/integration/insert_spec.rb +22 -0
- data/spec/integration/list_permissions_spec.rb +34 -0
- data/spec/integration/list_roles_spec.rb +12 -0
- data/spec/integration/list_users_spec.rb +12 -0
- data/spec/integration/revoke_spec.rb +29 -0
- data/spec/integration/select_spec.rb +46 -0
- data/spec/integration/truncate_spec.rb +12 -0
- data/spec/integration/update_spec.rb +23 -0
- data/spec/integration/use_spec.rb +12 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/unit/core/attribute_error_spec.rb +38 -0
- data/spec/unit/core/attribute_spec.rb +70 -0
- data/spec/unit/core/base_spec.rb +110 -0
- data/spec/unit/core/clause_spec.rb +101 -0
- data/spec/unit/core/statement_spec.rb +88 -0
- data/spec/unit/cql/operators/cql_composite_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_dec_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_element_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_entries_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_frozen_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_full_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_gt_spec.rb +19 -0
- data/spec/unit/cql/operators/cql_gte_spec.rb +19 -0
- data/spec/unit/cql/operators/cql_in_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_inc_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_keys_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_list_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_literal_spec.rb +83 -0
- data/spec/unit/cql/operators/cql_lt_spec.rb +19 -0
- data/spec/unit/cql/operators/cql_lte_spec.rb +19 -0
- data/spec/unit/cql/operators/cql_map_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_set_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_token_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_token_value_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_ttl_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_tuple_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_tuple_value_spec.rb +12 -0
- data/spec/unit/cql/operators/cql_writetime_spec.rb +12 -0
- data/spec/unit/cql/operators_spec.rb +66 -0
- metadata +405 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "INSERT" do
|
|
4
|
+
|
|
5
|
+
include QueryBuilder::CQL::Operators
|
|
6
|
+
|
|
7
|
+
let(:table) { QueryBuilder::CQL.keyspace(:wildlife).table(:species) }
|
|
8
|
+
|
|
9
|
+
it_behaves_like :query_builder do
|
|
10
|
+
subject do
|
|
11
|
+
table
|
|
12
|
+
.insert(names: ["tiger", "pantera tigra"])
|
|
13
|
+
.insert(sizes: { length: 3 })
|
|
14
|
+
.if_not_exists
|
|
15
|
+
.using(ttl: 500)
|
|
16
|
+
.using(timestamp: 100)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
let(:cql) { "INSERT INTO wildlife.species (names, sizes) VALUES (['tiger', 'pantera tigra'], {'length': 3}) USING TIMESTAMP 100 AND TTL 500 IF NOT EXISTS;" }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end # describe INSERT
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "LIST" do
|
|
4
|
+
|
|
5
|
+
let(:root) { QueryBuilder::CQL }
|
|
6
|
+
let(:keyspace) { root.keyspace(:wildlife) }
|
|
7
|
+
let(:table) { keyspace.table(:species) }
|
|
8
|
+
|
|
9
|
+
it_behaves_like :query_builder do
|
|
10
|
+
subject { root.permission.of(:admin) }
|
|
11
|
+
let(:cql) { "LIST ALL PERMISSIONS ON ALL KEYSPACES OF admin;" }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it_behaves_like :query_builder do
|
|
15
|
+
subject { root.permission(:alter).of(:admin) }
|
|
16
|
+
let(:cql) { "LIST ALTER PERMISSION ON ALL KEYSPACES OF admin;" }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it_behaves_like :query_builder do
|
|
20
|
+
subject { keyspace.permission(:create).of(:admin) }
|
|
21
|
+
let(:cql) { "LIST CREATE PERMISSION ON KEYSPACE wildlife OF admin;" }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it_behaves_like :query_builder do
|
|
25
|
+
subject { table.permission(:drop).of(:admin) }
|
|
26
|
+
let(:cql) { "LIST DROP PERMISSION ON TABLE wildlife.species OF admin;" }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it_behaves_like :query_builder do
|
|
30
|
+
subject { table.permission(:drop).of(:admin).norecursive }
|
|
31
|
+
let(:cql) { "LIST DROP PERMISSION ON TABLE wildlife.species OF admin NORECURSIVE;" }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end # describe LIST
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "REVOKE" do
|
|
4
|
+
|
|
5
|
+
let(:root) { QueryBuilder::CQL }
|
|
6
|
+
let(:keyspace) { root.keyspace(:wildlife) }
|
|
7
|
+
let(:table) { keyspace.table(:species) }
|
|
8
|
+
|
|
9
|
+
it_behaves_like :query_builder do
|
|
10
|
+
subject { root.permission.revoke_from(:admin) }
|
|
11
|
+
let(:cql) { "REVOKE ALL PERMISSIONS ON ALL KEYSPACES FROM admin;" }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it_behaves_like :query_builder do
|
|
15
|
+
subject { root.permission(:alter).revoke_from(:admin) }
|
|
16
|
+
let(:cql) { "REVOKE ALTER PERMISSION ON ALL KEYSPACES FROM admin;" }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it_behaves_like :query_builder do
|
|
20
|
+
subject { keyspace.permission(:create).revoke_from(:admin) }
|
|
21
|
+
let(:cql) { "REVOKE CREATE PERMISSION ON KEYSPACE wildlife FROM admin;" }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it_behaves_like :query_builder do
|
|
25
|
+
subject { table.permission(:drop).revoke_from(:admin) }
|
|
26
|
+
let(:cql) { "REVOKE DROP PERMISSION ON TABLE wildlife.species FROM admin;" }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end # describe REVOKE
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "SELECT" do
|
|
4
|
+
|
|
5
|
+
include QueryBuilder::CQL::Operators
|
|
6
|
+
|
|
7
|
+
let(:table) { QueryBuilder::CQL.keyspace(:wildlife).table(:species) }
|
|
8
|
+
|
|
9
|
+
it_behaves_like :query_builder do
|
|
10
|
+
subject { table.select }
|
|
11
|
+
let(:cql) { "SELECT * FROM wildlife.species;" }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it_behaves_like :query_builder do
|
|
15
|
+
subject { table.select.count }
|
|
16
|
+
let(:cql) { "SELECT COUNT(*) FROM wildlife.species;" }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it_behaves_like :query_builder do
|
|
20
|
+
subject { table.select.count(1) }
|
|
21
|
+
let(:cql) { "SELECT COUNT(1) FROM wildlife.species;" }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it_behaves_like :query_builder do
|
|
25
|
+
subject { table.select.where_clustered(name: :tiger, family: :cat) }
|
|
26
|
+
let(:cql) { "SELECT * FROM wildlife.species WHERE (name, family) = ('tiger', 'cat');" }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it_behaves_like :query_builder do
|
|
30
|
+
subject do
|
|
31
|
+
table
|
|
32
|
+
.select(id: :uuid)
|
|
33
|
+
.select(:name)
|
|
34
|
+
.order(:name, :desc)
|
|
35
|
+
.distinct
|
|
36
|
+
.where(id: cql_gte(3))
|
|
37
|
+
.where(id: cql_lt(10), area: cql_in("park", "garden"))
|
|
38
|
+
.where(cql_element[:names, 1] => :cat)
|
|
39
|
+
.limit(10)
|
|
40
|
+
.allow_filtering
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
let(:cql) { "SELECT DISTINCT uuid AS id, name FROM wildlife.species WHERE id >= 3 AND id < 10 AND area IN ('park', 'garden') AND names[1] = 'cat' ORDER BY (name DESC) LIMIT 10 ALLOW FILTERING;" }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end # describe SELECT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "TRUNCATE" do
|
|
4
|
+
|
|
5
|
+
let(:table) { QueryBuilder::CQL.keyspace(:wildlife).table(:species) }
|
|
6
|
+
|
|
7
|
+
it_behaves_like :query_builder do
|
|
8
|
+
subject { table.truncate }
|
|
9
|
+
let(:cql) { "TRUNCATE wildlife.species;" }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end # describe TRUNCATE
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe "UPDATE" do
|
|
4
|
+
|
|
5
|
+
include QueryBuilder::CQL::Operators
|
|
6
|
+
|
|
7
|
+
let(:table) { QueryBuilder::CQL.keyspace(:wildlife).table(:species) }
|
|
8
|
+
|
|
9
|
+
it_behaves_like :query_builder do
|
|
10
|
+
subject do
|
|
11
|
+
table
|
|
12
|
+
.update(name: :tiger, weight: 300)
|
|
13
|
+
.update(size: 3)
|
|
14
|
+
.where(id: 1, name: [:tiger, :bear])
|
|
15
|
+
.if_exists
|
|
16
|
+
.if(name: :tiger)
|
|
17
|
+
.using(ttl: 100, timestamp: 300)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
let(:cql) { "UPDATE wildlife.species USING TIMESTAMP 300 AND TTL 100 SET name = 'tiger', weight = 300, size = 3 WHERE id = 1 AND name IN ('tiger', 'bear') IF EXISTS AND name = 'tiger';" }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # describe UPDATE
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
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 "query_builder"
|
|
13
|
+
|
|
14
|
+
# Load shared examples for specs
|
|
15
|
+
require "transproc/rspec"
|
|
16
|
+
require "query_builder/rspec"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe QueryBuilder::Core::AttributeError do
|
|
4
|
+
|
|
5
|
+
let(:error) { described_class.new(:missed, attributes) }
|
|
6
|
+
let(:attributes) { [:foo] }
|
|
7
|
+
|
|
8
|
+
describe ".new" do
|
|
9
|
+
subject { error }
|
|
10
|
+
|
|
11
|
+
it "is a KeyError" do
|
|
12
|
+
expect(error).to be_kind_of KeyError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "is immutable" do
|
|
16
|
+
expect(error).to be_frozen
|
|
17
|
+
end
|
|
18
|
+
end # describe .new
|
|
19
|
+
|
|
20
|
+
describe "#message" do
|
|
21
|
+
subject { error.message }
|
|
22
|
+
|
|
23
|
+
context "with one attribute" do
|
|
24
|
+
it "returns proper text" do
|
|
25
|
+
expect(subject).to eql "missed attribute: :foo"
|
|
26
|
+
end
|
|
27
|
+
end # context
|
|
28
|
+
|
|
29
|
+
context "with many attributes" do
|
|
30
|
+
let(:attributes) { [:foo, :bar] }
|
|
31
|
+
|
|
32
|
+
it "returns proper text" do
|
|
33
|
+
expect(subject).to eql "missed attributes: :foo, :bar"
|
|
34
|
+
end
|
|
35
|
+
end # context
|
|
36
|
+
end # describe #message
|
|
37
|
+
|
|
38
|
+
end # describe QueryBuilder::Core::AttributeError
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe QueryBuilder::Core::Attribute do
|
|
4
|
+
|
|
5
|
+
let(:attribute) { described_class.new :foo }
|
|
6
|
+
|
|
7
|
+
describe ".new" do
|
|
8
|
+
subject { attribute }
|
|
9
|
+
|
|
10
|
+
it "is immutable" do
|
|
11
|
+
expect(subject).to be_frozen
|
|
12
|
+
end
|
|
13
|
+
end # describe .new
|
|
14
|
+
|
|
15
|
+
describe "#arguments" do
|
|
16
|
+
subject { attribute.arguments }
|
|
17
|
+
|
|
18
|
+
let(:arguments) { [:foo, default: :FOO, required: true] }
|
|
19
|
+
let(:attribute) { described_class.new(*arguments) }
|
|
20
|
+
|
|
21
|
+
it "returns argumens of the initializer" do
|
|
22
|
+
expect(subject).to eql(arguments)
|
|
23
|
+
end
|
|
24
|
+
end # describe #arguments
|
|
25
|
+
|
|
26
|
+
describe "#name" do
|
|
27
|
+
subject { attribute.name }
|
|
28
|
+
|
|
29
|
+
it "is initialized" do
|
|
30
|
+
expect(subject).to eql(:foo)
|
|
31
|
+
end
|
|
32
|
+
end # describe #name
|
|
33
|
+
|
|
34
|
+
describe "#default" do
|
|
35
|
+
subject { attribute.default }
|
|
36
|
+
|
|
37
|
+
context "by default" do
|
|
38
|
+
it "returns nil" do
|
|
39
|
+
expect(subject).to be_nil
|
|
40
|
+
end
|
|
41
|
+
end # context
|
|
42
|
+
|
|
43
|
+
context "when value is set" do
|
|
44
|
+
let(:attribute) { described_class.new :foo, default: :FOO }
|
|
45
|
+
|
|
46
|
+
it "is initialized" do
|
|
47
|
+
expect(subject).to eql(:FOO)
|
|
48
|
+
end
|
|
49
|
+
end # context
|
|
50
|
+
end # describe #default
|
|
51
|
+
|
|
52
|
+
describe "#required" do
|
|
53
|
+
subject { attribute.required }
|
|
54
|
+
|
|
55
|
+
context "by default" do
|
|
56
|
+
it "returns false" do
|
|
57
|
+
expect(subject).to eql(false)
|
|
58
|
+
end
|
|
59
|
+
end # context
|
|
60
|
+
|
|
61
|
+
context "when value is set" do
|
|
62
|
+
let(:attribute) { described_class.new :foo, required: true }
|
|
63
|
+
|
|
64
|
+
it "is initialized" do
|
|
65
|
+
expect(subject).to eql(true)
|
|
66
|
+
end
|
|
67
|
+
end # context
|
|
68
|
+
end # describe #required
|
|
69
|
+
|
|
70
|
+
end # describe QueryBuilder::Core::Attribute
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
describe QueryBuilder::Core::Base do
|
|
4
|
+
|
|
5
|
+
let(:exception) { QueryBuilder::Core::AttributeError }
|
|
6
|
+
let(:klass) { Class.new(described_class) }
|
|
7
|
+
let(:instance) { klass.new(attributes) }
|
|
8
|
+
let(:attributes) { { foo: :FOO } }
|
|
9
|
+
|
|
10
|
+
describe ".attribute" do
|
|
11
|
+
shared_examples :adding_attribute do
|
|
12
|
+
it "updates .attributes" do
|
|
13
|
+
expect { subject }
|
|
14
|
+
.to change { klass.attributes.map(&:name) }
|
|
15
|
+
.from([])
|
|
16
|
+
.to([:foo])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "adds key to the #attributes" do
|
|
20
|
+
expect { subject }
|
|
21
|
+
.to change { klass.new.attributes }
|
|
22
|
+
.from({})
|
|
23
|
+
.to(foo: default)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "defines the instance method" do
|
|
27
|
+
expect { subject }
|
|
28
|
+
.to change { klass.instance_methods }
|
|
29
|
+
.by [:foo]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "makes the method to return the attribute" do
|
|
33
|
+
subject
|
|
34
|
+
expect(klass.new.foo).to eql(default)
|
|
35
|
+
expect(klass.new(foo: :FOO).foo).to eql(:FOO)
|
|
36
|
+
end
|
|
37
|
+
end # shared examples
|
|
38
|
+
|
|
39
|
+
it_behaves_like :adding_attribute do
|
|
40
|
+
subject { klass.attribute :foo }
|
|
41
|
+
let(:default) { nil }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it_behaves_like :adding_attribute do
|
|
45
|
+
subject { klass.attribute :foo, default: default }
|
|
46
|
+
let(:default) { :Foo }
|
|
47
|
+
end
|
|
48
|
+
end # describe .attributes
|
|
49
|
+
|
|
50
|
+
describe ".inherited" do
|
|
51
|
+
subject { Class.new(klass).attributes.map(&:name) }
|
|
52
|
+
|
|
53
|
+
let(:klass) do
|
|
54
|
+
Class.new(described_class) { attribute :foo, default: :FOO }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "inherits the default attibutes of parent class" do
|
|
58
|
+
expect(subject).to eql [:foo]
|
|
59
|
+
end
|
|
60
|
+
end # describe .inherited
|
|
61
|
+
|
|
62
|
+
describe ".new" do
|
|
63
|
+
subject { instance }
|
|
64
|
+
|
|
65
|
+
before { klass.attribute :foo, required: true }
|
|
66
|
+
|
|
67
|
+
it "is immutable" do
|
|
68
|
+
expect(subject).to be_frozen
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "doesn't freeze attributes" do
|
|
72
|
+
expect { subject }.not_to change { attributes.frozen? }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "with unknown attribute" do
|
|
76
|
+
let(:attributes) { { foo: :FOO, bar: :BAR } }
|
|
77
|
+
|
|
78
|
+
it "raises AttributeError" do
|
|
79
|
+
expect { subject }.to raise_error do |error|
|
|
80
|
+
expect(error).to be_kind_of exception
|
|
81
|
+
expect(error.message).to include "unknown "
|
|
82
|
+
expect(error.message).to include "bar"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
context "with missed attribute" do
|
|
88
|
+
before { klass.attribute :bar, required: true }
|
|
89
|
+
|
|
90
|
+
it "raises AttributeError" do
|
|
91
|
+
expect { subject }.to raise_error do |error|
|
|
92
|
+
expect(error).to be_kind_of exception
|
|
93
|
+
expect(error.message).to include "missed "
|
|
94
|
+
expect(error.message).to include "bar"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end # describe .new
|
|
99
|
+
|
|
100
|
+
describe "#to_s" do
|
|
101
|
+
subject { instance.to_s }
|
|
102
|
+
|
|
103
|
+
let(:klass) { Class.new(described_class) { attribute :foo } }
|
|
104
|
+
|
|
105
|
+
it "returns empty string" do
|
|
106
|
+
expect(subject).to eql("")
|
|
107
|
+
end
|
|
108
|
+
end # describe #to_s
|
|
109
|
+
|
|
110
|
+
end # describe QueryBuilder::Core::Base
|