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.
Files changed (229) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +9 -0
  4. data/.metrics +9 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +2 -0
  7. data/.travis.yml +25 -0
  8. data/.yardopts +3 -0
  9. data/CHANGELOG.md +5 -0
  10. data/Gemfile +7 -0
  11. data/Guardfile +14 -0
  12. data/LICENSE +21 -0
  13. data/README.md +95 -0
  14. data/Rakefile +34 -0
  15. data/config/metrics/STYLEGUIDE +230 -0
  16. data/config/metrics/cane.yml +5 -0
  17. data/config/metrics/churn.yml +6 -0
  18. data/config/metrics/flay.yml +2 -0
  19. data/config/metrics/metric_fu.yml +14 -0
  20. data/config/metrics/reek.yml +1 -0
  21. data/config/metrics/roodi.yml +24 -0
  22. data/config/metrics/rubocop.yml +80 -0
  23. data/config/metrics/saikuro.yml +3 -0
  24. data/config/metrics/simplecov.yml +6 -0
  25. data/config/metrics/yardstick.yml +37 -0
  26. data/lib/query_builder.rb +9 -0
  27. data/lib/query_builder/core.rb +19 -0
  28. data/lib/query_builder/core/attribute.rb +54 -0
  29. data/lib/query_builder/core/attribute_error.rb +25 -0
  30. data/lib/query_builder/core/base.rb +102 -0
  31. data/lib/query_builder/core/clause.rb +46 -0
  32. data/lib/query_builder/core/statement.rb +55 -0
  33. data/lib/query_builder/cql.rb +80 -0
  34. data/lib/query_builder/cql/contexts.rb +21 -0
  35. data/lib/query_builder/cql/contexts/aggregate.rb +42 -0
  36. data/lib/query_builder/cql/contexts/column.rb +59 -0
  37. data/lib/query_builder/cql/contexts/field.rb +48 -0
  38. data/lib/query_builder/cql/contexts/function.rb +46 -0
  39. data/lib/query_builder/cql/contexts/index.rb +44 -0
  40. data/lib/query_builder/cql/contexts/keyspace.rb +107 -0
  41. data/lib/query_builder/cql/contexts/permission.rb +59 -0
  42. data/lib/query_builder/cql/contexts/role.rb +51 -0
  43. data/lib/query_builder/cql/contexts/table.rb +140 -0
  44. data/lib/query_builder/cql/contexts/trigger.rb +42 -0
  45. data/lib/query_builder/cql/contexts/type.rb +52 -0
  46. data/lib/query_builder/cql/contexts/user.rb +53 -0
  47. data/lib/query_builder/cql/modifiers.rb +61 -0
  48. data/lib/query_builder/cql/modifiers/add_column.rb +50 -0
  49. data/lib/query_builder/cql/modifiers/add_field.rb +49 -0
  50. data/lib/query_builder/cql/modifiers/allow_filtering.rb +45 -0
  51. data/lib/query_builder/cql/modifiers/alter.rb +44 -0
  52. data/lib/query_builder/cql/modifiers/called_on_null.rb +47 -0
  53. data/lib/query_builder/cql/modifiers/clustering_order.rb +51 -0
  54. data/lib/query_builder/cql/modifiers/column.rb +59 -0
  55. data/lib/query_builder/cql/modifiers/compact_storage.rb +46 -0
  56. data/lib/query_builder/cql/modifiers/count.rb +47 -0
  57. data/lib/query_builder/cql/modifiers/counter.rb +45 -0
  58. data/lib/query_builder/cql/modifiers/delete.rb +48 -0
  59. data/lib/query_builder/cql/modifiers/distinct.rb +45 -0
  60. data/lib/query_builder/cql/modifiers/finalfunc.rb +47 -0
  61. data/lib/query_builder/cql/modifiers/if.rb +44 -0
  62. data/lib/query_builder/cql/modifiers/if_exists.rb +46 -0
  63. data/lib/query_builder/cql/modifiers/if_not_exists.rb +46 -0
  64. data/lib/query_builder/cql/modifiers/initcond.rb +49 -0
  65. data/lib/query_builder/cql/modifiers/insert.rb +68 -0
  66. data/lib/query_builder/cql/modifiers/limit.rb +49 -0
  67. data/lib/query_builder/cql/modifiers/norecursive.rb +45 -0
  68. data/lib/query_builder/cql/modifiers/or_replace.rb +44 -0
  69. data/lib/query_builder/cql/modifiers/order.rb +50 -0
  70. data/lib/query_builder/cql/modifiers/password.rb +49 -0
  71. data/lib/query_builder/cql/modifiers/primary_key.rb +51 -0
  72. data/lib/query_builder/cql/modifiers/returns.rb +49 -0
  73. data/lib/query_builder/cql/modifiers/selected.rb +54 -0
  74. data/lib/query_builder/cql/modifiers/sfunc.rb +47 -0
  75. data/lib/query_builder/cql/modifiers/statement.rb +47 -0
  76. data/lib/query_builder/cql/modifiers/stype.rb +47 -0
  77. data/lib/query_builder/cql/modifiers/superuser.rb +54 -0
  78. data/lib/query_builder/cql/modifiers/timestamp.rb +50 -0
  79. data/lib/query_builder/cql/modifiers/unlogged.rb +45 -0
  80. data/lib/query_builder/cql/modifiers/update.rb +44 -0
  81. data/lib/query_builder/cql/modifiers/using.rb +48 -0
  82. data/lib/query_builder/cql/modifiers/using_options.rb +51 -0
  83. data/lib/query_builder/cql/modifiers/where.rb +44 -0
  84. data/lib/query_builder/cql/modifiers/where_clustered.rb +51 -0
  85. data/lib/query_builder/cql/modifiers/with.rb +44 -0
  86. data/lib/query_builder/cql/modifiers/with_options.rb +42 -0
  87. data/lib/query_builder/cql/operators.rb +29 -0
  88. data/lib/query_builder/cql/operators/cql.rb +23 -0
  89. data/lib/query_builder/cql/operators/cql_composite.rb +20 -0
  90. data/lib/query_builder/cql/operators/cql_dec.rb +21 -0
  91. data/lib/query_builder/cql/operators/cql_element.rb +23 -0
  92. data/lib/query_builder/cql/operators/cql_entries.rb +20 -0
  93. data/lib/query_builder/cql/operators/cql_frozen.rb +20 -0
  94. data/lib/query_builder/cql/operators/cql_full.rb +20 -0
  95. data/lib/query_builder/cql/operators/cql_gt.rb +23 -0
  96. data/lib/query_builder/cql/operators/cql_gte.rb +23 -0
  97. data/lib/query_builder/cql/operators/cql_in.rb +23 -0
  98. data/lib/query_builder/cql/operators/cql_inc.rb +21 -0
  99. data/lib/query_builder/cql/operators/cql_keys.rb +20 -0
  100. data/lib/query_builder/cql/operators/cql_list.rb +21 -0
  101. data/lib/query_builder/cql/operators/cql_literal.rb +84 -0
  102. data/lib/query_builder/cql/operators/cql_lt.rb +23 -0
  103. data/lib/query_builder/cql/operators/cql_lte.rb +23 -0
  104. data/lib/query_builder/cql/operators/cql_map.rb +25 -0
  105. data/lib/query_builder/cql/operators/cql_set.rb +21 -0
  106. data/lib/query_builder/cql/operators/cql_token.rb +21 -0
  107. data/lib/query_builder/cql/operators/cql_token_value.rb +23 -0
  108. data/lib/query_builder/cql/operators/cql_ttl.rb +20 -0
  109. data/lib/query_builder/cql/operators/cql_tuple.rb +21 -0
  110. data/lib/query_builder/cql/operators/cql_tuple_value.rb +23 -0
  111. data/lib/query_builder/cql/operators/cql_writetime.rb +20 -0
  112. data/lib/query_builder/cql/statements.rb +25 -0
  113. data/lib/query_builder/cql/statements/alter_column.rb +27 -0
  114. data/lib/query_builder/cql/statements/alter_field.rb +27 -0
  115. data/lib/query_builder/cql/statements/alter_keyspace.rb +25 -0
  116. data/lib/query_builder/cql/statements/alter_role.rb +26 -0
  117. data/lib/query_builder/cql/statements/alter_table.rb +25 -0
  118. data/lib/query_builder/cql/statements/alter_user.rb +26 -0
  119. data/lib/query_builder/cql/statements/batch.rb +31 -0
  120. data/lib/query_builder/cql/statements/create_aggregate.rb +36 -0
  121. data/lib/query_builder/cql/statements/create_column.rb +35 -0
  122. data/lib/query_builder/cql/statements/create_field.rb +25 -0
  123. data/lib/query_builder/cql/statements/create_function.rb +38 -0
  124. data/lib/query_builder/cql/statements/create_index.rb +41 -0
  125. data/lib/query_builder/cql/statements/create_keyspace.rb +26 -0
  126. data/lib/query_builder/cql/statements/create_role.rb +26 -0
  127. data/lib/query_builder/cql/statements/create_table.rb +30 -0
  128. data/lib/query_builder/cql/statements/create_trigger.rb +29 -0
  129. data/lib/query_builder/cql/statements/create_type.rb +26 -0
  130. data/lib/query_builder/cql/statements/create_user.rb +27 -0
  131. data/lib/query_builder/cql/statements/delete.rb +32 -0
  132. data/lib/query_builder/cql/statements/drop_aggregate.rb +25 -0
  133. data/lib/query_builder/cql/statements/drop_column.rb +23 -0
  134. data/lib/query_builder/cql/statements/drop_function.rb +25 -0
  135. data/lib/query_builder/cql/statements/drop_index.rb +25 -0
  136. data/lib/query_builder/cql/statements/drop_keyspace.rb +25 -0
  137. data/lib/query_builder/cql/statements/drop_role.rb +25 -0
  138. data/lib/query_builder/cql/statements/drop_table.rb +25 -0
  139. data/lib/query_builder/cql/statements/drop_trigger.rb +25 -0
  140. data/lib/query_builder/cql/statements/drop_type.rb +25 -0
  141. data/lib/query_builder/cql/statements/drop_user.rb +25 -0
  142. data/lib/query_builder/cql/statements/grant.rb +31 -0
  143. data/lib/query_builder/cql/statements/insert.rb +27 -0
  144. data/lib/query_builder/cql/statements/list_permissions.rb +35 -0
  145. data/lib/query_builder/cql/statements/list_roles.rb +23 -0
  146. data/lib/query_builder/cql/statements/list_users.rb +23 -0
  147. data/lib/query_builder/cql/statements/rename_column.rb +27 -0
  148. data/lib/query_builder/cql/statements/rename_field.rb +25 -0
  149. data/lib/query_builder/cql/statements/revoke.rb +31 -0
  150. data/lib/query_builder/cql/statements/select.rb +35 -0
  151. data/lib/query_builder/cql/statements/truncate.rb +23 -0
  152. data/lib/query_builder/cql/statements/update.rb +31 -0
  153. data/lib/query_builder/cql/statements/use.rb +23 -0
  154. data/lib/query_builder/rspec.rb +25 -0
  155. data/lib/query_builder/version.rb +9 -0
  156. data/query_builder.gemspec +31 -0
  157. data/spec/integration/alter_keyspace_spec.rb +17 -0
  158. data/spec/integration/alter_role_spec.rb +28 -0
  159. data/spec/integration/alter_table_add_spec.rb +21 -0
  160. data/spec/integration/alter_table_alter_spec.rb +15 -0
  161. data/spec/integration/alter_table_drop_spec.rb +15 -0
  162. data/spec/integration/alter_table_rename_spec.rb +15 -0
  163. data/spec/integration/alter_table_with_spec.rb +17 -0
  164. data/spec/integration/alter_type_add_spec.rb +15 -0
  165. data/spec/integration/alter_type_alter_spec.rb +15 -0
  166. data/spec/integration/alter_type_rename_spec.rb +15 -0
  167. data/spec/integration/alter_user_spec.rb +28 -0
  168. data/spec/integration/batch_spec.rb +32 -0
  169. data/spec/integration/create_aggregate_spec.rb +31 -0
  170. data/spec/integration/create_function_spec.rb +29 -0
  171. data/spec/integration/create_index_spec.rb +35 -0
  172. data/spec/integration/create_keyspace_spec.rb +24 -0
  173. data/spec/integration/create_role_spec.rb +26 -0
  174. data/spec/integration/create_table_spec.rb +34 -0
  175. data/spec/integration/create_trigger_spec.rb +21 -0
  176. data/spec/integration/create_type_spec.rb +20 -0
  177. data/spec/integration/create_user_spec.rb +23 -0
  178. data/spec/integration/delete_spec.rb +28 -0
  179. data/spec/integration/drop_aggregate_spec.rb +21 -0
  180. data/spec/integration/drop_function_spec.rb +21 -0
  181. data/spec/integration/drop_index_spec.rb +21 -0
  182. data/spec/integration/drop_keyspace_spec.rb +18 -0
  183. data/spec/integration/drop_role_spec.rb +18 -0
  184. data/spec/integration/drop_table_spec.rb +18 -0
  185. data/spec/integration/drop_trigger_spec.rb +21 -0
  186. data/spec/integration/drop_type_spec.rb +18 -0
  187. data/spec/integration/drop_user_spec.rb +18 -0
  188. data/spec/integration/grant_spec.rb +29 -0
  189. data/spec/integration/insert_spec.rb +22 -0
  190. data/spec/integration/list_permissions_spec.rb +34 -0
  191. data/spec/integration/list_roles_spec.rb +12 -0
  192. data/spec/integration/list_users_spec.rb +12 -0
  193. data/spec/integration/revoke_spec.rb +29 -0
  194. data/spec/integration/select_spec.rb +46 -0
  195. data/spec/integration/truncate_spec.rb +12 -0
  196. data/spec/integration/update_spec.rb +23 -0
  197. data/spec/integration/use_spec.rb +12 -0
  198. data/spec/spec_helper.rb +16 -0
  199. data/spec/unit/core/attribute_error_spec.rb +38 -0
  200. data/spec/unit/core/attribute_spec.rb +70 -0
  201. data/spec/unit/core/base_spec.rb +110 -0
  202. data/spec/unit/core/clause_spec.rb +101 -0
  203. data/spec/unit/core/statement_spec.rb +88 -0
  204. data/spec/unit/cql/operators/cql_composite_spec.rb +12 -0
  205. data/spec/unit/cql/operators/cql_dec_spec.rb +12 -0
  206. data/spec/unit/cql/operators/cql_element_spec.rb +12 -0
  207. data/spec/unit/cql/operators/cql_entries_spec.rb +12 -0
  208. data/spec/unit/cql/operators/cql_frozen_spec.rb +12 -0
  209. data/spec/unit/cql/operators/cql_full_spec.rb +12 -0
  210. data/spec/unit/cql/operators/cql_gt_spec.rb +19 -0
  211. data/spec/unit/cql/operators/cql_gte_spec.rb +19 -0
  212. data/spec/unit/cql/operators/cql_in_spec.rb +12 -0
  213. data/spec/unit/cql/operators/cql_inc_spec.rb +12 -0
  214. data/spec/unit/cql/operators/cql_keys_spec.rb +12 -0
  215. data/spec/unit/cql/operators/cql_list_spec.rb +12 -0
  216. data/spec/unit/cql/operators/cql_literal_spec.rb +83 -0
  217. data/spec/unit/cql/operators/cql_lt_spec.rb +19 -0
  218. data/spec/unit/cql/operators/cql_lte_spec.rb +19 -0
  219. data/spec/unit/cql/operators/cql_map_spec.rb +12 -0
  220. data/spec/unit/cql/operators/cql_set_spec.rb +12 -0
  221. data/spec/unit/cql/operators/cql_spec.rb +12 -0
  222. data/spec/unit/cql/operators/cql_token_spec.rb +12 -0
  223. data/spec/unit/cql/operators/cql_token_value_spec.rb +12 -0
  224. data/spec/unit/cql/operators/cql_ttl_spec.rb +12 -0
  225. data/spec/unit/cql/operators/cql_tuple_spec.rb +12 -0
  226. data/spec/unit/cql/operators/cql_tuple_value_spec.rb +12 -0
  227. data/spec/unit/cql/operators/cql_writetime_spec.rb +12 -0
  228. data/spec/unit/cql/operators_spec.rb +66 -0
  229. 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,12 @@
1
+ # encoding: utf-8
2
+
3
+ describe "LIST ROLES" do
4
+
5
+ let(:statement) { QueryBuilder::CQL.roles }
6
+
7
+ it_behaves_like :query_builder do
8
+ subject { statement }
9
+ let(:cql) { "LIST ROLES;" }
10
+ end
11
+
12
+ end # describe LIST ROLES
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ describe "LIST USERS" do
4
+
5
+ let(:statement) { QueryBuilder::CQL.users }
6
+
7
+ it_behaves_like :query_builder do
8
+ subject { statement }
9
+ let(:cql) { "LIST USERS;" }
10
+ end
11
+
12
+ end # describe LIST USERS
@@ -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
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ describe "USE" do
4
+
5
+ let(:keyspace) { QueryBuilder::CQL.keyspace(:wildlife) }
6
+
7
+ it_behaves_like :query_builder do
8
+ subject { keyspace.use }
9
+ let(:cql) { "USE wildlife;" }
10
+ end
11
+
12
+ end # describe USE
@@ -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