piece_pipe 0.0.1 → 0.1.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 +5 -0
- data/README.md +88 -0
- data/documentation_todo.txt +13 -0
- data/lib/piece_pipe.rb +4 -4
- data/lib/piece_pipe/{assembly_station.rb → assembly_step.rb} +2 -2
- data/lib/piece_pipe/collector.rb +1 -1
- data/lib/piece_pipe/debug_step.rb +1 -1
- data/lib/piece_pipe/hashed_aggregator.rb +1 -1
- data/lib/piece_pipe/map_step.rb +1 -1
- data/lib/piece_pipe/{method_assembly_station.rb → method_assembly_step.rb} +1 -1
- data/lib/piece_pipe/{method_element.rb → method_step.rb} +1 -1
- data/lib/piece_pipe/pipeline.rb +2 -2
- data/lib/piece_pipe/{pipeline_element.rb → step.rb} +2 -2
- data/lib/piece_pipe/tap_step.rb +1 -1
- data/lib/piece_pipe/version.rb +1 -1
- data/spec/{assembly_station_spec.rb → assembly_step_spec.rb} +14 -14
- data/spec/{method_assembly_station_spec.rb → method_assembly_step_spec.rb} +1 -1
- data/spec/{method_element_spec.rb → method_step_spec.rb} +1 -1
- data/spec/pipeline_spec.rb +4 -4
- data/spec/{pipeline_element_spec.rb → step_spec.rb} +11 -11
- metadata +23 -37
data/CHANGELOG
ADDED
data/README.md
CHANGED
@@ -2,6 +2,21 @@
|
|
2
2
|
|
3
3
|
PiecePipe is about breaking your problem into its smallest, most interesting pieces, solving those pieces and not spending time on the glue code between them.
|
4
4
|
|
5
|
+
## Motivation
|
6
|
+
|
7
|
+
Though this style of programming is similar to sequence processing using map, select and inject, PiecePipe
|
8
|
+
gives us power to:
|
9
|
+
|
10
|
+
* Improve expressiveness -- our high-level pipeline definition reads like a book and encompasses a comprehensible algorithm.
|
11
|
+
* Address and test each of the interesting little steps.
|
12
|
+
* Decouple ourselves from the implementation of map, select etc, which assume you're processing a collection, and have preconceptions on how they should be iterated over.
|
13
|
+
|
14
|
+
For sufficiently interesting algorithms we often talk in circles about how to break the problem down such that
|
15
|
+
no one piece is too complicated, then glue it all together. We end up with a tree of strangely named calculator
|
16
|
+
objects and an almost arbitrary sprinkling of looping/mapping constructs. We got sick of trying to
|
17
|
+
organize the glue and decided to see if we could just boil it down to "what are the interesting operations,
|
18
|
+
and what are the smallest pieces we can operate on?"
|
19
|
+
|
5
20
|
## Installation
|
6
21
|
|
7
22
|
Add this line to your application's Gemfile:
|
@@ -31,6 +46,79 @@ class NuclearPowerPlantHealthSummaryGenerator
|
|
31
46
|
collect(:plant_health_summary).
|
32
47
|
to_enum
|
33
48
|
end
|
49
|
+
|
50
|
+
# Custom Step, overriding #generate_sequence to produce a sequence of power plants for a given region.
|
51
|
+
# Each power plant is "produced" as a Hash with one key (so far) heading down the pipeline.
|
52
|
+
class FetchPowerPlantsByRegion < PiecePipe::Step
|
53
|
+
def generate_sequence(inputs)
|
54
|
+
# The expected interface of any Step's soure is that it supports #to_enum.
|
55
|
+
source.to_enum.each do |inputs|
|
56
|
+
inputs[:region].power_plants.those_still_open.each do |power_plant|
|
57
|
+
produce power_plant: power_plant # Each call to #produce sends another object down the pipe
|
58
|
+
end
|
59
|
+
end
|
60
|
+
enb
|
61
|
+
end
|
62
|
+
|
63
|
+
# For any given power plant, determine the worst reactor.
|
64
|
+
# Implemented as an AssemblyStep that analyzes inputs[:power_plant] from the prior Step,
|
65
|
+
# and installs a new key/val pair for :worst_reactor.
|
66
|
+
class FindWorstReactor < PiecePipe::AssemblyStep
|
67
|
+
def receive(inputs)
|
68
|
+
# Figure out which reactor has the highest radiation levels.
|
69
|
+
# "install" works a lot like "produce", but rather than take responsibility for the totality
|
70
|
+
# of the produced object, we're just saying "add :worst_reactor to whatever's there and pass it on".
|
71
|
+
install worst_reactor: inputs[:power_plant].reactors.reject(&:offline?).max_by(:&radiation)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Figure out which CSS class corresonds to the radiation from the worst reactor.
|
76
|
+
# (At this point, the inputs Hash has keys :region, :power_plant, and :worst_reactor.)
|
77
|
+
class DetermineStatusClass < PiecePipe::AssemblyStep
|
78
|
+
def receive(inputs)
|
79
|
+
install highlight_css_class: StatusFormatters.determine_css_class(inputs[:worst_reactor].radiation)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Composite our details into a line-item structure for our report.
|
84
|
+
# Even though we consume most of the interesting values that arrive in the inputs Hash,
|
85
|
+
# we're letting them ride as we simply install one more key, :plant_health_summary.
|
86
|
+
# (This comes in handy, as we intend to sort these structures in a later step, using values
|
87
|
+
# that are present in our transient input Hash, but NOT actually available in the
|
88
|
+
# report structure.)
|
89
|
+
class BuildPlantHealthSummary < PiecePipe::AssemblyStep
|
90
|
+
def receive(inputs)
|
91
|
+
power_plant = inputs[:power_plant]
|
92
|
+
worst_reactor = inputs[:worst_reactor]
|
93
|
+
install plant_health_summary: PlantHealthSummary.new(
|
94
|
+
power_plant_id: power_plant.id,
|
95
|
+
supervisor: power_plant.supervisor,
|
96
|
+
reactor_name: worst_reactor.name,
|
97
|
+
radiation: StatusFormatters.format_radiation(worst_reactor.radiation),
|
98
|
+
css_class: inputs[:highlight_css_class]
|
99
|
+
)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Sort all the values that come through the pipe based on the radiation of the worst reactor
|
104
|
+
# in each power_plant.
|
105
|
+
# Notice this is not an AssemblyStep, and we're overriding #generate_sequence again, this time
|
106
|
+
# because we're implementing a sink. The resulting downstream objects have the same structure
|
107
|
+
# they arrived with.
|
108
|
+
class SortByRadiationLevelsDescending < PiecePipe::Step
|
109
|
+
def generate_sequence
|
110
|
+
source.to_enum.sort_by do |inputs|
|
111
|
+
inputs[:worst_reactor].radiation
|
112
|
+
end.each do |inputs|
|
113
|
+
produce inputs
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
#... and that's it. Recall that the pipeline terminates with .collect(:plant_health_summary), which
|
119
|
+
# is shorthand for a special Step that accepts Hashes and uses #produce to spit out only the specified
|
120
|
+
# objects. Downstream of our #collect, only the PlantHealthSummary remains.
|
121
|
+
|
34
122
|
end
|
35
123
|
```
|
36
124
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
MethodStep
|
2
|
+
MethodAssemblyStep
|
3
|
+
TapStep
|
4
|
+
MapStep
|
5
|
+
HashedAggregator
|
6
|
+
|
7
|
+
In-file docs and example on how to use the MapStep and Aggregator. Mention in the README.
|
8
|
+
|
9
|
+
Details on the AssemblyStep concept and implementation.
|
10
|
+
|
11
|
+
Testing: ezpipe. Bring it, document it, provide examples.
|
12
|
+
|
13
|
+
|
data/lib/piece_pipe.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'piece_pipe/pipeline'
|
2
|
-
require 'piece_pipe/
|
2
|
+
require 'piece_pipe/step'
|
3
3
|
|
4
|
-
require 'piece_pipe/
|
4
|
+
require 'piece_pipe/assembly_step'
|
5
5
|
require 'piece_pipe/collector'
|
6
6
|
require 'piece_pipe/debug_step'
|
7
7
|
require 'piece_pipe/hashed_aggregator'
|
8
8
|
require 'piece_pipe/map_step'
|
9
|
-
require 'piece_pipe/
|
10
|
-
require 'piece_pipe/
|
9
|
+
require 'piece_pipe/method_assembly_step'
|
10
|
+
require 'piece_pipe/method_step'
|
11
11
|
require 'piece_pipe/tap_step'
|
12
12
|
require 'piece_pipe/version'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
module PiecePipe
|
3
|
-
class
|
3
|
+
class AssemblyStep < Step
|
4
4
|
def process(item)
|
5
5
|
ensure_hash_like_object item
|
6
6
|
@assembly = item
|
@@ -33,7 +33,7 @@ module PiecePipe
|
|
33
33
|
private
|
34
34
|
def ensure_hash_like_object(obj)
|
35
35
|
unless obj.respond_to?(:[]) and obj.respond_to?(:merge) and obj.respond_to?(:dup)
|
36
|
-
raise "
|
36
|
+
raise "AssemblyStep object #{self.class.name} requires its source to produce Hash-like elements; not acceptable: #{obj.inspect}"
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/lib/piece_pipe/collector.rb
CHANGED
data/lib/piece_pipe/map_step.rb
CHANGED
data/lib/piece_pipe/pipeline.rb
CHANGED
@@ -20,7 +20,7 @@ module PiecePipe
|
|
20
20
|
when Class
|
21
21
|
step = step.new # If the arg is a Class, instantiate it
|
22
22
|
when Method
|
23
|
-
step =
|
23
|
+
step = MethodStep.new(step)
|
24
24
|
end
|
25
25
|
add_step step
|
26
26
|
end
|
@@ -30,7 +30,7 @@ module PiecePipe
|
|
30
30
|
when Class
|
31
31
|
step = step.new # If the arg is a Class, instantiate it
|
32
32
|
when Method
|
33
|
-
step =
|
33
|
+
step = MethodAssemblyStep.new(step)
|
34
34
|
end
|
35
35
|
add_step step
|
36
36
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module PiecePipe
|
2
|
-
class
|
2
|
+
class Step
|
3
3
|
attr_accessor :source
|
4
4
|
|
5
5
|
def to_enum
|
@@ -17,7 +17,7 @@ module PiecePipe
|
|
17
17
|
|
18
18
|
def generate_sequence
|
19
19
|
if source.nil?
|
20
|
-
raise "The source of
|
20
|
+
raise "The source of Step #{self.class.name} is nil"
|
21
21
|
end
|
22
22
|
source.to_enum.each do |item|
|
23
23
|
process(item)
|
data/lib/piece_pipe/tap_step.rb
CHANGED
data/lib/piece_pipe/version.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe PiecePipe::
|
3
|
+
describe PiecePipe::AssemblyStep do
|
4
4
|
|
5
|
-
context "default
|
5
|
+
context "default AssemblyStep" do
|
6
6
|
it "produces unaltered items from its source" do
|
7
|
-
as = PiecePipe::
|
7
|
+
as = PiecePipe::AssemblyStep.new
|
8
8
|
as.source = [
|
9
9
|
{hello: "hippo"},
|
10
10
|
{hello: "lion"}
|
@@ -17,8 +17,8 @@ describe PiecePipe::AssemblyStation do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
context "a typical
|
21
|
-
class AnimalPhraser < PiecePipe::
|
20
|
+
context "a typical AssemblyStep" do
|
21
|
+
class AnimalPhraser < PiecePipe::AssemblyStep
|
22
22
|
def receive(inputs)
|
23
23
|
install phrase: "There are #{inputs[:count]} #{inputs[:animal]}s"
|
24
24
|
end
|
@@ -36,7 +36,7 @@ describe PiecePipe::AssemblyStation do
|
|
36
36
|
]
|
37
37
|
end
|
38
38
|
|
39
|
-
class Cuber < PiecePipe::
|
39
|
+
class Cuber < PiecePipe::AssemblyStep
|
40
40
|
def receive(inputs)
|
41
41
|
num = inputs[:num]
|
42
42
|
install squared: num * num, cubed: num * num * num
|
@@ -56,8 +56,8 @@ describe PiecePipe::AssemblyStation do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context "a filtering
|
60
|
-
class HippoHater < PiecePipe::
|
59
|
+
context "a filtering AssemblyStep" do
|
60
|
+
class HippoHater < PiecePipe::AssemblyStep
|
61
61
|
def receive(inputs)
|
62
62
|
unless inputs[:animal] == "Hippo"
|
63
63
|
install phrase: "There are #{inputs[:count]} #{inputs[:animal]}s"
|
@@ -80,8 +80,8 @@ describe PiecePipe::AssemblyStation do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
context "an exploding
|
84
|
-
class LionCrusher < PiecePipe::
|
83
|
+
context "an exploding AssemblyStep" do
|
84
|
+
class LionCrusher < PiecePipe::AssemblyStep
|
85
85
|
def receive(inputs)
|
86
86
|
if inputs[:animal] == "Hippo"
|
87
87
|
inputs[:lion_count].times do
|
@@ -106,18 +106,18 @@ describe PiecePipe::AssemblyStation do
|
|
106
106
|
|
107
107
|
context "error and oddball cases" do
|
108
108
|
context "source produces non-Hash inputs" do
|
109
|
-
class MyOtherSomething < PiecePipe::
|
109
|
+
class MyOtherSomething < PiecePipe::AssemblyStep
|
110
110
|
end
|
111
111
|
|
112
112
|
it "raises an error indicating requisite input type" do
|
113
113
|
as = MyOtherSomething.new
|
114
114
|
as.source = [1,2,3]
|
115
|
-
lambda do as.to_enum.to_a end.should raise_error(/
|
115
|
+
lambda do as.to_enum.to_a end.should raise_error(/AssemblyStep object MyOtherSomething.*Hash-like/)
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
119
|
context "overridden receive() installs nil" do
|
120
|
-
class NilInstaller < PiecePipe::
|
120
|
+
class NilInstaller < PiecePipe::AssemblyStep
|
121
121
|
def receive(inputs)
|
122
122
|
install nil
|
123
123
|
end
|
@@ -136,7 +136,7 @@ describe PiecePipe::AssemblyStation do
|
|
136
136
|
end
|
137
137
|
|
138
138
|
context "using noop()" do
|
139
|
-
class UseTheNoOp < PiecePipe::
|
139
|
+
class UseTheNoOp < PiecePipe::AssemblyStep
|
140
140
|
def receive(inputs)
|
141
141
|
noop
|
142
142
|
end
|
data/spec/pipeline_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PiecePipe::Pipeline do
|
4
|
-
class OneTwoThree < PiecePipe::
|
4
|
+
class OneTwoThree < PiecePipe::Step
|
5
5
|
def generate_sequence
|
6
6
|
produce 1
|
7
7
|
produce 2
|
@@ -9,7 +9,7 @@ describe PiecePipe::Pipeline do
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
class TheDoubler < PiecePipe::
|
12
|
+
class TheDoubler < PiecePipe::Step
|
13
13
|
def process(item)
|
14
14
|
produce item * 2
|
15
15
|
end
|
@@ -32,7 +32,7 @@ describe PiecePipe::Pipeline do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
context "using instantiated
|
35
|
+
context "using instantiated Steps as steps" do
|
36
36
|
it "produces transformed values by processing both steps for each item" do
|
37
37
|
subject.
|
38
38
|
step(OneTwoThree.new).
|
@@ -50,7 +50,7 @@ describe PiecePipe::Pipeline do
|
|
50
50
|
subject.to_enum.to_a.should == [20, 40, 60]
|
51
51
|
end
|
52
52
|
|
53
|
-
it "works with
|
53
|
+
it "works with Steps" do
|
54
54
|
subject.
|
55
55
|
source(OneTwoThree.new).
|
56
56
|
step(TheDoubler)
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe PiecePipe::
|
3
|
+
describe PiecePipe::Step do
|
4
4
|
|
5
5
|
let (:array_source) { [ "hippo", "distribution", "mechanism" ] }
|
6
6
|
|
7
|
-
context "default
|
7
|
+
context "default Step" do
|
8
8
|
|
9
9
|
it "provides an enumeration of its source's elements" do
|
10
|
-
e = PiecePipe::
|
10
|
+
e = PiecePipe::Step.new
|
11
11
|
e.source = array_source
|
12
12
|
|
13
13
|
en = e.to_enum
|
@@ -19,7 +19,7 @@ describe PiecePipe::PipelineElement do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
context "overriding #generate_sequence" do
|
22
|
-
class IntegerGenerator < PiecePipe::
|
22
|
+
class IntegerGenerator < PiecePipe::Step
|
23
23
|
def generate_sequence
|
24
24
|
process 1
|
25
25
|
process 2
|
@@ -32,7 +32,7 @@ describe PiecePipe::PipelineElement do
|
|
32
32
|
en.to_a.should == [1,2,3]
|
33
33
|
end
|
34
34
|
|
35
|
-
class NothingGenerator < PiecePipe::
|
35
|
+
class NothingGenerator < PiecePipe::Step
|
36
36
|
def generate_sequence
|
37
37
|
|
38
38
|
end
|
@@ -45,7 +45,7 @@ describe PiecePipe::PipelineElement do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
context "bypassing the default #process invocation" do
|
48
|
-
class IntegerProducer < PiecePipe::
|
48
|
+
class IntegerProducer < PiecePipe::Step
|
49
49
|
def generate_sequence
|
50
50
|
produce 1
|
51
51
|
produce 2
|
@@ -58,7 +58,7 @@ describe PiecePipe::PipelineElement do
|
|
58
58
|
en.to_a.should == [1,2,3]
|
59
59
|
end
|
60
60
|
|
61
|
-
class NothingProducer < PiecePipe::
|
61
|
+
class NothingProducer < PiecePipe::Step
|
62
62
|
def generate_sequence
|
63
63
|
|
64
64
|
end
|
@@ -72,7 +72,7 @@ describe PiecePipe::PipelineElement do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
context "overriding #process" do
|
75
|
-
class StringExpander < PiecePipe::
|
75
|
+
class StringExpander < PiecePipe::Step
|
76
76
|
def process(item)
|
77
77
|
produce "x" * item
|
78
78
|
end
|
@@ -84,7 +84,7 @@ describe PiecePipe::PipelineElement do
|
|
84
84
|
se.to_enum.to_a.should == ["xx", "xxxx"]
|
85
85
|
end
|
86
86
|
|
87
|
-
class AllFilter < PiecePipe::
|
87
|
+
class AllFilter < PiecePipe::Step
|
88
88
|
def process(item)
|
89
89
|
|
90
90
|
end
|
@@ -96,7 +96,7 @@ describe PiecePipe::PipelineElement do
|
|
96
96
|
al.to_enum.to_a.should == []
|
97
97
|
end
|
98
98
|
|
99
|
-
class Exploder < PiecePipe::
|
99
|
+
class Exploder < PiecePipe::Step
|
100
100
|
def process(item)
|
101
101
|
item.times do
|
102
102
|
produce "hi #{item}"
|
@@ -112,7 +112,7 @@ describe PiecePipe::PipelineElement do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
context "nill source" do
|
115
|
-
class MySomething < PiecePipe::
|
115
|
+
class MySomething < PiecePipe::Step
|
116
116
|
end
|
117
117
|
|
118
118
|
it "raises an error" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: piece_pipe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-06-07 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: mocha
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirement: &2152338560 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,15 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ! '>='
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
25
|
+
version_requirements: *2152338560
|
31
26
|
- !ruby/object:Gem::Dependency
|
32
27
|
name: rspec
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
28
|
+
requirement: &2152337340 !ruby/object:Gem::Requirement
|
34
29
|
none: false
|
35
30
|
requirements:
|
36
31
|
- - ! '>='
|
@@ -38,15 +33,10 @@ dependencies:
|
|
38
33
|
version: '0'
|
39
34
|
type: :development
|
40
35
|
prerelease: false
|
41
|
-
version_requirements:
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
36
|
+
version_requirements: *2152337340
|
47
37
|
- !ruby/object:Gem::Dependency
|
48
38
|
name: rake
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirement: &2152321200 !ruby/object:Gem::Requirement
|
50
40
|
none: false
|
51
41
|
requirements:
|
52
42
|
- - ! '>='
|
@@ -54,12 +44,7 @@ dependencies:
|
|
54
44
|
version: '0'
|
55
45
|
type: :development
|
56
46
|
prerelease: false
|
57
|
-
version_requirements:
|
58
|
-
none: false
|
59
|
-
requirements:
|
60
|
-
- - ! '>='
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
47
|
+
version_requirements: *2152321200
|
63
48
|
description: ! 'PiecePipe is about breaking your problem into its smallest, most interesting
|
64
49
|
pieces, solving those pieces and not spending time on the glue code between them. '
|
65
50
|
email:
|
@@ -70,32 +55,34 @@ extensions: []
|
|
70
55
|
extra_rdoc_files: []
|
71
56
|
files:
|
72
57
|
- .gitignore
|
58
|
+
- CHANGELOG
|
73
59
|
- Gemfile
|
74
60
|
- LICENSE
|
75
61
|
- README.md
|
76
62
|
- Rakefile
|
63
|
+
- documentation_todo.txt
|
77
64
|
- lib/piece_pipe.rb
|
78
|
-
- lib/piece_pipe/
|
65
|
+
- lib/piece_pipe/assembly_step.rb
|
79
66
|
- lib/piece_pipe/collector.rb
|
80
67
|
- lib/piece_pipe/debug_step.rb
|
81
68
|
- lib/piece_pipe/hashed_aggregator.rb
|
82
69
|
- lib/piece_pipe/map_step.rb
|
83
|
-
- lib/piece_pipe/
|
84
|
-
- lib/piece_pipe/
|
70
|
+
- lib/piece_pipe/method_assembly_step.rb
|
71
|
+
- lib/piece_pipe/method_step.rb
|
85
72
|
- lib/piece_pipe/pipeline.rb
|
86
|
-
- lib/piece_pipe/
|
73
|
+
- lib/piece_pipe/step.rb
|
87
74
|
- lib/piece_pipe/tap_step.rb
|
88
75
|
- lib/piece_pipe/version.rb
|
89
76
|
- piece_pipe.gemspec
|
90
|
-
- spec/
|
77
|
+
- spec/assembly_step_spec.rb
|
91
78
|
- spec/collector_spec.rb
|
92
79
|
- spec/hashed_aggregator_spec.rb
|
93
80
|
- spec/map_step_spec.rb
|
94
|
-
- spec/
|
95
|
-
- spec/
|
96
|
-
- spec/pipeline_element_spec.rb
|
81
|
+
- spec/method_assembly_step_spec.rb
|
82
|
+
- spec/method_step_spec.rb
|
97
83
|
- spec/pipeline_spec.rb
|
98
84
|
- spec/spec_helper.rb
|
85
|
+
- spec/step_spec.rb
|
99
86
|
homepage: http://atomicobject.com
|
100
87
|
licenses: []
|
101
88
|
post_install_message:
|
@@ -116,19 +103,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
103
|
version: '0'
|
117
104
|
requirements: []
|
118
105
|
rubyforge_project:
|
119
|
-
rubygems_version: 1.8.
|
106
|
+
rubygems_version: 1.8.10
|
120
107
|
signing_key:
|
121
108
|
specification_version: 3
|
122
109
|
summary: PiecePipe helps you break your code into small interesting pieces and provides
|
123
110
|
the glue for pipelining them together to provide elegant, readable code.
|
124
111
|
test_files:
|
125
|
-
- spec/
|
112
|
+
- spec/assembly_step_spec.rb
|
126
113
|
- spec/collector_spec.rb
|
127
114
|
- spec/hashed_aggregator_spec.rb
|
128
115
|
- spec/map_step_spec.rb
|
129
|
-
- spec/
|
130
|
-
- spec/
|
131
|
-
- spec/pipeline_element_spec.rb
|
116
|
+
- spec/method_assembly_step_spec.rb
|
117
|
+
- spec/method_step_spec.rb
|
132
118
|
- spec/pipeline_spec.rb
|
133
119
|
- spec/spec_helper.rb
|
134
|
-
|
120
|
+
- spec/step_spec.rb
|