Skip to content

Commit

Permalink
Marshalize mismatch errors
Browse files Browse the repository at this point in the history
Implements functionality to make MismatchErrors Marshalizeable.
  • Loading branch information
agentdon authored Oct 25, 2021
1 parent 51d4cdf commit 924724e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
16 changes: 16 additions & 0 deletions lib/scientist/experiment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ def raise_on_mismatches?
#
# Returns the configured block.
def before_run(&block)
marshalize(block)
@_scientist_before_run = block
end

Expand All @@ -99,6 +100,7 @@ def behaviors
#
# Returns the configured block.
def clean(&block)
marshalize(block)
@_scientist_cleaner = block
end

Expand Down Expand Up @@ -131,6 +133,7 @@ def clean_value(value)
#
# Returns the block.
def compare(*args, &block)
marshalize(block)
@_scientist_comparator = block
end

Expand All @@ -141,6 +144,7 @@ def compare(*args, &block)
#
# Returns the block.
def compare_errors(*args, &block)
marshalize(block)
@_scientist_error_comparator = block
end

Expand All @@ -159,6 +163,7 @@ 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
Expand Down Expand Up @@ -251,6 +256,7 @@ 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

Expand All @@ -276,6 +282,7 @@ 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)
Expand All @@ -287,6 +294,7 @@ def try(name = nil, &block)

# Register the control behavior for this experiment.
def use(&block)
marshalize(block)
try "control", &block
end

Expand Down Expand Up @@ -318,4 +326,12 @@ def generate_result(name)
control = observations.detect { |o| o.name == name }
Scientist::Result.new(self, observations, control)
end

private

def marshalize(block)
def block._dump(_)
to_s
end
end
end
21 changes: 21 additions & 0 deletions test/scientist/experiment_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,27 @@ def @ex.raised(op, exception)
assert_raises(Scientist::Experiment::MismatchError) { runner.call }
end

it "can be marshaled" do
Fake.raise_on_mismatches = true
@ex.before_run { "some block" }
@ex.clean { "some block" }
@ex.compare_errors { "some block" }
@ex.ignore { false }
@ex.run_if { "some block" }
@ex.try { "candidate" }
@ex.use { "control" }
@ex.compare { |control, candidate| control == candidate }

mismatch = nil
begin
@ex.run
rescue Scientist::Experiment::MismatchError => e
mismatch = e
end

assert_kind_of(String, Marshal.dump(mismatch))
end

describe "#raise_on_mismatches?" do
it "raises when there is a mismatch if the experiment instance's raise on mismatches is enabled" do
Fake.raise_on_mismatches = false
Expand Down

0 comments on commit 924724e

Please sign in to comment.