mutant 0.10.20 → 0.10.25
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 +23 -4
- data/lib/mutant/ast/meta/send.rb +0 -1
- data/lib/mutant/ast/regexp.rb +37 -0
- data/lib/mutant/ast/regexp/transformer.rb +150 -0
- data/lib/mutant/ast/regexp/transformer/direct.rb +121 -0
- data/lib/mutant/ast/regexp/transformer/named_group.rb +50 -0
- data/lib/mutant/ast/regexp/transformer/options_group.rb +68 -0
- data/lib/mutant/ast/regexp/transformer/quantifier.rb +90 -0
- data/lib/mutant/ast/regexp/transformer/recursive.rb +56 -0
- data/lib/mutant/ast/regexp/transformer/root.rb +28 -0
- data/lib/mutant/ast/regexp/transformer/text.rb +58 -0
- data/lib/mutant/ast/types.rb +115 -11
- data/lib/mutant/cli/command/environment.rb +9 -3
- data/lib/mutant/config.rb +8 -54
- data/lib/mutant/config/coverage_criteria.rb +61 -0
- data/lib/mutant/env.rb +8 -6
- data/lib/mutant/expression.rb +0 -12
- data/lib/mutant/expression/namespace.rb +1 -1
- data/lib/mutant/isolation/fork.rb +1 -1
- data/lib/mutant/loader.rb +1 -1
- data/lib/mutant/matcher.rb +2 -2
- data/lib/mutant/matcher/config.rb +27 -6
- data/lib/mutant/matcher/method.rb +2 -3
- data/lib/mutant/matcher/method/metaclass.rb +1 -1
- data/lib/mutant/meta/example/dsl.rb +6 -1
- data/lib/mutant/mutator/node/arguments.rb +0 -2
- data/lib/mutant/mutator/node/block.rb +5 -1
- data/lib/mutant/mutator/node/dynamic_literal.rb +1 -1
- data/lib/mutant/mutator/node/kwargs.rb +44 -0
- data/lib/mutant/mutator/node/literal/regex.rb +26 -0
- data/lib/mutant/mutator/node/literal/symbol.rb +0 -2
- data/lib/mutant/mutator/node/regexp.rb +20 -0
- data/lib/mutant/mutator/node/regexp/alternation_meta.rb +20 -0
- data/lib/mutant/mutator/node/regexp/beginning_of_line_anchor.rb +20 -0
- data/lib/mutant/mutator/node/regexp/capture_group.rb +25 -0
- data/lib/mutant/mutator/node/regexp/character_type.rb +31 -0
- data/lib/mutant/mutator/node/regexp/end_of_line_anchor.rb +20 -0
- data/lib/mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +20 -0
- data/lib/mutant/mutator/node/regexp/zero_or_more.rb +34 -0
- data/lib/mutant/mutator/node/sclass.rb +1 -1
- data/lib/mutant/mutator/node/send.rb +36 -19
- data/lib/mutant/parallel.rb +43 -28
- data/lib/mutant/parallel/driver.rb +9 -3
- data/lib/mutant/parallel/worker.rb +60 -2
- data/lib/mutant/pipe.rb +94 -0
- data/lib/mutant/reporter/cli/printer/env.rb +1 -1
- data/lib/mutant/reporter/cli/printer/isolation_result.rb +1 -6
- data/lib/mutant/result.rb +8 -0
- data/lib/mutant/runner.rb +7 -10
- data/lib/mutant/runner/sink.rb +12 -2
- data/lib/mutant/subject.rb +1 -3
- data/lib/mutant/subject/method/instance.rb +2 -4
- data/lib/mutant/timer.rb +2 -4
- data/lib/mutant/transform.rb +25 -2
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/world.rb +1 -2
- metadata +48 -9
- data/lib/mutant/warnings.rb +0 -106
@@ -8,7 +8,10 @@ module Mutant
|
|
8
8
|
:threads,
|
9
9
|
:var_active_jobs,
|
10
10
|
:var_final,
|
11
|
-
:
|
11
|
+
:var_running,
|
12
|
+
:var_sink,
|
13
|
+
:var_source,
|
14
|
+
:workers
|
12
15
|
)
|
13
16
|
|
14
17
|
private(*anima.attribute_names)
|
@@ -29,7 +32,10 @@ module Mutant
|
|
29
32
|
|
30
33
|
def finalize(status)
|
31
34
|
status.tap do
|
32
|
-
|
35
|
+
if status.done?
|
36
|
+
workers.each(&:join)
|
37
|
+
threads.each(&:join)
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
35
41
|
|
@@ -38,7 +44,7 @@ module Mutant
|
|
38
44
|
var_sink.with do |sink|
|
39
45
|
Status.new(
|
40
46
|
active_jobs: active_jobs.dup.freeze,
|
41
|
-
done: threads.all? { |
|
47
|
+
done: threads.all? { |worker| !worker.alive? },
|
42
48
|
payload: sink.status
|
43
49
|
)
|
44
50
|
end
|
@@ -4,7 +4,10 @@ module Mutant
|
|
4
4
|
module Parallel
|
5
5
|
class Worker
|
6
6
|
include Adamantium::Flat, Anima.new(
|
7
|
-
:
|
7
|
+
:connection,
|
8
|
+
:index,
|
9
|
+
:pid,
|
10
|
+
:process,
|
8
11
|
:var_active_jobs,
|
9
12
|
:var_final,
|
10
13
|
:var_running,
|
@@ -14,6 +17,45 @@ module Mutant
|
|
14
17
|
|
15
18
|
private(*anima.attribute_names)
|
16
19
|
|
20
|
+
public :index
|
21
|
+
|
22
|
+
# rubocop:disable Metrics/MethodLength
|
23
|
+
# rubocop:disable Metrics/ParameterLists
|
24
|
+
def self.start(world:, block:, process_name:, **attributes)
|
25
|
+
io = world.io
|
26
|
+
process = world.process
|
27
|
+
|
28
|
+
request = Pipe.from_io(io)
|
29
|
+
response = Pipe.from_io(io)
|
30
|
+
|
31
|
+
pid = process.fork do
|
32
|
+
world.thread.current.name = process_name
|
33
|
+
world.process.setproctitle(process_name)
|
34
|
+
|
35
|
+
Child.new(
|
36
|
+
block: block,
|
37
|
+
connection: Pipe::Connection.from_pipes(
|
38
|
+
marshal: world.marshal,
|
39
|
+
reader: request,
|
40
|
+
writer: response
|
41
|
+
)
|
42
|
+
).call
|
43
|
+
end
|
44
|
+
|
45
|
+
new(
|
46
|
+
pid: pid,
|
47
|
+
process: process,
|
48
|
+
connection: Pipe::Connection.from_pipes(
|
49
|
+
marshal: world.marshal,
|
50
|
+
reader: response,
|
51
|
+
writer: request
|
52
|
+
),
|
53
|
+
**attributes
|
54
|
+
)
|
55
|
+
end
|
56
|
+
# rubocop:enable Metrics/MethodLength
|
57
|
+
# rubocop:enable Metrics/ParameterLists
|
58
|
+
|
17
59
|
# Run worker payload
|
18
60
|
#
|
19
61
|
# @return [self]
|
@@ -23,7 +65,7 @@ module Mutant
|
|
23
65
|
|
24
66
|
job_start(job)
|
25
67
|
|
26
|
-
result =
|
68
|
+
result = connection.call(job.payload)
|
27
69
|
|
28
70
|
job_done(job)
|
29
71
|
|
@@ -35,6 +77,12 @@ module Mutant
|
|
35
77
|
self
|
36
78
|
end
|
37
79
|
|
80
|
+
def join
|
81
|
+
process.kill('TERM', pid)
|
82
|
+
process.wait(pid)
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
38
86
|
private
|
39
87
|
|
40
88
|
def next_job
|
@@ -66,6 +114,16 @@ module Mutant
|
|
66
114
|
var_final.put(nil) if var_running.modify(&:pred).zero?
|
67
115
|
end
|
68
116
|
|
117
|
+
class Child
|
118
|
+
include Anima.new(:block, :connection)
|
119
|
+
|
120
|
+
def call
|
121
|
+
loop do
|
122
|
+
connection.send_value(block.call(connection.receive_value))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
private_constant :Child
|
69
127
|
end # Worker
|
70
128
|
end # Parallel
|
71
129
|
end # Mutant
|
data/lib/mutant/pipe.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
# Pipe abstraction
|
5
|
+
class Pipe
|
6
|
+
include Adamantium::Flat, Anima.new(:reader, :writer)
|
7
|
+
|
8
|
+
# Run block with pipe in binmode
|
9
|
+
#
|
10
|
+
# @return [undefined]
|
11
|
+
def self.with(io)
|
12
|
+
io.pipe(binmode: true) do |(reader, writer)|
|
13
|
+
yield new(reader: reader, writer: writer)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_io(io)
|
18
|
+
reader, writer = io.pipe(binmode: true)
|
19
|
+
new(reader: reader, writer: writer)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Writer end of the pipe
|
23
|
+
#
|
24
|
+
# @return [IO]
|
25
|
+
def to_writer
|
26
|
+
reader.close
|
27
|
+
writer
|
28
|
+
end
|
29
|
+
|
30
|
+
# Parent reader end of the pipe
|
31
|
+
#
|
32
|
+
# @return [IO]
|
33
|
+
def to_reader
|
34
|
+
writer.close
|
35
|
+
reader
|
36
|
+
end
|
37
|
+
|
38
|
+
class Connection
|
39
|
+
include Anima.new(:marshal, :reader, :writer)
|
40
|
+
|
41
|
+
Error = Class.new(RuntimeError)
|
42
|
+
|
43
|
+
class Frame
|
44
|
+
include Concord.new(:io)
|
45
|
+
|
46
|
+
HEADER_FORMAT = 'N'
|
47
|
+
MAX_BYTES = (2**32).pred
|
48
|
+
HEADER_SIZE = 4
|
49
|
+
|
50
|
+
def receive_value
|
51
|
+
header = read(HEADER_SIZE)
|
52
|
+
read(Util.one(header.unpack(HEADER_FORMAT)))
|
53
|
+
end
|
54
|
+
|
55
|
+
def send_value(body)
|
56
|
+
bytesize = body.bytesize
|
57
|
+
|
58
|
+
fail Error, 'message to big' if bytesize > MAX_BYTES
|
59
|
+
|
60
|
+
io.write([bytesize].pack(HEADER_FORMAT))
|
61
|
+
io.write(body)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def read(bytes)
|
67
|
+
io.read(bytes) or fail Error, 'Unexpected EOF'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def call(payload)
|
72
|
+
send_value(payload)
|
73
|
+
receive_value
|
74
|
+
end
|
75
|
+
|
76
|
+
def receive_value
|
77
|
+
marshal.load(reader.receive_value)
|
78
|
+
end
|
79
|
+
|
80
|
+
def send_value(value)
|
81
|
+
writer.send_value(marshal.dump(value))
|
82
|
+
self
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.from_pipes(marshal:, reader:, writer:)
|
86
|
+
new(
|
87
|
+
marshal: marshal,
|
88
|
+
reader: Frame.new(reader.to_reader),
|
89
|
+
writer: Frame.new(writer.to_writer)
|
90
|
+
)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end # Pipe
|
94
|
+
end # Mutant
|
@@ -12,11 +12,6 @@ module Mutant
|
|
12
12
|
%s
|
13
13
|
MESSAGE
|
14
14
|
|
15
|
-
LOG_MESSAGES = <<~'MESSAGE'
|
16
|
-
Log messages (combined stderr and stdout):
|
17
|
-
%s
|
18
|
-
MESSAGE
|
19
|
-
|
20
15
|
EXCEPTION_ERROR_MESSAGE = <<~'MESSAGE'
|
21
16
|
Killing the mutation resulted in an integration error.
|
22
17
|
This is the case when the tests selected for the current mutation
|
@@ -36,7 +31,7 @@ module Mutant
|
|
36
31
|
```
|
37
32
|
MESSAGE
|
38
33
|
|
39
|
-
TIMEOUT_ERROR_MESSAGE
|
34
|
+
TIMEOUT_ERROR_MESSAGE = <<~'MESSAGE'
|
40
35
|
Mutation analysis ran into the configured timeout of %0.9<timeout>g seconds.
|
41
36
|
MESSAGE
|
42
37
|
|
data/lib/mutant/result.rb
CHANGED
@@ -232,6 +232,14 @@ module Mutant
|
|
232
232
|
end
|
233
233
|
end
|
234
234
|
|
235
|
+
class MutationIndex
|
236
|
+
include Anima.new(
|
237
|
+
:isolation_result,
|
238
|
+
:mutation_index,
|
239
|
+
:runtime
|
240
|
+
)
|
241
|
+
end # MutationIndex
|
242
|
+
|
235
243
|
# Mutation result
|
236
244
|
class Mutation
|
237
245
|
include Result, Anima.new(
|
data/lib/mutant/runner.rb
CHANGED
@@ -17,7 +17,7 @@ module Mutant
|
|
17
17
|
|
18
18
|
run_driver(
|
19
19
|
reporter,
|
20
|
-
Parallel.async(mutation_test_config(env))
|
20
|
+
Parallel.async(env.world, mutation_test_config(env))
|
21
21
|
).tap do |result|
|
22
22
|
reporter.report(result)
|
23
23
|
end
|
@@ -34,16 +34,13 @@ module Mutant
|
|
34
34
|
private_class_method :run_driver
|
35
35
|
|
36
36
|
def self.mutation_test_config(env)
|
37
|
-
world = env.world
|
38
|
-
|
39
37
|
Parallel::Config.new(
|
40
|
-
|
41
|
-
jobs:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
thread: world.thread
|
38
|
+
block: env.method(:cover_index),
|
39
|
+
jobs: env.config.jobs,
|
40
|
+
process_name: 'mutant-worker-process',
|
41
|
+
sink: Sink.new(env),
|
42
|
+
source: Parallel::Source::Array.new(env.mutations.each_index.to_a),
|
43
|
+
thread_name: 'mutant-worker-thread'
|
47
44
|
)
|
48
45
|
end
|
49
46
|
private_class_method :mutation_test_config
|
data/lib/mutant/runner/sink.rb
CHANGED
@@ -34,10 +34,12 @@ module Mutant
|
|
34
34
|
|
35
35
|
# Handle mutation finish
|
36
36
|
#
|
37
|
-
# @param [Result::
|
37
|
+
# @param [Result::MutationIndex] mutation_index_result
|
38
38
|
#
|
39
39
|
# @return [self]
|
40
|
-
def result(
|
40
|
+
def result(mutation_index_result)
|
41
|
+
mutation_result = mutation_result(mutation_index_result)
|
42
|
+
|
41
43
|
subject = mutation_result.mutation.subject
|
42
44
|
|
43
45
|
@subject_results[subject] = Result::Subject.new(
|
@@ -58,6 +60,14 @@ module Mutant
|
|
58
60
|
)
|
59
61
|
end
|
60
62
|
|
63
|
+
def mutation_result(mutation_index_result)
|
64
|
+
Result::Mutation.new(
|
65
|
+
isolation_result: mutation_index_result.isolation_result,
|
66
|
+
mutation: env.mutations.fetch(mutation_index_result.mutation_index),
|
67
|
+
runtime: mutation_index_result.runtime
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
61
71
|
def previous_coverage_results(subject)
|
62
72
|
subject_result = @subject_results.fetch(subject) { return EMPTY_ARRAY }
|
63
73
|
subject_result.coverage_results
|
data/lib/mutant/subject.rb
CHANGED
@@ -13,9 +13,7 @@ module Mutant
|
|
13
13
|
#
|
14
14
|
# @return [self]
|
15
15
|
def prepare
|
16
|
-
|
17
|
-
scope.public_send(:undef_method, name)
|
18
|
-
end
|
16
|
+
scope.undef_method(name)
|
19
17
|
self
|
20
18
|
end
|
21
19
|
|
@@ -52,7 +50,7 @@ module Mutant
|
|
52
50
|
# rubocop:disable Style/GuardClause
|
53
51
|
if FREEZER_OPTION_VALUES.key?(freezer)
|
54
52
|
[
|
55
|
-
s(:
|
53
|
+
s(:kwargs,
|
56
54
|
s(:pair,
|
57
55
|
s(:sym, :freezer),
|
58
56
|
s(:sym, FREEZER_OPTION_VALUES.fetch(freezer))))
|
data/lib/mutant/timer.rb
CHANGED
@@ -14,8 +14,8 @@ module Mutant
|
|
14
14
|
class Deadline
|
15
15
|
include Anima.new(:timer, :allowed_time)
|
16
16
|
|
17
|
-
def initialize(
|
18
|
-
super(
|
17
|
+
def initialize(*arguments)
|
18
|
+
super(*arguments)
|
19
19
|
@start_at = timer.now
|
20
20
|
end
|
21
21
|
|
@@ -54,8 +54,6 @@ module Mutant
|
|
54
54
|
class None < self
|
55
55
|
include Concord.new
|
56
56
|
|
57
|
-
STATUS = Status.new(nil)
|
58
|
-
|
59
57
|
# The time left
|
60
58
|
#
|
61
59
|
# @return [Float, nil]
|
data/lib/mutant/transform.rb
CHANGED
@@ -73,6 +73,31 @@ module Mutant
|
|
73
73
|
end
|
74
74
|
end # Named
|
75
75
|
|
76
|
+
class Block < self
|
77
|
+
include Anima.new(:block, :name)
|
78
|
+
|
79
|
+
def self.capture(name, &block)
|
80
|
+
new(block: block, name: name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def call(input)
|
84
|
+
block
|
85
|
+
.call(input)
|
86
|
+
.lmap do |message|
|
87
|
+
Error.new(
|
88
|
+
cause: nil,
|
89
|
+
input: input,
|
90
|
+
message: message,
|
91
|
+
transform: self
|
92
|
+
)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def slug
|
97
|
+
name
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
76
101
|
private
|
77
102
|
|
78
103
|
def error(cause: nil, input:, message: nil)
|
@@ -383,8 +408,6 @@ module Mutant
|
|
383
408
|
#
|
384
409
|
# @param [Object]
|
385
410
|
#
|
386
|
-
# ignore :reek:NestedIterators
|
387
|
-
#
|
388
411
|
# @return [Either<Error, Object>]
|
389
412
|
def call(input)
|
390
413
|
current = input
|
data/lib/mutant/version.rb
CHANGED
data/lib/mutant/world.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.25
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: abstract_type
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
159
|
+
version: 3.0.0
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
166
|
+
version: 3.0.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: procto
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,20 +178,40 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: 0.0.2
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: regexp_parser
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '2.0'
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: 2.0.3
|
191
|
+
type: :runtime
|
192
|
+
prerelease: false
|
193
|
+
version_requirements: !ruby/object:Gem::Requirement
|
194
|
+
requirements:
|
195
|
+
- - "~>"
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: '2.0'
|
198
|
+
- - ">="
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: 2.0.3
|
181
201
|
- !ruby/object:Gem::Dependency
|
182
202
|
name: unparser
|
183
203
|
requirement: !ruby/object:Gem::Requirement
|
184
204
|
requirements:
|
185
205
|
- - "~>"
|
186
206
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.5.
|
207
|
+
version: 0.5.6
|
188
208
|
type: :runtime
|
189
209
|
prerelease: false
|
190
210
|
version_requirements: !ruby/object:Gem::Requirement
|
191
211
|
requirements:
|
192
212
|
- - "~>"
|
193
213
|
- !ruby/object:Gem::Version
|
194
|
-
version: 0.5.
|
214
|
+
version: 0.5.6
|
195
215
|
- !ruby/object:Gem::Dependency
|
196
216
|
name: variable
|
197
217
|
requirement: !ruby/object:Gem::Requirement
|
@@ -268,14 +288,14 @@ dependencies:
|
|
268
288
|
requirements:
|
269
289
|
- - "~>"
|
270
290
|
- !ruby/object:Gem::Version
|
271
|
-
version: '1.
|
291
|
+
version: '1.7'
|
272
292
|
type: :development
|
273
293
|
prerelease: false
|
274
294
|
version_requirements: !ruby/object:Gem::Requirement
|
275
295
|
requirements:
|
276
296
|
- - "~>"
|
277
297
|
- !ruby/object:Gem::Version
|
278
|
-
version: '1.
|
298
|
+
version: '1.7'
|
279
299
|
description: Mutation Testing for Ruby.
|
280
300
|
email:
|
281
301
|
- mbj@schirp-dso.com
|
@@ -299,6 +319,15 @@ files:
|
|
299
319
|
- lib/mutant/ast/named_children.rb
|
300
320
|
- lib/mutant/ast/node_predicates.rb
|
301
321
|
- lib/mutant/ast/nodes.rb
|
322
|
+
- lib/mutant/ast/regexp.rb
|
323
|
+
- lib/mutant/ast/regexp/transformer.rb
|
324
|
+
- lib/mutant/ast/regexp/transformer/direct.rb
|
325
|
+
- lib/mutant/ast/regexp/transformer/named_group.rb
|
326
|
+
- lib/mutant/ast/regexp/transformer/options_group.rb
|
327
|
+
- lib/mutant/ast/regexp/transformer/quantifier.rb
|
328
|
+
- lib/mutant/ast/regexp/transformer/recursive.rb
|
329
|
+
- lib/mutant/ast/regexp/transformer/root.rb
|
330
|
+
- lib/mutant/ast/regexp/transformer/text.rb
|
302
331
|
- lib/mutant/ast/sexp.rb
|
303
332
|
- lib/mutant/ast/types.rb
|
304
333
|
- lib/mutant/bootstrap.rb
|
@@ -311,6 +340,7 @@ files:
|
|
311
340
|
- lib/mutant/cli/command/root.rb
|
312
341
|
- lib/mutant/cli/command/subscription.rb
|
313
342
|
- lib/mutant/config.rb
|
343
|
+
- lib/mutant/config/coverage_criteria.rb
|
314
344
|
- lib/mutant/context.rb
|
315
345
|
- lib/mutant/env.rb
|
316
346
|
- lib/mutant/expression.rb
|
@@ -366,6 +396,7 @@ files:
|
|
366
396
|
- lib/mutant/mutator/node/generic.rb
|
367
397
|
- lib/mutant/mutator/node/if.rb
|
368
398
|
- lib/mutant/mutator/node/index.rb
|
399
|
+
- lib/mutant/mutator/node/kwargs.rb
|
369
400
|
- lib/mutant/mutator/node/kwbegin.rb
|
370
401
|
- lib/mutant/mutator/node/literal.rb
|
371
402
|
- lib/mutant/mutator/node/literal/array.rb
|
@@ -390,6 +421,14 @@ files:
|
|
390
421
|
- lib/mutant/mutator/node/op_asgn.rb
|
391
422
|
- lib/mutant/mutator/node/or_asgn.rb
|
392
423
|
- lib/mutant/mutator/node/procarg_zero.rb
|
424
|
+
- lib/mutant/mutator/node/regexp.rb
|
425
|
+
- lib/mutant/mutator/node/regexp/alternation_meta.rb
|
426
|
+
- lib/mutant/mutator/node/regexp/beginning_of_line_anchor.rb
|
427
|
+
- lib/mutant/mutator/node/regexp/capture_group.rb
|
428
|
+
- lib/mutant/mutator/node/regexp/character_type.rb
|
429
|
+
- lib/mutant/mutator/node/regexp/end_of_line_anchor.rb
|
430
|
+
- lib/mutant/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb
|
431
|
+
- lib/mutant/mutator/node/regexp/zero_or_more.rb
|
393
432
|
- lib/mutant/mutator/node/regopt.rb
|
394
433
|
- lib/mutant/mutator/node/resbody.rb
|
395
434
|
- lib/mutant/mutator/node/rescue.rb
|
@@ -412,6 +451,7 @@ files:
|
|
412
451
|
- lib/mutant/parallel/source.rb
|
413
452
|
- lib/mutant/parallel/worker.rb
|
414
453
|
- lib/mutant/parser.rb
|
454
|
+
- lib/mutant/pipe.rb
|
415
455
|
- lib/mutant/range.rb
|
416
456
|
- lib/mutant/registry.rb
|
417
457
|
- lib/mutant/reporter.rb
|
@@ -450,7 +490,6 @@ files:
|
|
450
490
|
- lib/mutant/transform.rb
|
451
491
|
- lib/mutant/util.rb
|
452
492
|
- lib/mutant/version.rb
|
453
|
-
- lib/mutant/warnings.rb
|
454
493
|
- lib/mutant/world.rb
|
455
494
|
- lib/mutant/zombifier.rb
|
456
495
|
homepage: https://github.com/mbj/mutant
|