alf 0.10.1 → 0.11.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 (682) hide show
  1. data/CHANGELOG.md +25 -0
  2. data/Gemfile +8 -8
  3. data/Gemfile.lock +22 -20
  4. data/Rakefile +1 -1
  5. data/alf.gemspec +31 -30
  6. data/alf.noespec +11 -9
  7. data/bin/alf +1 -1
  8. data/lib/alf/aggregator/avg.rb +39 -0
  9. data/lib/alf/aggregator/class_methods.rb +32 -14
  10. data/lib/alf/aggregator/collect.rb +32 -0
  11. data/lib/alf/aggregator/concat.rb +47 -0
  12. data/lib/alf/aggregator/count.rb +32 -0
  13. data/lib/alf/aggregator/{base.rb → instance_methods.rb} +54 -30
  14. data/lib/alf/aggregator/max.rb +32 -0
  15. data/lib/alf/aggregator/min.rb +32 -0
  16. data/lib/alf/aggregator/stddev.rb +25 -0
  17. data/lib/alf/aggregator/sum.rb +32 -0
  18. data/lib/alf/aggregator/variance.rb +45 -0
  19. data/lib/alf/aggregator.rb +51 -0
  20. data/lib/alf/environment/class_methods.rb +37 -35
  21. data/lib/alf/environment/folder.rb +26 -28
  22. data/lib/alf/environment/{base.rb → instance_methods.rb} +8 -19
  23. data/lib/alf/environment.rb +34 -0
  24. data/lib/alf/errors.rb +1 -0
  25. data/lib/alf/iterator/class_methods.rb +0 -2
  26. data/lib/alf/iterator/proxy.rb +7 -13
  27. data/lib/alf/iterator.rb +27 -0
  28. data/lib/alf/lispy/instance_methods.rb +14 -14
  29. data/lib/alf/lispy.rb +24 -0
  30. data/lib/alf/loader.rb +1 -1
  31. data/lib/alf/operator/binary.rb +4 -15
  32. data/lib/alf/operator/class_methods.rb +33 -83
  33. data/lib/alf/operator/instance_methods.rb +29 -0
  34. data/lib/alf/operator/non_relational/autonum.rb +17 -22
  35. data/lib/alf/operator/non_relational/clip.rb +18 -18
  36. data/lib/alf/operator/non_relational/coerce.rb +17 -19
  37. data/lib/alf/operator/non_relational/compact.rb +13 -57
  38. data/lib/alf/operator/non_relational/defaults.rb +20 -23
  39. data/lib/alf/operator/non_relational/generator.rb +14 -32
  40. data/lib/alf/operator/non_relational/sort.rb +16 -20
  41. data/lib/alf/operator/nullary.rb +0 -9
  42. data/lib/alf/operator/relational/extend.rb +17 -22
  43. data/lib/alf/operator/relational/group.rb +16 -27
  44. data/lib/alf/operator/relational/heading.rb +15 -25
  45. data/lib/alf/operator/relational/intersect.rb +14 -33
  46. data/lib/alf/operator/relational/join.rb +15 -103
  47. data/lib/alf/operator/relational/matching.rb +15 -42
  48. data/lib/alf/operator/relational/minus.rb +14 -33
  49. data/lib/alf/operator/relational/not_matching.rb +15 -42
  50. data/lib/alf/operator/relational/project.rb +20 -20
  51. data/lib/alf/operator/relational/quota.rb +19 -47
  52. data/lib/alf/operator/relational/rank.rb +19 -52
  53. data/lib/alf/operator/relational/rename.rb +16 -17
  54. data/lib/alf/operator/relational/restrict.rb +16 -18
  55. data/lib/alf/operator/relational/summarize.rb +19 -75
  56. data/lib/alf/operator/relational/ungroup.rb +16 -22
  57. data/lib/alf/operator/relational/union.rb +17 -29
  58. data/lib/alf/operator/relational/unwrap.rb +17 -19
  59. data/lib/alf/operator/relational/wrap.rb +18 -20
  60. data/lib/alf/operator/signature.rb +67 -96
  61. data/lib/alf/operator/unary.rb +4 -26
  62. data/lib/alf/operator.rb +68 -0
  63. data/lib/alf/reader/alf_file.rb +5 -5
  64. data/lib/alf/reader/class_methods.rb +47 -38
  65. data/lib/alf/reader/{base.rb → instance_methods.rb} +18 -40
  66. data/lib/alf/reader/rash.rb +3 -3
  67. data/lib/alf/reader.rb +37 -0
  68. data/lib/alf/relation/instance_methods.rb +17 -37
  69. data/lib/alf/relation.rb +28 -0
  70. data/lib/alf/renderer/{base.rb → instance_methods.rb} +13 -30
  71. data/lib/alf/renderer.rb +32 -0
  72. data/lib/alf/tools/coerce.rb +18 -7
  73. data/lib/alf/tools/miscellaneous.rb +56 -29
  74. data/lib/alf/tools/to_lispy.rb +37 -40
  75. data/lib/alf/tools/to_ruby_literal.rb +24 -7
  76. data/lib/alf/tools/tuple_handle.rb +27 -17
  77. data/lib/alf/tools.rb +14 -0
  78. data/lib/alf/types/attr_list.rb +135 -31
  79. data/lib/alf/types/attr_name.rb +56 -18
  80. data/lib/alf/types/boolean.rb +18 -5
  81. data/lib/alf/types/heading.rb +83 -59
  82. data/lib/alf/types/ordering.rb +117 -64
  83. data/lib/alf/types/renaming.rb +73 -33
  84. data/lib/alf/types/size.rb +57 -0
  85. data/lib/alf/types/summarization.rb +105 -43
  86. data/lib/alf/types/tuple_computation.rb +113 -38
  87. data/lib/alf/types/tuple_expression.rb +122 -31
  88. data/lib/alf/types/tuple_predicate.rb +64 -40
  89. data/lib/alf/types.rb +49 -0
  90. data/lib/alf/version.rb +6 -6
  91. data/lib/alf-csv/alf/csv/commons.rb +36 -0
  92. data/lib/alf-csv/alf/csv/reader.rb +33 -0
  93. data/lib/alf-csv/alf/csv/renderer.rb +38 -0
  94. data/lib/alf-csv/alf/csv.rb +3 -0
  95. data/lib/alf-engine/alf/engine/aggregate.rb +44 -0
  96. data/lib/alf-engine/alf/engine/autonum.rb +45 -0
  97. data/lib/{alf/operator → alf-engine/alf/engine}/cesure.rb +13 -13
  98. data/lib/alf-engine/alf/engine/clip.rb +53 -0
  99. data/lib/alf-engine/alf/engine/coerce.rb +46 -0
  100. data/lib/alf-engine/alf/engine/cog.rb +7 -0
  101. data/lib/alf-engine/alf/engine/compact/set.rb +23 -0
  102. data/lib/alf-engine/alf/engine/compact/uniq.rb +23 -0
  103. data/lib/alf-engine/alf/engine/compact.rb +26 -0
  104. data/lib/alf-engine/alf/engine/concat.rb +25 -0
  105. data/lib/alf-engine/alf/engine/defaults.rb +43 -0
  106. data/lib/alf-engine/alf/engine/filter.rb +41 -0
  107. data/lib/alf-engine/alf/engine/generator.rb +50 -0
  108. data/lib/alf-engine/alf/engine/group/hash.rb +40 -0
  109. data/lib/alf-engine/alf/engine/group.rb +7 -0
  110. data/lib/alf-engine/alf/engine/join/hash.rb +35 -0
  111. data/lib/alf-engine/alf/engine/join.rb +7 -0
  112. data/lib/alf-engine/alf/engine/materialize/array.rb +78 -0
  113. data/lib/alf-engine/alf/engine/materialize/hash.rb +122 -0
  114. data/lib/alf-engine/alf/engine/materialize.rb +8 -0
  115. data/lib/alf-engine/alf/engine/quota/cesure.rb +46 -0
  116. data/lib/alf-engine/alf/engine/quota.rb +7 -0
  117. data/lib/alf-engine/alf/engine/rank/cesure.rb +48 -0
  118. data/lib/alf-engine/alf/engine/rank.rb +7 -0
  119. data/lib/alf-engine/alf/engine/rename.rb +39 -0
  120. data/lib/alf-engine/alf/engine/semi/hash.rb +39 -0
  121. data/lib/alf-engine/alf/engine/semi.rb +7 -0
  122. data/lib/alf-engine/alf/engine/set_attr.rb +46 -0
  123. data/lib/alf-engine/alf/engine/sort/in_memory.rb +39 -0
  124. data/lib/alf-engine/alf/engine/sort.rb +28 -0
  125. data/lib/alf-engine/alf/engine/summarize/cesure.rb +51 -0
  126. data/lib/alf-engine/alf/engine/summarize/hash.rb +35 -0
  127. data/lib/alf-engine/alf/engine/summarize.rb +8 -0
  128. data/lib/alf-engine/alf/engine/ungroup.rb +29 -0
  129. data/lib/alf-engine/alf/engine/unwrap.rb +31 -0
  130. data/lib/alf-engine/alf/engine/wrap.rb +39 -0
  131. data/lib/alf-engine/alf/engine.rb +25 -0
  132. data/lib/{alf/extra/logs.rb → alf-logs/alf/logs/reader.rb} +14 -16
  133. data/lib/alf-logs/alf/logs.rb +1 -0
  134. data/lib/alf-sequel/alf/sequel/environment.rb +57 -0
  135. data/lib/alf-sequel/alf/sequel/iterator.rb +21 -0
  136. data/lib/alf-sequel/alf/sequel.rb +2 -0
  137. data/lib/{alf → alf-shell/alf/shell}/command/exec.rb +3 -4
  138. data/lib/{alf → alf-shell/alf/shell}/command/help.rb +3 -4
  139. data/lib/alf-shell/alf/shell/command/main/class_methods.rb +46 -0
  140. data/lib/{alf → alf-shell/alf/shell}/command/main.rb +9 -51
  141. data/lib/{alf → alf-shell/alf/shell}/command/show.rb +5 -7
  142. data/lib/alf-shell/alf/shell/command.rb +26 -0
  143. data/lib/{alf/command → alf-shell/alf/shell}/doc_manager.rb +3 -3
  144. data/lib/alf-shell/alf/shell/operator.rb +86 -0
  145. data/lib/alf-shell/alf/shell.rb +40 -0
  146. data/lib/{alf/extra/yaml.rb → alf-yaml/alf/yaml/renderer.rb} +5 -7
  147. data/lib/alf-yaml/alf/yaml.rb +1 -0
  148. data/lib/alf.rb +17 -358
  149. data/spec/{unit → integration}/lispy/test_relation.rb +0 -0
  150. data/spec/{unit → integration}/lispy/test_run.rb +0 -0
  151. data/spec/{unit → integration}/lispy/test_tuple.rb +0 -0
  152. data/spec/integration/{command → shell}/alf/alf.db +0 -0
  153. data/spec/integration/{command → shell}/alf/alf_e.cmd +0 -0
  154. data/spec/integration/{command → shell}/alf/alf_e.stdout +0 -0
  155. data/spec/integration/shell/alf/alf_env.cmd +1 -0
  156. data/spec/integration/{command → shell}/alf/alf_env.stdout +0 -0
  157. data/spec/integration/shell/alf/alf_env_sqlite.cmd +1 -0
  158. data/spec/integration/{command → shell}/alf/alf_env_sqlite.stdout +0 -0
  159. data/spec/integration/{command → shell}/alf/alf_help.cmd +0 -0
  160. data/spec/integration/{command → shell}/alf/alf_help.stdout +0 -0
  161. data/spec/integration/{command → shell}/alf/alf_implicit.alf +0 -0
  162. data/spec/integration/shell/alf/alf_implicit_exec.cmd +1 -0
  163. data/spec/integration/{command → shell}/alf/alf_implicit_exec.stdout +0 -0
  164. data/spec/integration/{command → shell}/alf/alf_r.cmd +0 -0
  165. data/spec/integration/{command → shell}/alf/alf_r.stdout +0 -0
  166. data/spec/integration/{command → shell}/alf/alf_version.cmd +0 -0
  167. data/spec/integration/{command → shell}/alf/alf_version.stdout +0 -0
  168. data/spec/integration/{command → shell}/alf/alf_yaml.cmd +0 -0
  169. data/spec/integration/{command → shell}/alf/alf_yaml.stdout +0 -0
  170. data/spec/integration/{command → shell}/alf/rel.rash +0 -0
  171. data/spec/integration/{command → shell}/autonum/autonum_0.cmd +0 -0
  172. data/spec/integration/{command → shell}/autonum/autonum_0.stdout +0 -0
  173. data/spec/integration/shell/autonum/autonum_1.cmd +1 -0
  174. data/spec/integration/{command → shell}/autonum/autonum_1.stdout +0 -0
  175. data/spec/integration/shell/clip/clip_0.cmd +1 -0
  176. data/spec/integration/{command → shell}/clip/clip_0.stdout +0 -0
  177. data/spec/integration/shell/clip/clip_1.cmd +1 -0
  178. data/spec/integration/{command → shell}/clip/clip_1.stdout +0 -0
  179. data/spec/integration/{command → shell}/coerce/coerce_1.cmd +0 -0
  180. data/spec/integration/{command → shell}/coerce/coerce_1.stdout +0 -0
  181. data/spec/integration/{command → shell}/compact/compact_0.cmd +0 -0
  182. data/spec/integration/{command → shell}/compact/compact_0.stdout +0 -0
  183. data/spec/integration/{command → shell}/defaults/defaults_0.cmd +0 -0
  184. data/spec/integration/{command → shell}/defaults/defaults_0.stdout +0 -0
  185. data/spec/integration/{command → shell}/defaults/defaults_1.cmd +0 -0
  186. data/spec/integration/{command → shell}/defaults/defaults_1.stdout +0 -0
  187. data/spec/integration/{command → shell}/defaults/defaults_2.cmd +0 -0
  188. data/spec/integration/{command → shell}/defaults/defaults_2.stdout +0 -0
  189. data/spec/integration/{command → shell}/extend/extend_0.cmd +0 -0
  190. data/spec/integration/{command → shell}/extend/extend_0.stdout +0 -0
  191. data/spec/integration/{command → shell}/generator/generator_1.cmd +0 -0
  192. data/spec/integration/{command → shell}/generator/generator_1.stdout +0 -0
  193. data/spec/integration/{command → shell}/generator/generator_2.cmd +0 -0
  194. data/spec/integration/{command → shell}/generator/generator_2.stdout +0 -0
  195. data/spec/integration/{command → shell}/generator/generator_3.cmd +0 -0
  196. data/spec/integration/{command → shell}/generator/generator_3.stdout +0 -0
  197. data/spec/integration/{command → shell}/group/group_0.cmd +0 -0
  198. data/spec/integration/{command → shell}/group/group_0.stdout +0 -0
  199. data/spec/integration/{command → shell}/group/group_1.cmd +0 -0
  200. data/spec/integration/{command → shell}/group/group_1.stdout +0 -0
  201. data/spec/integration/{command → shell}/help/help_1.cmd +0 -0
  202. data/spec/integration/{command → shell}/help/help_1.stdout +0 -0
  203. data/spec/integration/{command → shell}/intersect/intersect_0.cmd +0 -0
  204. data/spec/integration/{command → shell}/intersect/intersect_0.stdout +0 -0
  205. data/spec/integration/{command → shell}/join/join_0.cmd +0 -0
  206. data/spec/integration/{command → shell}/join/join_0.stdout +0 -0
  207. data/spec/integration/{command → shell}/matching/matching_0.cmd +0 -0
  208. data/spec/integration/{command → shell}/matching/matching_0.stdout +0 -0
  209. data/spec/integration/{command → shell}/minus/minus_0.cmd +0 -0
  210. data/spec/integration/{command → shell}/minus/minus_0.stdout +0 -0
  211. data/spec/integration/{command → shell}/not-matching/not-matching_0.cmd +0 -0
  212. data/spec/integration/{command → shell}/not-matching/not-matching_0.stdout +0 -0
  213. data/spec/integration/{command → shell}/project/project_0.cmd +0 -0
  214. data/spec/integration/{command → shell}/project/project_0.stdout +0 -0
  215. data/spec/integration/{command → shell}/project/project_1.cmd +0 -0
  216. data/spec/integration/{command → shell}/project/project_1.stdout +0 -0
  217. data/spec/integration/{command → shell}/quota/quota_0.cmd +0 -0
  218. data/spec/integration/{command → shell}/quota/quota_0.stdout +0 -0
  219. data/spec/integration/{command → shell}/rank/rank_1.cmd +0 -0
  220. data/spec/integration/{command → shell}/rank/rank_1.stdout +1 -1
  221. data/spec/integration/{command → shell}/rank/rank_2.cmd +0 -0
  222. data/spec/integration/{command → shell}/rank/rank_2.stdout +1 -1
  223. data/spec/integration/{command → shell}/rank/rank_3.cmd +0 -0
  224. data/spec/integration/{command → shell}/rank/rank_3.stdout +0 -0
  225. data/spec/integration/{command → shell}/rank/rank_4.cmd +0 -0
  226. data/spec/integration/{command → shell}/rank/rank_4.stdout +0 -0
  227. data/spec/integration/{command → shell}/rank/rank_5.cmd +0 -0
  228. data/spec/integration/{command → shell}/rank/rank_5.stdout +0 -0
  229. data/spec/integration/{command → shell}/rename/rename_0.cmd +0 -0
  230. data/spec/integration/{command → shell}/rename/rename_0.stdout +0 -0
  231. data/spec/integration/{command → shell}/restrict/restrict_0.cmd +0 -0
  232. data/spec/integration/{command → shell}/restrict/restrict_0.stdout +0 -0
  233. data/spec/integration/{command → shell}/restrict/restrict_1.cmd +0 -0
  234. data/spec/integration/{command → shell}/restrict/restrict_1.stdout +0 -0
  235. data/spec/integration/{command → shell}/show/show_base.cmd +0 -0
  236. data/spec/integration/{command → shell}/show/show_base.stdout +0 -0
  237. data/spec/integration/{command → shell}/show/show_base_sort_1.cmd +0 -0
  238. data/spec/integration/{command → shell}/show/show_base_sort_1.stdout +0 -0
  239. data/spec/integration/{command → shell}/show/show_base_sort_2.cmd +0 -0
  240. data/spec/integration/{command → shell}/show/show_base_sort_2.stdout +0 -0
  241. data/spec/integration/{command → shell}/show/show_conflictual.cmd +0 -0
  242. data/spec/integration/{command → shell}/show/show_conflictual.stdout +0 -0
  243. data/spec/integration/{command → shell}/show/show_csv.cmd +0 -0
  244. data/spec/integration/{command → shell}/show/show_csv.stdout +0 -0
  245. data/spec/integration/{command → shell}/show/show_ff.cmd +0 -0
  246. data/spec/integration/{command → shell}/show/show_ff.stdout +0 -0
  247. data/spec/integration/{command → shell}/show/show_rash.cmd +0 -0
  248. data/spec/integration/{command → shell}/show/show_rash.stdout +0 -0
  249. data/spec/integration/{command → shell}/show/show_rash_pretty.cmd +0 -0
  250. data/spec/integration/{command → shell}/show/show_rash_pretty.stdout +0 -0
  251. data/spec/integration/{command → shell}/show/show_yaml.cmd +0 -0
  252. data/spec/integration/{command → shell}/show/show_yaml.stdout +0 -0
  253. data/spec/integration/{command → shell}/sort/sort_0.cmd +0 -0
  254. data/spec/integration/{command → shell}/sort/sort_0.stdout +0 -0
  255. data/spec/integration/{command → shell}/sort/sort_1.cmd +0 -0
  256. data/spec/integration/{command → shell}/sort/sort_1.stdout +0 -0
  257. data/spec/integration/{command → shell}/sort/sort_2.cmd +0 -0
  258. data/spec/integration/{command → shell}/sort/sort_2.stdout +0 -0
  259. data/spec/integration/{command → shell}/sort/sort_3.cmd +0 -0
  260. data/spec/integration/{command → shell}/sort/sort_3.stdout +0 -0
  261. data/spec/integration/{command → shell}/summarize/summarize_0.cmd +0 -0
  262. data/spec/integration/{command → shell}/summarize/summarize_0.stdout +0 -0
  263. data/spec/integration/{command → shell}/ungroup/ungroup_0.cmd +0 -0
  264. data/spec/integration/{command → shell}/ungroup/ungroup_0.stdout +0 -0
  265. data/spec/integration/{command → shell}/union/union_0.cmd +0 -0
  266. data/spec/integration/{command → shell}/union/union_0.stdout +0 -0
  267. data/spec/integration/{command → shell}/unwrap/unwrap_0.cmd +0 -0
  268. data/spec/integration/{command → shell}/unwrap/unwrap_0.stdout +0 -0
  269. data/spec/integration/{command → shell}/wrap/wrap_0.cmd +0 -0
  270. data/spec/integration/{command → shell}/wrap/wrap_0.stdout +0 -0
  271. data/spec/{unit → integration}/test_lispy.rb +0 -0
  272. data/spec/integration/{test_command.rb → test_shell.rb} +3 -3
  273. data/spec/regression/heading/test_heading_with_date.rb +1 -1
  274. data/spec/shared/a_valid_type_implementation.rb +47 -0
  275. data/spec/shared/an_operator_class.rb +2 -6
  276. data/spec/spec_helper.rb +9 -1
  277. data/spec/unit/alf-core/aggregator/test_avg.rb +22 -0
  278. data/spec/unit/alf-core/aggregator/test_collect.rb +25 -0
  279. data/spec/unit/alf-core/aggregator/test_concat.rb +31 -0
  280. data/spec/unit/alf-core/aggregator/test_count.rb +17 -0
  281. data/spec/unit/alf-core/aggregator/test_max.rb +23 -0
  282. data/spec/unit/alf-core/aggregator/test_min.rb +23 -0
  283. data/spec/unit/alf-core/aggregator/test_stddev.rb +27 -0
  284. data/spec/unit/alf-core/aggregator/test_sum.rb +23 -0
  285. data/spec/unit/alf-core/aggregator/test_variance.rb +29 -0
  286. data/spec/unit/{assumptions → alf-core/assumptions}/test_file.rb +0 -0
  287. data/spec/unit/{assumptions → alf-core/assumptions}/test_instance_eval.rb +0 -0
  288. data/spec/unit/{assumptions → alf-core/assumptions}/test_scoping.rb +0 -0
  289. data/spec/unit/{assumptions → alf-core/assumptions}/test_set.rb +0 -0
  290. data/spec/unit/{environment → alf-core/environment}/examples/suppliers.rash +0 -0
  291. data/spec/unit/alf-core/environment/test_folder.rb +53 -0
  292. data/spec/unit/{operator → alf-core/operator}/non_relational/test_autonum.rb +18 -31
  293. data/spec/unit/alf-core/operator/non_relational/test_clip.rb +35 -0
  294. data/spec/unit/{operator → alf-core/operator}/non_relational/test_coerce.rb +11 -17
  295. data/spec/unit/{operator/non_relational/compact/test_sort_based.rb → alf-core/operator/non_relational/test_compact.rb} +16 -14
  296. data/spec/unit/{operator → alf-core/operator}/non_relational/test_defaults.rb +17 -32
  297. data/spec/unit/{operator → alf-core/operator}/non_relational/test_generator.rb +21 -39
  298. data/spec/unit/{operator → alf-core/operator}/non_relational/test_sort.rb +20 -26
  299. data/spec/unit/{operator → alf-core/operator}/relational/test_extend.rb +8 -14
  300. data/spec/unit/{operator → alf-core/operator}/relational/test_group.rb +12 -28
  301. data/spec/unit/alf-core/operator/relational/test_heading.rb +27 -0
  302. data/spec/unit/{operator → alf-core/operator}/relational/test_intersect.rb +22 -22
  303. data/spec/unit/{operator → alf-core/operator}/relational/test_join.rb +7 -7
  304. data/spec/unit/{operator → alf-core/operator}/relational/test_minus.rb +23 -23
  305. data/spec/unit/alf-core/operator/relational/test_project.rb +62 -0
  306. data/spec/unit/{operator → alf-core/operator}/relational/test_quota.rb +8 -15
  307. data/spec/unit/alf-core/operator/relational/test_rank.rb +48 -0
  308. data/spec/unit/{operator → alf-core/operator}/relational/test_rename.rb +8 -14
  309. data/spec/unit/alf-core/operator/relational/test_restrict.rb +45 -0
  310. data/spec/unit/{operator → alf-core/operator}/relational/test_summarize.rb +13 -31
  311. data/spec/unit/{operator → alf-core/operator}/relational/test_ungroup.rb +9 -15
  312. data/spec/unit/{operator → alf-core/operator}/relational/test_union.rb +11 -11
  313. data/spec/unit/{operator → alf-core/operator}/relational/test_unwrap.rb +10 -16
  314. data/spec/unit/{operator → alf-core/operator}/relational/test_wrap.rb +10 -16
  315. data/spec/unit/alf-core/operator/signature/test_argv2args.rb +82 -0
  316. data/spec/unit/alf-core/operator/signature/test_collect_on.rb +38 -0
  317. data/spec/unit/{operator → alf-core/operator}/signature/test_initialize.rb +0 -0
  318. data/spec/unit/{operator → alf-core/operator}/signature/test_install.rb +0 -0
  319. data/spec/unit/{operator → alf-core/operator}/signature/test_option_parser.rb +0 -0
  320. data/spec/unit/alf-core/operator/signature/test_parse_args.rb +90 -0
  321. data/spec/unit/{operator → alf-core/operator}/signature/test_to_lispy.rb +0 -0
  322. data/spec/unit/{operator → alf-core/operator}/signature/test_to_shell.rb +0 -0
  323. data/spec/unit/{operator → alf-core/operator}/test_non_relational.rb +0 -0
  324. data/spec/unit/{operator → alf-core/operator}/test_relational.rb +0 -0
  325. data/spec/unit/{reader → alf-core/reader}/input.rb +0 -0
  326. data/spec/unit/{reader → alf-core/reader}/test_alf_file.rb +0 -0
  327. data/spec/unit/{reader → alf-core/reader}/test_initialize.rb +0 -0
  328. data/spec/unit/alf-core/reader/test_looks_a_path.rb +20 -0
  329. data/spec/unit/{reader → alf-core/reader}/test_rash.rb +0 -0
  330. data/spec/unit/{relation → alf-core/relation}/test_coerce.rb +0 -0
  331. data/spec/unit/{relation → alf-core/relation}/test_inspect.rb +0 -0
  332. data/spec/unit/{relation → alf-core/relation}/test_relops.rb +0 -0
  333. data/spec/unit/{relation → alf-core/relation}/test_to_a.rb +0 -0
  334. data/spec/unit/{renderer → alf-core/renderer}/test_initialize.rb +0 -0
  335. data/spec/unit/alf-core/test_aggregator.rb +58 -0
  336. data/spec/unit/{test_environment.rb → alf-core/test_environment.rb} +8 -21
  337. data/spec/unit/{test_operator.rb → alf-core/test_operator.rb} +0 -0
  338. data/spec/unit/{test_reader.rb → alf-core/test_reader.rb} +0 -0
  339. data/spec/unit/{test_relation.rb → alf-core/test_relation.rb} +0 -0
  340. data/spec/unit/{test_renderer.rb → alf-core/test_renderer.rb} +0 -0
  341. data/spec/unit/{text → alf-core/text}/test_cell.rb +0 -0
  342. data/spec/unit/{text → alf-core/text}/test_row.rb +0 -0
  343. data/spec/unit/{text → alf-core/text}/test_table.rb +0 -0
  344. data/spec/unit/alf-core/tools/test_class_name.rb +16 -0
  345. data/spec/unit/{tools → alf-core/tools}/test_coalesce.rb +6 -2
  346. data/spec/unit/alf-core/tools/test_coerce.rb +16 -0
  347. data/spec/unit/alf-core/tools/test_ruby_case.rb +16 -0
  348. data/spec/unit/{tools → alf-core/tools}/test_to_lispy.rb +14 -7
  349. data/spec/unit/{tools → alf-core/tools}/test_to_ruby_literal.rb +5 -5
  350. data/spec/unit/{tools → alf-core/tools}/test_tuple_handle.rb +14 -14
  351. data/spec/unit/alf-core/tools/test_tuple_heading.rb +15 -0
  352. data/spec/unit/{tools → alf-core/tools}/test_varargs.rb +9 -6
  353. data/spec/unit/alf-core/types/test_attr_list.rb +188 -0
  354. data/spec/unit/alf-core/types/test_attr_name.rb +78 -0
  355. data/spec/unit/{types/test_attr_name.rb → alf-core/types/test_boolean.rb} +18 -28
  356. data/spec/unit/alf-core/types/test_class_methods.rb +24 -0
  357. data/spec/unit/alf-core/types/test_heading.rb +146 -0
  358. data/spec/unit/alf-core/types/test_ordering.rb +185 -0
  359. data/spec/unit/alf-core/types/test_renaming.rb +72 -0
  360. data/spec/unit/alf-core/types/test_size.rb +74 -0
  361. data/spec/unit/{types → alf-core/types}/test_summarization.rb +46 -14
  362. data/spec/unit/{types → alf-core/types}/test_tuple_computation.rb +46 -10
  363. data/spec/unit/alf-core/types/test_tuple_expression.rb +122 -0
  364. data/spec/unit/{types → alf-core/types}/test_tuple_predicate.rb +51 -22
  365. data/spec/unit/{csv → alf-csv}/input.csv +0 -0
  366. data/spec/unit/{csv → alf-csv}/test_reader.rb +0 -0
  367. data/spec/unit/{csv → alf-csv}/test_renderer.rb +1 -1
  368. data/spec/unit/alf-engine/compact/test_set.rb +33 -0
  369. data/spec/unit/alf-engine/compact/test_uniq.rb +33 -0
  370. data/spec/unit/alf-engine/group/test_hash.rb +34 -0
  371. data/spec/unit/{operator/relational/join/test_hash_based.rb → alf-engine/join/test_hash.rb} +21 -29
  372. data/spec/unit/alf-engine/materialize/test_array.rb +28 -0
  373. data/spec/unit/alf-engine/materialize/test_hash.rb +76 -0
  374. data/spec/unit/alf-engine/quota/test_cesure.rb +34 -0
  375. data/spec/unit/{operator/relational/test_rank.rb → alf-engine/rank/test_cesure.rb} +21 -24
  376. data/spec/unit/alf-engine/semi/test_hash.rb +58 -0
  377. data/spec/unit/alf-engine/sort/test_in_memory.rb +32 -0
  378. data/spec/unit/{operator/relational/summarize/test_hash_based.rb → alf-engine/summarize/test_cesure.rb} +15 -21
  379. data/spec/unit/{operator/relational/summarize/test_sort_based.rb → alf-engine/summarize/test_hash.rb} +15 -21
  380. data/spec/unit/alf-engine/test_aggregate.rb +26 -0
  381. data/spec/unit/alf-engine/test_autonum.rb +24 -0
  382. data/spec/unit/alf-engine/test_clip.rb +34 -0
  383. data/spec/unit/alf-engine/test_coerce.rb +35 -0
  384. data/spec/unit/alf-engine/test_compact.rb +33 -0
  385. data/spec/unit/alf-engine/test_concat.rb +38 -0
  386. data/spec/unit/alf-engine/test_defaults.rb +37 -0
  387. data/spec/unit/alf-engine/test_filter.rb +23 -0
  388. data/spec/unit/alf-engine/test_generator.rb +25 -0
  389. data/spec/unit/alf-engine/test_rename.rb +24 -0
  390. data/spec/unit/alf-engine/test_set_attr.rb +38 -0
  391. data/spec/unit/alf-engine/test_sort.rb +32 -0
  392. data/spec/unit/alf-engine/test_ungroup.rb +28 -0
  393. data/spec/unit/alf-engine/test_unwrap.rb +20 -0
  394. data/spec/unit/alf-engine/test_wrap.rb +26 -0
  395. data/spec/unit/{logs → alf-logs}/apache_combined.log +0 -0
  396. data/spec/unit/{logs → alf-logs}/postgresql.log +0 -0
  397. data/spec/unit/{logs → alf-logs}/test_reader.rb +15 -16
  398. data/spec/unit/{sequel → alf-sequel}/alf.db +0 -0
  399. data/spec/unit/alf-sequel/test_environment.rb +69 -0
  400. data/spec/unit/{command → alf-shell}/doc_manager/dynamic.md +0 -0
  401. data/spec/unit/{command → alf-shell}/doc_manager/example.md +0 -0
  402. data/spec/unit/{command → alf-shell}/doc_manager/example_1.txt +0 -0
  403. data/spec/unit/{command → alf-shell}/doc_manager/static.md +0 -0
  404. data/spec/unit/{command → alf-shell}/doc_manager/test_call.rb +2 -3
  405. data/spec/unit/alf-shell/main/test_class_methods.rb +44 -0
  406. data/spec/unit/alf-shell/operator/test_autonum.rb +28 -0
  407. data/spec/unit/alf-shell/operator/test_clip.rb +29 -0
  408. data/spec/unit/alf-shell/operator/test_coerce.rb +21 -0
  409. data/spec/unit/alf-shell/operator/test_compact.rb +16 -0
  410. data/spec/unit/alf-shell/operator/test_defaults.rb +29 -0
  411. data/spec/unit/alf-shell/operator/test_extend.rb +21 -0
  412. data/spec/unit/alf-shell/operator/test_generator.rb +37 -0
  413. data/spec/unit/alf-shell/operator/test_group.rb +32 -0
  414. data/spec/unit/alf-shell/operator/test_heading.rb +16 -0
  415. data/spec/unit/alf-shell/operator/test_intersect.rb +18 -0
  416. data/spec/unit/alf-shell/operator/test_join.rb +18 -0
  417. data/spec/unit/alf-shell/operator/test_matching.rb +18 -0
  418. data/spec/unit/alf-shell/operator/test_minus.rb +18 -0
  419. data/spec/unit/alf-shell/operator/test_not_matching.rb +18 -0
  420. data/spec/unit/alf-shell/operator/test_project.rb +38 -0
  421. data/spec/unit/alf-shell/operator/test_quota.rb +23 -0
  422. data/spec/unit/alf-shell/operator/test_rank.rb +30 -0
  423. data/spec/unit/alf-shell/operator/test_rename.rb +21 -0
  424. data/spec/unit/alf-shell/operator/test_restrict.rb +35 -0
  425. data/spec/unit/alf-shell/operator/test_sort.rb +49 -0
  426. data/spec/unit/alf-shell/operator/test_summarize.rb +30 -0
  427. data/spec/unit/alf-shell/operator/test_ungroup.rb +28 -0
  428. data/spec/unit/alf-shell/operator/test_union.rb +18 -0
  429. data/spec/unit/alf-shell/operator/test_unwrap.rb +28 -0
  430. data/spec/unit/alf-shell/operator/test_wrap.rb +30 -0
  431. data/tasks/debug_mail.rake +42 -45
  432. data/tasks/gem.rake +13 -13
  433. data/tasks/gh-pages.rake +11 -6
  434. data/tasks/integration_test.rake +0 -8
  435. data/tasks/regression_test.rake +0 -8
  436. data/tasks/unit_test.rake +0 -8
  437. data/tasks/yard.rake +13 -13
  438. metadata +909 -1107
  439. data/examples/hitradio/compact.rb +0 -48
  440. data/examples/hitradio/compare1.rb +0 -28
  441. data/examples/hitradio/gz_reader.rb +0 -23
  442. data/examples/hitradio/hitradio-1.alf +0 -1
  443. data/examples/hitradio/hitradio.log +0 -25080
  444. data/examples/hitradio/hitradio.mar +0 -25081
  445. data/examples/hitradio/hitradio.mar.gz +0 -0
  446. data/examples/hitradio/hitradio.rash +0 -25080
  447. data/examples/hitradio/mar_reader.rb +0 -18
  448. data/examples/northwind/customers.csv +0 -92
  449. data/examples/northwind/northwind.db +0 -0
  450. data/examples/northwind/orders.csv +0 -831
  451. data/lib/alf/aggregator/aggregators.rb +0 -105
  452. data/lib/alf/aggregator/aggregators.rbc +0 -2640
  453. data/lib/alf/aggregator/base.rbc +0 -1055
  454. data/lib/alf/aggregator/class_methods.rbc +0 -830
  455. data/lib/alf/buffer/sorted.rb +0 -48
  456. data/lib/alf/buffer/sorted.rbc +0 -715
  457. data/lib/alf/command/class_methods.rb +0 -27
  458. data/lib/alf/command/class_methods.rbc +0 -453
  459. data/lib/alf/command/doc_manager.rbc +0 -1604
  460. data/lib/alf/command/exec.rbc +0 -408
  461. data/lib/alf/command/help.rbc +0 -764
  462. data/lib/alf/command/main.rbc +0 -3612
  463. data/lib/alf/command/show.rbc +0 -1327
  464. data/lib/alf/environment/base.rbc +0 -459
  465. data/lib/alf/environment/class_methods.rbc +0 -1110
  466. data/lib/alf/environment/explicit.rb +0 -38
  467. data/lib/alf/environment/explicit.rbc +0 -601
  468. data/lib/alf/environment/folder.rbc +0 -942
  469. data/lib/alf/errors.rbc +0 -155
  470. data/lib/alf/extra/csv.rb +0 -107
  471. data/lib/alf/extra/csv.rbc +0 -2021
  472. data/lib/alf/extra/logs.rbc +0 -1957
  473. data/lib/alf/extra/sequel.rb +0 -77
  474. data/lib/alf/extra/sequel.rbc +0 -1417
  475. data/lib/alf/extra/yaml.rbc +0 -435
  476. data/lib/alf/extra.rb +0 -5
  477. data/lib/alf/extra.rbc +0 -101
  478. data/lib/alf/iterator/base.rb +0 -38
  479. data/lib/alf/iterator/base.rbc +0 -437
  480. data/lib/alf/iterator/class_methods.rbc +0 -518
  481. data/lib/alf/iterator/proxy.rbc +0 -599
  482. data/lib/alf/lispy/instance_methods.rbc +0 -2535
  483. data/lib/alf/loader.rbc +0 -85
  484. data/lib/alf/operator/base.rb +0 -74
  485. data/lib/alf/operator/base.rbc +0 -860
  486. data/lib/alf/operator/binary.rbc +0 -595
  487. data/lib/alf/operator/cesure.rbc +0 -883
  488. data/lib/alf/operator/class_methods.rbc +0 -1915
  489. data/lib/alf/operator/experimental.rbc +0 -200
  490. data/lib/alf/operator/non_relational/autonum.rbc +0 -587
  491. data/lib/alf/operator/non_relational/clip.rbc +0 -522
  492. data/lib/alf/operator/non_relational/coerce.rbc +0 -596
  493. data/lib/alf/operator/non_relational/compact.rbc +0 -1283
  494. data/lib/alf/operator/non_relational/defaults.rbc +0 -733
  495. data/lib/alf/operator/non_relational/generator.rbc +0 -1015
  496. data/lib/alf/operator/non_relational/sort.rbc +0 -665
  497. data/lib/alf/operator/nullary.rbc +0 -404
  498. data/lib/alf/operator/relational/extend.rbc +0 -616
  499. data/lib/alf/operator/relational/group.rbc +0 -968
  500. data/lib/alf/operator/relational/heading.rbc +0 -657
  501. data/lib/alf/operator/relational/intersect.rbc +0 -969
  502. data/lib/alf/operator/relational/join.rbc +0 -1708
  503. data/lib/alf/operator/relational/matching.rbc +0 -1047
  504. data/lib/alf/operator/relational/minus.rbc +0 -965
  505. data/lib/alf/operator/relational/not_matching.rbc +0 -1047
  506. data/lib/alf/operator/relational/project.rbc +0 -669
  507. data/lib/alf/operator/relational/quota.rbc +0 -1193
  508. data/lib/alf/operator/relational/rank.rbc +0 -1217
  509. data/lib/alf/operator/relational/rename.rbc +0 -496
  510. data/lib/alf/operator/relational/restrict.rbc +0 -611
  511. data/lib/alf/operator/relational/summarize.rbc +0 -1922
  512. data/lib/alf/operator/relational/ungroup.rbc +0 -643
  513. data/lib/alf/operator/relational/union.rbc +0 -846
  514. data/lib/alf/operator/relational/unwrap.rbc +0 -540
  515. data/lib/alf/operator/relational/wrap.rbc +0 -560
  516. data/lib/alf/operator/shortcut.rb +0 -53
  517. data/lib/alf/operator/shortcut.rbc +0 -809
  518. data/lib/alf/operator/signature.rbc +0 -4640
  519. data/lib/alf/operator/transform.rb +0 -27
  520. data/lib/alf/operator/transform.rbc +0 -484
  521. data/lib/alf/operator/unary.rbc +0 -629
  522. data/lib/alf/reader/alf_file.rbc +0 -464
  523. data/lib/alf/reader/base.rbc +0 -1613
  524. data/lib/alf/reader/class_methods.rbc +0 -1099
  525. data/lib/alf/reader/rash.rbc +0 -583
  526. data/lib/alf/relation/class_methods.rbc +0 -674
  527. data/lib/alf/relation/instance_methods.rbc +0 -2107
  528. data/lib/alf/renderer/base.rbc +0 -936
  529. data/lib/alf/renderer/class_methods.rbc +0 -875
  530. data/lib/alf/renderer/rash.rbc +0 -802
  531. data/lib/alf/renderer/text.rbc +0 -5530
  532. data/lib/alf/tools/coerce.rbc +0 -352
  533. data/lib/alf/tools/miscellaneous.rbc +0 -1497
  534. data/lib/alf/tools/to_lispy.rbc +0 -2618
  535. data/lib/alf/tools/to_ruby_literal.rbc +0 -344
  536. data/lib/alf/tools/tuple_handle.rbc +0 -738
  537. data/lib/alf/types/attr_list.rbc +0 -1535
  538. data/lib/alf/types/attr_name.rbc +0 -781
  539. data/lib/alf/types/boolean.rbc +0 -365
  540. data/lib/alf/types/heading.rbc +0 -1778
  541. data/lib/alf/types/ordering.rbc +0 -2228
  542. data/lib/alf/types/renaming.rbc +0 -1064
  543. data/lib/alf/types/summarization.rbc +0 -1394
  544. data/lib/alf/types/tuple_computation.rbc +0 -1061
  545. data/lib/alf/types/tuple_expression.rbc +0 -1016
  546. data/lib/alf/types/tuple_predicate.rbc +0 -1349
  547. data/lib/alf/version.rbc +0 -350
  548. data/lib/alf.rbc +0 -3884
  549. data/spec/integration/command/alf/alf_env.cmd +0 -1
  550. data/spec/integration/command/alf/alf_env_sqlite.cmd +0 -1
  551. data/spec/integration/command/alf/alf_implicit_exec.cmd +0 -1
  552. data/spec/integration/command/autonum/autonum_1.cmd +0 -1
  553. data/spec/integration/command/clip/clip_0.cmd +0 -1
  554. data/spec/integration/command/clip/clip_1.cmd +0 -1
  555. data/spec/integration/command/show/show_rash_2.cmd +0 -1
  556. data/spec/integration/command/show/show_rash_2.stdout +0 -5
  557. data/spec/integration/test_alf.rbc +0 -1098
  558. data/spec/integration/test_command.rbc +0 -1832
  559. data/spec/integration/test_examples.rbc +0 -559
  560. data/spec/integration/test_semantics.rbc +0 -991
  561. data/spec/regression/alf_file/test___FILE__.rbc +0 -524
  562. data/spec/regression/heading/test_heading_with_date.rbc +0 -381
  563. data/spec/regression/lispy/test_compile.rbc +0 -404
  564. data/spec/regression/logs/test_path_attribute.rbc +0 -687
  565. data/spec/regression/relation/test_relation_allbut_all.rbc +0 -468
  566. data/spec/regression/relation/test_relation_with_date.rbc +0 -381
  567. data/spec/regression/restrict/test_restrict_with_keywords.rbc +0 -628
  568. data/spec/shared/a_value.rbc +0 -337
  569. data/spec/shared/an_operator_class.rbc +0 -908
  570. data/spec/spec_helper.rbc +0 -453
  571. data/spec/unit/assumptions/test_file.rbc +0 -668
  572. data/spec/unit/assumptions/test_instance_eval.rbc +0 -654
  573. data/spec/unit/assumptions/test_scoping.rbc +0 -755
  574. data/spec/unit/assumptions/test_set.rbc +0 -1928
  575. data/spec/unit/command/doc_manager/test_call.rbc +0 -1537
  576. data/spec/unit/csv/test_reader.rbc +0 -2228
  577. data/spec/unit/csv/test_renderer.rbc +0 -2426
  578. data/spec/unit/environment/test_explicit.rb +0 -15
  579. data/spec/unit/environment/test_explicit.rbc +0 -464
  580. data/spec/unit/environment/test_folder.rb +0 -35
  581. data/spec/unit/environment/test_folder.rbc +0 -1304
  582. data/spec/unit/lispy/test_relation.rbc +0 -1477
  583. data/spec/unit/lispy/test_run.rbc +0 -1735
  584. data/spec/unit/lispy/test_tuple.rbc +0 -1686
  585. data/spec/unit/logs/test_reader.rbc +0 -1807
  586. data/spec/unit/operator/non_relational/compact/test_buffer_based.rb +0 -30
  587. data/spec/unit/operator/non_relational/compact/test_buffer_based.rbc +0 -1127
  588. data/spec/unit/operator/non_relational/compact/test_sort_based.rbc +0 -1127
  589. data/spec/unit/operator/non_relational/test_autonum.rbc +0 -1969
  590. data/spec/unit/operator/non_relational/test_clip.rb +0 -49
  591. data/spec/unit/operator/non_relational/test_clip.rbc +0 -1850
  592. data/spec/unit/operator/non_relational/test_coerce.rbc +0 -1290
  593. data/spec/unit/operator/non_relational/test_compact.rb +0 -38
  594. data/spec/unit/operator/non_relational/test_compact.rbc +0 -1382
  595. data/spec/unit/operator/non_relational/test_defaults.rbc +0 -2319
  596. data/spec/unit/operator/non_relational/test_generator.rbc +0 -2361
  597. data/spec/unit/operator/non_relational/test_sort.rbc +0 -2583
  598. data/spec/unit/operator/relational/join/test_hash_based.rbc +0 -2481
  599. data/spec/unit/operator/relational/matching/test_hash_based.rb +0 -60
  600. data/spec/unit/operator/relational/matching/test_hash_based.rbc +0 -2458
  601. data/spec/unit/operator/relational/not_matching/test_hash_based.rb +0 -37
  602. data/spec/unit/operator/relational/not_matching/test_hash_based.rbc +0 -1632
  603. data/spec/unit/operator/relational/summarize/test_hash_based.rbc +0 -1990
  604. data/spec/unit/operator/relational/summarize/test_sort_based.rbc +0 -1990
  605. data/spec/unit/operator/relational/test_extend.rbc +0 -1300
  606. data/spec/unit/operator/relational/test_group.rbc +0 -2142
  607. data/spec/unit/operator/relational/test_intersect.rbc +0 -2069
  608. data/spec/unit/operator/relational/test_join.rbc +0 -1282
  609. data/spec/unit/operator/relational/test_minus.rbc +0 -1995
  610. data/spec/unit/operator/relational/test_project.rb +0 -75
  611. data/spec/unit/operator/relational/test_project.rbc +0 -2870
  612. data/spec/unit/operator/relational/test_quota.rbc +0 -1788
  613. data/spec/unit/operator/relational/test_rank.rbc +0 -2079
  614. data/spec/unit/operator/relational/test_rename.rbc +0 -1158
  615. data/spec/unit/operator/relational/test_restrict.rb +0 -56
  616. data/spec/unit/operator/relational/test_restrict.rbc +0 -2305
  617. data/spec/unit/operator/relational/test_summarize.rbc +0 -2570
  618. data/spec/unit/operator/relational/test_ungroup.rbc +0 -1425
  619. data/spec/unit/operator/relational/test_union.rbc +0 -1089
  620. data/spec/unit/operator/relational/test_unwrap.rbc +0 -1176
  621. data/spec/unit/operator/relational/test_wrap.rbc +0 -1203
  622. data/spec/unit/operator/signature/test_collect_on.rb +0 -45
  623. data/spec/unit/operator/signature/test_collect_on.rbc +0 -1989
  624. data/spec/unit/operator/signature/test_initialize.rbc +0 -544
  625. data/spec/unit/operator/signature/test_install.rbc +0 -1671
  626. data/spec/unit/operator/signature/test_option_parser.rbc +0 -1348
  627. data/spec/unit/operator/signature/test_parse_args.rb +0 -60
  628. data/spec/unit/operator/signature/test_parse_args.rbc +0 -1908
  629. data/spec/unit/operator/signature/test_parse_argv.rb +0 -87
  630. data/spec/unit/operator/signature/test_parse_argv.rbc +0 -2878
  631. data/spec/unit/operator/signature/test_to_lispy.rbc +0 -3305
  632. data/spec/unit/operator/signature/test_to_shell.rbc +0 -3327
  633. data/spec/unit/operator/test_non_relational.rbc +0 -571
  634. data/spec/unit/operator/test_relational.rbc +0 -758
  635. data/spec/unit/reader/test_alf_file.rbc +0 -1107
  636. data/spec/unit/reader/test_initialize.rbc +0 -1774
  637. data/spec/unit/reader/test_rash.rbc +0 -1127
  638. data/spec/unit/relation/test_coerce.rbc +0 -2320
  639. data/spec/unit/relation/test_inspect.rbc +0 -502
  640. data/spec/unit/relation/test_relops.rbc +0 -1585
  641. data/spec/unit/relation/test_to_a.rbc +0 -1112
  642. data/spec/unit/renderer/test_initialize.rbc +0 -1766
  643. data/spec/unit/sequel/test_environment.rb +0 -54
  644. data/spec/unit/sequel/test_environment.rbc +0 -1723
  645. data/spec/unit/test_aggregator.rb +0 -109
  646. data/spec/unit/test_aggregator.rbc +0 -4358
  647. data/spec/unit/test_environment.rbc +0 -1271
  648. data/spec/unit/test_lispy.rbc +0 -879
  649. data/spec/unit/test_operator.rbc +0 -531
  650. data/spec/unit/test_reader.rbc +0 -1249
  651. data/spec/unit/test_relation.rbc +0 -2588
  652. data/spec/unit/test_renderer.rbc +0 -2011
  653. data/spec/unit/text/test_cell.rbc +0 -1532
  654. data/spec/unit/text/test_row.rbc +0 -847
  655. data/spec/unit/text/test_table.rbc +0 -978
  656. data/spec/unit/tools/test_coalesce.rbc +0 -456
  657. data/spec/unit/tools/test_coerce.rb +0 -10
  658. data/spec/unit/tools/test_coerce.rbc +0 -279
  659. data/spec/unit/tools/test_to_lispy.rbc +0 -5711
  660. data/spec/unit/tools/test_to_ruby_literal.rbc +0 -272
  661. data/spec/unit/tools/test_tools.rb +0 -25
  662. data/spec/unit/tools/test_tools.rbc +0 -672
  663. data/spec/unit/tools/test_tuple_handle.rbc +0 -1591
  664. data/spec/unit/tools/test_tuple_heading.rb +0 -20
  665. data/spec/unit/tools/test_tuple_heading.rbc +0 -821
  666. data/spec/unit/tools/test_varargs.rbc +0 -495
  667. data/spec/unit/types/heading/test_union.rb +0 -21
  668. data/spec/unit/types/heading/test_union.rbc +0 -1043
  669. data/spec/unit/types/test_attr_list.rb +0 -106
  670. data/spec/unit/types/test_attr_list.rbc +0 -4481
  671. data/spec/unit/types/test_attr_name.rbc +0 -1872
  672. data/spec/unit/types/test_heading.rb +0 -48
  673. data/spec/unit/types/test_heading.rbc +0 -1735
  674. data/spec/unit/types/test_ordering.rb +0 -127
  675. data/spec/unit/types/test_ordering.rbc +0 -3695
  676. data/spec/unit/types/test_renaming.rb +0 -55
  677. data/spec/unit/types/test_renaming.rbc +0 -2426
  678. data/spec/unit/types/test_summarization.rbc +0 -2538
  679. data/spec/unit/types/test_tuple_computation.rbc +0 -2340
  680. data/spec/unit/types/test_tuple_expression.rb +0 -64
  681. data/spec/unit/types/test_tuple_expression.rbc +0 -2285
  682. data/spec/unit/types/test_tuple_predicate.rbc +0 -3168
@@ -0,0 +1,188 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe AttrList do
4
+
5
+ describe "the class itself" do
6
+ let(:type){ AttrList }
7
+ def AttrList.exemplars
8
+ [
9
+ [],
10
+ [:a],
11
+ [:a, :b]
12
+ ].map{|arg| AttrList.coerce(arg) }
13
+ end
14
+ it_should_behave_like 'A valid type implementation'
15
+ end
16
+
17
+ describe "coerce" do
18
+
19
+ subject{ AttrList.coerce(arg) }
20
+
21
+ describe "when passed a AttrList" do
22
+ let(:arg){ [:a, :b] }
23
+ it{ should eq(AttrList.new(arg)) }
24
+ end
25
+
26
+ describe "when passed an Ordering" do
27
+ let(:arg){ Ordering.new [[:a, :asc], [:b, :asc]] }
28
+ it{ should eq(AttrList.new([:a, :b])) }
29
+ end
30
+
31
+ describe "when passed a TupleComputation" do
32
+ let(:arg){ TupleComputation[:a => 12, :b => "Smith"] }
33
+ specify{
34
+ subject.should be_a(AttrList)
35
+ subject.to_a.to_set.should eq([:a, :b].to_set)
36
+ }
37
+ end
38
+
39
+ describe "when passed an array" do
40
+ let(:arg){ [:a, :b] }
41
+ it{ should eq(AttrList.new([:a, :b])) }
42
+ end
43
+
44
+ describe "when passed an unrecognized argument" do
45
+ let(:arg){ :not_recognized }
46
+ specify{
47
+ lambda{ subject }.should raise_error(ArgumentError)
48
+ }
49
+ end
50
+
51
+ end # coerce
52
+
53
+ describe "[]" do
54
+
55
+ it 'should allow an empty list' do
56
+ AttrList[].should eq(AttrList.new([]))
57
+ end
58
+
59
+ it 'should allow an non-empty list' do
60
+ AttrList[:name, :city].should eq(AttrList.new([:name, :city]))
61
+ end
62
+
63
+ end # []
64
+
65
+ describe "from_argv" do
66
+
67
+ subject{ AttrList.from_argv(argv) }
68
+
69
+ describe "on an empty array" do
70
+ let(:argv){ [] }
71
+ it{ should eq(AttrList.new([])) }
72
+ end
73
+
74
+ describe "on a singleton" do
75
+ let(:argv){ ["hello"] }
76
+ it{ should eq(AttrList.new([:hello])) }
77
+ end
78
+
79
+ describe "on multiple strings" do
80
+ let(:argv){ ["hello", "world"] }
81
+ it{ should eq(AttrList.new([:hello, :world])) }
82
+ end
83
+
84
+ describe "when passed an unrecognized argument" do
85
+ let(:argv){ :not_recognized }
86
+ specify{
87
+ lambda{ subject }.should raise_error(ArgumentError)
88
+ }
89
+ end
90
+
91
+ end # from_argv
92
+
93
+ describe "to_ordering" do
94
+
95
+ describe "without direction" do
96
+ subject{ AttrList.coerce(attrs).to_ordering }
97
+ let(:attrs){ [:a, :b] }
98
+ it{ should eq(Ordering.new [[:a, :asc], [:b, :asc]])}
99
+ end
100
+
101
+ describe "with a direction" do
102
+ subject{ AttrList.coerce(attrs).to_ordering(direction) }
103
+ let(:attrs){ [:a, :b] }
104
+ let(:direction){ :desc }
105
+ it{ should eq(Ordering.new [[:a, :desc], [:b, :desc]])}
106
+ end
107
+
108
+ end # to_ordering
109
+
110
+ describe "split_tuple" do
111
+
112
+ let(:key){ AttrList.new [:a, :b] }
113
+ let(:tuple){ {:a => 1, :b => 2, :c => 3} }
114
+
115
+ describe "when used without allbut" do
116
+ subject{ key.split_tuple(tuple) }
117
+ it{ should eq([{:a => 1, :b => 2}, {:c => 3}]) }
118
+ end
119
+
120
+ describe "when used with allbut set to true" do
121
+ subject{ key.split_tuple(tuple, true) }
122
+ it{ should eq([{:c => 3}, {:a => 1, :b => 2}]) }
123
+ end
124
+
125
+ describe "when used with allbut set to false" do
126
+ subject{ key.split_tuple(tuple, false) }
127
+ it{ should eq([{:a => 1, :b => 2}, {:c => 3}]) }
128
+ end
129
+
130
+ specify "the documentation example" do
131
+ list = AttrList.new([:name])
132
+ tuple = {:name => "Jones", :city => "London"}
133
+ list.split_tuple(tuple).should eq([{:name => "Jones"}, {:city => "London"}])
134
+ list.split_tuple(tuple, true).should eq([{:city => "London"}, {:name => "Jones"}])
135
+ end
136
+
137
+ end # split
138
+
139
+ describe "project_tuple" do
140
+
141
+ let(:key){ AttrList.new [:a, :b] }
142
+ let(:tuple){ {:a => 1, :b => 2, :c => 3} }
143
+
144
+ describe "when used without allbut" do
145
+ subject{ key.project_tuple(tuple) }
146
+ it{ should eq({:a => 1, :b => 2}) }
147
+ end
148
+
149
+ describe "when used with allbut set to true" do
150
+ subject{ key.project_tuple(tuple, true) }
151
+ it{ should eq({:c => 3}) }
152
+ end
153
+
154
+ describe "when used without allbut set to false" do
155
+ subject{ key.project_tuple(tuple, false) }
156
+ it{ should eq({:a => 1, :b => 2}) }
157
+ end
158
+
159
+ specify "the documentation example" do
160
+ list = AttrList.new([:name])
161
+ tuple = {:name => "Jones", :city => "London"}
162
+ list.project_tuple(tuple).should eq({:name => "Jones"})
163
+ list.project_tuple(tuple, true).should eq({:city => "London"})
164
+ end
165
+
166
+ end # project
167
+
168
+ it 'should to_a' do
169
+ AttrList[:a, :b].to_a.should eq([:a, :b])
170
+ AttrList[].to_a.should eq([])
171
+ end
172
+
173
+ it "should define a value" do
174
+ l1 = AttrList.new [:a, :b]
175
+ l2 = AttrList.new [:a, :b]
176
+ l3 = AttrList.new [:a]
177
+
178
+ l1.should == l2
179
+ l1.should eq(l2)
180
+
181
+ l1.should_not == l3
182
+ l1.should_not eq(l3)
183
+
184
+ {l1 => 1, l2 => 2}.size.should eq(1)
185
+ end
186
+
187
+ end
188
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe AttrName do
4
+
5
+ describe "===" do
6
+
7
+ it "should allow normal names" do
8
+ (AttrName === :city).should be_true
9
+ end
10
+
11
+ it "should allow underscores" do
12
+ (AttrName === :my_city).should be_true
13
+ end
14
+
15
+ it "should allow numbers" do
16
+ (AttrName === :city2).should be_true
17
+ end
18
+
19
+ it "should allow question marks and bang" do
20
+ (AttrName === :big?).should be_true
21
+ (AttrName === :big!).should be_true
22
+ end
23
+
24
+ it "should not allow strange attribute names" do
25
+ (AttrName === "$$$".to_sym).should be_false
26
+ end
27
+
28
+ end # ===
29
+
30
+ describe "coerce" do
31
+
32
+ it 'should work on valid attribute names' do
33
+ AttrName.coerce("city").should eq(:city)
34
+ AttrName.coerce(:big?).should eq(:big?)
35
+ end
36
+
37
+ it 'should be aliased as []' do
38
+ AttrName["city"].should eq(:city)
39
+ end
40
+
41
+ it 'should raise ArgumentError otherwise' do
42
+ lambda{ AttrName["!123"] }.should raise_error(ArgumentError)
43
+ end
44
+
45
+ end # coerce
46
+
47
+ describe "from_argv" do
48
+
49
+ subject{ AttrName.from_argv(argv, opts) }
50
+
51
+ describe "with a String" do
52
+ let(:argv){ %w{hello} }
53
+ let(:opts) {{}}
54
+ it{ should eq(:hello) }
55
+ end
56
+
57
+ describe "with nothing but a default" do
58
+ let(:argv){ %w{} }
59
+ let(:opts){ {:default => :hello} }
60
+ it{ should eq(:hello) }
61
+ end
62
+
63
+ describe "with nothing and no default" do
64
+ let(:argv){ %w{} }
65
+ let(:opts){ {} }
66
+ specify{ lambda{subject}.should raise_error(ArgumentError) }
67
+ end
68
+
69
+ describe "with more than one string" do
70
+ let(:argv){ %w{hello world} }
71
+ let(:opts){ {} }
72
+ specify{ lambda{subject}.should raise_error(ArgumentError) }
73
+ end
74
+
75
+ end # from_argv
76
+
77
+ end
78
+ end
@@ -1,42 +1,32 @@
1
1
  require 'spec_helper'
2
2
  module Alf
3
- describe AttrName do
4
-
5
- it "should allow normal names" do
6
- (AttrName === :city).should be_true
7
- end
8
-
9
- it "should allow underscores" do
10
- (AttrName === :my_city).should be_true
11
- end
12
-
13
- it "should allow numbers" do
14
- (AttrName === :city2).should be_true
15
- end
16
-
17
- it "should not allow strange attribute names" do
18
- (AttrName === "$$$".to_sym).should be_false
19
- end
20
-
3
+ describe Boolean do
4
+
21
5
  describe "from_argv" do
22
-
23
- subject{ AttrName.from_argv(argv, opts) }
24
-
6
+
7
+ subject{ Boolean.from_argv(argv, opts) }
8
+
25
9
  describe "with a String" do
26
- let(:argv){ %w{hello} }
10
+ let(:argv){ %w{true} }
27
11
  let(:opts) {{}}
28
- it{ should eq(:hello) }
12
+ it{ should eq(true) }
29
13
  end
30
14
 
31
15
  describe "with nothing but a default" do
32
16
  let(:argv){ %w{} }
33
- let(:opts){ {:default => :hello} }
34
- it{ should eq(:hello) }
17
+ let(:opts){ {:default => true} }
18
+ it{ should eq(true) }
35
19
  end
36
20
 
37
21
  describe "with nothing and no default" do
38
22
  let(:argv){ %w{} }
39
23
  let(:opts){ {} }
24
+ it{ should eq(false) }
25
+ end
26
+
27
+ describe "with an invalid string" do
28
+ let(:argv){ %w{hello} }
29
+ let(:opts){ {} }
40
30
  specify{ lambda{subject}.should raise_error(ArgumentError) }
41
31
  end
42
32
 
@@ -45,8 +35,8 @@ module Alf
45
35
  let(:opts){ {} }
46
36
  specify{ lambda{subject}.should raise_error(ArgumentError) }
47
37
  end
48
-
49
- end
50
-
38
+
39
+ end # from_argv
40
+
51
41
  end
52
42
  end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe Types do
4
+ include Types
5
+
6
+ describe "common_super_type" do
7
+
8
+ it 'should work on same types' do
9
+ common_super_type(String, String).should eq(String)
10
+ end
11
+
12
+ it 'should work with related types' do
13
+ common_super_type(Fixnum, Integer).should eq(Integer)
14
+ common_super_type(Fixnum, Float).should eq(Numeric)
15
+ end
16
+
17
+ it 'should work with un related types' do
18
+ common_super_type(Fixnum, String).should eq(Object)
19
+ end
20
+
21
+ end
22
+
23
+ end # describe Types
24
+ end # module Alf
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe Heading do
4
+
5
+ describe "the class itself" do
6
+ let(:type){ Heading }
7
+ def Heading.exemplars
8
+ [
9
+ {},
10
+ {:a => String},
11
+ {:a => String, :b => Date}
12
+ ].map{|x| Heading.coerce(x)}
13
+ end
14
+ it_should_behave_like 'A valid type implementation'
15
+ end
16
+
17
+ let(:h0){ Heading.new({}) }
18
+ let(:h1){ Heading.new(:name => String) }
19
+ let(:h2){ Heading.new(:name => String, :price => Float) }
20
+
21
+ it 'should be Enumerable' do
22
+ h2.map{|k,v| [k,v]}.to_set.should eq([[:name, String], [:price, Float]].to_set)
23
+ end
24
+
25
+ describe "coerce" do
26
+
27
+ it "should work with a heading" do
28
+ Heading.coerce(h0).should eq(h0)
29
+ Heading.coerce(h1).should eq(h1)
30
+ end
31
+
32
+ it "should work with hashes" do
33
+ Heading.coerce(:name => String).should eq(h1)
34
+ Heading.coerce("name" => "String").should eq(h1)
35
+ Heading.coerce({}).should eq(h0)
36
+ end
37
+
38
+ it "should work with arrays" do
39
+ Heading.coerce([]).should eq(h0)
40
+ Heading.coerce(["name", "String"]).should eq(h1)
41
+ end
42
+
43
+ specify "should raise ArgumentError on error" do
44
+ lambda{ Heading.coerce(true) }.should raise_error(ArgumentError)
45
+ end
46
+
47
+ end # coerce
48
+
49
+ describe "[]" do
50
+
51
+ specify "it should mimic coerce" do
52
+ Heading[:name => String].should eq(h1)
53
+ Heading["name" => "String"].should eq(h1)
54
+ Heading[{}].should eq(h0)
55
+ Heading[[]].should eq(h0)
56
+ Heading[["name", "String"]].should eq(h1)
57
+ end
58
+
59
+ specify "should raise ArgumentError on error" do
60
+ lambda{ Heading[true] }.should raise_error(ArgumentError)
61
+ end
62
+
63
+ end # []
64
+
65
+ describe "from_argv" do
66
+
67
+ it "should work with an array of strings" do
68
+ Heading.from_argv(["name", "String"]).should eq(h1)
69
+ end
70
+
71
+ end
72
+
73
+ describe "cardinality" do
74
+
75
+ it "should return the number of pairs" do
76
+ h0.cardinality.should eq(0)
77
+ h1.cardinality.should eq(1)
78
+ h2.cardinality.should eq(2)
79
+ end
80
+
81
+ it 'should be aliased as count' do
82
+ [h0, h1, h2].all?{|h| h.cardinality == h.count}.should be_true
83
+ end
84
+
85
+ it 'should be aliased as size' do
86
+ [h0, h1, h2].all?{|h| h.cardinality == h.size}.should be_true
87
+ end
88
+
89
+ end # cardinality, count, size
90
+
91
+ describe "union" do
92
+
93
+ let(:h_name){ Heading[:name => String] }
94
+ let(:h_city){ Heading[:city => String] }
95
+
96
+ it "should work on empty headings" do
97
+ Heading::EMPTY.union(Heading::EMPTY).should eq(Heading::EMPTY)
98
+ end
99
+
100
+ it "should work with disjoint headings" do
101
+ h_name.union(h_city).should eq(Heading[:name => String, :city => String])
102
+ end
103
+
104
+ it "should be aliased as +" do
105
+ (h_name + h_city).should eq(Heading[:name => String, :city => String])
106
+ end
107
+
108
+ it "should work compute supertype on non-disjoint headings" do
109
+ h1 = Heading[:age => Fixnum, :name => String]
110
+ h2 = Heading[:age => Integer]
111
+ (h1 + h2).should eq(Heading[:age => Integer, :name => String])
112
+ end
113
+
114
+ it "should be aliased as join" do
115
+ h1 = Heading[:age => Fixnum, :name => String]
116
+ h2 = Heading[:age => Integer]
117
+ h1.join(h2).should eq(Heading[:age => Integer, :name => String])
118
+ end
119
+
120
+ end # union
121
+
122
+ it "should implement a to_h method" do
123
+ h0.to_h.should eq({})
124
+ h1.to_h.should eq(:name => String)
125
+ h2.to_h.should eq(:name => String, :price => Float)
126
+ end
127
+
128
+ describe "EMPTY" do
129
+ subject{ Heading::EMPTY }
130
+ it{ should be_a(Heading) }
131
+ it_should_behave_like "A value"
132
+ end
133
+
134
+ describe "h0" do
135
+ subject{ h0 }
136
+ it { should == Heading::EMPTY }
137
+ it_should_behave_like "A value"
138
+ end
139
+
140
+ describe "h1" do
141
+ subject{ h1 }
142
+ it_should_behave_like "A value"
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,185 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe Ordering do
4
+
5
+ describe "the class itself" do
6
+ let(:type){ Ordering }
7
+ def Ordering.exemplars
8
+ [
9
+ [],
10
+ [:a],
11
+ [[:a, :asc], [:b, :asc]]
12
+ ].map{|x| Ordering.coerce(x)}
13
+ end
14
+ it_should_behave_like 'A valid type implementation'
15
+ end
16
+
17
+ describe "coerce" do
18
+
19
+ let(:expected){ Ordering.new([[:a, :asc], [:b, :asc]]) }
20
+
21
+ it "should work with an Ordering" do
22
+ key = Ordering.coerce [:a, :b]
23
+ key.should eq(expected)
24
+ end
25
+
26
+ it "should work with an empty array" do
27
+ key = Ordering.coerce []
28
+ key.should eq(Ordering.new([]))
29
+ end
30
+
31
+ it "should work with a normalized array" do
32
+ key = Ordering.coerce [[:a, :asc], [:b, :asc]]
33
+ key.should eq(expected)
34
+ end
35
+
36
+ it "should work with an array of AttrName" do
37
+ key = Ordering.coerce [:a, :b]
38
+ key.should eq(expected)
39
+ end
40
+
41
+ it "should work with an array of Strings" do
42
+ key = Ordering.coerce ["a", "b"]
43
+ key.should eq(expected)
44
+ end
45
+
46
+ it "should work with a single array with explicit asc/desc (1)" do
47
+ key = Ordering.coerce [:a, :asc]
48
+ key.should eq(Ordering.new([[:a, :asc]]))
49
+ end
50
+
51
+ it "should work with a single array with explicit asc/desc (2)" do
52
+ key = Ordering.coerce [:a, :asc, :b, :desc]
53
+ key.should eq(Ordering.new([[:a, :asc], [:b, :desc]]))
54
+ end
55
+
56
+ it "should work with a single array with explicit asc/desc (3)" do
57
+ key = Ordering.coerce ["a", "asc", "b", "desc"]
58
+ key.should eq(Ordering.new([[:a, :asc], [:b, :desc]]))
59
+ end
60
+
61
+ it "should work with an AttrList" do
62
+ key = Ordering.coerce(AttrList.new([:a, :b]))
63
+ key.should eq(expected)
64
+ end
65
+
66
+ end # coerce
67
+
68
+ describe "from_argv" do
69
+
70
+ subject{ Ordering.from_argv(argv) }
71
+
72
+ describe "on an empty array" do
73
+ let(:argv){ [] }
74
+ it{ should eq(Ordering.new([])) }
75
+ end
76
+
77
+ describe "on a singleton" do
78
+ let(:argv){ ["hello"] }
79
+ it{ should eq(Ordering.new([[:hello, :asc]])) }
80
+ end
81
+
82
+ describe "on multiple strings without explit directions" do
83
+ let(:argv){ ["hello", "world"] }
84
+ it{ should eq(Ordering.new([[:hello, :asc], [:world, :asc]])) }
85
+ end
86
+
87
+ describe "on multiple strings with explit directions" do
88
+ let(:argv){ ["hello", "asc", "world", "desc"] }
89
+ it{ should eq(Ordering.new([[:hello, :asc], [:world, :desc]])) }
90
+ end
91
+
92
+ end # from_argv
93
+
94
+ describe "attributes" do
95
+
96
+ it 'should work on an empty ordering' do
97
+ Ordering.new([]).attributes.should eq([])
98
+ end
99
+
100
+ it 'should work on an singleton ordering' do
101
+ Ordering.new([[:a, :asc]]).attributes.should eq([:a])
102
+ end
103
+
104
+ it 'should work on an ordering' do
105
+ Ordering.new([[:a, :asc], [:b, :desc]]).attributes.should eq([:a, :b])
106
+ end
107
+
108
+ end # attributes
109
+
110
+ describe "compare" do
111
+
112
+ it "should work on a singleton ordering" do
113
+ key = Ordering.coerce [:a]
114
+ key.compare({:a => 1}, {:a => 2}).should == -1
115
+ key.compare({:a => 1}, {:a => 1}).should == 0
116
+ key.compare({:a => 2}, {:a => 1}).should == 1
117
+ end
118
+
119
+ it "should work on singleton when :desc" do
120
+ key = Ordering.coerce [[:a, :desc]]
121
+ key.compare({:a => 1}, {:a => 2}).should == 1
122
+ key.compare({:a => 1}, {:a => 1}).should == 0
123
+ key.compare({:a => 2}, {:a => 1}).should == -1
124
+ end
125
+
126
+ it "should work with multiple keys" do
127
+ key = Ordering.coerce [[:a, :asc], [:b, :desc]]
128
+ key.compare({:a => 1, :b => 1}, {:a => 0, :b => 1}).should == 1
129
+ key.compare({:a => -1, :b => 1}, {:a => 0, :b => 1}).should == -1
130
+ key.compare({:a => 0, :b => 1}, {:a => 0, :b => 0}).should == -1
131
+ key.compare({:a => 1, :b => 1}, {:a => 1, :b => 2}).should == 1
132
+ key.compare({:a => 1, :b => 1}, {:a => 1, :b => 1}).should == 0
133
+ end
134
+
135
+ end # compare
136
+
137
+ describe "sorter" do
138
+
139
+ let(:sorter){ Ordering.coerce([[:a, :desc]]).sorter }
140
+
141
+ it 'should sort correctly' do
142
+ [{:a => 2},
143
+ {:a => 7},
144
+ {:a => 1}].sort(&sorter).should eq([
145
+ {:a => 7}, {:a => 2}, {:a => 1}
146
+ ])
147
+ end
148
+
149
+ end # sorter
150
+
151
+ describe "+" do
152
+
153
+ subject{ Ordering.coerce(left) + right }
154
+ let(:expected){ Ordering.new([[:a, :asc], [:b, :desc]]) }
155
+
156
+ describe "with another Ordering" do
157
+ let(:left){ [:a] }
158
+ let(:right){ Ordering.new([[:b, :desc]]) }
159
+ it{ should eq(expected) }
160
+ end
161
+
162
+ describe "with another array" do
163
+ let(:left){ [:a] }
164
+ let(:right){ [[:b, :desc]] }
165
+ it{ should eq(expected) }
166
+ end
167
+
168
+ describe "with another array (2)" do
169
+ let(:left){ [:a] }
170
+ let(:right){ [:b, :desc] }
171
+ it{ should eq(expected) }
172
+ end
173
+
174
+ end # +
175
+
176
+ describe "to_attr_list" do
177
+
178
+ it 'should return the correct list of attribute names' do
179
+ Ordering.new([[:a, :asc], [:b, :desc]]).to_attr_list.should eq(AttrList[:a, :b])
180
+ end
181
+
182
+ end # "to_attr_list"
183
+
184
+ end # Ordering
185
+ end # Alf