mutant 0.9.7 → 0.9.12
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 +0 -36
- data/lib/mutant/cli.rb +5 -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 +0 -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 -74
- 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/registry.rb +2 -7
- 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 +0 -18
- 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/.circleci/config.yml +0 -53
- data/.gitignore +0 -38
- data/.rspec +0 -5
- data/.rubocop.yml +0 -7
- data/Changelog.md +0 -71
- data/Gemfile +0 -14
- data/Gemfile.lock +0 -167
- data/Gemfile.shared +0 -3
- 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 -47
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71f2d39499ffdc3adced885c60b9b22220e409f360fce5ab8ac0aaeb36bdbda3
|
4
|
+
data.tar.gz: dee6aa26ddce9e06949566dfc75d4daf295ec76ea46903af80b0ac4027f338ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6a44765e6fec377e0f4d9e3047832468af386b34f5d7a231fb940802a97977bba6000b016ca6739f402314bf03027dd8852776ff1ee687d6e67fb6168d5416a
|
7
|
+
data.tar.gz: 9d696a03e4a86c8838fa73ab147a75dac9f8f14b1f20eef653b30a3758c4044f016f4444f94827738d6bd39d05fdd9cddafdcfbd2a6475c2ebbc8674f005738d
|
data/lib/mutant.rb
CHANGED
@@ -51,6 +51,7 @@ require 'mutant/ast/types'
|
|
51
51
|
require 'mutant/ast/nodes'
|
52
52
|
require 'mutant/ast/named_children'
|
53
53
|
require 'mutant/ast/node_predicates'
|
54
|
+
require 'mutant/ast/find_metaclass_containing'
|
54
55
|
require 'mutant/ast/meta'
|
55
56
|
require 'mutant/ast/meta/send'
|
56
57
|
require 'mutant/ast/meta/const'
|
@@ -112,12 +113,14 @@ require 'mutant/mutator/node/send/conditional'
|
|
112
113
|
require 'mutant/mutator/node/send/attribute_assignment'
|
113
114
|
require 'mutant/mutator/node/when'
|
114
115
|
require 'mutant/mutator/node/class'
|
116
|
+
require 'mutant/mutator/node/sclass'
|
115
117
|
require 'mutant/mutator/node/define'
|
116
118
|
require 'mutant/mutator/node/mlhs'
|
117
119
|
require 'mutant/mutator/node/nthref'
|
118
120
|
require 'mutant/mutator/node/masgn'
|
119
121
|
require 'mutant/mutator/node/return'
|
120
122
|
require 'mutant/mutator/node/block'
|
123
|
+
require 'mutant/mutator/node/block_pass'
|
121
124
|
require 'mutant/mutator/node/if'
|
122
125
|
require 'mutant/mutator/node/case'
|
123
126
|
require 'mutant/mutator/node/splat'
|
@@ -134,11 +137,13 @@ require 'mutant/subject'
|
|
134
137
|
require 'mutant/subject/method'
|
135
138
|
require 'mutant/subject/method/instance'
|
136
139
|
require 'mutant/subject/method/singleton'
|
140
|
+
require 'mutant/subject/method/metaclass'
|
137
141
|
require 'mutant/matcher'
|
138
142
|
require 'mutant/matcher/config'
|
139
143
|
require 'mutant/matcher/chain'
|
140
144
|
require 'mutant/matcher/method'
|
141
145
|
require 'mutant/matcher/method/singleton'
|
146
|
+
require 'mutant/matcher/method/metaclass'
|
142
147
|
require 'mutant/matcher/method/instance'
|
143
148
|
require 'mutant/matcher/methods'
|
144
149
|
require 'mutant/matcher/namespace'
|
@@ -161,8 +166,6 @@ require 'mutant/selector/expression'
|
|
161
166
|
require 'mutant/selector/null'
|
162
167
|
require 'mutant/config'
|
163
168
|
require 'mutant/cli'
|
164
|
-
require 'mutant/color'
|
165
|
-
require 'mutant/diff'
|
166
169
|
require 'mutant/runner'
|
167
170
|
require 'mutant/runner/sink'
|
168
171
|
require 'mutant/result'
|
data/lib/mutant/ast.rb
CHANGED
@@ -27,15 +27,6 @@ module Mutant
|
|
27
27
|
path
|
28
28
|
end
|
29
29
|
|
30
|
-
# Walk all ast nodes keeping track of path
|
31
|
-
#
|
32
|
-
# @param [Parser::AST::Node] root
|
33
|
-
# @param [Array<Parser::AST::Node>] stack
|
34
|
-
#
|
35
|
-
# @yield [Parser::AST::Node]
|
36
|
-
# all nodes visited recursively including root
|
37
|
-
#
|
38
|
-
# @return [undefined]
|
39
30
|
def self.walk(node, stack, &block)
|
40
31
|
block.call(node, stack)
|
41
32
|
node.children.grep(::Parser::AST::Node) do |child|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
module AST
|
5
|
+
# Given an AST, finds the sclass that directly(-ish) contains the provided
|
6
|
+
# node.
|
7
|
+
# This won't match arbitrarily complex structures - it only searches the
|
8
|
+
# first level deep (no begins-in-begins, for example). This is in
|
9
|
+
# keeping with mutant generally not supporting 'weird' syntax.
|
10
|
+
# Descending into 'begin' nodes is supported because these are generated for
|
11
|
+
# the one-line syntax class << self; def foo; end
|
12
|
+
class FindMetaclassContaining
|
13
|
+
include NodePredicates, Concord.new(:root, :target), Procto.call
|
14
|
+
|
15
|
+
SCLASS_BODY_INDEX = 1
|
16
|
+
|
17
|
+
private_constant(*constants(false))
|
18
|
+
|
19
|
+
# Find metaclass node containing target node
|
20
|
+
#
|
21
|
+
# @return [Parser::AST::Node, nil]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
def call
|
25
|
+
AST.find_last_path(root) do |current|
|
26
|
+
next unless n_sclass?(current)
|
27
|
+
|
28
|
+
metaclass_of?(current)
|
29
|
+
end.last
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def metaclass_of?(sclass)
|
35
|
+
body = sclass.children.fetch(SCLASS_BODY_INDEX)
|
36
|
+
body.equal?(target) || transparently_contains?(body)
|
37
|
+
end
|
38
|
+
|
39
|
+
def transparently_contains?(body)
|
40
|
+
n_begin?(body) && include_exact?(body.children, target)
|
41
|
+
end
|
42
|
+
|
43
|
+
def include_exact?(haystack, needle)
|
44
|
+
haystack.any? { |elem| elem.equal?(needle) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/mutant/ast/meta/send.rb
CHANGED
@@ -56,16 +56,10 @@ module Mutant
|
|
56
56
|
|
57
57
|
private
|
58
58
|
|
59
|
-
# Test if node is `proc { ... }`
|
60
|
-
#
|
61
|
-
# @return [Boolean]
|
62
59
|
def naked_proc?
|
63
60
|
!receiver && selector.equal?(:proc)
|
64
61
|
end
|
65
62
|
|
66
|
-
# Test if node is `Proc.new { ... }`
|
67
|
-
#
|
68
|
-
# @return [Boolean]
|
69
63
|
def proc_new?
|
70
64
|
receiver &&
|
71
65
|
selector.equal?(:new) &&
|
data/lib/mutant/bootstrap.rb
CHANGED
@@ -49,9 +49,6 @@ module Mutant
|
|
49
49
|
end
|
50
50
|
# rubocop:enable Metrics/MethodLength
|
51
51
|
|
52
|
-
# Infect environment
|
53
|
-
#
|
54
|
-
# @return [undefined]
|
55
52
|
def self.infect(env)
|
56
53
|
config, world = env.config, env.world
|
57
54
|
|
@@ -60,12 +57,6 @@ module Mutant
|
|
60
57
|
end
|
61
58
|
private_class_method :infect
|
62
59
|
|
63
|
-
# Matchable scopes
|
64
|
-
#
|
65
|
-
# @param [World] world
|
66
|
-
# @param [Config] config
|
67
|
-
#
|
68
|
-
# @return [Array<Scope>]
|
69
60
|
def self.matchable_scopes(world, config)
|
70
61
|
scopes = world.object_space.each_object(Module).each_with_object([]) do |scope, aggregate|
|
71
62
|
expression = expression(config.reporter, config.expression_parser, scope) || next
|
@@ -76,15 +67,6 @@ module Mutant
|
|
76
67
|
end
|
77
68
|
private_class_method :matchable_scopes
|
78
69
|
|
79
|
-
# Scope name from scoping object
|
80
|
-
#
|
81
|
-
# @param [Class, Module] scope
|
82
|
-
#
|
83
|
-
# @return [String]
|
84
|
-
# if scope has a name and does not raise exceptions obtaining it
|
85
|
-
#
|
86
|
-
# @return [nil]
|
87
|
-
# otherwise
|
88
70
|
def self.scope_name(reporter, scope)
|
89
71
|
scope.name
|
90
72
|
rescue => exception
|
@@ -99,20 +81,7 @@ module Mutant
|
|
99
81
|
end
|
100
82
|
private_class_method :scope_name
|
101
83
|
|
102
|
-
# Try to turn scope into expression
|
103
|
-
#
|
104
|
-
# @param [Expression::Parser] expression_parser
|
105
|
-
# @param [Class, Module] scope
|
106
|
-
#
|
107
|
-
# @return [Expression]
|
108
|
-
# if scope can be represented in an expression
|
109
|
-
#
|
110
|
-
# @return [nil]
|
111
|
-
# otherwise
|
112
|
-
#
|
113
84
|
# rubocop:disable Metrics/MethodLength
|
114
|
-
#
|
115
|
-
# ignore :reek:LongParameterList
|
116
85
|
def self.expression(reporter, expression_parser, scope)
|
117
86
|
name = scope_name(reporter, scope) or return
|
118
87
|
|
@@ -132,11 +101,6 @@ module Mutant
|
|
132
101
|
private_class_method :expression
|
133
102
|
# rubocop:enable Metrics/MethodLength
|
134
103
|
|
135
|
-
# Write a semantics warning
|
136
|
-
#
|
137
|
-
# @return [undefined]
|
138
|
-
#
|
139
|
-
# ignore :reek:LongParameterList
|
140
104
|
def self.semantics_warning(reporter, format, options)
|
141
105
|
reporter.warn(SEMANTICS_MESSAGE_FORMAT % { message: format % options })
|
142
106
|
end
|
data/lib/mutant/cli.rb
CHANGED
@@ -88,23 +88,12 @@ module Mutant
|
|
88
88
|
|
89
89
|
private
|
90
90
|
|
91
|
-
# Parse matchers
|
92
|
-
#
|
93
|
-
# @param [Array<String>] expressions
|
94
|
-
#
|
95
|
-
# @return [undefined]
|
96
91
|
def parse_match_expressions(expressions)
|
97
92
|
expressions.each do |expression|
|
98
93
|
add_matcher(:match_expressions, config.expression_parser.apply(expression).from_right)
|
99
94
|
end
|
100
95
|
end
|
101
96
|
|
102
|
-
# Add environmental options
|
103
|
-
#
|
104
|
-
# @param [Object] opts
|
105
|
-
#
|
106
|
-
# @return [undefined]
|
107
|
-
#
|
108
97
|
# rubocop:disable Metrics/MethodLength
|
109
98
|
def add_environment_options(opts)
|
110
99
|
opts.separator('Environment:')
|
@@ -121,12 +110,8 @@ module Mutant
|
|
121
110
|
with(jobs: Integer(number))
|
122
111
|
end
|
123
112
|
end
|
113
|
+
# rubocop:enable Metrics/MethodLength
|
124
114
|
|
125
|
-
# Add mutation options
|
126
|
-
#
|
127
|
-
# @param [OptionParser] opts
|
128
|
-
#
|
129
|
-
# @return [undefined]
|
130
115
|
def add_mutation_options(opts)
|
131
116
|
opts.separator(nil)
|
132
117
|
opts.separator('Options:')
|
@@ -136,11 +121,7 @@ module Mutant
|
|
136
121
|
end
|
137
122
|
end
|
138
123
|
|
139
|
-
#
|
140
|
-
#
|
141
|
-
# @param [OptionParser] opts
|
142
|
-
#
|
143
|
-
# @return [undefined]
|
124
|
+
# rubocop:disable Metrics/MethodLength
|
144
125
|
def add_filter_options(opts)
|
145
126
|
opts.on('--ignore-subject EXPRESSION', 'Ignore subjects that match EXPRESSION as prefix') do |pattern|
|
146
127
|
add_matcher(:ignore_expressions, config.expression_parser.apply(pattern).from_right)
|
@@ -154,12 +135,9 @@ module Mutant
|
|
154
135
|
)
|
155
136
|
end
|
156
137
|
end
|
138
|
+
# rubocop:enable Metrics/MethodLength
|
157
139
|
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# @param [OptionParser] opts
|
161
|
-
#
|
162
|
-
# @return [undefined]
|
140
|
+
# rubocop:disable Metrics/MethodLength
|
163
141
|
def add_debug_options(opts)
|
164
142
|
opts.on('--fail-fast', 'Fail fast') do
|
165
143
|
with(fail_fast: true)
|
@@ -173,38 +151,16 @@ module Mutant
|
|
173
151
|
world.kernel.exit
|
174
152
|
end
|
175
153
|
end
|
154
|
+
# rubocop:enable Metrics/MethodLength
|
176
155
|
|
177
|
-
# With configuration
|
178
|
-
#
|
179
|
-
# @param [Hash<Symbol, Object>] attributes
|
180
|
-
#
|
181
|
-
# @return [undefined]
|
182
156
|
def with(attributes)
|
183
157
|
@config = config.with(attributes)
|
184
158
|
end
|
185
159
|
|
186
|
-
# Add configuration
|
187
|
-
#
|
188
|
-
# @param [Symbol] attribute
|
189
|
-
# the attribute to add to
|
190
|
-
#
|
191
|
-
# @param [Object] value
|
192
|
-
# the value to add
|
193
|
-
#
|
194
|
-
# @return [undefined]
|
195
160
|
def add(attribute, value)
|
196
161
|
with(attribute => config.public_send(attribute) + [value])
|
197
162
|
end
|
198
163
|
|
199
|
-
# Add matcher configuration
|
200
|
-
#
|
201
|
-
# @param [Symbol] attribute
|
202
|
-
# the attribute to add to
|
203
|
-
#
|
204
|
-
# @param [Object] value
|
205
|
-
# the value to add
|
206
|
-
#
|
207
|
-
# @return [undefined]
|
208
164
|
def add_matcher(attribute, value)
|
209
165
|
with(matcher: config.matcher.add(attribute, value))
|
210
166
|
end
|
data/lib/mutant/config.rb
CHANGED
@@ -126,14 +126,6 @@ module Mutant
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
# Load contents of file
|
130
|
-
#
|
131
|
-
# @param [Pathname] path
|
132
|
-
#
|
133
|
-
# @return [Config]
|
134
|
-
#
|
135
|
-
# @raise [Either<String, Hash{Symbol => Object}>]
|
136
|
-
# in case of config file error
|
137
129
|
def self.load_contents(path)
|
138
130
|
Transform::Named
|
139
131
|
.new(path.to_s, TRANSFORM)
|
data/lib/mutant/context.rb
CHANGED
data/lib/mutant/env.rb
CHANGED
@@ -126,12 +126,6 @@ module Mutant
|
|
126
126
|
|
127
127
|
private
|
128
128
|
|
129
|
-
# Kill mutation under isolation with integration
|
130
|
-
#
|
131
|
-
# @param [Mutation] mutation
|
132
|
-
# @param [Array<Test>] test
|
133
|
-
#
|
134
|
-
# @return [Result::Isolation]
|
135
129
|
def run_mutation_tests(mutation, tests)
|
136
130
|
config.isolation.call do
|
137
131
|
result = mutation.insert(world.kernel)
|
@@ -14,8 +14,8 @@ module Mutant
|
|
14
14
|
private(*anima.attribute_names)
|
15
15
|
|
16
16
|
MATCHERS = IceNine.deep_freeze(
|
17
|
-
'.' => Matcher::Methods::Singleton,
|
18
|
-
'#' => Matcher::Methods::Instance
|
17
|
+
'.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
|
18
|
+
'#' => [Matcher::Methods::Instance]
|
19
19
|
)
|
20
20
|
|
21
21
|
METHOD_NAME_PATTERN = Regexp.union(
|
@@ -39,16 +39,16 @@ module Mutant
|
|
39
39
|
#
|
40
40
|
# @return [Matcher]
|
41
41
|
def matcher
|
42
|
-
|
42
|
+
matcher_candidates = MATCHERS.fetch(scope_symbol)
|
43
|
+
.map { |submatcher| submatcher.new(scope) }
|
44
|
+
|
45
|
+
methods_matcher = Matcher::Chain.new(matcher_candidates)
|
43
46
|
|
44
47
|
Matcher::Filter.new(methods_matcher, ->(subject) { subject.expression.eql?(self) })
|
45
48
|
end
|
46
49
|
|
47
50
|
private
|
48
51
|
|
49
|
-
# Scope object
|
50
|
-
#
|
51
|
-
# @return [Class, Method]
|
52
52
|
def scope
|
53
53
|
Object.const_get(scope_name)
|
54
54
|
end
|
@@ -13,8 +13,8 @@ module Mutant
|
|
13
13
|
private(*anima.attribute_names)
|
14
14
|
|
15
15
|
MATCHERS = IceNine.deep_freeze(
|
16
|
-
'.' => Matcher::Methods::Singleton,
|
17
|
-
'#' => Matcher::Methods::Instance
|
16
|
+
'.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
|
17
|
+
'#' => [Matcher::Methods::Instance]
|
18
18
|
)
|
19
19
|
private_constant(*constants(false))
|
20
20
|
|
@@ -32,7 +32,10 @@ module Mutant
|
|
32
32
|
#
|
33
33
|
# @return [Matcher::Method]
|
34
34
|
def matcher
|
35
|
-
MATCHERS.fetch(scope_symbol)
|
35
|
+
matcher_candidates = MATCHERS.fetch(scope_symbol)
|
36
|
+
.map { |submatcher| submatcher.new(scope) }
|
37
|
+
|
38
|
+
Matcher::Chain.new(matcher_candidates)
|
36
39
|
end
|
37
40
|
|
38
41
|
# Length of match with other expression
|
@@ -50,9 +53,6 @@ module Mutant
|
|
50
53
|
|
51
54
|
private
|
52
55
|
|
53
|
-
# Scope object
|
54
|
-
#
|
55
|
-
# @return [Class, Method]
|
56
56
|
def scope
|
57
57
|
Object.const_get(scope_name)
|
58
58
|
end
|
@@ -28,12 +28,6 @@ module Mutant
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
# Expressions parsed from input
|
32
|
-
#
|
33
|
-
# @param [String] input
|
34
|
-
#
|
35
|
-
# @return [Array<Expression>]
|
36
|
-
# if expressions can be parsed from input
|
37
31
|
def expressions(input)
|
38
32
|
types.each_with_object([]) do |type, aggregate|
|
39
33
|
expression = type.try_parse(input) and aggregate << expression
|
data/lib/mutant/integration.rb
CHANGED
@@ -32,14 +32,6 @@ module Mutant
|
|
32
32
|
.fmap { |klass| klass.new(env.config).setup }
|
33
33
|
end
|
34
34
|
|
35
|
-
# Attempt to require integration
|
36
|
-
#
|
37
|
-
# @param env [Bootstrap]
|
38
|
-
#
|
39
|
-
# @return [Either<String, undefined>]
|
40
|
-
#
|
41
|
-
# @api private
|
42
|
-
#
|
43
35
|
# rubocop:disable Style/MultilineBlockChain
|
44
36
|
def self.attempt_require(env)
|
45
37
|
integration_name = env.config.integration
|
@@ -56,13 +48,6 @@ module Mutant
|
|
56
48
|
private_class_method :attempt_require
|
57
49
|
# rubocop:enable Style/MultilineBlockChain
|
58
50
|
|
59
|
-
# Attempt const get
|
60
|
-
#
|
61
|
-
# @param env [Boostrap]
|
62
|
-
#
|
63
|
-
# @return [Either<String, Class<Integration>>]
|
64
|
-
#
|
65
|
-
# @api private
|
66
51
|
def self.attempt_const_get(env)
|
67
52
|
integration_name = env.config.integration
|
68
53
|
constant_name = integration_name.capitalize
|
@@ -98,9 +83,6 @@ module Mutant
|
|
98
83
|
|
99
84
|
private
|
100
85
|
|
101
|
-
# Expression parser
|
102
|
-
#
|
103
|
-
# @return [Expression::Parser]
|
104
86
|
def expression_parser
|
105
87
|
config.expression_parser
|
106
88
|
end
|