axiom 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -1
  3. data/.rubocop.yml +7 -0
  4. data/.travis.yml +10 -7
  5. data/Gemfile +4 -0
  6. data/Gemfile.devtools +27 -13
  7. data/Guardfile +2 -2
  8. data/README.md +36 -30
  9. data/TODO +22 -24
  10. data/axiom.gemspec +9 -9
  11. data/benchmarks/memory.rb +1 -2
  12. data/benchmarks/speed.rb +7 -8
  13. data/config/flay.yml +1 -1
  14. data/config/reek.yml +19 -7
  15. data/config/rubocop.yml +6 -9
  16. data/lib/axiom.rb +28 -13
  17. data/lib/axiom/aggregate/mean.rb +4 -3
  18. data/lib/axiom/aggregate/sum.rb +1 -1
  19. data/lib/axiom/algebra/extension.rb +1 -1
  20. data/lib/axiom/algebra/join.rb +4 -27
  21. data/lib/axiom/algebra/product.rb +3 -3
  22. data/lib/axiom/algebra/projection.rb +2 -2
  23. data/lib/axiom/algebra/rename.rb +2 -2
  24. data/lib/axiom/algebra/rename/aliases.rb +3 -3
  25. data/lib/axiom/algebra/summarization.rb +3 -3
  26. data/lib/axiom/attribute.rb +5 -4
  27. data/lib/axiom/attribute/comparable.rb +15 -11
  28. data/lib/axiom/attribute/date.rb +1 -1
  29. data/lib/axiom/attribute/date_time.rb +1 -1
  30. data/lib/axiom/attribute/length_comparable.rb +39 -0
  31. data/lib/axiom/attribute/numeric.rb +1 -26
  32. data/lib/axiom/attribute/relation.rb +64 -0
  33. data/lib/axiom/attribute/string.rb +1 -28
  34. data/lib/axiom/attribute/time.rb +1 -1
  35. data/lib/axiom/attribute/tuple.rb +50 -0
  36. data/lib/axiom/attribute/value_comparable.rb +42 -0
  37. data/lib/axiom/function.rb +1 -1
  38. data/lib/axiom/function/binary.rb +4 -16
  39. data/lib/axiom/function/comparable.rb +1 -1
  40. data/lib/axiom/function/connective/conjunction.rb +1 -1
  41. data/lib/axiom/function/connective/disjunction.rb +1 -1
  42. data/lib/axiom/function/connective/negation.rb +1 -1
  43. data/lib/axiom/function/numeric/exponentiation.rb +1 -1
  44. data/lib/axiom/function/numeric/square_root.rb +1 -1
  45. data/lib/axiom/function/predicate/enumerable.rb +0 -14
  46. data/lib/axiom/function/predicate/exclusion.rb +1 -1
  47. data/lib/axiom/function/predicate/inclusion.rb +1 -1
  48. data/lib/axiom/function/proposition.rb +12 -25
  49. data/lib/axiom/function/unary.rb +92 -106
  50. data/lib/axiom/relation.rb +3 -3
  51. data/lib/axiom/relation/base.rb +15 -0
  52. data/lib/axiom/relation/header.rb +25 -22
  53. data/lib/axiom/relation/index.rb +91 -0
  54. data/lib/axiom/relation/keys.rb +3 -3
  55. data/lib/axiom/relation/materialized.rb +48 -4
  56. data/lib/axiom/relation/operation/binary.rb +5 -5
  57. data/lib/axiom/relation/operation/group.rb +95 -0
  58. data/lib/axiom/relation/operation/limit.rb +15 -15
  59. data/lib/axiom/relation/operation/offset.rb +12 -12
  60. data/lib/axiom/relation/operation/reverse.rb +9 -9
  61. data/lib/axiom/relation/operation/set.rb +1 -1
  62. data/lib/axiom/relation/operation/{order.rb → sorted.rb} +29 -28
  63. data/lib/axiom/relation/operation/{order → sorted}/direction.rb +4 -4
  64. data/lib/axiom/relation/operation/{order → sorted}/direction_set.rb +3 -3
  65. data/lib/axiom/relation/operation/ungroup.rb +82 -0
  66. data/lib/axiom/relation/operation/unwrap.rb +80 -0
  67. data/lib/axiom/relation/operation/wrap.rb +85 -0
  68. data/lib/axiom/relation/proxy.rb +5 -6
  69. data/lib/axiom/relation/variable.rb +1 -2
  70. data/lib/axiom/support/aliasable.rb +3 -5
  71. data/lib/axiom/support/equalizer.rb +10 -12
  72. data/lib/axiom/support/operation/binary.rb +3 -2
  73. data/lib/axiom/support/operation/unary.rb +1 -1
  74. data/lib/axiom/tuple.rb +76 -26
  75. data/lib/axiom/types/relation.rb +13 -0
  76. data/lib/axiom/types/tuple.rb +13 -0
  77. data/lib/axiom/version.rb +1 -1
  78. data/spec/integration/axiom/relation/efficient_enumerable_spec.rb +9 -9
  79. data/spec/integration/axiom/relation/writable_relations_spec.rb +12 -12
  80. data/spec/shared/invertible_method_behaviour.rb +1 -1
  81. data/spec/spec_helper.rb +8 -6
  82. data/spec/unit/axiom/aggregate/call_spec.rb +7 -12
  83. data/spec/unit/axiom/aggregate/class_methods/default_spec.rb +7 -2
  84. data/spec/unit/axiom/aggregate/default_spec.rb +1 -1
  85. data/spec/unit/axiom/aggregate/finalize_spec.rb +1 -1
  86. data/spec/unit/axiom/aggregate/maximum/type_spec.rb +2 -6
  87. data/spec/unit/axiom/aggregate/mean/class_methods/call_spec.rb +2 -2
  88. data/spec/unit/axiom/aggregate/mean/class_methods/finalize_spec.rb +10 -3
  89. data/spec/unit/axiom/aggregate/minimum/type_spec.rb +2 -6
  90. data/spec/unit/axiom/aggregate/sum/default_spec.rb +32 -6
  91. data/spec/unit/axiom/aggregate/sum/type_spec.rb +2 -6
  92. data/spec/unit/axiom/aggregate/variance/class_methods/call_spec.rb +6 -6
  93. data/spec/unit/axiom/algebra/difference/each_spec.rb +3 -3
  94. data/spec/unit/axiom/algebra/extension/class_methods/new_spec.rb +1 -1
  95. data/spec/unit/axiom/algebra/extension/each_spec.rb +2 -2
  96. data/spec/unit/axiom/algebra/intersection/each_spec.rb +3 -3
  97. data/spec/unit/axiom/algebra/join/each_spec.rb +6 -6
  98. data/spec/unit/axiom/algebra/product/each_spec.rb +2 -2
  99. data/spec/unit/axiom/algebra/projection/each_spec.rb +2 -2
  100. data/spec/unit/axiom/algebra/rename/directions_spec.rb +3 -3
  101. data/spec/unit/axiom/algebra/rename/each_spec.rb +2 -2
  102. data/spec/unit/axiom/algebra/restriction/delete_spec.rb +3 -3
  103. data/spec/unit/axiom/algebra/restriction/each_spec.rb +12 -11
  104. data/spec/unit/axiom/algebra/restriction/insert_spec.rb +3 -3
  105. data/spec/unit/axiom/algebra/restriction/methods/restrict_spec.rb +4 -4
  106. data/spec/unit/axiom/algebra/summarization/each_spec.rb +2 -2
  107. data/spec/unit/axiom/algebra/summarization/eql_spec.rb +1 -1
  108. data/spec/unit/axiom/algebra/summarization/summaries/summarize_by_spec.rb +4 -4
  109. data/spec/unit/axiom/algebra/summarization/summaries/to_hash_spec.rb +2 -2
  110. data/spec/unit/axiom/algebra/summarization/summary/summarize_by_spec.rb +1 -1
  111. data/spec/unit/axiom/algebra/union/each_spec.rb +4 -4
  112. data/spec/unit/axiom/aliasable/fixtures/classes.rb +3 -1
  113. data/spec/unit/axiom/aliasable/inheritable_alias_spec.rb +18 -27
  114. data/spec/unit/axiom/attribute/call_spec.rb +1 -1
  115. data/spec/unit/axiom/attribute/class_methods/coerce_spec.rb +57 -51
  116. data/spec/unit/axiom/attribute/class_methods/new_spec.rb +1 -1
  117. data/spec/unit/axiom/attribute/comparable/asc_spec.rb +4 -2
  118. data/spec/unit/axiom/attribute/comparable/desc_spec.rb +4 -2
  119. data/spec/unit/axiom/attribute/comparable/range_spec.rb +20 -0
  120. data/spec/unit/axiom/attribute/eql_spec.rb +1 -1
  121. data/spec/unit/axiom/attribute/equality_operator_spec.rb +1 -1
  122. data/spec/unit/axiom/attribute/include_predicate_spec.rb +1 -1
  123. data/spec/unit/axiom/attribute/name_spec.rb +1 -1
  124. data/spec/unit/axiom/attribute/optional_predicate_spec.rb +1 -1
  125. data/spec/unit/axiom/attribute/relation/class_methods/new_spec.rb +56 -0
  126. data/spec/unit/axiom/attribute/relation/class_methods/type_spec.rb +13 -0
  127. data/spec/unit/axiom/attribute/relation/header_spec.rb +13 -0
  128. data/spec/unit/axiom/attribute/relation/new_relation_spec.rb +15 -0
  129. data/spec/unit/axiom/attribute/rename_spec.rb +1 -1
  130. data/spec/unit/axiom/attribute/required_predicate_spec.rb +1 -1
  131. data/spec/unit/axiom/attribute/tuple/class_methods/new_spec.rb +56 -0
  132. data/spec/unit/axiom/attribute/tuple/class_methods/type_spec.rb +13 -0
  133. data/spec/unit/axiom/attribute/tuple/header_spec.rb +13 -0
  134. data/spec/unit/axiom/equalizer/class_method/new_spec.rb +24 -54
  135. data/spec/unit/axiom/evaluator/context/add_spec.rb +7 -7
  136. data/spec/unit/axiom/evaluator/context/element_reader_spec.rb +4 -4
  137. data/spec/unit/axiom/evaluator/context/functions_spec.rb +1 -1
  138. data/spec/unit/axiom/evaluator/context/method_missing_spec.rb +3 -3
  139. data/spec/unit/axiom/evaluator/context/respond_to_predicate_spec.rb +3 -3
  140. data/spec/unit/axiom/evaluator/context/send_spec.rb +8 -8
  141. data/spec/unit/axiom/function/binary/call_spec.rb +1 -1
  142. data/spec/unit/axiom/function/binary/type_spec.rb +12 -10
  143. data/spec/unit/axiom/function/comparable/class_methods/included_spec.rb +2 -2
  144. data/spec/unit/axiom/function/connective/negation/inverse_spec.rb +1 -1
  145. data/spec/unit/axiom/function/predicate/call_spec.rb +5 -4
  146. data/spec/unit/axiom/function/predicate/enumerable/call_spec.rb +12 -2
  147. data/spec/unit/axiom/function/predicate/eql_spec.rb +4 -3
  148. data/spec/unit/axiom/function/predicate/equality/methods/eq_spec.rb +5 -1
  149. data/spec/unit/axiom/function/predicate/exclusion/class_methods/call_spec.rb +37 -8
  150. data/spec/unit/axiom/function/predicate/exclusion/methods/exclude_spec.rb +6 -2
  151. data/spec/unit/axiom/function/predicate/greater_than/methods/gt_spec.rb +5 -1
  152. data/spec/unit/axiom/function/predicate/greater_than_or_equal_to/methods/gte_spec.rb +5 -1
  153. data/spec/unit/axiom/function/predicate/inclusion/class_methods/call_spec.rb +37 -8
  154. data/spec/unit/axiom/function/predicate/inclusion/methods/include_spec.rb +6 -2
  155. data/spec/unit/axiom/function/predicate/inequality/methods/ne_spec.rb +5 -1
  156. data/spec/unit/axiom/function/predicate/less_than/methods/lt_spec.rb +5 -1
  157. data/spec/unit/axiom/function/predicate/less_than_or_equal_to/methods/lte_spec.rb +5 -1
  158. data/spec/unit/axiom/function/predicate/match/methods/match_spec.rb +7 -3
  159. data/spec/unit/axiom/function/predicate/no_match/methods/no_match_spec.rb +6 -2
  160. data/spec/unit/axiom/function/proposition/call_spec.rb +6 -4
  161. data/spec/unit/axiom/function/proposition/class_methods/{new_spec.rb → coerce_spec.rb} +17 -17
  162. data/spec/unit/axiom/function/proposition/eql_spec.rb +4 -4
  163. data/spec/unit/axiom/function/proposition/equality_operator_spec.rb +3 -3
  164. data/spec/unit/axiom/function/proposition/inverse_spec.rb +4 -4
  165. data/spec/unit/axiom/function/proposition/rename_spec.rb +1 -1
  166. data/spec/unit/axiom/function/type_spec.rb +1 -1
  167. data/spec/unit/axiom/function/unary/call_spec.rb +1 -1
  168. data/spec/unit/axiom/function/unary/callable/call_spec.rb +3 -13
  169. data/spec/unit/axiom/function/unary/callable/included_spec.rb +2 -2
  170. data/spec/unit/axiom/function/unary/type_spec.rb +11 -1
  171. data/spec/unit/axiom/relation/base/eql_spec.rb +1 -1
  172. data/spec/unit/axiom/relation/base/equality_operator_spec.rb +138 -0
  173. data/spec/unit/axiom/relation/class_methods/new_spec.rb +7 -7
  174. data/spec/unit/axiom/relation/directions_spec.rb +2 -2
  175. data/spec/unit/axiom/relation/each_spec.rb +5 -5
  176. data/spec/unit/axiom/relation/element_reader_spec.rb +1 -1
  177. data/spec/unit/axiom/relation/empty/each_spec.rb +1 -1
  178. data/spec/unit/axiom/relation/empty_predicate_spec.rb +1 -1
  179. data/spec/unit/axiom/relation/eql_spec.rb +1 -1
  180. data/spec/unit/axiom/relation/equality_operator_spec.rb +1 -1
  181. data/spec/unit/axiom/relation/header/class_methods/coerce_spec.rb +2 -2
  182. data/spec/unit/axiom/relation/header/class_methods/new_spec.rb +3 -3
  183. data/spec/unit/axiom/relation/header/context_spec.rb +2 -2
  184. data/spec/unit/axiom/relation/header/each_spec.rb +2 -2
  185. data/spec/unit/axiom/relation/header/extend_spec.rb +1 -1
  186. data/spec/unit/axiom/relation/header/{call_spec.rb → fetch_spec.rb} +1 -1
  187. data/spec/unit/axiom/relation/header/project_spec.rb +1 -1
  188. data/spec/unit/axiom/relation/header/rename_spec.rb +19 -5
  189. data/spec/unit/axiom/relation/header/size_spec.rb +14 -0
  190. data/spec/unit/axiom/relation/header_spec.rb +1 -1
  191. data/spec/unit/axiom/relation/index/each_spec.rb +33 -0
  192. data/spec/unit/axiom/relation/index/element_reader_spec.rb +17 -0
  193. data/spec/unit/axiom/relation/index/left_shift_operator_spec.rb +23 -0
  194. data/spec/unit/axiom/relation/index/merge_spec.rb +19 -0
  195. data/spec/unit/axiom/relation/keys/class_methods/coerce_spec.rb +19 -2
  196. data/spec/unit/axiom/relation/keys/class_methods/new_spec.rb +1 -1
  197. data/spec/unit/axiom/relation/keys/each_spec.rb +2 -2
  198. data/spec/unit/axiom/relation/materialize_spec.rb +1 -1
  199. data/spec/unit/axiom/relation/materialized/class_methods/new_spec.rb +30 -4
  200. data/spec/unit/axiom/relation/materialized/directions_spec.rb +1 -1
  201. data/spec/unit/axiom/relation/materialized/materialized_predicate_spec.rb +1 -1
  202. data/spec/unit/axiom/relation/materialized_predicate_spec.rb +1 -1
  203. data/spec/unit/axiom/relation/operation/binary/class_methods/included_spec.rb +2 -2
  204. data/spec/unit/axiom/relation/operation/binary/class_methods/new_spec.rb +6 -6
  205. data/spec/unit/axiom/relation/operation/combination/class_methods/combine_tuples_spec.rb +4 -4
  206. data/spec/unit/axiom/relation/operation/group/each_spec.rb +33 -0
  207. data/spec/unit/axiom/relation/operation/group/header_spec.rb +22 -0
  208. data/spec/unit/axiom/relation/operation/group/methods/group_spec.rb +25 -0
  209. data/spec/unit/axiom/relation/operation/limit/class_methods/new_spec.rb +4 -4
  210. data/spec/unit/axiom/relation/operation/limit/directions_spec.rb +3 -3
  211. data/spec/unit/axiom/relation/operation/limit/each_spec.rb +4 -4
  212. data/spec/unit/axiom/relation/operation/limit/limit_spec.rb +2 -2
  213. data/spec/unit/axiom/relation/operation/offset/class_methods/new_spec.rb +4 -4
  214. data/spec/unit/axiom/relation/operation/offset/directions_spec.rb +3 -3
  215. data/spec/unit/axiom/relation/operation/offset/each_spec.rb +4 -4
  216. data/spec/unit/axiom/relation/operation/offset/offset_spec.rb +2 -2
  217. data/spec/unit/axiom/relation/operation/reverse/class_methods/new_spec.rb +6 -6
  218. data/spec/unit/axiom/relation/operation/reverse/directions_spec.rb +3 -3
  219. data/spec/unit/axiom/relation/operation/reverse/each_spec.rb +4 -4
  220. data/spec/unit/axiom/relation/operation/set/class_methods/included_spec.rb +2 -2
  221. data/spec/unit/axiom/relation/operation/{order → sorted}/ascending/class_methods/call_spec.rb +22 -1
  222. data/spec/unit/axiom/relation/operation/sorted/ascending/class_methods/reverse_spec.rb +11 -0
  223. data/spec/unit/axiom/relation/operation/{order/descending → sorted/ascending}/reverse_spec.rb +2 -2
  224. data/spec/unit/axiom/relation/operation/{order → sorted}/class_methods/new_spec.rb +4 -4
  225. data/spec/unit/axiom/relation/operation/{order → sorted}/delete_spec.rb +12 -6
  226. data/spec/unit/axiom/relation/operation/{order → sorted}/descending/class_methods/call_spec.rb +22 -1
  227. data/spec/unit/axiom/relation/operation/sorted/descending/class_methods/reverse_spec.rb +11 -0
  228. data/spec/unit/axiom/relation/operation/{order/ascending → sorted/descending}/reverse_spec.rb +2 -2
  229. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/attribute_spec.rb +4 -4
  230. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/call_spec.rb +7 -7
  231. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/class_methods/coerce_spec.rb +2 -2
  232. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/eql_predicate_spec.rb +4 -4
  233. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/name_spec.rb +4 -4
  234. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/rename_spec.rb +5 -5
  235. data/spec/unit/axiom/relation/operation/{order → sorted}/direction/reverse_spec.rb +9 -9
  236. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/attributes_spec.rb +1 -1
  237. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/class_methods/coerce_spec.rb +3 -3
  238. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/class_methods/new_spec.rb +1 -1
  239. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/eql_spec.rb +1 -1
  240. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/equality_operator_spec.rb +1 -1
  241. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/project_spec.rb +1 -1
  242. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/rename_spec.rb +1 -1
  243. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/reverse_spec.rb +2 -2
  244. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/sort_tuples_spec.rb +1 -1
  245. data/spec/unit/axiom/relation/operation/{order → sorted}/direction_set/to_ary_spec.rb +1 -1
  246. data/spec/unit/axiom/relation/operation/{order → sorted}/directions_spec.rb +1 -1
  247. data/spec/unit/axiom/relation/operation/{order → sorted}/each_spec.rb +3 -3
  248. data/spec/unit/axiom/relation/operation/{order → sorted}/eql_spec.rb +1 -1
  249. data/spec/unit/axiom/relation/operation/{order → sorted}/header_spec.rb +1 -1
  250. data/spec/unit/axiom/relation/operation/{order → sorted}/insert_spec.rb +12 -6
  251. data/spec/unit/axiom/relation/operation/{order → sorted}/methods/sort_by_spec.rb +24 -24
  252. data/spec/unit/axiom/relation/operation/sorted/methods/sort_spec.rb +19 -0
  253. data/spec/unit/axiom/relation/operation/ungroup/each_spec.rb +33 -0
  254. data/spec/unit/axiom/relation/operation/ungroup/header_spec.rb +19 -0
  255. data/spec/unit/axiom/relation/operation/ungroup/methods/ungroup_spec.rb +21 -0
  256. data/spec/unit/axiom/relation/operation/unwrap/each_spec.rb +33 -0
  257. data/spec/unit/axiom/relation/operation/unwrap/header_spec.rb +19 -0
  258. data/spec/unit/axiom/relation/operation/unwrap/methods/unwrap_spec.rb +21 -0
  259. data/spec/unit/axiom/relation/operation/wrap/each_spec.rb +33 -0
  260. data/spec/unit/axiom/relation/operation/wrap/header_spec.rb +22 -0
  261. data/spec/unit/axiom/relation/operation/wrap/methods/wrap_spec.rb +25 -0
  262. data/spec/unit/axiom/relation/proxy/each_spec.rb +2 -2
  263. data/spec/unit/axiom/relation/proxy/respond_to_predicate_spec.rb +48 -12
  264. data/spec/unit/axiom/relation/replace_spec.rb +8 -8
  265. data/spec/unit/axiom/tuple/class_methods/coerce_spec.rb +7 -1
  266. data/spec/unit/axiom/tuple/{call_spec.rb → fetch_spec.rb} +1 -1
  267. data/spec/unit/axiom/tuple/inspect_spec.rb +14 -0
  268. data/spec/unit/axiom/tuple/rename_spec.rb +17 -0
  269. data/spec/unit/axiom/tuple/size_spec.rb +14 -0
  270. data/spec/unit/axiom/tuple/to_ary_spec.rb +22 -5
  271. data/spec/unit/axiom/tuple/to_hash_spec.rb +14 -0
  272. data/spec/unit/axiom/types/relation/class_methods/primitive_spec.rb +13 -0
  273. data/spec/unit/axiom/types/tuple/class_methods/primitive_spec.rb +13 -0
  274. data/spec/unit/axiom/visitable/accept_spec.rb +1 -1
  275. data/spec/unit/date/pred_spec.rb +1 -1
  276. data/spec/unit/time/pred_spec.rb +1 -1
  277. metadata +631 -107
  278. data/spec/unit/axiom/aggregate/hash_spec.rb +0 -15
  279. data/spec/unit/axiom/algebra/extension/hash_spec.rb +0 -15
  280. data/spec/unit/axiom/algebra/projection/hash_spec.rb +0 -16
  281. data/spec/unit/axiom/algebra/rename/aliases/hash_spec.rb +0 -15
  282. data/spec/unit/axiom/algebra/rename/hash_spec.rb +0 -15
  283. data/spec/unit/axiom/algebra/restriction/hash_spec.rb +0 -15
  284. data/spec/unit/axiom/algebra/summarization/hash_spec.rb +0 -16
  285. data/spec/unit/axiom/attribute/hash_spec.rb +0 -21
  286. data/spec/unit/axiom/attribute/numeric/hash_spec.rb +0 -17
  287. data/spec/unit/axiom/attribute/string/hash_spec.rb +0 -25
  288. data/spec/unit/axiom/equalizer/methods/eql_spec.rb +0 -49
  289. data/spec/unit/axiom/equalizer/methods/equality_operator_spec.rb +0 -85
  290. data/spec/unit/axiom/function/binary/invertible/class_methods/included_spec.rb +0 -29
  291. data/spec/unit/axiom/function/predicate/hash_spec.rb +0 -16
  292. data/spec/unit/axiom/function/predicate/inverse_spec.rb +0 -17
  293. data/spec/unit/axiom/function/proposition/hash_spec.rb +0 -14
  294. data/spec/unit/axiom/function/unary/hash_spec.rb +0 -18
  295. data/spec/unit/axiom/function/unary/invertible/class_methods/included_spec.rb +0 -29
  296. data/spec/unit/axiom/operation/binary/hash_spec.rb +0 -16
  297. data/spec/unit/axiom/operation/unary/hash_spec.rb +0 -15
  298. data/spec/unit/axiom/relation/base/hash_spec.rb +0 -16
  299. data/spec/unit/axiom/relation/hash_spec.rb +0 -19
  300. data/spec/unit/axiom/relation/header/hash_spec.rb +0 -15
  301. data/spec/unit/axiom/relation/operation/limit/hash_spec.rb +0 -16
  302. data/spec/unit/axiom/relation/operation/offset/hash_spec.rb +0 -16
  303. data/spec/unit/axiom/relation/operation/order/ascending/class_methods/reverse_spec.rb +0 -11
  304. data/spec/unit/axiom/relation/operation/order/descending/class_methods/reverse_spec.rb +0 -11
  305. data/spec/unit/axiom/relation/operation/order/direction/hash_spec.rb +0 -15
  306. data/spec/unit/axiom/relation/operation/order/direction_set/hash_spec.rb +0 -15
  307. data/spec/unit/axiom/relation/operation/order/hash_spec.rb +0 -15
  308. data/spec/unit/axiom/relation/operation/order/methods/sort_spec.rb +0 -19
  309. data/spec/unit/axiom/relation/proxy/hash_spec.rb +0 -26
  310. data/spec/unit/axiom/relation/proxy/method_missing_spec.rb +0 -24
  311. data/spec/unit/axiom/tuple/hash_spec.rb +0 -15
@@ -25,7 +25,7 @@ describe Relation::Keys, '.new' do
25
25
  it { should == argument }
26
26
 
27
27
  it 'does not freeze the argument' do
28
- argument.should_not be_frozen
28
+ expect(argument).not_to be_frozen
29
29
  expect { subject }.to_not change(argument, :frozen?)
30
30
  end
31
31
  end
@@ -13,7 +13,7 @@ describe Relation::Keys, '#each' do
13
13
 
14
14
  it 'yields only headers' do
15
15
  subject
16
- yields.each { |header| header.should be_instance_of(Relation::Header) }
16
+ yields.each { |header| expect(header).to be_instance_of(Relation::Header) }
17
17
  end
18
18
 
19
19
  it 'yields only headers with the expected data' do
@@ -31,6 +31,6 @@ describe Relation::Keys do
31
31
  it { should be_kind_of(Enumerable) }
32
32
 
33
33
  it 'case matches Enumerable' do
34
- (Enumerable === subject).should be(true)
34
+ expect(Enumerable === subject).to be(true)
35
35
  end
36
36
  end
@@ -9,7 +9,7 @@ describe Relation, '#materialize' do
9
9
  let(:object) { described_class.new(header, LazyEnumerable.new([[1]])).sort_by { |r| r.id } }
10
10
 
11
11
  before do
12
- object.should be_kind_of(described_class)
12
+ expect(object).to be_kind_of(described_class)
13
13
  end
14
14
 
15
15
  it { should be_instance_of(Relation::Materialized) }
@@ -17,7 +17,7 @@ describe Relation::Materialized, '.new' do
17
17
  its(:header) { should be(header) }
18
18
 
19
19
  its(:directions) do
20
- should be_instance_of(Relation::Operation::Order::DirectionSet)
20
+ should be_instance_of(Relation::Operation::Sorted::DirectionSet)
21
21
  should == directions
22
22
  end
23
23
 
@@ -31,19 +31,45 @@ describe Relation::Materialized, '.new' do
31
31
 
32
32
  its(:header) { should be(header) }
33
33
 
34
- its(:directions) { should be(Relation::Operation::Order::DirectionSet::EMPTY) }
34
+ its(:directions) { should be(Relation::Operation::Sorted::DirectionSet::EMPTY) }
35
35
 
36
36
  it { should == tuples }
37
37
  end
38
38
 
39
+ context 'with empty tuples and no directions' do
40
+ subject { object.new(header, tuples) }
41
+
42
+ let(:tuples) { [] }
43
+
44
+ it { should be_instance_of(Relation::Empty) }
45
+
46
+ its(:header) { should be(header) }
47
+
48
+ its(:directions) { should be(Relation::Operation::Sorted::DirectionSet::EMPTY) }
49
+
50
+ it { should be_empty }
51
+ end
52
+
39
53
  context 'with no tuples or directions' do
40
54
  subject { object.new(header) }
41
55
 
42
- it { should be_instance_of(object) }
56
+ it { should be_instance_of(Relation::Empty) }
57
+
58
+ its(:header) { should be(header) }
59
+
60
+ its(:directions) { should be(Relation::Operation::Sorted::DirectionSet::EMPTY) }
61
+
62
+ it { should be_empty }
63
+ end
64
+
65
+ context 'with no tuples or directions' do
66
+ subject { object.new(header) }
67
+
68
+ it { should be_instance_of(Relation::Empty) }
43
69
 
44
70
  its(:header) { should be(header) }
45
71
 
46
- its(:directions) { should be(Relation::Operation::Order::DirectionSet::EMPTY) }
72
+ its(:directions) { should be(Relation::Operation::Sorted::DirectionSet::EMPTY) }
47
73
 
48
74
  it { should be_empty }
49
75
  end
@@ -22,6 +22,6 @@ describe Relation::Materialized, '#directions' do
22
22
 
23
23
  it_should_behave_like 'an idempotent method'
24
24
 
25
- it { should be(Relation::Operation::Order::DirectionSet::EMPTY) }
25
+ it { should be(Relation::Operation::Sorted::DirectionSet::EMPTY) }
26
26
  end
27
27
  end
@@ -8,7 +8,7 @@ describe Relation::Materialized, '#materialized?' do
8
8
  let(:object) { described_class.new([[:id, Integer]], [[1]]) }
9
9
 
10
10
  before do
11
- object.should be_instance_of(described_class)
11
+ expect(object).to be_instance_of(described_class)
12
12
  end
13
13
 
14
14
  it { should be(true) }
@@ -8,7 +8,7 @@ describe Relation, '#materialized?' do
8
8
  let(:object) { described_class.new([[:id, Integer]], LazyEnumerable.new) }
9
9
 
10
10
  before do
11
- object.should be_instance_of(described_class)
11
+ expect(object).to be_instance_of(described_class)
12
12
  end
13
13
 
14
14
  it { should be(false) }
@@ -9,9 +9,9 @@ describe Relation::Operation::Binary, '.included' do
9
9
  let(:klass) { Class.new }
10
10
 
11
11
  it 'extends the klass' do
12
- klass.singleton_class.should_not include(described_class::ClassMethods)
12
+ expect(klass.singleton_class).not_to include(described_class::ClassMethods)
13
13
  klass.send(:include, subject)
14
- klass.singleton_class.should include(described_class::ClassMethods)
14
+ expect(klass.singleton_class).to include(described_class::ClassMethods)
15
15
  end
16
16
 
17
17
  it 'delegates to the ancestor' do
@@ -10,31 +10,31 @@ describe Relation::Operation::Binary::ClassMethods, '#new' do
10
10
  let(:original_right) { Relation.new([[:name, String]], [['Dan Kubb']]) }
11
11
  let(:object) { BinaryRelationOperationSpecs::Object }
12
12
 
13
- context 'with left and right ordered' do
13
+ context 'with left and right sorted' do
14
14
  let(:left) { original_left.sort_by { |r| r.id } }
15
15
  let(:right) { original_right.sort_by { |r| r.name } }
16
16
 
17
17
  it { should be_instance_of(object) }
18
18
  end
19
19
 
20
- context 'with left and right unordered' do
20
+ context 'with left and right unsorted' do
21
21
  let(:left) { original_left }
22
22
  let(:right) { original_right }
23
23
 
24
24
  it { should be_instance_of(object) }
25
25
  end
26
26
 
27
- context 'with left ordered, and right unordered' do
27
+ context 'with left sorted, and right unsorted' do
28
28
  let(:left) { original_left.sort_by { |r| r.id } }
29
29
  let(:right) { original_right }
30
30
 
31
- specify { expect { subject }.to raise_error(RelationMismatchError, 'both relations must be ordered or neither may be ordered') }
31
+ specify { expect { subject }.to raise_error(RelationMismatchError, 'both relations must be sorted or neither may be sorted') }
32
32
  end
33
33
 
34
- context 'with right ordered, and left unordered' do
34
+ context 'with right sorted, and left unsorted' do
35
35
  let(:left) { original_left }
36
36
  let(:right) { original_right.sort_by { |r| r.name } }
37
37
 
38
- specify { expect { subject }.to raise_error(RelationMismatchError, 'both relations must be ordered or neither may be ordered') }
38
+ specify { expect { subject }.to raise_error(RelationMismatchError, 'both relations must be sorted or neither may be sorted') }
39
39
  end
40
40
  end
@@ -12,12 +12,12 @@ describe Relation::Operation::Combination, '.combine_tuples' do
12
12
  )
13
13
  end
14
14
 
15
- let(:left_header) { Relation::Header.coerce([[:id, Integer]]) }
16
- let(:right_header) { Relation::Header.coerce([[:name, String]]) }
15
+ let(:object) { self.class.described_class }
16
+ let(:header) { left_header | right_header }
17
17
  let(:left_tuple) { Tuple.new(left_header, [1]) }
18
18
  let(:right_tuples) { [Tuple.new(right_header, ['Dan Kubb'])] }
19
- let(:header) { left_header | right_header }
20
- let(:object) { self.class.described_class }
19
+ let(:left_header) { Relation::Header.coerce([[:id, Integer]]) }
20
+ let(:right_header) { Relation::Header.coerce([[:name, String]]) }
21
21
  let(:yields) { [] }
22
22
 
23
23
  it 'yields each combined tuple' do
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Operation::Group, '#each' do
6
+ subject { object }
7
+
8
+ let(:object) { described_class.new(relation, :names, [:name]) }
9
+ let(:relation) { Relation.new(header, body) }
10
+ let(:header) { [[:id, Integer], [:name, String]] }
11
+ let(:body) { [[1, 'John Doe']] }
12
+
13
+ it_should_behave_like 'an #each method'
14
+
15
+ it 'is a command method' do
16
+ expect(subject.each(&EMPTY_PROC)).to be(object)
17
+ end
18
+
19
+ it 'yields only tuples' do
20
+ expect { |block| subject.each(&block) }.to yield_with_args(Tuple)
21
+ end
22
+
23
+ it 'yields only tuples with the expected header' do
24
+ tuples = []
25
+ subject.each(&tuples.method(:<<))
26
+ expect(tuples.first.header).to be(object.header)
27
+ end
28
+
29
+ it 'yields only tuples with the expected data' do
30
+ expect { |block| subject.each(&block) }
31
+ .to yield_with_args([1, [['John Doe']]])
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Operation::Group, '#header' do
6
+ subject { object.header }
7
+
8
+ let(:object) { described_class.new(relation, :names, [:name]) }
9
+ let(:relation) { Relation.new(header, []) }
10
+ let(:header) { [[:id, Integer], [:name, String]] }
11
+
12
+ it_should_behave_like 'an idempotent method'
13
+
14
+ it { should be_instance_of(Relation::Header) }
15
+
16
+ it 'returns the expected attributes' do
17
+ should == [
18
+ Attribute::Integer.new(:id),
19
+ Attribute::Relation.new(:names, header: [[:name, String]]),
20
+ ]
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Operation::Group::Methods, '#group' do
6
+ subject { object.group(name => attributes) }
7
+
8
+ let(:object) { described_class.new(header, body) }
9
+ let(:described_class) { Relation }
10
+ let(:header) { [[:id, Integer], [:name, String]] }
11
+ let(:body) { [[1, 'John Doe']] }
12
+ let(:name) { :names }
13
+ let(:attributes) { [:name] }
14
+
15
+ it { should be_instance_of(Relation::Operation::Group) }
16
+
17
+ its(:header) do
18
+ should == [
19
+ Attribute::Integer.new(:id),
20
+ Attribute::Relation.new(:names, header: [[:name, String]]),
21
+ ]
22
+ end
23
+
24
+ its(:to_a) { should eq([[1, [['John Doe']]]]) }
25
+ end
@@ -8,25 +8,25 @@ describe Relation::Operation::Limit, '.new' do
8
8
  let(:original_relation) { Relation.new([[:id, Integer]], [[1], [2]]) }
9
9
  let(:object) { described_class }
10
10
 
11
- context 'with an ordered relation' do
11
+ context 'with a sorted relation' do
12
12
  let(:relation) { original_relation.sort_by { |r| r.id } }
13
13
  let(:limit) { 1 }
14
14
 
15
15
  it { should be_instance_of(object) }
16
16
  end
17
17
 
18
- context 'with an ordered relation having an empty header' do
18
+ context 'with a sorted relation having an empty header' do
19
19
  let(:relation) { original_relation.sort_by { |r| r.id }.project([]) }
20
20
  let(:limit) { 1 }
21
21
 
22
22
  it { should be_instance_of(object) }
23
23
  end
24
24
 
25
- context 'without an ordered relation' do
25
+ context 'without a sorted relation' do
26
26
  let(:relation) { original_relation }
27
27
  let(:limit) { 1 }
28
28
 
29
- specify { expect { subject }.to raise_error(OrderedRelationRequiredError, 'can only limit an ordered operand') }
29
+ specify { expect { subject }.to raise_error(SortededRelationRequiredError, 'can only limit a sorted operand') }
30
30
  end
31
31
 
32
32
  context 'with an limit less than 0' do
@@ -6,10 +6,10 @@ describe Relation::Operation::Limit, '#directions' do
6
6
  subject { object.directions }
7
7
 
8
8
  let(:relation) { Relation.new([[:id, Integer]], LazyEnumerable.new) }
9
- let(:object) { described_class.new(ordered, 1) }
10
- let(:ordered) { relation.sort_by { |r| r.id } }
9
+ let(:object) { described_class.new(sorted, 1) }
10
+ let(:sorted) { relation.sort_by { |r| r.id } }
11
11
 
12
12
  it_should_behave_like 'an idempotent method'
13
13
 
14
- it { should be(ordered.directions) }
14
+ it { should be(sorted.directions) }
15
15
  end
@@ -5,21 +5,21 @@ require 'spec_helper'
5
5
  describe Relation::Operation::Limit, '#each' do
6
6
  subject { object.each { |tuple| yields << tuple } }
7
7
 
8
- let(:object) { described_class.new(order, 1) }
8
+ let(:object) { described_class.new(sorted, 1) }
9
9
  let(:relation) { Relation.new([[:id, Integer]], [[1], [2], [3]]) }
10
- let(:order) { relation.sort_by { |r| r.id } }
10
+ let(:sorted) { relation.sort_by { |r| r.id } }
11
11
  let(:yields) { [] }
12
12
 
13
13
  it_should_behave_like 'an #each method'
14
14
 
15
15
  it 'yields only tuples' do
16
16
  subject
17
- yields.each { |tuple| tuple.should be_instance_of(Tuple) }
17
+ yields.each { |tuple| expect(tuple).to be_instance_of(Tuple) }
18
18
  end
19
19
 
20
20
  it 'yields only tuples with the expected header' do
21
21
  subject
22
- yields.each { |tuple| tuple.header.should be(object.header) }
22
+ yields.each { |tuple| expect(tuple.header).to be(object.header) }
23
23
  end
24
24
 
25
25
  it 'yields only tuples with the expected data' do
@@ -6,9 +6,9 @@ describe Relation::Operation::Limit, '#limit' do
6
6
  subject { object.limit }
7
7
 
8
8
  let(:relation) { Relation.new([[:id, Integer]], [[1], [2], [3]]) }
9
- let(:order) { relation.sort_by { |r| r.id } }
9
+ let(:sorted) { relation.sort_by { |r| r.id } }
10
10
  let(:limit) { 1 }
11
- let(:object) { described_class.new(order, limit) }
11
+ let(:object) { described_class.new(sorted, limit) }
12
12
 
13
13
  it { should == limit }
14
14
  end
@@ -8,25 +8,25 @@ describe Relation::Operation::Offset, '.new' do
8
8
  let(:original_relation) { Relation.new([[:id, Integer]], [[1], [2]]) }
9
9
  let(:object) { described_class }
10
10
 
11
- context 'with an ordered relation' do
11
+ context 'with a sorted relation' do
12
12
  let(:relation) { original_relation.sort_by { |r| r.id } }
13
13
  let(:offset) { 1 }
14
14
 
15
15
  it { should be_instance_of(object) }
16
16
  end
17
17
 
18
- context 'with an ordered relation having an empty header' do
18
+ context 'with a sorted relation having an empty header' do
19
19
  let(:relation) { original_relation.sort_by { |r| r.id }.project([]) }
20
20
  let(:offset) { 1 }
21
21
 
22
22
  it { should be_instance_of(object) }
23
23
  end
24
24
 
25
- context 'without an ordered relation' do
25
+ context 'without a sorted relation' do
26
26
  let(:relation) { original_relation }
27
27
  let(:offset) { 1 }
28
28
 
29
- specify { expect { subject }.to raise_error(OrderedRelationRequiredError, 'can only offset an ordered operand') }
29
+ specify { expect { subject }.to raise_error(SortededRelationRequiredError, 'can only offset a sorted operand') }
30
30
  end
31
31
 
32
32
  context 'with an offset less than 0' do
@@ -6,10 +6,10 @@ describe Relation::Operation::Offset, '#directions' do
6
6
  subject { object.directions }
7
7
 
8
8
  let(:relation) { Relation.new([[:id, Integer]], LazyEnumerable.new) }
9
- let(:object) { described_class.new(ordered, 0) }
10
- let(:ordered) { relation.sort_by { |r| r.id } }
9
+ let(:object) { described_class.new(sorted, 0) }
10
+ let(:sorted) { relation.sort_by { |r| r.id } }
11
11
 
12
12
  it_should_behave_like 'an idempotent method'
13
13
 
14
- it { should be(ordered.directions) }
14
+ it { should be(sorted.directions) }
15
15
  end
@@ -5,21 +5,21 @@ require 'spec_helper'
5
5
  describe Relation::Operation::Offset, '#each' do
6
6
  subject { object.each { |tuple| yields << tuple } }
7
7
 
8
- let(:object) { described_class.new(order, 1) }
8
+ let(:object) { described_class.new(sorted, 1) }
9
9
  let(:relation) { Relation.new([[:id, Integer]], [[1], [2], [3]]) }
10
- let(:order) { relation.sort_by { |r| r.id } }
10
+ let(:sorted) { relation.sort_by { |r| r.id } }
11
11
  let(:yields) { [] }
12
12
 
13
13
  it_should_behave_like 'an #each method'
14
14
 
15
15
  it 'yields only tuples' do
16
16
  subject
17
- yields.each { |tuple| tuple.should be_instance_of(Tuple) }
17
+ yields.each { |tuple| expect(tuple).to be_instance_of(Tuple) }
18
18
  end
19
19
 
20
20
  it 'yields only tuples with the expected header' do
21
21
  subject
22
- yields.each { |tuple| tuple.header.should be(object.header) }
22
+ yields.each { |tuple| expect(tuple.header).to be(object.header) }
23
23
  end
24
24
 
25
25
  it 'yields only tuples with the expected data' do
@@ -6,9 +6,9 @@ describe Relation::Operation::Offset, '#offset' do
6
6
  subject { object.offset }
7
7
 
8
8
  let(:relation) { Relation.new([[:id, Integer]], [[1], [2], [3]]) }
9
- let(:order) { relation.sort_by { |r| r.id } }
9
+ let(:sorted) { relation.sort_by { |r| r.id } }
10
10
  let(:offset) { 1 }
11
- let(:object) { described_class.new(order, offset) }
11
+ let(:object) { described_class.new(sorted, offset) }
12
12
 
13
13
  it { should == offset }
14
14
  end