Class: Trevl::Renderer::Transform
- Inherits:
-
Object
- Object
- Trevl::Renderer::Transform
- 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
-
#apply_computed_fields(rows_by_ref_key, payload_by_ref_key, component) ⇒ Object
Applies computed fields (per-row JavaScript expressions) to all rows.
-
#apply_postprocess(rows_by_ref_key, component, warnings) ⇒ Object
Applies postprocess JavaScript to the full dataset.
-
#initialize(ref_parser) ⇒ Transform
constructor
A new instance of Transform.
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.}" end end rows_by_ref_key end |