Class: FakePipe::Piper
- Inherits:
-
Object
- Object
- FakePipe::Piper
- Defined in:
- lib/fake_pipe/piper.rb
Overview
This class cooridinates between all the text blocks. The class is initialized with some input io, an output io, and an adapter.
## Adapter An adapter is created by creating a module directly under fake_pipe. The module must respond to text_blocks which will return all the TextBlock classes needed to call on_config and on_cell.
## General IO Flow The run method is probably the most interesting. It streams in each_line of the input io and will output either the same line or the parsed line from the ‘TextObject#parse`. It’s the responsibility of the TextBlock to extract relevant table, column, cell information. This class will make keep track of when to mutate cell.
Most lines from io should be passed directly to the outputter
Instance Attribute Summary collapse
-
#configs ⇒ Object
Returns the value of attribute configs.
-
#io ⇒ Object
Returns the value of attribute io.
-
#outputter ⇒ Object
Returns the value of attribute outputter.
-
#text_blocks ⇒ Object
Returns the value of attribute text_blocks.
Instance Method Summary collapse
-
#detect_and_start_text_block(line) ⇒ Object
Check if a line is the begining of a new text block.
-
#initialize(io:, outputter:, adapter:) ⇒ Piper
constructor
A new instance of Piper.
-
#on_cell(table:, column:, cell:) ⇒ String
The mutated cell or the original if there’s no config for the table/column.
-
#on_config(table:, column:, config:) ⇒ Object
Delegate method to be called by the #text_objects to get config information from a table’s column.
- #register_adapter(adapter) ⇒ Object
- #run ⇒ Object
Constructor Details
#initialize(io:, outputter:, adapter:) ⇒ Piper
Returns a new instance of Piper.
22 23 24 25 26 27 |
# File 'lib/fake_pipe/piper.rb', line 22 def initialize(io:, outputter:, adapter:) self.configs = {} self.io = io self.outputter = outputter register_adapter(adapter) end |
Instance Attribute Details
#configs ⇒ Object
Returns the value of attribute configs.
19 20 21 |
# File 'lib/fake_pipe/piper.rb', line 19 def configs @configs end |
#io ⇒ Object
Returns the value of attribute io.
19 20 21 |
# File 'lib/fake_pipe/piper.rb', line 19 def io @io end |
#outputter ⇒ Object
Returns the value of attribute outputter.
19 20 21 |
# File 'lib/fake_pipe/piper.rb', line 19 def outputter @outputter end |
#text_blocks ⇒ Object
Returns the value of attribute text_blocks.
19 20 21 |
# File 'lib/fake_pipe/piper.rb', line 19 def text_blocks @text_blocks end |
Instance Method Details
#detect_and_start_text_block(line) ⇒ Object
Check if a line is the begining of a new text block. When it is, trigger the callbacks so the text block can initialize itself.
59 60 61 62 63 64 65 66 67 |
# File 'lib/fake_pipe/piper.rb', line 59 def detect_and_start_text_block(line) text_blocks.detect do |block| matcher = block.match_start_text(line) if matcher && block.start_text? block.on_start_text(matcher, line) true # result for detect end end end |
#on_cell(table:, column:, cell:) ⇒ String
Returns The mutated cell or the original if there’s no config for the table/column.
78 79 80 81 82 83 84 |
# File 'lib/fake_pipe/piper.rb', line 78 def on_cell(table:, column:, cell:) if config = configs[table].try(:[], column) Mutator.mutate(config, cell) else cell end end |
#on_config(table:, column:, config:) ⇒ Object
Delegate method to be called by the #text_objects to get config information from a table’s column
71 72 73 74 |
# File 'lib/fake_pipe/piper.rb', line 71 def on_config(table:, column:, config:) table = (configs[table] ||= {}) table[column] = config end |
#register_adapter(adapter) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/fake_pipe/piper.rb', line 29 def register_adapter(adapter) adapter_module = "fake_pipe/#{adapter}" require adapter_module adapter_class = adapter_module.camelize.constantize self.text_blocks = adapter_class.text_blocks.map do |block_class| block_class.new(delegate: self) end # AnyBlock is a catch all and needs to come last. text_blocks << AnyBlock.new(delegate: self) end |
#run ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/fake_pipe/piper.rb', line 41 def run # used to track which text_block is currently in use current_block = text_blocks.last io.each_line do |line| if current_block.end_text?(line) output line current_block = detect_and_start_text_block(line) elsif configs[current_block.table] # optimization: only parse of the text block has a table configuration output current_block.parse(line) else # otherwise output the original line output line end end end |