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
@@ -12,7 +12,7 @@ describe Relation, '.new' do
12
12
  context 'with no body' do
13
13
  subject { object.new(header) }
14
14
 
15
- it { should be_instance_of(Relation::Materialized) }
15
+ it { should be_instance_of(Relation::Empty) }
16
16
 
17
17
  it { should be_empty }
18
18
  end
@@ -23,14 +23,14 @@ describe Relation, '.new' do
23
23
  it { should == body.dup }
24
24
 
25
25
  it 'does not freeze the body' do
26
- body.should_not be_frozen
26
+ expect(body).not_to be_frozen
27
27
  expect { subject }.to_not change(body, :frozen?)
28
28
  end
29
29
  end
30
30
 
31
31
  context 'with a body that returns nil for #size' do
32
32
  before do
33
- body.should_receive(:size).and_return(nil)
33
+ expect(body).to receive(:size).and_return(nil)
34
34
  end
35
35
 
36
36
  it { should be_instance_of(object) }
@@ -38,14 +38,14 @@ describe Relation, '.new' do
38
38
  it { should == body.dup }
39
39
 
40
40
  it 'does not freeze the body' do
41
- body.should_not be_frozen
41
+ expect(body).not_to be_frozen
42
42
  expect { subject }.to_not change(body, :frozen?)
43
43
  end
44
44
  end
45
45
 
46
46
  context 'with a body that returns Float::INFINITY for #size' do
47
47
  before do
48
- body.should_receive(:size).and_return(Float::INFINITY)
48
+ expect(body).to receive(:size).and_return(Float::INFINITY)
49
49
  end
50
50
 
51
51
  it { should be_instance_of(object) }
@@ -53,7 +53,7 @@ describe Relation, '.new' do
53
53
  it { should == body.dup }
54
54
 
55
55
  it 'does not freeze the body' do
56
- body.should_not be_frozen
56
+ expect(body).not_to be_frozen
57
57
  expect { subject }.to_not change(body, :frozen?)
58
58
  end
59
59
  end
@@ -70,7 +70,7 @@ describe Relation, '.new' do
70
70
  it { should == body.dup }
71
71
 
72
72
  it 'does not freeze the body' do
73
- body.should_not be_frozen
73
+ expect(body).not_to be_frozen
74
74
  expect { subject }.to_not change(body, :frozen?)
75
75
  end
76
76
  end
@@ -9,12 +9,12 @@ describe Relation, '#directions' do
9
9
  let(:object) { described_class.new([[:id, Integer]], body) }
10
10
 
11
11
  before do
12
- object.should be_instance_of(described_class)
12
+ expect(object).to be_instance_of(described_class)
13
13
  end
14
14
 
15
15
  it_should_behave_like 'an idempotent method'
16
16
 
17
- it { should be_instance_of(Relation::Operation::Order::DirectionSet) }
17
+ it { should be_instance_of(Relation::Operation::Sorted::DirectionSet) }
18
18
 
19
19
  it { should be_empty }
20
20
  end
@@ -11,19 +11,19 @@ describe Relation, '#each' do
11
11
  let(:yields) { [] }
12
12
 
13
13
  before do
14
- object.should be_instance_of(described_class)
14
+ expect(object).to be_instance_of(described_class)
15
15
  end
16
16
 
17
17
  it_should_behave_like 'an #each method'
18
18
 
19
19
  it 'yields only tuples' do
20
20
  subject
21
- yields.each { |tuple| tuple.should be_instance_of(Tuple) }
21
+ yields.each { |tuple| expect(tuple).to be_instance_of(Tuple) }
22
22
  end
23
23
 
24
24
  it 'yields only tuples with the expected header' do
25
25
  subject
26
- yields.each { |tuple| tuple.header.should be(object.header) }
26
+ yields.each { |tuple| expect(tuple.header).to be(object.header) }
27
27
  end
28
28
 
29
29
  it 'yields only tuples with the expected data' do
@@ -41,12 +41,12 @@ describe Relation do
41
41
  let(:object) { described_class }
42
42
 
43
43
  before do
44
- subject.should be_instance_of(object)
44
+ expect(subject).to be_instance_of(object)
45
45
  end
46
46
 
47
47
  it { should be_kind_of(Enumerable) }
48
48
 
49
49
  it 'case matches Enumerable' do
50
- (Enumerable === subject).should be(true)
50
+ expect(Enumerable === subject).to be(true)
51
51
  end
52
52
  end
@@ -10,7 +10,7 @@ describe Relation, '#[]' do
10
10
  let(:object) { described_class.new([attribute], LazyEnumerable.new) }
11
11
 
12
12
  before do
13
- object.should be_instance_of(described_class)
13
+ expect(object).to be_instance_of(described_class)
14
14
  end
15
15
 
16
16
  it { should be(attribute) }
@@ -13,6 +13,6 @@ describe Relation::Empty, '#each' do
13
13
 
14
14
  it 'yields no tuples' do
15
15
  subject
16
- yields.should be_empty
16
+ expect(yields).to be_empty
17
17
  end
18
18
  end
@@ -9,7 +9,7 @@ describe Relation, '#empty?' do
9
9
  let(:object) { described_class.new(header, body) }
10
10
 
11
11
  before do
12
- object.should be_instance_of(described_class)
12
+ expect(object).to be_instance_of(described_class)
13
13
  end
14
14
 
15
15
  context 'with a body containing no entries' do
@@ -10,7 +10,7 @@ describe Relation, '#eql?' do
10
10
  let(:object) { described_class.new(header, body) }
11
11
 
12
12
  before do
13
- object.should be_instance_of(described_class)
13
+ expect(object).to be_instance_of(described_class)
14
14
  end
15
15
 
16
16
  context 'with the same object' do
@@ -10,7 +10,7 @@ describe Relation, '#==' do
10
10
  let(:object) { described_class.new(header, body) }
11
11
 
12
12
  before do
13
- object.should be_instance_of(described_class)
13
+ expect(object).to be_instance_of(described_class)
14
14
  end
15
15
 
16
16
  context 'with the same object' do
@@ -12,8 +12,8 @@ describe Relation::Header, '.coerce' do
12
12
  subject { object.coerce(argument, &block) }
13
13
 
14
14
  context 'when the argument is a Header' do
15
- let(:argument) { header }
16
- let(:block) { proc { raise 'should not raise' } }
15
+ let(:argument) { header }
16
+ let(:block) { proc { fail 'should not fail' } }
17
17
 
18
18
  it { should be(header) }
19
19
  end
@@ -26,7 +26,7 @@ describe Relation::Header, '.new' do
26
26
  it { should == attributes }
27
27
 
28
28
  it 'does not freeze the attributes' do
29
- attributes.should_not be_frozen
29
+ expect(attributes).not_to be_frozen
30
30
  expect { subject }.to_not change(attributes, :frozen?)
31
31
  end
32
32
  end
@@ -42,12 +42,12 @@ describe Relation::Header, '.new' do
42
42
  it { should == attributes }
43
43
 
44
44
  it 'does not freeze the attributes' do
45
- attributes.should_not be_frozen
45
+ expect(attributes).not_to be_frozen
46
46
  expect { subject }.to_not change(attributes, :frozen?)
47
47
  end
48
48
 
49
49
  it 'does not freeze the options' do
50
- options.should_not be_frozen
50
+ expect(options).not_to be_frozen
51
51
  expect { subject }.to_not change(options, :frozen?)
52
52
  end
53
53
  end
@@ -7,11 +7,11 @@ describe Relation::Header, '#context' do
7
7
 
8
8
  let(:object) { described_class.coerce([attribute]) }
9
9
  let(:attribute) { Attribute::Integer.new(:id) }
10
- let(:block) { ->(context) { } }
10
+ let(:block) { ->(context) {} }
11
11
  let(:context) { double('context') }
12
12
 
13
13
  before do
14
- Axiom::Evaluator::Context.should_receive(:new).with(object)
14
+ expect(Evaluator::Context).to receive(:new).with(object)
15
15
  .and_yield(context)
16
16
  .and_return(context)
17
17
  end
@@ -13,7 +13,7 @@ describe Relation::Header, '#each' do
13
13
 
14
14
  it 'yields only attributes' do
15
15
  subject
16
- yields.each { |attribute| attribute.should be_kind_of(Attribute) }
16
+ yields.each { |attribute| expect(attribute).to be_kind_of(Attribute) }
17
17
  end
18
18
 
19
19
  it 'yields each attribute' do
@@ -31,6 +31,6 @@ describe Relation::Header 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
@@ -15,7 +15,7 @@ describe Relation::Header, '#extend' do
15
15
  it { should be_instance_of(described_class) }
16
16
 
17
17
  it 'uses the attribute object' do
18
- subject[:name].should be(attribute)
18
+ expect(subject[:name]).to be(attribute)
19
19
  end
20
20
 
21
21
  its(:to_ary) { should == [[:id, Integer], [:name, String]] }
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- [:call, :[]].each do |method|
5
+ [:fetch, :[]].each do |method|
6
6
  describe Relation::Header, "##{method}" do
7
7
  subject { object.send(method, name) }
8
8
 
@@ -15,7 +15,7 @@ describe Relation::Header, '#project' do
15
15
  it { should be_instance_of(described_class) }
16
16
 
17
17
  it 'uses the attribute object' do
18
- subject[:id].should be(attribute)
18
+ expect(subject[:id]).to be(attribute)
19
19
  end
20
20
 
21
21
  its(:to_ary) { should == [[:id, Integer]] }
@@ -6,14 +6,28 @@ describe Relation::Header, '#rename' do
6
6
  subject { object.rename(aliases) }
7
7
 
8
8
  let(:object) { described_class.coerce([[:id, Integer], [:name, String]], keys: keys) }
9
- let(:aliases) { Algebra::Rename::Aliases.coerce(object, id: :other_id) }
9
+ let(:aliases) { { id: :other_id } }
10
10
  let(:keys) { Relation::Keys.new([described_class.coerce([[:id, Integer]])]) }
11
11
 
12
- it { should be_instance_of(described_class) }
12
+ context 'with aliases' do
13
+ let(:aliases) { Algebra::Rename::Aliases.coerce(object, super()) }
13
14
 
14
- it { should_not be(object) }
15
+ it { should be_instance_of(described_class) }
15
16
 
16
- its(:to_ary) { should == [[:other_id, Integer], [:name, String]] }
17
+ it { should_not be(object) }
17
18
 
18
- its(:keys) { should eql(Relation::Keys.new([described_class.coerce([[:other_id, Integer]])])) }
19
+ its(:to_ary) { should == [[:other_id, Integer], [:name, String]] }
20
+
21
+ its(:keys) { should eql(Relation::Keys.new([described_class.coerce([[:other_id, Integer]])])) }
22
+ end
23
+
24
+ context 'with a Hash' do
25
+ it { should be_instance_of(described_class) }
26
+
27
+ it { should_not be(object) }
28
+
29
+ its(:to_ary) { should == [[:other_id, Integer], [:name, String]] }
30
+
31
+ its(:keys) { should eql(Relation::Keys.new([described_class.coerce([[:other_id, Integer]])])) }
32
+ end
19
33
  end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Header, '#size' do
6
+ subject { object.size }
7
+
8
+ let(:object) { described_class.new(attributes) }
9
+ let(:attributes) { [Attribute::Integer.new(:id)] }
10
+
11
+ it_should_behave_like 'an idempotent method'
12
+
13
+ it { should be(1) }
14
+ end
@@ -9,7 +9,7 @@ describe Relation, '#header' do
9
9
  let(:object) { described_class.new(header, LazyEnumerable.new) }
10
10
 
11
11
  before do
12
- object.should be_instance_of(described_class)
12
+ expect(object).to be_instance_of(described_class)
13
13
  end
14
14
 
15
15
  it_should_behave_like 'an idempotent method'
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Index, '#each' do
6
+ subject { described_class.new(key, header) << tuple }
7
+
8
+ let(:key) { Relation::Header.coerce([[:id, Integer]]) }
9
+ let(:header) { Relation::Header.coerce([[:id, Integer], [:name, String]]) }
10
+ let(:tuple) { Tuple.new(header, [1, 'John Doe']) }
11
+
12
+ context 'with a block' do
13
+ it 'returns an index' do
14
+ expect(subject.each {}).to be_instance_of(described_class)
15
+ end
16
+
17
+ it 'yields each key and tuples' do
18
+ expect { |block| subject.each(&block) }
19
+ .to yield_with_args([[1], Set[tuple]])
20
+ end
21
+ end
22
+
23
+ context 'without a block' do
24
+ it 'returns an enumerator' do
25
+ expect(subject.each).to be_instance_of(to_enum.class)
26
+ end
27
+
28
+ it 'yields each key and tuples' do
29
+ expect { |block| subject.each.each(&block) }
30
+ .to yield_with_args([[1], Set[tuple]])
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Index, '#[]' do
6
+ subject { object[tuple] }
7
+
8
+ let(:object) { described_class.new(key, header) }
9
+ let(:key) { Relation::Header.coerce([[:id, Integer]]) }
10
+ let(:header) { Relation::Header.coerce([[:id, Integer], [:name, String]]) }
11
+ let(:tuple) { Tuple.new(header, [1, 'John Doe']) }
12
+
13
+ it 'returns the tuples in the index' do
14
+ object << tuple
15
+ expect(object[tuple]).to eql(Set[tuple])
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Index, '#<<' do
6
+ subject { object << tuple }
7
+
8
+ let(:object) { described_class.new(key, header.project(name_only)) }
9
+ let(:key) { Relation::Header.coerce([[:id, Integer]]) }
10
+ let(:header) { Relation::Header.coerce([[:id, Integer], [:name, String]]) }
11
+ let(:tuple) { Tuple.new(header, [1, 'John Doe']) }
12
+
13
+ let(:name_only) do
14
+ header.project([:name])
15
+ end
16
+
17
+ it_should_behave_like 'a command method'
18
+
19
+ it 'adds the tuple to the index' do
20
+ expect { subject }.to change { object[tuple] }
21
+ .from(Set[]).to(Set[tuple.project(name_only)])
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Relation::Index, '#merge' do
6
+ subject { object.merge(tuples) }
7
+
8
+ let(:object) { described_class.new(key, header) }
9
+ let(:key) { Relation::Header.coerce([[:id, Integer]]) }
10
+ let(:header) { Relation::Header.coerce([[:id, Integer], [:name, String]]) }
11
+ let(:tuples) { [tuple] }
12
+ let(:tuple) { Tuple.new(header, [1, 'John Doe']) }
13
+
14
+ it_should_behave_like 'a command method'
15
+
16
+ it 'add the tuples to the index' do
17
+ expect { subject }.to change { object[tuple] }.from(Set[]).to(Set[tuple])
18
+ end
19
+ end
@@ -16,9 +16,26 @@ describe Relation::Keys, '.coerce' do
16
16
  context 'when the argument responds to #to_ary' do
17
17
  let(:argument) { [[[:id]]] }
18
18
 
19
- it { should be_instance_of(object) }
19
+ context 'with a block' do
20
+ subject { object.coerce(argument, &block) }
20
21
 
21
- it { should == [Relation::Header.coerce([:id])] }
22
+ let(:block) { ->(attributes) { Relation::Header.coerce(attributes) } }
23
+
24
+ it { should be_instance_of(object) }
25
+
26
+ it { should == [Relation::Header.coerce([:id])] }
27
+
28
+ it 'yields the attributes' do
29
+ expect { |block| object.coerce(argument, &block) }
30
+ .to yield_successive_args(*argument)
31
+ end
32
+ end
33
+
34
+ context 'without a block' do
35
+ it { should be_instance_of(object) }
36
+
37
+ it { should == [Relation::Header.coerce([:id])] }
38
+ end
22
39
  end
23
40
 
24
41
  context 'when the argument is not a Keys and does not respond to #to_ary' do