stages 0.1.1 → 0.1.2
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/VERSION +1 -1
- data/examples/sing.rb +4 -4
- data/examples/sing_custom_stages.rb +51 -0
- data/examples/sing_subpipes.rb +8 -8
- data/lib/stages/each.rb +34 -0
- data/lib/stages/sub_stage.rb +7 -0
- data/stages.gemspec +3 -5
- data/test/test_pipeline.rb +4 -4
- data/test/test_stages.rb +16 -16
- metadata +4 -6
- data/lib/stages/each_element.rb +0 -14
- data/lib/stages/each_input.rb +0 -10
- data/lib/stages/hash_lookup.rb +0 -12
- data/lib/stages/multiples_of.rb +0 -12
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/examples/sing.rb
CHANGED
@@ -14,14 +14,14 @@ def sing
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def setup_pipeline
|
17
|
-
generator =
|
17
|
+
generator = Each.new sing.keys
|
18
18
|
loop = Restrict.new
|
19
|
-
get_lyric =
|
20
|
-
each_character =
|
19
|
+
get_lyric = Map.new{ |x| sing[x]}
|
20
|
+
each_character = Each.new{ |x| x.chars }
|
21
21
|
whitespace = Select.new{ |x| x != ' '}
|
22
22
|
pool = ResumeCount.new
|
23
23
|
subtotals = Map.new { |x| x.values.first }
|
24
|
-
iterator =
|
24
|
+
iterator = Each.new
|
25
25
|
aggregator = SuperAggregator.new
|
26
26
|
|
27
27
|
generator | loop | get_lyric | each_character | whitespace | pool | subtotals | iterator | aggregator
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/stages"
|
2
|
+
|
3
|
+
include Stages
|
4
|
+
|
5
|
+
#count the occurance of each letter in these song lyrics
|
6
|
+
@lyrics =
|
7
|
+
{ :do => 'doe a deer a female deer',
|
8
|
+
:re => 'ray a drop of golden sun',
|
9
|
+
:mi => 'me a name I call myself',
|
10
|
+
:fa => 'far a long long way to run',
|
11
|
+
:so => 'a needle pulling thread',
|
12
|
+
:la => 'a note to follow so',
|
13
|
+
:ti => 'a drink with jam and bread'}
|
14
|
+
|
15
|
+
class Lyrics < Stage
|
16
|
+
attr_accessor :lyrics
|
17
|
+
def handle_value(value)
|
18
|
+
output @lyrics[value]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Generator < Stage
|
23
|
+
def initialize(things)
|
24
|
+
@things = things
|
25
|
+
super()
|
26
|
+
end
|
27
|
+
|
28
|
+
def process
|
29
|
+
@things.each do |t|
|
30
|
+
output t
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def setup_pipeline
|
36
|
+
get_lyric = Lyrics.new
|
37
|
+
get_lyric.lyrics = @lyrics
|
38
|
+
|
39
|
+
each_character = Each.new{ |x| x.chars }
|
40
|
+
trim_whitespace = Select.new{ |x| x != ' '}
|
41
|
+
letters_in_each_line = SubStage.new(get_lyric | each_character | trim_whitespace)
|
42
|
+
each_note = Generator.new(@lyrics.keys)
|
43
|
+
count_everything = Count.new
|
44
|
+
|
45
|
+
each_note | letters_in_each_line | count_everything
|
46
|
+
end
|
47
|
+
|
48
|
+
puts setup_pipeline.run.inspect
|
49
|
+
|
50
|
+
|
51
|
+
|
data/examples/sing_subpipes.rb
CHANGED
@@ -3,7 +3,7 @@ require "#{File.dirname(__FILE__)}/../lib/stages"
|
|
3
3
|
include Stages
|
4
4
|
|
5
5
|
#count the occurance of each letter in these song lyrics
|
6
|
-
|
6
|
+
@lyrics =
|
7
7
|
{ :do => 'doe a deer a female deer',
|
8
8
|
:re => 'ray a drop of golden sun',
|
9
9
|
:mi => 'me a name I call myself',
|
@@ -11,18 +11,18 @@ def sing
|
|
11
11
|
:so => 'a needle pulling thread',
|
12
12
|
:la => 'a note to follow so',
|
13
13
|
:ti => 'a drink with jam and bread'}
|
14
|
-
end
|
15
14
|
|
16
15
|
def setup_pipeline
|
17
|
-
get_lyric =
|
18
|
-
each_character = EachInput.new{ |x| x.chars }
|
19
|
-
trim_whitespace = Select.new{ |x| x != ' '}
|
20
|
-
count_letters_in_line = SubStage.new(get_lyric | each_character | trim_whitespace)
|
16
|
+
get_lyric = Map.new{ |x| @lyrics[x]}
|
21
17
|
|
22
|
-
|
18
|
+
|
19
|
+
each_character = Each.new{ |x| x.chars }
|
20
|
+
trim_whitespace = Select.new{ |x| x != ' '}
|
21
|
+
letters_in_each_line = SubStage.new(get_lyric | each_character | trim_whitespace)
|
22
|
+
each_note = Each.new @lyrics.keys
|
23
23
|
count_everything = Count.new
|
24
24
|
|
25
|
-
each_note |
|
25
|
+
each_note | letters_in_each_line | count_everything
|
26
26
|
end
|
27
27
|
|
28
28
|
puts setup_pipeline.run.inspect
|
data/lib/stages/each.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Stages
|
2
|
+
class Each < Stage
|
3
|
+
def initialize(things = nil, &block)
|
4
|
+
@things = things unless things.nil?
|
5
|
+
@block = block
|
6
|
+
super()
|
7
|
+
end
|
8
|
+
|
9
|
+
def process
|
10
|
+
if @things
|
11
|
+
process_things
|
12
|
+
else
|
13
|
+
process_inputs
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_inputs
|
18
|
+
while v = input
|
19
|
+
v = @block.call(v) if @block
|
20
|
+
v.each do |v|
|
21
|
+
output v
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_things
|
27
|
+
@things = @block.call(@things) if @block
|
28
|
+
output nil if @things.nil?
|
29
|
+
@things.each do |thing|
|
30
|
+
output thing
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/stages/sub_stage.rb
CHANGED
@@ -3,13 +3,20 @@ module Stages
|
|
3
3
|
def initialize(pipeline)
|
4
4
|
@pipeline = pipeline
|
5
5
|
@cache = []
|
6
|
+
@with_hash = false
|
6
7
|
super()
|
7
8
|
end
|
8
9
|
|
10
|
+
def with_hash
|
11
|
+
@with_hash = true
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
9
15
|
def process
|
10
16
|
while value = input
|
11
17
|
subpipe = Emit.new(value) | @pipeline
|
12
18
|
while v = subpipe.run
|
19
|
+
v = { value => v} if @with_hash
|
13
20
|
output v
|
14
21
|
end
|
15
22
|
@pipeline.drop_leftmost!
|
data/stages.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "stages"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["The Justice Eight"]
|
@@ -23,17 +23,15 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
25
|
"examples/sing.rb",
|
26
|
+
"examples/sing_custom_stages.rb",
|
26
27
|
"examples/sing_subpipes.rb",
|
27
28
|
"lib/stage_base.rb",
|
28
29
|
"lib/stages.rb",
|
29
30
|
"lib/stages/count.rb",
|
30
|
-
"lib/stages/
|
31
|
-
"lib/stages/each_input.rb",
|
31
|
+
"lib/stages/each.rb",
|
32
32
|
"lib/stages/emit.rb",
|
33
33
|
"lib/stages/evens.rb",
|
34
|
-
"lib/stages/hash_lookup.rb",
|
35
34
|
"lib/stages/map.rb",
|
36
|
-
"lib/stages/multiples_of.rb",
|
37
35
|
"lib/stages/restrict.rb",
|
38
36
|
"lib/stages/resume.rb",
|
39
37
|
"lib/stages/resume_count.rb",
|
data/test/test_pipeline.rb
CHANGED
@@ -5,8 +5,8 @@ class TestPipeline < MiniTest::Unit::TestCase
|
|
5
5
|
|
6
6
|
test 'simple basic pipeline' do
|
7
7
|
evens = Evens.new
|
8
|
-
mx3 =
|
9
|
-
mx7 =
|
8
|
+
mx3 = Select.new{ |x| x % 3 == 0}
|
9
|
+
mx7 = Select.new{ |x| x % 7 == 0}
|
10
10
|
mx3.source = evens
|
11
11
|
mx7.source = mx3
|
12
12
|
|
@@ -15,7 +15,7 @@ class TestPipeline < MiniTest::Unit::TestCase
|
|
15
15
|
end
|
16
16
|
|
17
17
|
test 'pipeline pipe syntax works' do
|
18
|
-
pipeline = Evens.new |
|
18
|
+
pipeline = Evens.new | Select.new{ |x| x % 3 == 0} | Select.new{ |x| x % 7 == 0}
|
19
19
|
result = (0..2).map{ pipeline.run }
|
20
20
|
assert_equal([0, 42, 84], result)
|
21
21
|
end
|
@@ -36,7 +36,7 @@ class TestPipeline < MiniTest::Unit::TestCase
|
|
36
36
|
end
|
37
37
|
|
38
38
|
test 'nil kills it' do
|
39
|
-
pipeline =
|
39
|
+
pipeline = Each.new([1, 2, nil, 3])
|
40
40
|
result = []
|
41
41
|
while v = pipeline.run
|
42
42
|
result << v
|
data/test/test_stages.rb
CHANGED
@@ -22,19 +22,19 @@ class TestStages < MiniTest::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
|
24
24
|
test 'multiples_of' do
|
25
|
-
pipeline = Evens.new |
|
25
|
+
pipeline = Evens.new | Select.new{ |x| x % 3 == 0}
|
26
26
|
result = (0..3).map{ pipeline.run }
|
27
27
|
assert_equal([0, 6, 12, 18], result)
|
28
28
|
end
|
29
29
|
|
30
30
|
test 'each_element' do
|
31
|
-
pipeline =
|
31
|
+
pipeline = Each.new([1, 2, 3])
|
32
32
|
result = (0..2).map{ pipeline.run }
|
33
33
|
assert_equal([1, 2, 3], result)
|
34
34
|
end
|
35
35
|
|
36
36
|
test 'hash_lookup' do
|
37
|
-
pipeline =
|
37
|
+
pipeline = Each.new([:do, :re, :mi]) | Map.new{ |x| sing[x]}
|
38
38
|
result = (0..2).map { pipeline.run }
|
39
39
|
assert_equal(['doe a deer a female deer', 'ray a drop of golden sun', 'me a name I call myself'], result)
|
40
40
|
end
|
@@ -53,17 +53,8 @@ class TestStages < MiniTest::Unit::TestCase
|
|
53
53
|
assert_equal([0, 4], result)
|
54
54
|
end
|
55
55
|
|
56
|
-
test 'each_input' do
|
57
|
-
pipeline = EachElement.new([[1, 2], [3, 4]]) | EachInput.new
|
58
|
-
result = []
|
59
|
-
while v = pipeline.run
|
60
|
-
result << v
|
61
|
-
end
|
62
|
-
assert_equal([1, 2, 3, 4], result)
|
63
|
-
end
|
64
|
-
|
65
56
|
test 'resume' do
|
66
|
-
pipeline =
|
57
|
+
pipeline = Each.new(%w(foo bar)) | Restrict.new | Each.new{ |x| x.chars} | Resume.new
|
67
58
|
result = []
|
68
59
|
while v = pipeline.run
|
69
60
|
result << v
|
@@ -73,20 +64,29 @@ class TestStages < MiniTest::Unit::TestCase
|
|
73
64
|
|
74
65
|
test 'resume with count' do
|
75
66
|
resume = ResumeCount.new
|
76
|
-
pipeline =
|
67
|
+
pipeline = Each.new(%w(foo bar)) | Restrict.new | Each.new{ |x| x.chars} | Map.new{ |x| x.to_sym } | resume
|
77
68
|
result = pipeline.run
|
78
69
|
assert_equal({ 'foo' => { :f => 1, :o => 2}}, result)
|
79
70
|
end
|
80
71
|
|
81
72
|
test 'substage instead of resume' do
|
82
|
-
sub =
|
83
|
-
pipeline =
|
73
|
+
sub = Each.new{ |x| x.chars } | Map.new{ |x| x.to_sym} | Count.new
|
74
|
+
pipeline = Each.new(%w(foo bar)) | SubStage.new(sub).with_hash | Map.new{ |x| x.values.first}
|
84
75
|
result = pipeline.run
|
85
76
|
assert_equal({ :f => 1, :o => 2}, result)
|
86
77
|
result = pipeline.run
|
87
78
|
assert_equal({ :b => 1, :a => 1, :r => 1}, result)
|
88
79
|
end
|
89
80
|
|
81
|
+
test 'substage with key and result' do
|
82
|
+
sub = Each.new{ |x| x.chars } | Map.new{ |x| x.to_sym} | Count.new
|
83
|
+
pipeline = Each.new(%w(foo bar)) | SubStage.new(sub).with_hash
|
84
|
+
result = pipeline.run
|
85
|
+
assert_equal({'foo' => { :f => 1, :o => 2}}, result)
|
86
|
+
result = pipeline.run
|
87
|
+
assert_equal({ 'bar' => { :b => 1, :a => 1, :r => 1}}, result)
|
88
|
+
end
|
89
|
+
|
90
90
|
def sing
|
91
91
|
{ :do => 'doe a deer a female deer',
|
92
92
|
:re => 'ray a drop of golden sun',
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: stages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- The Justice Eight
|
@@ -39,17 +39,15 @@ files:
|
|
39
39
|
- Rakefile
|
40
40
|
- VERSION
|
41
41
|
- examples/sing.rb
|
42
|
+
- examples/sing_custom_stages.rb
|
42
43
|
- examples/sing_subpipes.rb
|
43
44
|
- lib/stage_base.rb
|
44
45
|
- lib/stages.rb
|
45
46
|
- lib/stages/count.rb
|
46
|
-
- lib/stages/
|
47
|
-
- lib/stages/each_input.rb
|
47
|
+
- lib/stages/each.rb
|
48
48
|
- lib/stages/emit.rb
|
49
49
|
- lib/stages/evens.rb
|
50
|
-
- lib/stages/hash_lookup.rb
|
51
50
|
- lib/stages/map.rb
|
52
|
-
- lib/stages/multiples_of.rb
|
53
51
|
- lib/stages/restrict.rb
|
54
52
|
- lib/stages/resume.rb
|
55
53
|
- lib/stages/resume_count.rb
|
@@ -72,7 +70,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
70
|
requirements:
|
73
71
|
- - ">="
|
74
72
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
73
|
+
hash: 1777887051892301360
|
76
74
|
segments:
|
77
75
|
- 0
|
78
76
|
version: "0"
|
data/lib/stages/each_element.rb
DELETED
data/lib/stages/each_input.rb
DELETED
data/lib/stages/hash_lookup.rb
DELETED