mutant 0.9.8 → 0.9.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mutant.rb +5 -2
- data/lib/mutant/ast.rb +0 -9
- data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
- data/lib/mutant/ast/meta/send.rb +0 -6
- data/lib/mutant/bootstrap.rb +14 -37
- data/lib/mutant/cli.rb +11 -49
- data/lib/mutant/config.rb +0 -8
- data/lib/mutant/context.rb +0 -3
- data/lib/mutant/env.rb +0 -6
- data/lib/mutant/expression/method.rb +6 -6
- data/lib/mutant/expression/methods.rb +6 -6
- data/lib/mutant/expression/parser.rb +0 -6
- data/lib/mutant/integration.rb +0 -18
- data/lib/mutant/isolation.rb +1 -1
- data/lib/mutant/isolation/fork.rb +2 -24
- data/lib/mutant/isolation/none.rb +1 -1
- data/lib/mutant/license.rb +11 -0
- data/lib/mutant/matcher.rb +0 -14
- data/lib/mutant/matcher/config.rb +2 -11
- data/lib/mutant/matcher/method.rb +0 -31
- data/lib/mutant/matcher/method/instance.rb +0 -8
- data/lib/mutant/matcher/method/metaclass.rb +86 -0
- data/lib/mutant/matcher/method/singleton.rb +0 -25
- data/lib/mutant/matcher/methods.rb +17 -28
- data/lib/mutant/matcher/namespace.rb +0 -10
- data/lib/mutant/matcher/scope.rb +2 -4
- data/lib/mutant/meta/example/dsl.rb +0 -21
- data/lib/mutant/meta/example/verification.rb +0 -20
- data/lib/mutant/minitest/coverage.rb +53 -0
- data/lib/mutant/mutation.rb +0 -3
- data/lib/mutant/mutator.rb +1 -29
- data/lib/mutant/mutator/node.rb +1 -66
- data/lib/mutant/mutator/node/and_asgn.rb +0 -3
- data/lib/mutant/mutator/node/argument.rb +0 -15
- data/lib/mutant/mutator/node/arguments.rb +0 -20
- data/lib/mutant/mutator/node/begin.rb +0 -3
- data/lib/mutant/mutator/node/binary.rb +0 -23
- data/lib/mutant/mutator/node/block.rb +0 -15
- data/lib/mutant/mutator/node/block_pass.rb +29 -0
- data/lib/mutant/mutator/node/break.rb +0 -3
- data/lib/mutant/mutator/node/case.rb +0 -9
- data/lib/mutant/mutator/node/class.rb +0 -3
- data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
- data/lib/mutant/mutator/node/const.rb +0 -3
- data/lib/mutant/mutator/node/define.rb +0 -11
- data/lib/mutant/mutator/node/defined.rb +0 -3
- data/lib/mutant/mutator/node/dstr.rb +0 -3
- data/lib/mutant/mutator/node/dsym.rb +0 -3
- data/lib/mutant/mutator/node/generic.rb +0 -3
- data/lib/mutant/mutator/node/if.rb +0 -12
- data/lib/mutant/mutator/node/index.rb +0 -27
- data/lib/mutant/mutator/node/kwbegin.rb +0 -3
- data/lib/mutant/mutator/node/literal.rb +0 -3
- data/lib/mutant/mutator/node/literal/array.rb +0 -6
- data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
- data/lib/mutant/mutator/node/literal/float.rb +0 -9
- data/lib/mutant/mutator/node/literal/hash.rb +0 -9
- data/lib/mutant/mutator/node/literal/integer.rb +0 -9
- data/lib/mutant/mutator/node/literal/nil.rb +0 -3
- data/lib/mutant/mutator/node/literal/range.rb +4 -7
- data/lib/mutant/mutator/node/literal/regex.rb +0 -6
- data/lib/mutant/mutator/node/literal/string.rb +0 -3
- data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
- data/lib/mutant/mutator/node/masgn.rb +0 -3
- data/lib/mutant/mutator/node/match_current_line.rb +0 -3
- data/lib/mutant/mutator/node/mlhs.rb +0 -3
- data/lib/mutant/mutator/node/named_value/access.rb +2 -14
- data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
- data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
- data/lib/mutant/mutator/node/next.rb +0 -3
- data/lib/mutant/mutator/node/noop.rb +1 -4
- data/lib/mutant/mutator/node/nthref.rb +0 -3
- data/lib/mutant/mutator/node/op_asgn.rb +0 -3
- data/lib/mutant/mutator/node/or_asgn.rb +0 -3
- data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
- data/lib/mutant/mutator/node/regopt.rb +0 -6
- data/lib/mutant/mutator/node/resbody.rb +0 -6
- data/lib/mutant/mutator/node/rescue.rb +2 -19
- data/lib/mutant/mutator/node/return.rb +0 -3
- data/lib/mutant/mutator/node/sclass.rb +20 -0
- data/lib/mutant/mutator/node/send.rb +26 -61
- data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
- data/lib/mutant/mutator/node/send/binary.rb +0 -11
- data/lib/mutant/mutator/node/send/conditional.rb +0 -3
- data/lib/mutant/mutator/node/splat.rb +0 -3
- data/lib/mutant/mutator/node/super.rb +0 -3
- data/lib/mutant/mutator/node/when.rb +0 -19
- data/lib/mutant/mutator/node/yield.rb +0 -3
- data/lib/mutant/mutator/node/zsuper.rb +0 -3
- data/lib/mutant/mutator/util/array.rb +0 -6
- data/lib/mutant/mutator/util/symbol.rb +0 -3
- data/lib/mutant/parallel.rb +0 -13
- data/lib/mutant/parallel/driver.rb +0 -10
- data/lib/mutant/parallel/worker.rb +0 -22
- data/lib/mutant/reporter/cli.rb +0 -5
- data/lib/mutant/reporter/cli/format.rb +0 -9
- data/lib/mutant/reporter/cli/printer.rb +2 -42
- data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
- data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
- data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
- data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
- data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
- data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
- data/lib/mutant/repository/diff.rb +1 -13
- data/lib/mutant/repository/diff/ranges.rb +0 -11
- data/lib/mutant/result.rb +0 -3
- data/lib/mutant/runner.rb +0 -18
- data/lib/mutant/runner/sink.rb +0 -5
- data/lib/mutant/subject.rb +0 -8
- data/lib/mutant/subject/method.rb +0 -3
- data/lib/mutant/subject/method/instance.rb +40 -6
- data/lib/mutant/subject/method/metaclass.rb +30 -0
- data/lib/mutant/transform.rb +0 -92
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warnings.rb +0 -6
- data/lib/mutant/zombifier.rb +2 -34
- metadata +61 -333
- data/.github/workflows/ci.yml +0 -121
- data/.gitignore +0 -38
- data/.rspec +0 -5
- data/.rubocop.yml +0 -7
- data/Changelog.md +0 -75
- data/Gemfile +0 -7
- data/Gemfile.lock +0 -167
- data/Gemfile.shared +0 -10
- data/README.md +0 -138
- data/Rakefile +0 -5
- data/config/devtools.yml +0 -2
- data/config/reek.yml +0 -138
- data/config/rubocop.yml +0 -205
- data/config/yardstick.yml +0 -2
- data/docs/commercial-support.md +0 -14
- data/docs/concurrency.md +0 -39
- data/docs/incremental.md +0 -76
- data/docs/known-problems.md +0 -30
- data/docs/limitations.md +0 -50
- data/docs/mutant-minitest.md +0 -149
- data/docs/mutant-rspec.md +0 -130
- data/docs/nomenclature.md +0 -82
- data/docs/reading-reports.md +0 -74
- data/lib/mutant/color.rb +0 -43
- data/lib/mutant/diff.rb +0 -114
- data/meta/and.rb +0 -15
- data/meta/and_asgn.rb +0 -14
- data/meta/array.rb +0 -30
- data/meta/begin.rb +0 -23
- data/meta/block.rb +0 -202
- data/meta/block_pass.rb +0 -8
- data/meta/blockarg.rb +0 -10
- data/meta/break.rb +0 -10
- data/meta/case.rb +0 -223
- data/meta/casgn.rb +0 -28
- data/meta/cbase.rb +0 -8
- data/meta/class.rb +0 -12
- data/meta/const.rb +0 -17
- data/meta/csend.rb +0 -10
- data/meta/cvar.rb +0 -7
- data/meta/cvasgn.rb +0 -10
- data/meta/date.rb +0 -59
- data/meta/def.rb +0 -203
- data/meta/defined.rb +0 -9
- data/meta/dstr.rb +0 -13
- data/meta/dsym.rb +0 -14
- data/meta/ensure.rb +0 -9
- data/meta/false.rb +0 -8
- data/meta/file.rb +0 -5
- data/meta/float.rb +0 -37
- data/meta/gvar.rb +0 -7
- data/meta/gvasgn.rb +0 -10
- data/meta/hash.rb +0 -24
- data/meta/if.rb +0 -77
- data/meta/index.rb +0 -133
- data/meta/indexasgn.rb +0 -31
- data/meta/int.rb +0 -18
- data/meta/ivar.rb +0 -8
- data/meta/ivasgn.rb +0 -23
- data/meta/kwarg.rb +0 -10
- data/meta/kwbegin.rb +0 -9
- data/meta/kwoptarg.rb +0 -13
- data/meta/lambda.rb +0 -23
- data/meta/line.rb +0 -5
- data/meta/lvar.rb +0 -16
- data/meta/lvasgn.rb +0 -25
- data/meta/masgn.rb +0 -7
- data/meta/match_current_line.rb +0 -15
- data/meta/next.rb +0 -11
- data/meta/nil.rb +0 -5
- data/meta/nthref.rb +0 -14
- data/meta/op_assgn.rb +0 -17
- data/meta/or.rb +0 -15
- data/meta/or_asgn.rb +0 -50
- data/meta/range.rb +0 -39
- data/meta/redo.rb +0 -5
- data/meta/regexp.rb +0 -81
- data/meta/regopt.rb +0 -10
- data/meta/rescue.rb +0 -90
- data/meta/return.rb +0 -16
- data/meta/self.rb +0 -7
- data/meta/send.rb +0 -604
- data/meta/str.rb +0 -7
- data/meta/super.rb +0 -27
- data/meta/sym.rb +0 -8
- data/meta/true.rb +0 -8
- data/meta/until.rb +0 -17
- data/meta/while.rb +0 -26
- data/meta/yield.rb +0 -10
- data/mutant-minitest.gemspec +0 -22
- data/mutant-rspec.gemspec +0 -22
- data/mutant.gemspec +0 -41
- data/mutant.yml +0 -6
- data/spec/integration/mutant/corpus_spec.rb +0 -15
- data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
- data/spec/integration/mutant/minitest_spec.rb +0 -11
- data/spec/integration/mutant/null_spec.rb +0 -16
- data/spec/integration/mutant/rspec_spec.rb +0 -15
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
- data/spec/integrations.yml +0 -63
- data/spec/shared/base_behavior.rb +0 -45
- data/spec/shared/framework_integration_behavior.rb +0 -70
- data/spec/shared/method_matcher_behavior.rb +0 -47
- data/spec/spec_helper.rb +0 -75
- data/spec/support/corpus.rb +0 -318
- data/spec/support/file_system.rb +0 -62
- data/spec/support/ice_nine_config.rb +0 -10
- data/spec/support/ruby_vm.rb +0 -84
- data/spec/support/shared_context.rb +0 -169
- data/spec/support/test_app.rb +0 -7
- data/spec/support/warnings.yml +0 -6
- data/spec/support/xspec.rb +0 -183
- data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
- data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
- data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
- data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
- data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
- data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
- data/spec/unit/mutant/ast_spec.rb +0 -57
- data/spec/unit/mutant/bootstrap_spec.rb +0 -216
- data/spec/unit/mutant/cli_spec.rb +0 -305
- data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
- data/spec/unit/mutant/config_spec.rb +0 -126
- data/spec/unit/mutant/context_spec.rb +0 -111
- data/spec/unit/mutant/diff_spec.rb +0 -189
- data/spec/unit/mutant/env_spec.rb +0 -229
- data/spec/unit/mutant/expression/method_spec.rb +0 -62
- data/spec/unit/mutant/expression/methods_spec.rb +0 -61
- data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
- data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
- data/spec/unit/mutant/expression/parser_spec.rb +0 -65
- data/spec/unit/mutant/expression_spec.rb +0 -45
- data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
- data/spec/unit/mutant/integration_spec.rb +0 -150
- data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
- data/spec/unit/mutant/isolation/none_spec.rb +0 -23
- data/spec/unit/mutant/isolation/result_spec.rb +0 -73
- data/spec/unit/mutant/license_spec.rb +0 -293
- data/spec/unit/mutant/loader_spec.rb +0 -79
- data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
- data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
- data/spec/unit/mutant/matcher/config_spec.rb +0 -47
- data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
- data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
- data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
- data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
- data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
- data/spec/unit/mutant/matcher/null_spec.rb +0 -12
- data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
- data/spec/unit/mutant/matcher/static_spec.rb +0 -13
- data/spec/unit/mutant/matcher_spec.rb +0 -102
- data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
- data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
- data/spec/unit/mutant/meta/example_spec.rb +0 -34
- data/spec/unit/mutant/mutation_spec.rb +0 -140
- data/spec/unit/mutant/mutator/node_spec.rb +0 -52
- data/spec/unit/mutant/mutator_spec.rb +0 -21
- data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
- data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
- data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
- data/spec/unit/mutant/parallel_spec.rb +0 -115
- data/spec/unit/mutant/parser_spec.rb +0 -26
- data/spec/unit/mutant/range_spec.rb +0 -141
- data/spec/unit/mutant/registry_spec.rb +0 -74
- data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
- data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
- data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
- data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
- data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
- data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
- data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
- data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
- data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
- data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
- data/spec/unit/mutant/reporter/null_spec.rb +0 -14
- data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
- data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
- data/spec/unit/mutant/repository/diff_spec.rb +0 -122
- data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
- data/spec/unit/mutant/require_highjack_spec.rb +0 -73
- data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
- data/spec/unit/mutant/result/env_spec.rb +0 -161
- data/spec/unit/mutant/result/mutation_spec.rb +0 -70
- data/spec/unit/mutant/result/subject_spec.rb +0 -111
- data/spec/unit/mutant/result/test_spec.rb +0 -14
- data/spec/unit/mutant/result_spec.rb +0 -33
- data/spec/unit/mutant/runner/sink_spec.rb +0 -174
- data/spec/unit/mutant/runner_spec.rb +0 -121
- data/spec/unit/mutant/selector/expression_spec.rb +0 -62
- data/spec/unit/mutant/selector/null_spec.rb +0 -17
- data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
- data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
- data/spec/unit/mutant/subject_spec.rb +0 -93
- data/spec/unit/mutant/transform/array_spec.rb +0 -92
- data/spec/unit/mutant/transform/bool_spec.rb +0 -63
- data/spec/unit/mutant/transform/error_spec.rb +0 -132
- data/spec/unit/mutant/transform/exception_spec.rb +0 -44
- data/spec/unit/mutant/transform/hash_spec.rb +0 -236
- data/spec/unit/mutant/transform/index_spec.rb +0 -92
- data/spec/unit/mutant/transform/named_spec.rb +0 -49
- data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
- data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
- data/spec/unit/mutant/util/one_spec.rb +0 -22
- data/spec/unit/mutant/warnings_spec.rb +0 -89
- data/spec/unit/mutant/world_spec.rb +0 -63
- data/spec/unit/mutant/zombifier_spec.rb +0 -122
- data/test_app/.rspec +0 -1
- data/test_app/Gemfile.minitest +0 -4
- data/test_app/Gemfile.rspec3.8 +0 -7
- data/test_app/lib/test_app.rb +0 -109
- data/test_app/lib/test_app/literal.rb +0 -35
- data/test_app/spec/spec_helper.rb +0 -9
- data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
- data/test_app/test/unit/test_app/literal_test.rb +0 -16
data/lib/mutant/result.rb
CHANGED
data/lib/mutant/runner.rb
CHANGED
@@ -12,9 +12,6 @@ module Mutant
|
|
12
12
|
Either::Right.new(run_mutation_analysis(env))
|
13
13
|
end
|
14
14
|
|
15
|
-
# Run mutation analysis
|
16
|
-
#
|
17
|
-
# @return [undefined]
|
18
15
|
def self.run_mutation_analysis(env)
|
19
16
|
reporter = reporter(env)
|
20
17
|
|
@@ -27,13 +24,6 @@ module Mutant
|
|
27
24
|
end
|
28
25
|
private_class_method :run_mutation_analysis
|
29
26
|
|
30
|
-
# Run driver
|
31
|
-
#
|
32
|
-
# @param [Reporter] reporter
|
33
|
-
# @param [Driver] driver
|
34
|
-
#
|
35
|
-
# @return [Object]
|
36
|
-
# the last returned status payload
|
37
27
|
def self.run_driver(reporter, driver)
|
38
28
|
loop do
|
39
29
|
status = driver.wait_timeout(reporter.delay)
|
@@ -43,9 +33,6 @@ module Mutant
|
|
43
33
|
end
|
44
34
|
private_class_method :run_driver
|
45
35
|
|
46
|
-
# Configuration for parallel execution engine
|
47
|
-
#
|
48
|
-
# @return [Parallell::Config]
|
49
36
|
def self.mutation_test_config(env)
|
50
37
|
world = env.world
|
51
38
|
|
@@ -61,11 +48,6 @@ module Mutant
|
|
61
48
|
end
|
62
49
|
private_class_method :mutation_test_config
|
63
50
|
|
64
|
-
# Reporter to use
|
65
|
-
#
|
66
|
-
# @param [Env] env
|
67
|
-
#
|
68
|
-
# @return [Reporter]
|
69
51
|
def self.reporter(env)
|
70
52
|
env.config.reporter
|
71
53
|
end
|
data/lib/mutant/runner/sink.rb
CHANGED
@@ -51,11 +51,6 @@ module Mutant
|
|
51
51
|
|
52
52
|
private
|
53
53
|
|
54
|
-
# Return previous results
|
55
|
-
#
|
56
|
-
# @param [Subject]
|
57
|
-
#
|
58
|
-
# @return [Array<Result::Mutation>]
|
59
54
|
def previous_mutation_results(subject)
|
60
55
|
subject_result = @subject_results.fetch(subject) { return EMPTY_ARRAY }
|
61
56
|
subject_result.mutation_results
|
data/lib/mutant/subject.rb
CHANGED
@@ -79,18 +79,10 @@ module Mutant
|
|
79
79
|
|
80
80
|
private
|
81
81
|
|
82
|
-
# Neutral mutation
|
83
|
-
#
|
84
|
-
# @return [Mutation::Neutral]
|
85
82
|
def neutral_mutation
|
86
83
|
Mutation::Neutral.new(self, wrap_node(node))
|
87
84
|
end
|
88
85
|
|
89
|
-
# Wrap node into subject specific container
|
90
|
-
#
|
91
|
-
# @param [Parser::AST::Node] node
|
92
|
-
#
|
93
|
-
# @return [Parser::AST::Node]
|
94
86
|
def wrap_node(node)
|
95
87
|
node
|
96
88
|
end
|
@@ -23,23 +23,57 @@ module Mutant
|
|
23
23
|
class Memoized < self
|
24
24
|
include AST::Sexp
|
25
25
|
|
26
|
+
FREEZER_OPTION_VALUES = {
|
27
|
+
Adamantium::Freezer::Deep => :deep,
|
28
|
+
Adamantium::Freezer::Flat => :flat,
|
29
|
+
Adamantium::Freezer::Noop => :noop
|
30
|
+
}.freeze
|
31
|
+
|
32
|
+
private_constant(*constants(false))
|
33
|
+
|
26
34
|
# Prepare subject for mutation insertion
|
27
35
|
#
|
28
36
|
# @return [self]
|
29
37
|
def prepare
|
30
|
-
|
38
|
+
memory.delete(name)
|
31
39
|
super()
|
32
40
|
end
|
33
41
|
|
34
42
|
private
|
35
43
|
|
36
|
-
|
44
|
+
def wrap_node(mutant)
|
45
|
+
s(:begin, mutant, s(:send, nil, :memoize, s(:args, s(:sym, name), *options)))
|
46
|
+
end
|
47
|
+
|
48
|
+
# The optional AST node for adamantium memoization options
|
37
49
|
#
|
38
|
-
# @
|
50
|
+
# @return [Array(Parser::AST::Node), nil]
|
51
|
+
def options
|
52
|
+
# rubocop:disable Style/GuardClause
|
53
|
+
if FREEZER_OPTION_VALUES.key?(freezer)
|
54
|
+
[
|
55
|
+
s(:hash,
|
56
|
+
s(:pair,
|
57
|
+
s(:sym, :freezer),
|
58
|
+
s(:sym, FREEZER_OPTION_VALUES.fetch(freezer))))
|
59
|
+
]
|
60
|
+
end
|
61
|
+
# rubocop:enable Style/GuardClause
|
62
|
+
end
|
63
|
+
|
64
|
+
# The freezer used for memoization
|
39
65
|
#
|
40
|
-
# @return [
|
41
|
-
def
|
42
|
-
|
66
|
+
# @return [Object]
|
67
|
+
def freezer
|
68
|
+
memory.fetch(name).instance_variable_get(:@freezer)
|
69
|
+
end
|
70
|
+
memoize :freezer, freezer: :noop
|
71
|
+
|
72
|
+
# The memory used for memoization
|
73
|
+
#
|
74
|
+
# @return [ThreadSafe::Cache]
|
75
|
+
def memory
|
76
|
+
scope.__send__(:memoized_methods).instance_variable_get(:@memory)
|
43
77
|
end
|
44
78
|
|
45
79
|
end # Memoized
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Subject
|
5
|
+
class Method
|
6
|
+
# Singleton method defined using metaclass syntax
|
7
|
+
# (class << self; def foo; end; end)
|
8
|
+
class Metaclass < self
|
9
|
+
include AST::Sexp
|
10
|
+
|
11
|
+
NAME_INDEX = 0
|
12
|
+
SYMBOL = '.'
|
13
|
+
|
14
|
+
# Prepare subject for mutation insertion
|
15
|
+
#
|
16
|
+
# @return [self]
|
17
|
+
def prepare
|
18
|
+
scope.singleton_class.public_send(:undef_method, name)
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def wrap_node(mutant)
|
25
|
+
s(:sclass, AST::Nodes::N_SELF, mutant)
|
26
|
+
end
|
27
|
+
end # Metaclass
|
28
|
+
end # Method
|
29
|
+
end # Subject
|
30
|
+
end # Mutant
|
data/lib/mutant/transform.rb
CHANGED
@@ -49,9 +49,6 @@ module Mutant
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
# Path representation to error
|
53
|
-
#
|
54
|
-
# @return [String]
|
55
52
|
def path
|
56
53
|
trace.map { |error| error.transform.slug }.reject(&:empty?).join('/')
|
57
54
|
end
|
@@ -78,23 +75,6 @@ module Mutant
|
|
78
75
|
|
79
76
|
private
|
80
77
|
|
81
|
-
# Make error from curent context
|
82
|
-
#
|
83
|
-
# @param [Error, nil] cause
|
84
|
-
# original error, if any
|
85
|
-
#
|
86
|
-
# @param [Object] input
|
87
|
-
# input that ran into the error
|
88
|
-
#
|
89
|
-
# @param [String] message
|
90
|
-
# human readable error message
|
91
|
-
#
|
92
|
-
# @param [Transform, nil]
|
93
|
-
# transform that generated the error from input
|
94
|
-
#
|
95
|
-
# @return [Error]
|
96
|
-
#
|
97
|
-
# ignore :reek:LongParameterList
|
98
78
|
def error(cause: nil, input:, message: nil)
|
99
79
|
Error.new(
|
100
80
|
cause: cause,
|
@@ -104,42 +84,18 @@ module Mutant
|
|
104
84
|
)
|
105
85
|
end
|
106
86
|
|
107
|
-
# Lift error
|
108
|
-
#
|
109
|
-
# @param [Error]
|
110
|
-
#
|
111
|
-
# @return [Error]
|
112
87
|
def lift_error(error)
|
113
88
|
error.with(transform: self)
|
114
89
|
end
|
115
90
|
|
116
|
-
# Wrap error
|
117
|
-
#
|
118
|
-
# @param [Error]
|
119
|
-
#
|
120
|
-
# @return [Error]
|
121
91
|
def wrap_error(error)
|
122
92
|
error(cause: error, input: error.input)
|
123
93
|
end
|
124
94
|
|
125
|
-
# Create failure
|
126
|
-
#
|
127
|
-
# @param [Object] value
|
128
|
-
#
|
129
|
-
# @return [Either::Left]
|
130
|
-
#
|
131
|
-
# ignore :reek:UtilityFunction
|
132
95
|
def failure(value)
|
133
96
|
Either::Left.new(value)
|
134
97
|
end
|
135
98
|
|
136
|
-
# Create success
|
137
|
-
#
|
138
|
-
# @param [Object] value
|
139
|
-
#
|
140
|
-
# @return [Either::Right]
|
141
|
-
#
|
142
|
-
# ignore :reek:UtilityFunction
|
143
99
|
def success(value)
|
144
100
|
Either::Right.new(value)
|
145
101
|
end
|
@@ -268,14 +224,6 @@ module Mutant
|
|
268
224
|
|
269
225
|
private
|
270
226
|
|
271
|
-
# Transform array
|
272
|
-
#
|
273
|
-
# @param [Array<Object>] input
|
274
|
-
#
|
275
|
-
# @return [Either<Error, Array<Object>]
|
276
|
-
#
|
277
|
-
# ignore :reek:NestedIterators
|
278
|
-
#
|
279
227
|
# rubocop:disable Metrics/MethodLength
|
280
228
|
def run(input)
|
281
229
|
output = []
|
@@ -357,31 +305,16 @@ module Mutant
|
|
357
305
|
|
358
306
|
private
|
359
307
|
|
360
|
-
# Transform hash
|
361
|
-
#
|
362
|
-
# @param [Hash] input
|
363
|
-
#
|
364
|
-
# @return [Either<Error, Hash>]
|
365
308
|
def transform(input)
|
366
309
|
transform_required(input).bind do |required|
|
367
310
|
transform_optional(input).fmap(&required.method(:merge))
|
368
311
|
end
|
369
312
|
end
|
370
313
|
|
371
|
-
# Transform required keys
|
372
|
-
#
|
373
|
-
# @param [Hash] input
|
374
|
-
#
|
375
|
-
# @return [Either<Error, Hash>]
|
376
314
|
def transform_required(input)
|
377
315
|
transform_keys(required, input)
|
378
316
|
end
|
379
317
|
|
380
|
-
# Transform optional keys
|
381
|
-
#
|
382
|
-
# @param [Hash] input
|
383
|
-
#
|
384
|
-
# @return [Either<Error, Hash>]
|
385
318
|
def transform_optional(input)
|
386
319
|
transform_keys(
|
387
320
|
optional.select { |key| input.key?(key.value) },
|
@@ -389,13 +322,6 @@ module Mutant
|
|
389
322
|
)
|
390
323
|
end
|
391
324
|
|
392
|
-
# Transform keys
|
393
|
-
#
|
394
|
-
# @param [Array<Transform::Hash::Key>] keys
|
395
|
-
# @param [Hash] input
|
396
|
-
#
|
397
|
-
# @return [Either<Error, Hash>]
|
398
|
-
#
|
399
325
|
# ignore :reek:NestedIterators
|
400
326
|
#
|
401
327
|
# rubocop:disable Metrics/MethodLength
|
@@ -415,24 +341,12 @@ module Mutant
|
|
415
341
|
end
|
416
342
|
# rubocop:enable Metrics/MethodLength
|
417
343
|
|
418
|
-
# Coerce key value under key specific transformer
|
419
|
-
#
|
420
|
-
# @param [Hash::Key] key
|
421
|
-
# @param [Hash] input
|
422
|
-
#
|
423
|
-
# @return [Either<Error, Object>]
|
424
344
|
def coerce_key(key, input)
|
425
345
|
key.apply(input.fetch(key.value)).lmap do |error|
|
426
346
|
error(input: input, cause: error)
|
427
347
|
end
|
428
348
|
end
|
429
349
|
|
430
|
-
# Reject unexpected keys
|
431
|
-
#
|
432
|
-
# @param [Hash]
|
433
|
-
#
|
434
|
-
# @return [Either<Error, Object>]
|
435
|
-
#
|
436
350
|
# rubocop:disable Metrics/MethodLength
|
437
351
|
def reject_keys(input)
|
438
352
|
keys = input.keys
|
@@ -452,17 +366,11 @@ module Mutant
|
|
452
366
|
end
|
453
367
|
# rubocop:enable Metrics/MethodLength
|
454
368
|
|
455
|
-
# Key values allowed to be present
|
456
|
-
#
|
457
|
-
# @return [Array<Object>]
|
458
369
|
def allowed_keys
|
459
370
|
required_keys + optional.map(&:value)
|
460
371
|
end
|
461
372
|
memoize :allowed_keys
|
462
373
|
|
463
|
-
# Key values required to be present
|
464
|
-
#
|
465
|
-
# @return [Array<Object>]
|
466
374
|
def required_keys
|
467
375
|
required.map(&:value)
|
468
376
|
end
|
data/lib/mutant/version.rb
CHANGED
data/lib/mutant/warnings.rb
CHANGED
@@ -92,9 +92,6 @@ module Mutant
|
|
92
92
|
|
93
93
|
private
|
94
94
|
|
95
|
-
# Hook called when capturing a warning
|
96
|
-
#
|
97
|
-
# @return [undefined]
|
98
95
|
def capture(*arguments)
|
99
96
|
if @disabled
|
100
97
|
@original.call(*arguments)
|
@@ -103,9 +100,6 @@ module Mutant
|
|
103
100
|
end
|
104
101
|
end
|
105
102
|
|
106
|
-
# Assert warnings capture does not call itself
|
107
|
-
#
|
108
|
-
# Its currently not supported nor intended to be supported.
|
109
103
|
def assert_no_recursion
|
110
104
|
fail RecursiveUseError unless @disabled
|
111
105
|
end
|
data/lib/mutant/zombifier.rb
CHANGED
@@ -42,32 +42,20 @@ module Mutant
|
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
|
-
|
45
|
+
attr_reader :original
|
46
|
+
private :original
|
46
47
|
#
|
47
48
|
# @return [Method]
|
48
|
-
attr_reader :original
|
49
49
|
|
50
|
-
# Run zombifier
|
51
|
-
#
|
52
|
-
# @return [undefined]
|
53
50
|
def call
|
54
51
|
@original = require_highjack.call(method(:require))
|
55
52
|
require(root_require)
|
56
53
|
end
|
57
54
|
|
58
|
-
# Test if logical name is subjected to zombification
|
59
|
-
#
|
60
|
-
# @param [String]
|
61
55
|
def include?(logical_name)
|
62
56
|
!@zombified.include?(logical_name) && includes =~ logical_name
|
63
57
|
end
|
64
58
|
|
65
|
-
# Require file in zombie namespace
|
66
|
-
#
|
67
|
-
# @param [#to_s] logical_name
|
68
|
-
#
|
69
|
-
# @return [Bool]
|
70
|
-
# true if successful and false if feature already loaded
|
71
59
|
def require(logical_name)
|
72
60
|
logical_name = logical_name.to_s
|
73
61
|
loaded = original.call(logical_name)
|
@@ -77,14 +65,6 @@ module Mutant
|
|
77
65
|
true
|
78
66
|
end
|
79
67
|
|
80
|
-
# Find file by logical path
|
81
|
-
#
|
82
|
-
# @param [String] logical_name
|
83
|
-
#
|
84
|
-
# @return [File]
|
85
|
-
#
|
86
|
-
# @raise [LoadError]
|
87
|
-
# otherwise
|
88
68
|
def find(logical_name)
|
89
69
|
file_name = "#{logical_name}.rb"
|
90
70
|
|
@@ -96,13 +76,6 @@ module Mutant
|
|
96
76
|
fail LoadError, "Cannot find file #{file_name.inspect} in load path"
|
97
77
|
end
|
98
78
|
|
99
|
-
# Zombify contents of file
|
100
|
-
#
|
101
|
-
# Probably the 2nd valid use of eval ever. (First one is inserting mutants!).
|
102
|
-
#
|
103
|
-
# @param [Pathname] source_path
|
104
|
-
#
|
105
|
-
# @return [undefined]
|
106
79
|
def zombify(source_path)
|
107
80
|
kernel.eval(
|
108
81
|
Unparser.unparse(namespaced_node(source_path)),
|
@@ -111,11 +84,6 @@ module Mutant
|
|
111
84
|
)
|
112
85
|
end
|
113
86
|
|
114
|
-
# Namespaced root node
|
115
|
-
#
|
116
|
-
# @param [Pathname] source_path
|
117
|
-
#
|
118
|
-
# @return [Parser::AST::Node]
|
119
87
|
def namespaced_node(source_path)
|
120
88
|
s(:module, s(:const, nil, namespace), Unparser.parse(source_path.read))
|
121
89
|
end
|