stages 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +4 -1
- data/README.md +2 -0
- data/VERSION +1 -1
- data/lib/stages.rb +1 -0
- data/lib/sugar.rb +39 -0
- data/stages.gemspec +5 -3
- data/test/helper.rb +13 -7
- data/test/test_stages.rb +17 -24
- data/test/test_syntax.rb +38 -0
- metadata +5 -3
data/.autotest
CHANGED
@@ -4,7 +4,10 @@ Autotest.add_hook(:initialize) do |at|
|
|
4
4
|
end
|
5
5
|
|
6
6
|
at.add_mapping(%r%^lib(/stages)?/(.*).rb$%, true) do |filename, _|
|
7
|
-
['test/test_pipeline.rb', 'test/test_stages.rb']
|
7
|
+
['test/test_pipeline.rb', 'test/test_stages.rb', 'test/test_syntax.rb']
|
8
8
|
end
|
9
9
|
|
10
|
+
at.add_mapping(%r%^lib/sugar.rb$%, true) do |filename, _|
|
11
|
+
['test/test_syntax.rb']
|
12
|
+
end
|
10
13
|
end
|
data/README.md
CHANGED
@@ -5,6 +5,8 @@ A gem for creating data pipelines out of tiny, reusable objects
|
|
5
5
|
|
6
6
|
Initial code stolen shamelessly from http://pragdave.blogs.pragprog.com/pragdave/2008/01/pipelines-using.html
|
7
7
|
|
8
|
+
Announcement blog post is at http://blog.igodigital.com/blog/on-recommendations/the-stages-gem
|
9
|
+
|
8
10
|
Usage
|
9
11
|
-----
|
10
12
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.6
|
data/lib/stages.rb
CHANGED
data/lib/sugar.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Stages
|
2
|
+
module Sugar
|
3
|
+
def select(*args, &block)
|
4
|
+
Select.new(*args, &block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def each(*args, &block)
|
8
|
+
Each.new(*args, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def map(*args, &block)
|
12
|
+
Map.new(*args, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def wrap(*args, &block)
|
16
|
+
Wrap.new(*args, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def unique(*args, &block)
|
20
|
+
Unique.new(*args, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def run_until_exhausted(*args, &block)
|
24
|
+
Exhaust.new(*args, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def restrict(*args, &block)
|
28
|
+
Restrict.new(*args, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def resume(*args, &block)
|
32
|
+
Resume.new(*args, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def group(*args, &block)
|
36
|
+
Count.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/stages.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "stages"
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.6"
|
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"]
|
12
|
-
s.date = "2012-01-
|
12
|
+
s.date = "2012-01-21"
|
13
13
|
s.description = "pipeline builder"
|
14
14
|
s.email = "support@igodigital.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -38,10 +38,12 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/stages/select.rb",
|
39
39
|
"lib/stages/unique.rb",
|
40
40
|
"lib/stages/wrap.rb",
|
41
|
+
"lib/sugar.rb",
|
41
42
|
"stages.gemspec",
|
42
43
|
"test/helper.rb",
|
43
44
|
"test/test_pipeline.rb",
|
44
|
-
"test/test_stages.rb"
|
45
|
+
"test/test_stages.rb",
|
46
|
+
"test/test_syntax.rb"
|
45
47
|
]
|
46
48
|
s.homepage = "https://github.com/iGoDigital-LLC/stages"
|
47
49
|
s.require_paths = ["lib"]
|
data/test/helper.rb
CHANGED
@@ -7,7 +7,7 @@ require 'minitest/unit'
|
|
7
7
|
|
8
8
|
module Stages
|
9
9
|
class Evens < Stage
|
10
|
-
def process
|
10
|
+
def process
|
11
11
|
value = 0
|
12
12
|
loop do
|
13
13
|
output(value)
|
@@ -17,6 +17,12 @@ module Stages
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
module Stages::Sugar
|
21
|
+
def evens
|
22
|
+
Evens.new
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
20
26
|
class MiniTest::Unit::TestCase
|
21
27
|
def self.test(name, &block)
|
22
28
|
define_method 'test_' + name, &block
|
@@ -33,12 +39,12 @@ class MiniTest::Unit
|
|
33
39
|
if test_cases.size > 0
|
34
40
|
@@out.print "\n#{suite}:\n"
|
35
41
|
end
|
36
|
-
|
42
|
+
|
37
43
|
test_cases.each do |test|
|
38
44
|
inst = suite.new test
|
39
45
|
inst._assertions = 0
|
40
|
-
|
41
|
-
|
46
|
+
|
47
|
+
|
42
48
|
@broken = nil
|
43
49
|
|
44
50
|
@@out.print(case run_one inst
|
@@ -63,7 +69,7 @@ class MiniTest::Unit
|
|
63
69
|
end)
|
64
70
|
|
65
71
|
if @broken
|
66
|
-
@@out.print MiniTest::Unit.use_natural_language_case_names? ?
|
72
|
+
@@out.print MiniTest::Unit.use_natural_language_case_names? ?
|
67
73
|
" #{test.gsub("test_", "").gsub(/_/, " ")}" : " #{test}"
|
68
74
|
@@out.print " (%.2fs) " % @elapsed
|
69
75
|
@@out.puts
|
@@ -84,14 +90,14 @@ class MiniTest::Unit
|
|
84
90
|
@@out.sync = old_sync if @@out.respond_to? :sync=
|
85
91
|
[@test_count, @assertion_count]
|
86
92
|
end
|
87
|
-
|
93
|
+
|
88
94
|
def run_one(inst)
|
89
95
|
t = Time.now
|
90
96
|
result = inst.run self
|
91
97
|
@elapsed = Time.now - t
|
92
98
|
if result == :pass && @elapsed > 5.0
|
93
99
|
result = :timeout
|
94
|
-
@report << { :message => "Test took a long time (%.2fs)" % @elapsed,
|
100
|
+
@report << { :message => "Test took a long time (%.2fs)" % @elapsed,
|
95
101
|
:exception => Exception.new("Long test")}
|
96
102
|
end
|
97
103
|
result
|
data/test/test_stages.rb
CHANGED
@@ -2,43 +2,36 @@ require 'helper'
|
|
2
2
|
include Stages
|
3
3
|
|
4
4
|
class TestStages < MiniTest::Unit::TestCase
|
5
|
-
|
6
5
|
test 'evens' do
|
7
6
|
evens = Evens.new
|
8
7
|
result = (0..2).map{ evens.run }
|
9
8
|
assert_equal([0, 2, 4], result)
|
10
9
|
end
|
11
|
-
|
10
|
+
|
12
11
|
test 'select' do
|
13
12
|
pipeline = Evens.new | Select.new{ |val| val > 6}
|
14
13
|
result = (0..2).map{ pipeline.run }
|
15
14
|
assert_equal([8, 10, 12], result)
|
16
15
|
end
|
17
|
-
|
16
|
+
|
18
17
|
test 'map' do
|
19
18
|
pipeline = Evens.new | Map.new{ |val| val * 3}
|
20
19
|
result = (0..2).map{ pipeline.run }
|
21
20
|
assert_equal([0, 6, 12], result)
|
22
21
|
end
|
23
|
-
|
24
|
-
test 'multiples_of' do
|
25
|
-
pipeline = Evens.new | Select.new{ |x| x % 3 == 0}
|
26
|
-
result = (0..3).map{ pipeline.run }
|
27
|
-
assert_equal([0, 6, 12, 18], result)
|
28
|
-
end
|
29
|
-
|
22
|
+
|
30
23
|
test 'each_element' do
|
31
24
|
pipeline = Each.new([1, 2, 3])
|
32
25
|
result = (0..2).map{ pipeline.run }
|
33
26
|
assert_equal([1, 2, 3], result)
|
34
27
|
end
|
35
|
-
|
28
|
+
|
36
29
|
test 'hash_lookup' do
|
37
30
|
pipeline = Each.new([:do, :re, :mi]) | Map.new{ |x| sing[x]}
|
38
31
|
result = (0..2).map { pipeline.run }
|
39
32
|
assert_equal(['doe a deer a female deer', 'ray a drop of golden sun', 'me a name I call myself'], result)
|
40
|
-
end
|
41
|
-
|
33
|
+
end
|
34
|
+
|
42
35
|
test 'restrict' do
|
43
36
|
pipeline = Evens.new | Restrict.new | Map.new{ |x| x * 2}
|
44
37
|
result = []
|
@@ -52,7 +45,7 @@ class TestStages < MiniTest::Unit::TestCase
|
|
52
45
|
end
|
53
46
|
assert_equal([0, 4], result)
|
54
47
|
end
|
55
|
-
|
48
|
+
|
56
49
|
test 'resume' do
|
57
50
|
pipeline = Each.new(%w(foo bar)) | Restrict.new | Each.new{ |x| x.chars} | Resume.new
|
58
51
|
result = []
|
@@ -61,14 +54,14 @@ class TestStages < MiniTest::Unit::TestCase
|
|
61
54
|
end
|
62
55
|
assert_equal([{ 'foo' => %w(f o o)}, {'bar' => %w(b a r)}], result)
|
63
56
|
end
|
64
|
-
|
57
|
+
|
65
58
|
test 'resume with count' do
|
66
59
|
resume = ResumeCount.new
|
67
60
|
pipeline = Each.new(%w(foo bar)) | Restrict.new | Each.new{ |x| x.chars} | Map.new{ |x| x.to_sym } | resume
|
68
61
|
result = pipeline.run
|
69
62
|
assert_equal({ 'foo' => { :f => 1, :o => 2}}, result)
|
70
63
|
end
|
71
|
-
|
64
|
+
|
72
65
|
test 'hash mode wrap' do
|
73
66
|
pipeline = Each.new(%w(foo bar)) | Wrap.new(Each.new{ |x| x.chars})
|
74
67
|
result = pipeline.run
|
@@ -76,7 +69,7 @@ class TestStages < MiniTest::Unit::TestCase
|
|
76
69
|
result = pipeline.run
|
77
70
|
assert_equal(%w(b a r), result['bar'])
|
78
71
|
end
|
79
|
-
|
72
|
+
|
80
73
|
test 'hash/aggregated wrap mode wrap' do
|
81
74
|
pipeline = Each.new(%w(foo bar)) | Wrap.new(Each.new{ |x| x.chars} | Count.new, :aggregated)
|
82
75
|
result = pipeline.run
|
@@ -84,8 +77,8 @@ class TestStages < MiniTest::Unit::TestCase
|
|
84
77
|
result = pipeline.run
|
85
78
|
assert_equal(3, result['bar'].keys.length)
|
86
79
|
end
|
87
|
-
|
88
|
-
|
80
|
+
|
81
|
+
|
89
82
|
test 'array mode wrap' do
|
90
83
|
pipeline = Each.new(%w(foo bar)) | Wrap.new(Each.new{ |x| x.chars}, :array)
|
91
84
|
result = pipeline.run
|
@@ -93,15 +86,15 @@ class TestStages < MiniTest::Unit::TestCase
|
|
93
86
|
result = pipeline.run
|
94
87
|
assert_equal(%w(b a r), result)
|
95
88
|
end
|
96
|
-
|
89
|
+
|
97
90
|
test 'each mode wrap' do
|
98
91
|
pipeline = Each.new(%w(foo bar)) | Wrap.new(Each.new{ |x| x.chars}, :each)
|
99
92
|
expected = %w(r a b o o f)
|
100
93
|
while r = pipeline.run
|
101
94
|
assert_equal(expected.pop, r)
|
102
|
-
end
|
95
|
+
end
|
103
96
|
end
|
104
|
-
|
97
|
+
|
105
98
|
test 'unique' do
|
106
99
|
pipeline = Each.new('abcadefbega'){ |x| x.chars} | Unique.new
|
107
100
|
results = []
|
@@ -110,12 +103,12 @@ class TestStages < MiniTest::Unit::TestCase
|
|
110
103
|
end
|
111
104
|
assert_equal(%w(a b c d e f g), results)
|
112
105
|
end
|
113
|
-
|
106
|
+
|
114
107
|
test 'exhaust' do
|
115
108
|
pipeline = Each.new(%w(foo bar zut)) | Exhaust.new
|
116
109
|
assert_equal(%w(foo bar zut), pipeline.run)
|
117
110
|
end
|
118
|
-
|
111
|
+
|
119
112
|
def sing
|
120
113
|
{ :do => 'doe a deer a female deer',
|
121
114
|
:re => 'ray a drop of golden sun',
|
data/test/test_syntax.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'helper'
|
2
|
+
include Stages
|
3
|
+
|
4
|
+
class TestSyntax < MiniTest::Unit::TestCase
|
5
|
+
include Stages::Sugar
|
6
|
+
|
7
|
+
test 'select and map' do
|
8
|
+
pipeline = evens | select{ |val| val > 6} | map{ |val| val * 2}
|
9
|
+
assert_equal(16, pipeline.run)
|
10
|
+
end
|
11
|
+
|
12
|
+
test 'each and group' do
|
13
|
+
pipeline = each([1, 2, 3]) | map{ |x| [1]*x} | each | group
|
14
|
+
assert_equal({ 1 => 6}, pipeline.run)
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'restrict and resume' do
|
18
|
+
pipeline = each(%w(foo bar)) | restrict | each{ |x| x.chars} | resume
|
19
|
+
result = []
|
20
|
+
while v = pipeline.run
|
21
|
+
result << v
|
22
|
+
end
|
23
|
+
assert_equal([{ 'foo' => %w(f o o)}, {'bar' => %w(b a r)}], result)
|
24
|
+
end
|
25
|
+
|
26
|
+
test 'wrap' do
|
27
|
+
pipeline = each(%w(foo bar)) | wrap(each{ |x| x.chars}, :each)
|
28
|
+
expected = %w(r a b o o f)
|
29
|
+
while r = pipeline.run
|
30
|
+
assert_equal(expected.pop, r)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'unique and exhaust' do
|
35
|
+
pipeline = each([1, 3, 2, 3, 2, 1]) | unique | run_until_exhausted
|
36
|
+
assert_equal([1, 3, 2], pipeline.run)
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: stages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- The Justice Eight
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-01-
|
13
|
+
date: 2012-01-21 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -54,10 +54,12 @@ files:
|
|
54
54
|
- lib/stages/select.rb
|
55
55
|
- lib/stages/unique.rb
|
56
56
|
- lib/stages/wrap.rb
|
57
|
+
- lib/sugar.rb
|
57
58
|
- stages.gemspec
|
58
59
|
- test/helper.rb
|
59
60
|
- test/test_pipeline.rb
|
60
61
|
- test/test_stages.rb
|
62
|
+
- test/test_syntax.rb
|
61
63
|
homepage: https://github.com/iGoDigital-LLC/stages
|
62
64
|
licenses: []
|
63
65
|
|
@@ -71,7 +73,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
73
|
requirements:
|
72
74
|
- - ">="
|
73
75
|
- !ruby/object:Gem::Version
|
74
|
-
hash:
|
76
|
+
hash: 2434517779879848773
|
75
77
|
segments:
|
76
78
|
- 0
|
77
79
|
version: "0"
|