Class: Trevl::Renderer::Transform

Inherits:
Object
  • Object
show all
Defined in:
lib/trevl/renderer/transform.rb

Overview

Applies computed fields and postprocess transformations to data rows.

transform = Transform.new(ref_parser)
transform.apply_computed_fields(rows, payloads, component)

Instance Method Summary collapse

Constructor Details

#initialize(ref_parser) ⇒ Transform

Returns a new instance of Transform.



13
14
15
# File 'lib/trevl/renderer/transform.rb', line 13

def initialize(ref_parser)
  @refs = ref_parser
end

Instance Method Details

#apply_computed_fields(rows_by_ref_key, payload_by_ref_key, component) ⇒ Object

Applies computed fields (per-row JavaScript expressions) to all rows.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/trevl/renderer/transform.rb', line 18

def apply_computed_fields(rows_by_ref_key, payload_by_ref_key, component)
  computeds = collect_computed_fields(component)
  return rows_by_ref_key unless computeds.any?

  rows_by_ref_key.each do |rk, rows|
    rows.each do |row|
      computeds.each do |computed|
        arg_names, arg_values = resolve_arguments(computed, row, rk, payload_by_ref_key)
        js = "(function(#{arg_names.join(", ")}) { return #{computed["code"]} })(#{arg_values.map(&:to_json).join(", ")})"
        row[computed["name"]] = ExecJS.eval(js)
      end
    end
  end

  rows_by_ref_key
end

#apply_postprocess(rows_by_ref_key, component, warnings) ⇒ Object

Applies postprocess JavaScript to the full dataset.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/trevl/renderer/transform.rb', line 36

def apply_postprocess(rows_by_ref_key, component, warnings)
  code = component["postprocess"]
  return rows_by_ref_key unless code.is_a?(String) && !code.strip.empty?

  rows_by_ref_key.each do |rk, rows|
    js = "(function() { var $result = #{rows.to_json}; #{code.strip.chomp(";")}; return $result; })()"
    begin
      result = ExecJS.eval(js)
      if result.is_a?(Array)
        rows_by_ref_key[rk] = result
      else
        warnings << "Postprocess for '#{component["id"]}' returned #{result.class} instead of Array"
        Trevl.logger.warn("[Trevl::Renderer] Postprocess returned non-Array for '#{component["id"]}'")
      end
    rescue ExecJS::Error => e
      raise RenderError, "Postprocess JavaScript error for '#{component["id"]}': #{e.message}"
    end
  end

  rows_by_ref_key
end