piece_pipe 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ v0.1.0 - 2012-06-06
2
+ * Some class name changes for "step" motif consistency.
3
+
4
+ v0.0.1 - 2012-05-30
5
+ * Initial release
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
+
@@ -1,12 +1,12 @@
1
1
  require 'piece_pipe/pipeline'
2
- require 'piece_pipe/pipeline_element'
2
+ require 'piece_pipe/step'
3
3
 
4
- require 'piece_pipe/assembly_station'
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/method_assembly_station'
10
- require 'piece_pipe/method_element'
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 AssemblyStation < PipelineElement
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 "AssemblyStation object #{self.class.name} requires its source to produce Hash-like elements; not acceptable: #{obj.inspect}"
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
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class Collector < PipelineElement
2
+ class Collector < Step
3
3
  def initialize(key)
4
4
  @key = key
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class DebugStep < PipelineElement
2
+ class DebugStep < Step
3
3
  def initialize(opts={},&block)
4
4
  @opts = opts
5
5
  @block = block
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class HashedAggregator < PipelineElement
2
+ class HashedAggregator < Step
3
3
  def initialize
4
4
  @hash = {}
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class MapStep < PipelineElement
2
+ class MapStep < Step
3
3
  def process(item)
4
4
  map item
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class MethodAssemblyStation < AssemblyStation
2
+ class MethodAssemblyStep < AssemblyStep
3
3
  def initialize(meth)
4
4
  @method = meth
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class MethodElement < PipelineElement
2
+ class MethodStep < Step
3
3
  def initialize(meth)
4
4
  raise "method cannot be nil" if meth.nil?
5
5
  raise "method must accept 1 or 2 arguments; it accepts #{meth.arity}" if meth.arity != 1 and meth.arity != 2
@@ -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 = MethodElement.new(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 = MethodAssemblyStation.new(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 PipelineElement
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 PipelineElement #{self.class.name} is nil"
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)
@@ -1,5 +1,5 @@
1
1
  module PiecePipe
2
- class TapStep < PipelineElement
2
+ class TapStep < Step
3
3
  def initialize(&block)
4
4
  @block = block
5
5
  end
@@ -1,3 +1,3 @@
1
1
  module PiecePipe
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,10 +1,10 @@
1
1
  require "spec_helper"
2
2
 
3
- describe PiecePipe::AssemblyStation do
3
+ describe PiecePipe::AssemblyStep do
4
4
 
5
- context "default AssemblyStation" do
5
+ context "default AssemblyStep" do
6
6
  it "produces unaltered items from its source" do
7
- as = PiecePipe::AssemblyStation.new
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 AssemblyStation" do
21
- class AnimalPhraser < PiecePipe::AssemblyStation
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::AssemblyStation
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 AssemblyStation" do
60
- class HippoHater < PiecePipe::AssemblyStation
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 AssemblyStation" do
84
- class LionCrusher < PiecePipe::AssemblyStation
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::AssemblyStation
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(/AssemblyStation object MyOtherSomething.*Hash-like/)
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::AssemblyStation
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::AssemblyStation
139
+ class UseTheNoOp < PiecePipe::AssemblyStep
140
140
  def receive(inputs)
141
141
  noop
142
142
  end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe PiecePipe::MethodAssemblyStation do
3
+ describe PiecePipe::MethodAssemblyStep do
4
4
  let(:pipeline) { PiecePipe::Pipeline.new }
5
5
 
6
6
  context "wrapping methods with single arguments" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe PiecePipe::MethodElement do
3
+ describe PiecePipe::MethodStep do
4
4
  let(:pipeline) { PiecePipe::Pipeline.new }
5
5
 
6
6
  context "wrapping methods with single arguments" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PiecePipe::Pipeline do
4
- class OneTwoThree < PiecePipe::PipelineElement
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::PipelineElement
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 PipelineElements as steps" do
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 PipelineElements" do
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::PipelineElement do
3
+ describe PiecePipe::Step do
4
4
 
5
5
  let (:array_source) { [ "hippo", "distribution", "mechanism" ] }
6
6
 
7
- context "default PipelineElement" do
7
+ context "default Step" do
8
8
 
9
9
  it "provides an enumeration of its source's elements" do
10
- e = PiecePipe::PipelineElement.new
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::PipelineElement
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::PipelineElement
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::PipelineElement
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::PipelineElement
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::PipelineElement
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::PipelineElement
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::PipelineElement
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::PipelineElement
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.1
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-05-30 00:00:00.000000000 Z
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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: !ruby/object:Gem::Requirement
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/assembly_station.rb
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/method_assembly_station.rb
84
- - lib/piece_pipe/method_element.rb
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/pipeline_element.rb
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/assembly_station_spec.rb
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/method_assembly_station_spec.rb
95
- - spec/method_element_spec.rb
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.24
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/assembly_station_spec.rb
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/method_assembly_station_spec.rb
130
- - spec/method_element_spec.rb
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
- has_rdoc:
120
+ - spec/step_spec.rb