From 0f0a51c5fb71edef0ec0b61ac0af2bafdd7ef781 Mon Sep 17 00:00:00 2001 From: agentdon <82984396+agentdon@users.noreply.github.com> Date: Thu, 9 Dec 2021 21:49:00 +0000 Subject: [PATCH] Improve marshal support Improves the approach that we introduced in #168 to marshal mismatch errors so that we don't have to dynamically define methods on the procs provided by the user. Thanks to @brasic suggesting this improvement. --- lib/scientist/experiment.rb | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/lib/scientist/experiment.rb b/lib/scientist/experiment.rb index 614bf6f..f48b339 100644 --- a/lib/scientist/experiment.rb +++ b/lib/scientist/experiment.rb @@ -84,7 +84,6 @@ def raise_on_mismatches? # # Returns the configured block. def before_run(&block) - marshalize(block) @_scientist_before_run = block end @@ -100,7 +99,6 @@ def behaviors # # Returns the configured block. def clean(&block) - marshalize(block) @_scientist_cleaner = block end @@ -133,7 +131,6 @@ def clean_value(value) # # Returns the block. def compare(*args, &block) - marshalize(block) @_scientist_comparator = block end @@ -144,7 +141,6 @@ def compare(*args, &block) # # Returns the block. def compare_errors(*args, &block) - marshalize(block) @_scientist_error_comparator = block end @@ -163,7 +159,6 @@ def context(context = nil) # # This can be called more than once with different blocks to use. def ignore(&block) - marshalize(block) @_scientist_ignores ||= [] @_scientist_ignores << block end @@ -256,7 +251,6 @@ def run(name = nil) # Define a block that determines whether or not the experiment should run. def run_if(&block) - marshalize(block) @_scientist_run_if_block = block end @@ -282,7 +276,6 @@ def should_experiment_run? # Register a named behavior for this experiment, default "candidate". def try(name = nil, &block) - marshalize(block) name = (name || "candidate").to_s if behaviors.include?(name) @@ -294,7 +287,6 @@ def try(name = nil, &block) # Register the control behavior for this experiment. def use(&block) - marshalize(block) try "control", &block end @@ -332,13 +324,14 @@ def generate_result(name) # In order to support marshaling, we have to make the procs marshalable. Some # CI providers attempt to marshal Scientist mismatch errors so that they can # be sent out to different places (logs, etc.) The mismatch errors contain - # code from the experiment. This code contains Procs - which can't be - # marshaled until we run the following code. - def marshalize(block) - unless block.respond_to?(:_dump) || block.respond_to?(:_dump_data) - def block._dump(_) - to_s - end - end + # code from the experiment. This code contains procs. These procs prevent the + # error from being marshaled. To fix this, we simple exclude the procs from + # the data that we marshal. + def marshal_dump + [@name, @result, @raise_on_mismatches] + end + + def marshal_load + @name, @result, @raise_on_mismatches = array end end