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 Attribute, '.new' do
25
25
  let(:object) { described_class }
26
26
 
27
27
  it 'does not freeze the options' do
28
- options.should_not be_frozen
28
+ expect(options).not_to be_frozen
29
29
  expect { subject }.to_not change(options, :frozen?)
30
30
  end
31
31
 
@@ -6,8 +6,10 @@ require File.expand_path('../fixtures/classes', __FILE__)
6
6
  describe Attribute::Comparable, '#asc' do
7
7
  subject { object.asc }
8
8
 
9
- let(:described_class) { ComparableSpecs::Object }
10
9
  let(:object) { described_class.new }
10
+ let(:described_class) { ComparableSpecs::Object }
11
+
12
+ it { should be_instance_of(Relation::Operation::Sorted::Ascending) }
11
13
 
12
- it { should be_instance_of(Relation::Operation::Order::Ascending) }
14
+ its(:attribute) { should be(object) }
13
15
  end
@@ -6,8 +6,10 @@ require File.expand_path('../fixtures/classes', __FILE__)
6
6
  describe Attribute::Comparable, '#desc' do
7
7
  subject { object.desc }
8
8
 
9
- let(:described_class) { ComparableSpecs::Object }
10
9
  let(:object) { described_class.new }
10
+ let(:described_class) { ComparableSpecs::Object }
11
+
12
+ it { should be_instance_of(Relation::Operation::Sorted::Descending) }
11
13
 
12
- it { should be_instance_of(Relation::Operation::Order::Descending) }
14
+ its(:attribute) { should be(object) }
13
15
  end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require File.expand_path('../fixtures/classes', __FILE__)
5
+
6
+ describe Attribute::Comparable, '#range' do
7
+ subject { object.range }
8
+
9
+ let(:object) { described_class.new }
10
+
11
+ let(:described_class) do
12
+ Class.new(ComparableSpecs::Object) do
13
+ def type
14
+ Types::Numeric
15
+ end
16
+ end
17
+ end
18
+
19
+ it { should eql(Types::NegativeInfinity.instance..Types::Infinity.instance) }
20
+ end
@@ -10,7 +10,7 @@ describe Attribute, '#eql?' do
10
10
  let(:object) { described_class.new(name) }
11
11
 
12
12
  before do
13
- described_class.stub(type: Types::Object)
13
+ allow(described_class).to receive(:type).and_return(Types::Object)
14
14
  end
15
15
 
16
16
  context 'with the same object' do
@@ -10,7 +10,7 @@ describe Attribute, '#==' do
10
10
  let(:object) { described_class.new(name) }
11
11
 
12
12
  before do
13
- described_class.stub(type: Types::Object)
13
+ allow(described_class).to receive(:type).and_return(Types::Object)
14
14
  end
15
15
 
16
16
  context 'with the same object' do
@@ -8,7 +8,7 @@ describe Attribute, '#include?' do
8
8
  let(:described_class) { Class.new(Attribute) }
9
9
 
10
10
  before do
11
- described_class.stub(type: Types::Integer)
11
+ allow(described_class).to receive(:type).and_return(Types::Integer)
12
12
  end
13
13
 
14
14
  context 'when value is nil' do
@@ -9,7 +9,7 @@ describe Attribute, '#name' do
9
9
  let(:object) { described_class.new(name) }
10
10
 
11
11
  before do
12
- described_class.stub(type: Types::Object)
12
+ allow(described_class).to receive(:type).and_return(Types::Object)
13
13
  end
14
14
 
15
15
  context 'when name is a Symbol' do
@@ -8,7 +8,7 @@ describe Attribute, '#optional?' do
8
8
  let(:described_class) { Class.new(Attribute) }
9
9
 
10
10
  before do
11
- described_class.stub(type: Types::Object)
11
+ allow(described_class).to receive(:type).and_return(Types::Object)
12
12
  end
13
13
 
14
14
  context 'without :required option passed to constructor' do
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Relation, '.new' do
6
+ subject { object.new(name, options) }
7
+
8
+ let(:object) { described_class }
9
+ let(:name) { :ids }
10
+
11
+ context 'with a Header' do
12
+ let(:options) { { header: header } }
13
+ let(:header) { Relation::Header.coerce([[:id, Integer]]) }
14
+
15
+ it { should be_instance_of(described_class) }
16
+
17
+ it 'sets the name' do
18
+ expect(subject.name).to be(name)
19
+ end
20
+
21
+ it 'does not freeze the options' do
22
+ expect(options).not_to be_frozen
23
+ expect { subject }.to_not change(options, :frozen?)
24
+ end
25
+
26
+ it 'sets the expected header' do
27
+ expect(subject.header).to be(header)
28
+ end
29
+ end
30
+
31
+ context 'with attributes' do
32
+ let(:options) { { header: header } }
33
+ let(:header) { [[:id, Integer]] }
34
+
35
+ it { should be_instance_of(described_class) }
36
+
37
+ it 'sets the name' do
38
+ expect(subject.name).to be(name)
39
+ end
40
+
41
+ it 'does not freeze the options' do
42
+ expect(options).not_to be_frozen
43
+ expect { subject }.to_not change(options, :frozen?)
44
+ end
45
+
46
+ it 'sets the expected header' do
47
+ expect(subject.header).to eql(Relation::Header.coerce(header))
48
+ end
49
+ end
50
+
51
+ context 'without a Header' do
52
+ let(:options) { {} }
53
+
54
+ specify { expect { subject }.to raise_error }
55
+ end
56
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Relation, '.type' do
6
+ subject { object.type }
7
+
8
+ let(:object) { described_class }
9
+
10
+ it_should_behave_like 'an idempotent method'
11
+
12
+ it { should be(Types::Relation) }
13
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Relation, '#header' do
6
+ subject { object.header }
7
+
8
+ let(:object) { described_class.new(:ids, options) }
9
+ let(:options) { { header: header } }
10
+ let(:header) { Relation::Header.coerce([[:id, Integer]]) }
11
+
12
+ it { should be(header) }
13
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Relation, '#new_relation' do
6
+ subject { object.new_relation(tuples) }
7
+
8
+ let(:object) { described_class.new(:ids, header: header) }
9
+ let(:header) { [[:id, Integer]] }
10
+ let(:tuples) { [[1]] }
11
+
12
+ it 'returns the expected relation' do
13
+ expect(subject).to eql(Relation.new(header, tuples))
14
+ end
15
+ end
@@ -9,7 +9,7 @@ describe Attribute, '#rename' do
9
9
  let(:object) { described_class.new(:name, required: false) }
10
10
 
11
11
  before do
12
- described_class.stub(type: Types::Object)
12
+ allow(described_class).to receive(:type).and_return(Types::Object)
13
13
  end
14
14
 
15
15
  context 'when the new name is the same' do
@@ -8,7 +8,7 @@ describe Attribute, '#required?' do
8
8
  let(:described_class) { Class.new(Attribute) }
9
9
 
10
10
  before do
11
- described_class.stub(type: Types::Object)
11
+ allow(described_class).to receive(:type).and_return(Types::Object)
12
12
  end
13
13
 
14
14
  context 'without :required option passed to constructor' do
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Tuple, '.new' do
6
+ subject { object.new(name, options) }
7
+
8
+ let(:object) { described_class }
9
+ let(:name) { :ids }
10
+
11
+ context 'with a Header' do
12
+ let(:options) { { header: header } }
13
+ let(:header) { Relation::Header.coerce([[:id, Integer]]) }
14
+
15
+ it { should be_instance_of(described_class) }
16
+
17
+ it 'sets the name' do
18
+ expect(subject.name).to be(name)
19
+ end
20
+
21
+ it 'does not freeze the options' do
22
+ expect(options).not_to be_frozen
23
+ expect { subject }.to_not change(options, :frozen?)
24
+ end
25
+
26
+ it 'sets the expected header' do
27
+ expect(subject.header).to be(header)
28
+ end
29
+ end
30
+
31
+ context 'with attributes' do
32
+ let(:options) { { header: header } }
33
+ let(:header) { [[:id, Integer]] }
34
+
35
+ it { should be_instance_of(described_class) }
36
+
37
+ it 'sets the name' do
38
+ expect(subject.name).to be(name)
39
+ end
40
+
41
+ it 'does not freeze the options' do
42
+ expect(options).not_to be_frozen
43
+ expect { subject }.to_not change(options, :frozen?)
44
+ end
45
+
46
+ it 'sets the expected header' do
47
+ expect(subject.header).to eql(Relation::Header.coerce(header))
48
+ end
49
+ end
50
+
51
+ context 'without a Header' do
52
+ let(:options) { {} }
53
+
54
+ specify { expect { subject }.to raise_error }
55
+ end
56
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Tuple, '.type' do
6
+ subject { object.type }
7
+
8
+ let(:object) { described_class }
9
+
10
+ it_should_behave_like 'an idempotent method'
11
+
12
+ it { should be(Types::Tuple) }
13
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Attribute::Tuple, '#header' do
6
+ subject { object.header }
7
+
8
+ let(:object) { described_class.new(:ids, options) }
9
+ let(:options) { { header: header } }
10
+ let(:header) { Relation::Header.coerce([[:id, Integer]]) }
11
+
12
+ it { should be(header) }
13
+ end
@@ -7,61 +7,49 @@ describe Axiom::Equalizer, '.new' do
7
7
  let(:name) { 'User' }
8
8
  let(:klass) { ::Class.new }
9
9
 
10
+ before do
11
+ # specify the class #name method
12
+ allow(klass).to receive(:name).and_return(name)
13
+ klass.send(:include, subject)
14
+ end
15
+
10
16
  context 'with no keys' do
11
17
  subject { object.new }
12
18
 
13
- before do
14
- # specify the class #name method
15
- klass.stub(name: name)
16
- klass.send(:include, subject)
17
- end
18
-
19
19
  let(:instance) { klass.new }
20
20
 
21
21
  it { should be_instance_of(object) }
22
22
 
23
- it 'defines #hash and #inspect methods dynamically' do
24
- subject.public_instance_methods(false).map(&:to_s).should =~ %w[hash inspect]
25
- end
26
-
27
23
  describe '#eql?' do
28
- context 'when the objects are similar' do
29
- let(:other) { instance.dup }
24
+ context 'when the objects are equivalent' do
25
+ let(:other) { klass.new }
30
26
 
31
- it { instance.eql?(other).should be(true) }
27
+ it { expect(instance.eql?(other)).to be(true) }
32
28
  end
33
29
 
34
30
  context 'when the objects are different' do
35
31
  let(:other) { double('other') }
36
32
 
37
- it { instance.eql?(other).should be(false) }
33
+ it { expect(instance.eql?(other)).to be(false) }
38
34
  end
39
35
  end
40
36
 
41
37
  describe '#==' do
42
- context 'when the objects are similar' do
43
- let(:other) { instance.dup }
38
+ context 'when the objects are equivalent' do
39
+ let(:other) { klass.new }
44
40
 
45
- it { (instance == other).should be(true) }
41
+ it { expect(instance == other).to be(true) }
46
42
  end
47
43
 
48
44
  context 'when the objects are different' do
49
45
  let(:other) { double('other') }
50
46
 
51
- it { (instance == other).should be(false) }
52
- end
53
- end
54
-
55
- describe '#hash' do
56
- it { instance.hash.should eql(klass.hash) }
57
-
58
- it 'memoizes the hash code' do
59
- instance.hash.should eql(instance.memoized(:hash))
47
+ it { expect(instance == other).to be(false) }
60
48
  end
61
49
  end
62
50
 
63
51
  describe '#inspect' do
64
- it { instance.inspect.should eql('#<User>') }
52
+ it { expect(instance.inspect).to eql('#<User>') }
65
53
  end
66
54
  end
67
55
 
@@ -82,56 +70,38 @@ describe Axiom::Equalizer, '.new' do
82
70
  end
83
71
  end
84
72
 
85
- before do
86
- # specify the class #inspect method
87
- klass.stub(name: nil, inspect: name)
88
- klass.send(:include, subject)
89
- end
90
-
91
73
  it { should be_instance_of(object) }
92
74
 
93
- it 'defines #hash and #inspect methods dynamically' do
94
- subject.public_instance_methods(false).map(&:to_s).should =~ %w[hash inspect]
95
- end
96
-
97
75
  describe '#eql?' do
98
- context 'when the objects are similar' do
99
- let(:other) { instance.dup }
76
+ context 'when the objects are equivalent' do
77
+ let(:other) { klass.new(first_name) }
100
78
 
101
- it { instance.eql?(other).should be(true) }
79
+ it { expect(instance.eql?(other)).to be(true) }
102
80
  end
103
81
 
104
82
  context 'when the objects are different' do
105
83
  let(:other) { double('other') }
106
84
 
107
- it { instance.eql?(other).should be(false) }
85
+ it { expect(instance.eql?(other)).to be(false) }
108
86
  end
109
87
  end
110
88
 
111
89
  describe '#==' do
112
- context 'when the objects are similar' do
113
- let(:other) { instance.dup }
90
+ context 'when the objects are equivalent' do
91
+ let(:other) { klass.new(first_name) }
114
92
 
115
- it { (instance == other).should be(true) }
93
+ it { expect(instance == other).to be(true) }
116
94
  end
117
95
 
118
96
  context 'when the objects are different' do
119
97
  let(:other) { double('other') }
120
98
 
121
- it { (instance == other).should be(false) }
122
- end
123
- end
124
-
125
- describe '#hash' do
126
- it { instance.hash.should eql(klass.hash ^ first_name.hash) }
127
-
128
- it 'memoizes the hash code' do
129
- instance.hash.should eql(instance.memoized(:hash))
99
+ it { expect(instance == other).to be(false) }
130
100
  end
131
101
  end
132
102
 
133
103
  describe '#inspect' do
134
- it { instance.inspect.should eql('#<User first_name="John">') }
104
+ it { expect(instance.inspect).to eql('#<User first_name="John">') }
135
105
  end
136
106
  end
137
107
  end