Module: Lou::Transformer

Defined in:
lib/lou/transformer.rb,
lib/lou/transformer/step.rb

Defined Under Namespace

Classes: NeverError, Step

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/lou/transformer.rb', line 9

def self.extended(base)
  base.class_eval do
    class_attribute :steps
    self.steps = []
    class_attribute :error_class
    self.error_class = Lou::Transformer::NeverError
  end
end

Instance Method Details

#apply(input, total_steps = steps.count) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/lou/transformer.rb', line 28

def apply(input, total_steps = steps.count)
  applied_steps = 0
  begin
    steps.last(total_steps).each do |t|
      input = t.apply(input)
      applied_steps += 1
    end
  rescue error_class => e
    reverse(input, applied_steps) if total_steps == steps.count
    raise e
  end
  input
end

#reverse(output, total_steps = steps.count) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/lou/transformer.rb', line 42

def reverse(output, total_steps = steps.count)
  reversed_steps = 0
  begin
    steps.first(total_steps).reverse_each do |t|
      output = t.reverse(output)
      reversed_steps += 1
    end
  rescue error_class => e
    apply(output, reversed_steps) if total_steps == steps.count
    raise e
  end
  output
end

#reverse_on(error) ⇒ Object



18
19
20
# File 'lib/lou/transformer.rb', line 18

def reverse_on(error)
  self.error_class = error
end

#stepObject



22
23
24
25
26
# File 'lib/lou/transformer.rb', line 22

def step
  Step.new.tap do |t|
    self.steps += [t]
  end
end