alf 0.9.2 → 0.9.3

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 (187) hide show
  1. data/CHANGELOG.md +89 -0
  2. data/Gemfile.lock +6 -1
  3. data/README.md +35 -21
  4. data/TODO.md +0 -5
  5. data/alf.gemspec +2 -0
  6. data/alf.noespec +6 -4
  7. data/bin/alf +9 -13
  8. data/examples/{autonum.alf → operators/autonum.alf} +0 -0
  9. data/examples/{cities.rash → operators/cities.rash} +0 -0
  10. data/examples/{clip.alf → operators/clip.alf} +0 -0
  11. data/examples/{compact.alf → operators/compact.alf} +0 -0
  12. data/examples/{database.alf → operators/database.alf} +1 -1
  13. data/examples/{defaults.alf → operators/defaults.alf} +0 -0
  14. data/examples/{extend.alf → operators/extend.alf} +0 -0
  15. data/examples/{group.alf → operators/group.alf} +0 -0
  16. data/examples/{intersect.alf → operators/intersect.alf} +0 -0
  17. data/examples/{join.alf → operators/join.alf} +0 -0
  18. data/examples/operators/matching.alf +2 -0
  19. data/examples/{minus.alf → operators/minus.alf} +0 -0
  20. data/examples/operators/not_matching.alf +2 -0
  21. data/examples/{nulls.rash → operators/nulls.rash} +0 -0
  22. data/examples/{parts.rash → operators/parts.rash} +0 -0
  23. data/examples/{project.alf → operators/project.alf} +0 -0
  24. data/examples/{pseudo-with.alf → operators/pseudo-with.alf} +0 -0
  25. data/examples/{quota.alf → operators/quota.alf} +0 -0
  26. data/examples/operators/rank.alf +4 -0
  27. data/examples/{rename.alf → operators/rename.alf} +0 -0
  28. data/examples/{restrict.alf → operators/restrict.alf} +0 -0
  29. data/examples/{schema.yaml → operators/schema.yaml} +0 -0
  30. data/examples/{sort.alf → operators/sort.alf} +0 -0
  31. data/examples/{summarize.alf → operators/summarize.alf} +0 -0
  32. data/examples/{suppliers.rash → operators/suppliers.rash} +0 -0
  33. data/examples/{supplies.rash → operators/supplies.rash} +0 -0
  34. data/examples/{ungroup.alf → operators/ungroup.alf} +0 -0
  35. data/examples/{union.alf → operators/union.alf} +0 -0
  36. data/examples/{unwrap.alf → operators/unwrap.alf} +0 -0
  37. data/examples/{wrap.alf → operators/wrap.alf} +0 -0
  38. data/lib/alf.rb +837 -62
  39. data/lib/alf/loader.rb +2 -1
  40. data/lib/alf/text.rb +160 -0
  41. data/lib/alf/version.rb +1 -1
  42. data/lib/alf/yaml.rb +24 -0
  43. data/spec/integration/__database__/group.alf +3 -0
  44. data/spec/integration/__database__/parts.rash +6 -0
  45. data/spec/integration/__database__/suppliers.rash +5 -0
  46. data/spec/integration/__database__/supplies.rash +12 -0
  47. data/spec/integration/command/alf/alf_e.cmd +1 -0
  48. data/spec/integration/command/alf/alf_e.stdout +4 -0
  49. data/spec/integration/command/alf/alf_env.cmd +1 -0
  50. data/spec/integration/command/alf/alf_env.stdout +5 -0
  51. data/spec/integration/command/alf/alf_implicit.alf +1 -0
  52. data/spec/integration/command/alf/alf_implicit_exec.cmd +1 -0
  53. data/spec/integration/command/alf/alf_implicit_exec.stdout +4 -0
  54. data/spec/integration/command/alf/alf_r.cmd +1 -0
  55. data/spec/integration/command/alf/alf_r.stdout +5 -0
  56. data/spec/integration/command/alf/alf_version.cmd +1 -0
  57. data/spec/integration/command/alf/alf_version.stdout +2 -0
  58. data/spec/integration/command/alf/alf_yaml.cmd +1 -0
  59. data/spec/integration/command/alf/alf_yaml.stdout +22 -0
  60. data/spec/integration/command/alf/rel.rash +1 -0
  61. data/spec/integration/command/autonum/autonum_0.cmd +1 -0
  62. data/spec/integration/command/autonum/autonum_0.stdout +9 -0
  63. data/spec/integration/command/autonum/autonum_1.cmd +1 -0
  64. data/spec/integration/command/autonum/autonum_1.stdout +9 -0
  65. data/spec/integration/command/clip/clip_0.cmd +1 -0
  66. data/spec/integration/command/clip/clip_0.stdout +9 -0
  67. data/spec/integration/command/clip/clip_1.cmd +1 -0
  68. data/spec/integration/command/clip/clip_1.stdout +9 -0
  69. data/spec/integration/command/compact/compact_0.cmd +1 -0
  70. data/spec/integration/command/compact/compact_0.stdout +9 -0
  71. data/spec/integration/command/defaults/defaults_0.cmd +1 -0
  72. data/spec/integration/command/defaults/defaults_0.stdout +9 -0
  73. data/spec/integration/command/defaults/defaults_1.cmd +1 -0
  74. data/spec/integration/command/defaults/defaults_1.stdout +9 -0
  75. data/spec/integration/command/extend/extend_0.cmd +1 -0
  76. data/spec/integration/command/extend/extend_0.stdout +16 -0
  77. data/spec/integration/command/group/group_0.cmd +1 -0
  78. data/spec/integration/command/group/group_0.stdout +32 -0
  79. data/spec/integration/command/group/group_1.cmd +1 -0
  80. data/spec/integration/command/group/group_1.stdout +32 -0
  81. data/spec/integration/command/intersect/intersect_0.cmd +1 -0
  82. data/spec/integration/command/intersect/intersect_0.stdout +9 -0
  83. data/spec/integration/command/join/join_0.cmd +1 -0
  84. data/spec/integration/command/join/join_0.stdout +16 -0
  85. data/spec/integration/command/matching/matching_0.cmd +1 -0
  86. data/spec/integration/command/matching/matching_0.stdout +8 -0
  87. data/spec/integration/command/minus/minus_0.cmd +1 -0
  88. data/spec/integration/command/minus/minus_0.stdout +4 -0
  89. data/spec/integration/command/not-matching/not-matching_0.cmd +1 -0
  90. data/spec/integration/command/not-matching/not-matching_0.stdout +5 -0
  91. data/spec/integration/command/project/project_0.cmd +1 -0
  92. data/spec/integration/command/project/project_0.stdout +9 -0
  93. data/spec/integration/command/project/project_1.cmd +1 -0
  94. data/spec/integration/command/project/project_1.stdout +9 -0
  95. data/spec/integration/command/quota/quota_0.cmd +1 -0
  96. data/spec/integration/command/quota/quota_0.stdout +16 -0
  97. data/spec/integration/command/rank/rank_1.cmd +1 -0
  98. data/spec/integration/command/rank/rank_1.stdout +10 -0
  99. data/spec/integration/command/rank/rank_2.cmd +1 -0
  100. data/spec/integration/command/rank/rank_2.stdout +10 -0
  101. data/spec/integration/command/rank/rank_3.cmd +1 -0
  102. data/spec/integration/command/rank/rank_3.stdout +10 -0
  103. data/spec/integration/command/rank/rank_4.cmd +1 -0
  104. data/spec/integration/command/rank/rank_4.stdout +6 -0
  105. data/spec/integration/command/rank/rank_5.cmd +1 -0
  106. data/spec/integration/command/rank/rank_5.stdout +6 -0
  107. data/spec/integration/command/rename/rename_0.cmd +1 -0
  108. data/spec/integration/command/rename/rename_0.stdout +9 -0
  109. data/spec/integration/command/restrict/restrict_0.cmd +1 -0
  110. data/spec/integration/command/restrict/restrict_0.stdout +6 -0
  111. data/spec/integration/command/restrict/restrict_1.cmd +1 -0
  112. data/spec/integration/command/restrict/restrict_1.stdout +6 -0
  113. data/spec/integration/command/show/show_base.cmd +1 -0
  114. data/spec/integration/command/show/show_base.stdout +9 -0
  115. data/spec/integration/command/show/show_conflictual.cmd +1 -0
  116. data/spec/integration/command/show/show_conflictual.stdout +5 -0
  117. data/spec/integration/command/show/show_rash.cmd +1 -0
  118. data/spec/integration/command/show/show_rash.stdout +5 -0
  119. data/spec/integration/command/show/show_rash_2.cmd +1 -0
  120. data/spec/integration/command/show/show_rash_2.stdout +5 -0
  121. data/spec/integration/command/show/show_yaml.cmd +1 -0
  122. data/spec/integration/command/show/show_yaml.stdout +22 -0
  123. data/spec/integration/command/sort/sort_0.cmd +1 -0
  124. data/spec/integration/command/sort/sort_0.stdout +9 -0
  125. data/spec/integration/command/sort/sort_1.cmd +1 -0
  126. data/spec/integration/command/sort/sort_1.stdout +9 -0
  127. data/spec/integration/command/summarize/summarize_0.cmd +1 -0
  128. data/spec/integration/command/summarize/summarize_0.stdout +8 -0
  129. data/spec/integration/command/ungroup/ungroup_0.cmd +1 -0
  130. data/spec/integration/command/ungroup/ungroup_0.stdout +16 -0
  131. data/spec/integration/command/union/union_0.cmd +1 -0
  132. data/spec/integration/command/union/union_0.stdout +9 -0
  133. data/spec/integration/command/unwrap/unwrap_0.cmd +1 -0
  134. data/spec/integration/command/unwrap/unwrap_0.stdout +9 -0
  135. data/spec/integration/command/wrap/wrap_0.cmd +1 -0
  136. data/spec/integration/command/wrap/wrap_0.stdout +9 -0
  137. data/spec/integration/semantics/test_join.alf +9 -0
  138. data/spec/integration/{src → semantics}/test_minus.alf +0 -0
  139. data/spec/integration/{src → semantics}/test_project.alf +0 -0
  140. data/spec/integration/semantics/test_rank.alf +34 -0
  141. data/spec/integration/test_command.rb +36 -0
  142. data/spec/integration/test_examples.rb +11 -22
  143. data/spec/integration/test_semantics.rb +40 -0
  144. data/spec/regression/alf_file/__FILE__.alf +2 -0
  145. data/spec/regression/alf_file/suppliers.rash +5 -0
  146. data/spec/regression/alf_file/test___FILE__.rb +17 -0
  147. data/spec/regression/heading/test_heading_with_date.rb +12 -0
  148. data/spec/regression/lispy/test_compile.rb +14 -0
  149. data/spec/regression/relation/test_relation_with_date.rb +12 -0
  150. data/spec/regression/restrict/test_restrict_with_keywords.rb +17 -0
  151. data/spec/shared/a_value.rb +12 -0
  152. data/spec/shared/an_operator_class.rb +35 -0
  153. data/spec/spec_helper.rb +12 -34
  154. data/spec/unit/assumptions/test_file.rb +17 -0
  155. data/spec/unit/{test_assumptions.rb → assumptions/test_instance_eval.rb} +1 -1
  156. data/spec/unit/assumptions/test_scoping.rb +29 -0
  157. data/spec/unit/environment/test_folder.rb +6 -1
  158. data/spec/unit/operator/relational/matching/test_hash_based.rb +60 -0
  159. data/spec/unit/operator/relational/not_matching/test_hash_based.rb +37 -0
  160. data/spec/unit/operator/relational/test_rank.rb +50 -0
  161. data/spec/unit/operator/test_relational.rb +3 -0
  162. data/spec/unit/reader/test_alf_file.rb +7 -4
  163. data/spec/unit/reader/test_initialize.rb +60 -0
  164. data/spec/unit/relation/test_relops.rb +4 -0
  165. data/spec/unit/relation/test_to_a.rb +41 -0
  166. data/spec/unit/renderer/test_initialize.rb +60 -0
  167. data/spec/unit/test_environment.rb +38 -0
  168. data/spec/unit/test_heading.rb +38 -0
  169. data/spec/unit/test_reader.rb +5 -0
  170. data/spec/unit/test_relation.rb +31 -1
  171. data/spec/unit/test_renderer.rb +1 -1
  172. data/spec/unit/{renderer/text → text}/test_cell.rb +1 -1
  173. data/spec/unit/{renderer/text → text}/test_row.rb +1 -1
  174. data/spec/unit/{renderer/text → text}/test_table.rb +1 -1
  175. data/spec/unit/tools/test_ordering_key.rb +13 -0
  176. data/spec/unit/tools/test_parse_commandline_args.rb +47 -0
  177. data/spec/unit/tools/test_tuple_handle.rb +34 -2
  178. data/spec/unit/tools/test_varargs.rb +16 -0
  179. data/tasks/{spec_test.rake → integration_test.rake} +4 -32
  180. data/tasks/regression_test.rake +52 -0
  181. data/tasks/unit_test.rake +33 -58
  182. metadata +326 -66
  183. data/examples/runall.sh +0 -26
  184. data/lib/alf/relation.rb +0 -118
  185. data/lib/alf/renderer/text.rb +0 -153
  186. data/lib/alf/renderer/yaml.rb +0 -22
  187. data/spec/integration/test_alf_specs.rb +0 -37
@@ -0,0 +1 @@
1
+ alf --text unwrap suppliers -- loc_and_status
@@ -0,0 +1,9 @@
1
+ +------+-------+---------+--------+
2
+ | :sid | :name | :status | :city |
3
+ +------+-------+---------+--------+
4
+ | S1 | Smith | 20 | London |
5
+ | S2 | Jones | 10 | Paris |
6
+ | S3 | Blake | 30 | Paris |
7
+ | S4 | Clark | 20 | London |
8
+ | S5 | Adams | 30 | Athens |
9
+ +------+-------+---------+--------+
@@ -0,0 +1 @@
1
+ alf --text wrap suppliers -- city status loc_and_status
@@ -0,0 +1,9 @@
1
+ +------+-------+--------------------------------+
2
+ | :sid | :name | :loc_and_status |
3
+ +------+-------+--------------------------------+
4
+ | S1 | Smith | {:city=>"London", :status=>20} |
5
+ | S2 | Jones | {:city=>"Paris", :status=>10} |
6
+ | S3 | Blake | {:city=>"Paris", :status=>30} |
7
+ | S4 | Clark | {:city=>"London", :status=>20} |
8
+ | S5 | Adams | {:city=>"Athens", :status=>30} |
9
+ +------+-------+--------------------------------+
@@ -0,0 +1,9 @@
1
+ (specify "(join xxx, DUM) is DUM",
2
+ (rel_equal DUM, (join :suppliers, DUM)))
3
+ (specify "(join DUM, xxx) is DUM",
4
+ (rel_equal DUM, (join DUM, :suppliers)))
5
+
6
+ (specify "(join DEE, xxx) is xxx",
7
+ (rel_equal :suppliers, (join DEE, :suppliers)))
8
+ (specify "(join xxx, DEE) is xxx",
9
+ (rel_equal :suppliers, (join :suppliers, DEE)))
File without changes
@@ -0,0 +1,34 @@
1
+ input = rel(
2
+ {:id => 1, :weight => 10.0},
3
+ {:id => 2, :weight => 12.0},
4
+ {:id => 3, :weight => 12.0}
5
+ )
6
+
7
+ (specify "rank should respect < by default",
8
+ (rel_equal \
9
+ (rel (tuple :id => 1, :weight => 10.0, :rank => 0),
10
+ (tuple :id => 2, :weight => 12.0, :rank => 1),
11
+ (tuple :id => 3, :weight => 12.0, :rank => 1)),
12
+ (rank input, [:weight])))
13
+
14
+ (specify "rank should support a strict order",
15
+ (rel_equal \
16
+ (rel (tuple :id => 1, :weight => 10.0, :rank => 0),
17
+ (tuple :id => 2, :weight => 12.0, :rank => 1),
18
+ (tuple :id => 3, :weight => 12.0, :rank => 2)),
19
+ (rank input, [:weight, :id])))
20
+
21
+ (specify "rank should support a reverse order",
22
+ (rel_equal \
23
+ (rel (tuple :id => 1, :weight => 10.0, :rank => 2),
24
+ (tuple :id => 2, :weight => 12.0, :rank => 0),
25
+ (tuple :id => 3, :weight => 12.0, :rank => 0)),
26
+ (rank input, [[:weight, :desc]])))
27
+
28
+ (specify "rank should allow specifying a name",
29
+ (rel_equal \
30
+ (rel (tuple :id => 1, :weight => 10.0, :pos => 0),
31
+ (tuple :id => 2, :weight => 12.0, :pos => 1),
32
+ (tuple :id => 3, :weight => 12.0, :pos => 1)),
33
+ (rank input, [:weight], :pos)))
34
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ describe "Alf's alf command / " do
3
+
4
+ Dir[_('command/**/*.cmd', __FILE__)].each do |input|
5
+ cmd = wlang(File.readlines(input).first, binding)
6
+ specify{ cmd.should =~ /^alf / }
7
+
8
+ describe "#{File.basename(input)}: #{cmd}" do
9
+ let(:argv) { Alf::Tools::parse_commandline_args(cmd)[1..-1] }
10
+ let(:stdout) { File.join(File.dirname(input), "#{File.basename(input, ".cmd")}.stdout") }
11
+ let(:expected) { wlang(File.read(stdout), binding) }
12
+
13
+ before{
14
+ $oldstdout = $stdout
15
+ $stdout = StringIO.new
16
+ }
17
+ after {
18
+ $stdout = $oldstdout
19
+ $oldstdout = nil
20
+ }
21
+
22
+ specify{
23
+ begin
24
+ dir = File.expand_path('../__database__', __FILE__)
25
+ main = Alf::Command::Main.new
26
+ main.environment = Alf::Environment.folder(dir)
27
+ main.run(argv, __FILE__)
28
+ rescue SystemExit
29
+ $stdout << SystemExit << "\n"
30
+ end
31
+ $stdout.string.should(eq(expected)) unless RUBY_VERSION < "1.9"
32
+ }
33
+ end
34
+ end
35
+
36
+ end
@@ -1,26 +1,15 @@
1
1
  require 'spec_helper'
2
- module Alf
3
- describe "Alf's examples" do
4
-
5
- shared_examples_for "An example" do
6
-
7
- let(:env){ Environment.examples }
2
+ Dir["#{File.expand_path('../../../examples', __FILE__)}/**/*.alf"].each do |file|
8
3
 
9
- it "should work when executed with a Alf" do
10
- lambda{
11
- Alf.lispy(env).compile(File.read(subject)).to_a
12
- }.should_not raise_error
13
- end
14
-
15
- end # An example
16
-
17
-
18
- Dir["#{File.expand_path('../../../examples', __FILE__)}/**/*.alf"].each do |file|
19
- describe file do
20
- subject{ file }
21
- it_should_behave_like "An example"
22
- end
4
+ describe "Alf example: #{file}" do
5
+ let(:example_path){ file }
6
+ let(:example_dir) { File.dirname(file) }
7
+ let(:example_env) { Alf::Environment.folder(example_dir) }
8
+
9
+ it "should run without error" do
10
+ Alf.lispy(example_env).compile(File.read(example_path)).to_rel
23
11
  end
24
-
12
+
25
13
  end
26
- end
14
+
15
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ describe "Alf's semantics tests" do
3
+
4
+ module Helpers
5
+
6
+ def rel_equal(x, y)
7
+ x = Alf::Environment.examples.dataset(x) if x.is_a?(Symbol)
8
+ y = Alf::Environment.examples.dataset(y) if y.is_a?(Symbol)
9
+ x.to_rel == y.to_rel
10
+ end
11
+
12
+ def specify(message, x)
13
+ raise message unless x
14
+ end
15
+
16
+ end
17
+
18
+ shared_examples_for "A semantics spec file" do
19
+
20
+ let(:lispy){
21
+ dir = File.expand_path('../__database__', __FILE__)
22
+ lispy = Alf.lispy(Alf::Environment.folder(dir))
23
+ lispy.ruby_extend(Helpers)
24
+ }
25
+
26
+ it "should work when executed with a Alf" do
27
+ lispy.compile(File.read(subject))
28
+ end
29
+
30
+ end # An example
31
+
32
+
33
+ Dir["#{File.expand_path('../semantics', __FILE__)}/**/*.alf"].each do |file|
34
+ describe file do
35
+ subject{ file }
36
+ it_should_behave_like "A semantics spec file"
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,2 @@
1
+ suppliers = Reader.reader File.join(File.dirname(__FILE__), "suppliers.rash")
2
+ (project suppliers, [:city])
@@ -0,0 +1,5 @@
1
+ {:sid => 'S1', :name => 'Smith', :status => 20, :city => 'London'}
2
+ {:sid => 'S2', :name => 'Jones', :status => 10, :city => 'Paris'}
3
+ {:sid => 'S3', :name => 'Blake', :status => 30, :city => 'Paris'}
4
+ {:sid => 'S4', :name => 'Clark', :status => 20, :city => 'London'}
5
+ {:sid => 'S5', :name => 'Adams', :status => 30, :city => 'Athens'}
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe Reader::AlfFile do
4
+ subject{
5
+ Reader::AlfFile.new(File.expand_path("../__FILE__.alf", __FILE__), Environment.examples)
6
+ }
7
+
8
+ specify {
9
+ subject.to_rel.should == Relation[
10
+ {:city => "London"},
11
+ {:city => "Paris"},
12
+ {:city => "Athens"}
13
+ ]
14
+ }
15
+
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+ module Alf
4
+ describe Heading do
5
+
6
+ describe "when attributes on Foo domain" do
7
+ subject{ Heading[{:date => Date.today}] }
8
+ it_should_behave_like "A value"
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ describe "Lispy.compile" do
3
+
4
+ it "should use a clean binding" do
5
+ p = Alf::Lispy.compile("lambda{ path }", "a path")
6
+ lambda{ p.call }.should raise_error(NameError)
7
+ end
8
+
9
+ it "should resolve __FILE__ correctly" do
10
+ p = Alf::Lispy.compile("__FILE__", "a path")
11
+ p.should == "a path"
12
+ end
13
+
14
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+ module Alf
4
+ describe Relation do
5
+
6
+ describe "when attributes on Date domain" do
7
+ subject{ Relation[{:date => Date.today}] }
8
+ it_should_behave_like "A value"
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ module Alf
3
+ describe "(restrict xxx, :keyword => ...)" do
4
+
5
+ it "should support using a keyword on Relation" do
6
+ rel = Relation[{:when => "now"}]
7
+ rel.restrict(:when => "now").should eq(rel)
8
+ end
9
+
10
+ it "should support using a keyword on Lispy" do
11
+ Alf.lispy(Environment.examples).evaluate do
12
+ (restrict (extend :suppliers, {:when => lambda{"notnow"}}), {:when => "now"})
13
+ end.should eq(Relation::DUM)
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ shared_examples_for "A value" do
2
+
3
+ it "should have a inspect/class.parse that lead to equal values" do
4
+ Kernel.eval(subject.inspect).should eq(subject)
5
+ end
6
+
7
+ it "should act a valid Hash keys" do
8
+ dup = Kernel.eval(subject.inspect)
9
+ {subject => true, dup => false}.size.should == 1
10
+ end
11
+
12
+ end
@@ -0,0 +1,35 @@
1
+ shared_examples_for "An operator class" do
2
+
3
+ it "should not have public set_args, _each and _prepare methods" do
4
+ operator_class.public_method_defined?(:set_args).should be_false
5
+ operator_class.public_method_defined?(:_each).should be_false
6
+ operator_class.public_method_defined?(:_prepare).should be_false
7
+ end
8
+
9
+ it "should have a public run method" do
10
+ operator_class.public_method_defined?(:run).should be_true
11
+ end
12
+
13
+ it "should have a public pipe method" do
14
+ operator_class.public_method_defined?(:pipe).should be_true
15
+ end
16
+
17
+ it "should have a public each method" do
18
+ operator_class.public_method_defined?(:each).should be_true
19
+ end
20
+
21
+ it "should have a unary? class method" do
22
+ operator_class.should respond_to(:unary?)
23
+ end
24
+
25
+ it "should have a binary? class method" do
26
+ operator_class.should respond_to(:binary?)
27
+ end
28
+
29
+ it "should implement unary? and binary? accurately" do
30
+ operator_class.unary?.should_not eq(operator_class.binary?)
31
+ operator_class.unary?.should eq(operator_class.ancestors.include?(Alf::Operator::Unary))
32
+ operator_class.binary?.should eq(operator_class.ancestors.include?(Alf::Operator::Binary))
33
+ end
34
+
35
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,44 +1,22 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
2
2
  require 'alf'
3
+ require "rspec"
3
4
 
4
5
  Alf::Lispy.extend(Alf::Lispy)
5
6
 
6
7
  def rel(*args)
7
8
  Alf::Relation.coerce(args)
8
9
  end
10
+ def tuple(h)
11
+ h
12
+ end
13
+ def _(path, file)
14
+ File.expand_path("../#{path}", file)
15
+ end
9
16
 
10
- shared_examples_for "An operator class" do
11
-
12
- it "should not have public set_args, _each and _prepare methods" do
13
- operator_class.public_method_defined?(:set_args).should be_false
14
- operator_class.public_method_defined?(:_each).should be_false
15
- operator_class.public_method_defined?(:_prepare).should be_false
16
- end
17
-
18
- it "should have a public run method" do
19
- operator_class.public_method_defined?(:run).should be_true
20
- end
21
-
22
- it "should have a public pipe method" do
23
- operator_class.public_method_defined?(:pipe).should be_true
24
- end
25
-
26
- it "should have a public each method" do
27
- operator_class.public_method_defined?(:each).should be_true
28
- end
29
-
30
- it "should have a unary? class method" do
31
- operator_class.should respond_to(:unary?)
32
- end
33
-
34
- it "should have a binary? class method" do
35
- operator_class.should respond_to(:binary?)
36
- end
37
-
38
- it "should implement unary? and binary? accurately" do
39
- operator_class.unary?.should_not eq(operator_class.binary?)
40
- operator_class.unary?.should eq(operator_class.ancestors.include?(Alf::Operator::Unary))
41
- operator_class.binary?.should eq(operator_class.ancestors.include?(Alf::Operator::Binary))
42
- end
43
-
17
+ def wlang(str, binding)
18
+ str.gsub(/\$\(([\S]+)\)/){ Kernel.eval($1, binding) }
44
19
  end
20
+
21
+ require 'shared/an_operator_class'
22
+ require 'shared/a_value'
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ describe "__FILE__" do
3
+
4
+ describe "when used with eval within same file" do
5
+ let(:src){ "__FILE__" }
6
+ subject{ Kernel.eval(src, binding, __FILE__) }
7
+ it { should == __FILE__ }
8
+ end
9
+
10
+ describe "when used with eval from other file" do
11
+ let(:src){ "__FILE__" }
12
+ subject{ Kernel.eval(src, binding, "hello.rb") }
13
+ it { should == "hello.rb" }
14
+ end
15
+
16
+
17
+ end
@@ -12,4 +12,4 @@ describe :instance_eval do
12
12
  it { should == 10 }
13
13
  end
14
14
 
15
- end
15
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ describe :clojures_and_scoping do
3
+
4
+ class Foo
5
+
6
+ def a_method
7
+ :inside
8
+ end
9
+
10
+ def evaluate(lamb)
11
+ if RUBY_VERSION <= "1.9"
12
+ self.instance_eval(&lamb)
13
+ else
14
+ self.instance_exec(&lamb)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ specify "when no name clash" do
21
+ Foo.new.evaluate(lambda{ a_method }).should == :inside
22
+ end
23
+
24
+ specify "with name clash" do
25
+ a_method = :outside
26
+ Foo.new.evaluate(Proc.new{ a_method }).should == :outside
27
+ end
28
+
29
+ end