alf 0.9.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.
- data/CHANGELOG.md +5 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +42 -0
- data/LICENCE.md +22 -0
- data/Manifest.txt +15 -0
- data/README.md +769 -0
- data/Rakefile +23 -0
- data/TODO.md +26 -0
- data/alf.gemspec +191 -0
- data/alf.noespec +30 -0
- data/bin/alf +31 -0
- data/examples/autonum.alf +6 -0
- data/examples/cities.rash +4 -0
- data/examples/clip.alf +3 -0
- data/examples/compact.alf +2 -0
- data/examples/database.alf +6 -0
- data/examples/defaults.alf +3 -0
- data/examples/extend.alf +3 -0
- data/examples/group.alf +3 -0
- data/examples/intersect.alf +4 -0
- data/examples/join.alf +2 -0
- data/examples/minus.alf +8 -0
- data/examples/nest.alf +2 -0
- data/examples/nulls.rash +3 -0
- data/examples/parts.rash +6 -0
- data/examples/project.alf +2 -0
- data/examples/quota.alf +4 -0
- data/examples/rename.alf +3 -0
- data/examples/restrict.alf +2 -0
- data/examples/runall.sh +26 -0
- data/examples/schema.yaml +28 -0
- data/examples/sort.alf +4 -0
- data/examples/summarize.alf +16 -0
- data/examples/suppliers.rash +5 -0
- data/examples/supplies.rash +12 -0
- data/examples/ungroup.alf +4 -0
- data/examples/union.alf +3 -0
- data/examples/unnest.alf +4 -0
- data/examples/with.alf +23 -0
- data/lib/alf.rb +2984 -0
- data/lib/alf/loader.rb +1 -0
- data/lib/alf/renderer/text.rb +153 -0
- data/lib/alf/renderer/yaml.rb +22 -0
- data/lib/alf/version.rb +14 -0
- data/spec/aggregator_spec.rb +62 -0
- data/spec/alf_spec.rb +47 -0
- data/spec/assumptions_spec.rb +15 -0
- data/spec/environment/explicit_spec.rb +15 -0
- data/spec/environment/folder_spec.rb +30 -0
- data/spec/examples_spec.rb +26 -0
- data/spec/lispy_spec.rb +23 -0
- data/spec/operator/command_methods_spec.rb +38 -0
- data/spec/operator/non_relational/autonum_spec.rb +61 -0
- data/spec/operator/non_relational/clip_spec.rb +49 -0
- data/spec/operator/non_relational/compact/buffer_based.rb +30 -0
- data/spec/operator/non_relational/compact/sort_based_spec.rb +30 -0
- data/spec/operator/non_relational/compact_spec.rb +38 -0
- data/spec/operator/non_relational/defaults_spec.rb +55 -0
- data/spec/operator/non_relational/sort_spec.rb +66 -0
- data/spec/operator/relational/extend_spec.rb +34 -0
- data/spec/operator/relational/group_spec.rb +54 -0
- data/spec/operator/relational/intersect_spec.rb +58 -0
- data/spec/operator/relational/join/hash_based_spec.rb +63 -0
- data/spec/operator/relational/minus_spec.rb +56 -0
- data/spec/operator/relational/nest_spec.rb +32 -0
- data/spec/operator/relational/project_spec.rb +65 -0
- data/spec/operator/relational/quota_spec.rb +44 -0
- data/spec/operator/relational/rename_spec.rb +32 -0
- data/spec/operator/relational/restrict_spec.rb +56 -0
- data/spec/operator/relational/summarize/sort_based_spec.rb +31 -0
- data/spec/operator/relational/summarize_spec.rb +41 -0
- data/spec/operator/relational/ungroup_spec.rb +35 -0
- data/spec/operator/relational/union_spec.rb +35 -0
- data/spec/operator/relational/unnest_spec.rb +32 -0
- data/spec/reader/alf_file_spec.rb +15 -0
- data/spec/reader/input.rb +2 -0
- data/spec/reader/rash_spec.rb +31 -0
- data/spec/reader_spec.rb +27 -0
- data/spec/renderer/text/cell_spec.rb +34 -0
- data/spec/renderer/text/row_spec.rb +30 -0
- data/spec/renderer/text/table_spec.rb +39 -0
- data/spec/renderer_spec.rb +42 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/tools/ordering_key_spec.rb +81 -0
- data/spec/tools/projection_key_spec.rb +83 -0
- data/spec/tools/tools_spec.rb +25 -0
- data/spec/tools/tuple_handle_spec.rb +78 -0
- data/tasks/debug_mail.rake +78 -0
- data/tasks/debug_mail.txt +13 -0
- data/tasks/gem.rake +68 -0
- data/tasks/spec_test.rake +79 -0
- data/tasks/unit_test.rake +77 -0
- data/tasks/yard.rake +51 -0
- metadata +282 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Join::HashBased do
|
5
|
+
|
6
|
+
let(:suppliers) {[
|
7
|
+
{:sid => 'S1', :city => 'London'},
|
8
|
+
{:sid => 'S2', :city => 'Paris'},
|
9
|
+
{:sid => 'S3', :city => 'Paris'}
|
10
|
+
]}
|
11
|
+
|
12
|
+
let(:statuses) {[
|
13
|
+
{:sid => 'S1', :status => 20},
|
14
|
+
{:sid => 'S2', :status => 10},
|
15
|
+
{:sid => 'S3', :status => 30}
|
16
|
+
]}
|
17
|
+
|
18
|
+
let(:countries) {[
|
19
|
+
{:city => 'London', :country => 'England'},
|
20
|
+
{:city => 'Paris', :country => 'France'},
|
21
|
+
{:city => 'Bruxelles', :country => 'Belgium (until ?)'}
|
22
|
+
]}
|
23
|
+
|
24
|
+
let(:operator){ Join::HashBased.new }
|
25
|
+
subject{ operator.to_a }
|
26
|
+
|
27
|
+
describe "when applied on both candidate keys" do
|
28
|
+
before{ operator.datasets = [suppliers, statuses] }
|
29
|
+
let(:expected){[
|
30
|
+
{:sid => 'S1', :city => 'London', :status => 20},
|
31
|
+
{:sid => 'S2', :city => 'Paris', :status => 10},
|
32
|
+
{:sid => 'S3', :city => 'Paris', :status => 30}
|
33
|
+
]}
|
34
|
+
it { should == expected }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "when applied on a typical foreign key" do
|
38
|
+
let(:expected){[
|
39
|
+
{:sid => 'S1', :city => 'London', :country => 'England'},
|
40
|
+
{:sid => 'S2', :city => 'Paris', :country => 'France'},
|
41
|
+
{:sid => 'S3', :city => 'Paris', :country => 'France'}
|
42
|
+
]}
|
43
|
+
describe "on one way" do
|
44
|
+
before{ operator.datasets = [suppliers, countries] }
|
45
|
+
it { should == expected }
|
46
|
+
end
|
47
|
+
describe "on the other way around" do
|
48
|
+
before{ operator.datasets = [countries, suppliers] }
|
49
|
+
it { should == expected }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "when no attributes are in common" do
|
54
|
+
before{ operator.datasets = [statuses, countries] }
|
55
|
+
let(:expected){
|
56
|
+
statuses.collect{|s| countries.collect{|c| c.merge(s)}}.flatten
|
57
|
+
}
|
58
|
+
it { should == expected }
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Minus do
|
5
|
+
|
6
|
+
let(:operator_class){ Minus }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:left) {[
|
10
|
+
{:sid => 'S1', :city => 'London'},
|
11
|
+
{:sid => 'S2', :city => 'Paris'},
|
12
|
+
{:sid => 'S3', :city => 'Paris'}
|
13
|
+
]}
|
14
|
+
|
15
|
+
let(:right) {[
|
16
|
+
{:sid => 'S2', :city => 'Paris'},
|
17
|
+
{:sid => 'S1', :city => 'London'},
|
18
|
+
]}
|
19
|
+
|
20
|
+
let(:disjoint) {[
|
21
|
+
{:sid => 'S4', :city => 'Oslo'},
|
22
|
+
{:sid => 'S5', :city => 'Bruxelles'},
|
23
|
+
]}
|
24
|
+
|
25
|
+
let(:operator){ Minus.run([]) }
|
26
|
+
subject{ operator.to_a }
|
27
|
+
|
28
|
+
describe "when applied on the same operand twice" do
|
29
|
+
before{ operator.datasets = [left, left] }
|
30
|
+
it { should be_empty }
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "when applied on operands sharing tuples" do
|
34
|
+
before{ operator.datasets = [left, right] }
|
35
|
+
let(:expected) {[
|
36
|
+
{:sid => 'S3', :city => 'Paris'}
|
37
|
+
]}
|
38
|
+
it { should == expected }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "when applied on disjoint operands" do
|
42
|
+
before{ operator.datasets = [left, disjoint] }
|
43
|
+
it { should == left }
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when factored with Lispy" do
|
47
|
+
let(:operator){ Lispy.minus(left, right) }
|
48
|
+
let(:expected) {[
|
49
|
+
{:sid => 'S3', :city => 'Paris'}
|
50
|
+
]}
|
51
|
+
it { should == expected }
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Nest do
|
5
|
+
|
6
|
+
let(:operator_class){ Nest }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "a", :b => "b", :c => "c"},
|
11
|
+
]}
|
12
|
+
|
13
|
+
let(:expected) {[
|
14
|
+
{:nested => {:a => "a", :b => "b"}, :c => "c"}
|
15
|
+
]}
|
16
|
+
|
17
|
+
subject{ operator.to_a }
|
18
|
+
|
19
|
+
describe "when factored with commandline args" do
|
20
|
+
let(:operator){ Nest.run(["--", "a", "b", "nested"]) }
|
21
|
+
before{ operator.pipe(input) }
|
22
|
+
it { should == expected }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "when factored with Lispy" do
|
26
|
+
let(:operator){ Lispy.nest(input, [:a, :b], :nested) }
|
27
|
+
it { should == expected }
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Project do
|
5
|
+
|
6
|
+
let(:operator_class){ Project }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "a", :b => "b"},
|
11
|
+
{:a => "a", :b => "b"},
|
12
|
+
]}
|
13
|
+
|
14
|
+
subject{ operator.to_a }
|
15
|
+
|
16
|
+
describe "when used without --allbut" do
|
17
|
+
let(:expected){[{:a => "a"}]}
|
18
|
+
|
19
|
+
describe "and factored with commandline args" do
|
20
|
+
let(:operator){ Project.run(["--", 'a']) }
|
21
|
+
before{ operator.pipe(input) }
|
22
|
+
it { should == expected }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "and factored with Lispy" do
|
26
|
+
let(:operator){ Lispy.project(input, [:a]) }
|
27
|
+
it { should == expected }
|
28
|
+
end
|
29
|
+
|
30
|
+
end # --no-allbut
|
31
|
+
|
32
|
+
describe "when used with --allbut" do
|
33
|
+
let(:expected){[{:b => "b"}]}
|
34
|
+
|
35
|
+
describe "and factored with commandline args" do
|
36
|
+
let(:operator){ Project.run(['--allbut', '--', 'a']) }
|
37
|
+
before{ operator.pipe(input) }
|
38
|
+
it { should == expected }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "and factored with Lispy" do
|
42
|
+
let(:operator){ Lispy.allbut(input, [:a]) }
|
43
|
+
it { should == expected }
|
44
|
+
end
|
45
|
+
|
46
|
+
end # --allbut
|
47
|
+
|
48
|
+
describe "when all is projected" do
|
49
|
+
let(:expected){[{}]}
|
50
|
+
|
51
|
+
describe "when input is not empty" do
|
52
|
+
let(:operator){ Lispy.project(input, []) }
|
53
|
+
it { should == expected }
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "when input is empty" do
|
57
|
+
let(:operator){ Lispy.project([], []) }
|
58
|
+
it { should == [] }
|
59
|
+
end
|
60
|
+
|
61
|
+
end # all attributes projected
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Quota do
|
5
|
+
|
6
|
+
let(:operator_class){ Quota }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "via_method", :time => 1},
|
11
|
+
{:a => "via_method", :time => 2},
|
12
|
+
{:a => "via_method", :time => 3},
|
13
|
+
{:a => "via_reader", :time => 4},
|
14
|
+
{:a => "via_reader", :time => 2},
|
15
|
+
]}
|
16
|
+
|
17
|
+
let(:expected) {[
|
18
|
+
{:a => "via_method", :time => 1, :time_sum => 1, :time_max => 1},
|
19
|
+
{:a => "via_method", :time => 2, :time_sum => 3, :time_max => 2},
|
20
|
+
{:a => "via_method", :time => 3, :time_sum => 6, :time_max => 3},
|
21
|
+
{:a => "via_reader", :time => 2, :time_sum => 2, :time_max => 2},
|
22
|
+
{:a => "via_reader", :time => 4, :time_sum => 6, :time_max => 4},
|
23
|
+
]}
|
24
|
+
|
25
|
+
subject{ operator.to_a }
|
26
|
+
|
27
|
+
describe "When factored with commandline args" do
|
28
|
+
let(:opts){ ['--by=a', "--order=time"] }
|
29
|
+
let(:aggs){ ["time_sum", "sum(:time)", "time_max", "max(:time)"] }
|
30
|
+
let(:operator){ Quota.run(opts + ["--"] + aggs) }
|
31
|
+
before{ operator.pipe(input) }
|
32
|
+
it { should == expected }
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "When factored with Lispy" do
|
36
|
+
let(:aggs){{:time_sum => Aggregator.sum(:time),
|
37
|
+
:time_max => Aggregator.max(:time)}}
|
38
|
+
let(:operator){ Lispy.quota(input, [:a], [:time], aggs) }
|
39
|
+
it { should == expected }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Rename do
|
5
|
+
|
6
|
+
let(:operator_class){ Rename }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "a", :b => "b"},
|
11
|
+
]}
|
12
|
+
|
13
|
+
let(:expected){[
|
14
|
+
{:z => "a", :b => "b"},
|
15
|
+
]}
|
16
|
+
|
17
|
+
subject{ operator.to_a }
|
18
|
+
|
19
|
+
describe "When factored with Lispy" do
|
20
|
+
let(:operator){ Lispy.rename(input, {:a => :z}) }
|
21
|
+
it{ should == expected }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "When factored from commandline args" do
|
25
|
+
let(:operator){ Rename.run(['--', 'a', 'z']) }
|
26
|
+
before{ operator.pipe(input) }
|
27
|
+
it{ should == expected }
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Restrict do
|
5
|
+
|
6
|
+
let(:operator_class){ Restrict }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:tested => 1, :other => "b"},
|
11
|
+
{:tested => 30, :other => "a"},
|
12
|
+
]}
|
13
|
+
|
14
|
+
let(:expected){[
|
15
|
+
{:tested => 1, :other => "b"}
|
16
|
+
]}
|
17
|
+
|
18
|
+
subject{ operator.to_a }
|
19
|
+
|
20
|
+
describe "when used with no argument" do
|
21
|
+
let(:operator){ Restrict.run(%w{}) }
|
22
|
+
before{ operator.pipe(input) }
|
23
|
+
it { should == input }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when used with a string" do
|
27
|
+
describe "when factored with commandline args" do
|
28
|
+
let(:operator){ Restrict.run(["--", "tested < 10"]) }
|
29
|
+
before{ operator.pipe(input) }
|
30
|
+
it { should == expected }
|
31
|
+
end
|
32
|
+
describe "when factored with Lispy" do
|
33
|
+
let(:operator){ Lispy.restrict(input, "tested < 10") }
|
34
|
+
it { should == expected }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "when used with arguments" do
|
39
|
+
describe "when factored with commandline args" do
|
40
|
+
let(:operator){ Restrict.run(["--", "tested", "1"]) }
|
41
|
+
before{ operator.pipe(input) }
|
42
|
+
it { should == expected }
|
43
|
+
end
|
44
|
+
describe "when factored with Lispy and Proc" do
|
45
|
+
let(:operator){ Lispy.restrict(input, lambda{ tested < 10 }) }
|
46
|
+
it { should == expected }
|
47
|
+
end
|
48
|
+
describe "when factored with Lispy and array" do
|
49
|
+
let(:operator){ Lispy.restrict(input, [:tested, 1]) }
|
50
|
+
it { should == expected }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Summarize::SortBased do
|
5
|
+
|
6
|
+
let(:input) {[
|
7
|
+
{:a => "via_method", :time => 1},
|
8
|
+
{:a => "via_method", :time => 1},
|
9
|
+
{:a => "via_method", :time => 2},
|
10
|
+
{:a => "via_reader", :time => 4},
|
11
|
+
{:a => "via_reader", :time => 2},
|
12
|
+
]}
|
13
|
+
|
14
|
+
let(:expected) {[
|
15
|
+
{:a => "via_method", :time_sum => 4, :time_max => 2},
|
16
|
+
{:a => "via_reader", :time_sum => 6, :time_max => 4},
|
17
|
+
]}
|
18
|
+
|
19
|
+
let(:by_key){ Tools::ProjectionKey.new([:a],false) }
|
20
|
+
let(:aggs){{:time_sum => Aggregator.sum(:time),
|
21
|
+
:time_max => Aggregator.max(:time)}}
|
22
|
+
let(:operator){ Summarize::SortBased.new(by_key, aggs) }
|
23
|
+
|
24
|
+
before{ operator.pipe(input) }
|
25
|
+
subject{ operator.to_a }
|
26
|
+
|
27
|
+
it { should == expected }
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Summarize do
|
5
|
+
|
6
|
+
let(:operator_class){ Summarize }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "via_reader", :time => 2},
|
11
|
+
{:a => "via_method", :time => 1},
|
12
|
+
{:a => "via_method", :time => 2},
|
13
|
+
{:a => "via_reader", :time => 4},
|
14
|
+
{:a => "via_method", :time => 1},
|
15
|
+
]}
|
16
|
+
|
17
|
+
let(:expected) {[
|
18
|
+
{:a => "via_method", :time_sum => 4, :time_max => 2},
|
19
|
+
{:a => "via_reader", :time_sum => 6, :time_max => 4},
|
20
|
+
]}
|
21
|
+
|
22
|
+
subject{ operator.to_a }
|
23
|
+
|
24
|
+
describe "When factored with commandline args" do
|
25
|
+
let(:opts){ ["--by=a"] }
|
26
|
+
let(:aggs){ ["time_sum", "sum(:time)", "time_max", "max(:time)"] }
|
27
|
+
let(:operator){ Summarize.run(opts + ["--"] +aggs) }
|
28
|
+
before{ operator.pipe(input) }
|
29
|
+
it { should == expected }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "When factored with Lispy" do
|
33
|
+
let(:aggs){{:time_sum => Aggregator.sum(:time),
|
34
|
+
:time_max => Aggregator.max(:time)}}
|
35
|
+
let(:operator){ Lispy.summarize(input, [:a], aggs) }
|
36
|
+
it { should == expected }
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Alf
|
3
|
+
module Operator::Relational
|
4
|
+
describe Ungroup do
|
5
|
+
|
6
|
+
let(:operator_class){ Ungroup }
|
7
|
+
it_should_behave_like("An operator class")
|
8
|
+
|
9
|
+
let(:input) {[
|
10
|
+
{:a => "via_method", :as => [{:time => 1, :b => "b"}, {:time => 2, :b => "b"}]},
|
11
|
+
{:a => "via_reader", :as => [{:time => 3, :b => "b"}]},
|
12
|
+
]}
|
13
|
+
|
14
|
+
let(:expected) {[
|
15
|
+
{:a => "via_method", :time => 1, :b => "b"},
|
16
|
+
{:a => "via_method", :time => 2, :b => "b"},
|
17
|
+
{:a => "via_reader", :time => 3, :b => "b"},
|
18
|
+
]}
|
19
|
+
|
20
|
+
subject{ operator.to_a.sort{|k1,k2| k1[:time] <=> k2[:time]} }
|
21
|
+
|
22
|
+
describe "when factored with commandline args" do
|
23
|
+
let(:operator) { Ungroup.run(%w{-- as}) }
|
24
|
+
before{ operator.pipe(input) }
|
25
|
+
it { should == expected }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "when factored with Lispy" do
|
29
|
+
let(:operator) { Lispy.ungroup(input, :as) }
|
30
|
+
it { should == expected }
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|