mutant 0.10.34 → 0.11.2
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/bootstrap.rb +4 -0
- data/lib/mutant/cli/command/environment/irb.rb +21 -0
- data/lib/mutant/cli/command/environment.rb +8 -0
- data/lib/mutant/cli/command/root.rb +1 -1
- data/lib/mutant/config.rb +50 -18
- data/lib/mutant/expression/descendants.rb +19 -0
- data/lib/mutant/matcher/chain.rb +1 -1
- data/lib/mutant/matcher/descendants.rb +26 -0
- data/lib/mutant/matcher/method.rb +11 -1
- data/lib/mutant/matcher/methods.rb +30 -9
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/world.rb +14 -0
- data/lib/mutant.rb +49 -36
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b75a7265756d1903cb93a5937959a7fca2a38d157eedf9287d1004b7bd5a05a4
|
4
|
+
data.tar.gz: 96c7945d43c9ba8dd5c9ef362b4bccc5a536eddf91526a9cb1bce4333df542cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53bf6c9d0de1fb8305fa7e7fce7e2072e381c6a088b0f6e08049222f46de4f908466d498c104f72fd19ddcf1cd7fa2f1cbc2beff099bd5529e880b3bf6a4c2ae
|
7
|
+
data.tar.gz: 3cc43c8eefce22bceb8465c4b475d4e0cc5b1e2c01a29997713e137605483d33ff792e368a37afd66316113f0495ae2ac265ec22af638cb112785da95f2261f9
|
data/lib/mutant/bootstrap.rb
CHANGED
@@ -71,6 +71,10 @@ module Mutant
|
|
71
71
|
|
72
72
|
hooks.run(:env_infection_pre, env)
|
73
73
|
|
74
|
+
config.environment_variables.each do |key, value|
|
75
|
+
world.environment_variables[key] = value
|
76
|
+
end
|
77
|
+
|
74
78
|
config.includes.each(&world.load_path.public_method(:<<))
|
75
79
|
config.requires.each(&world.kernel.public_method(:require))
|
76
80
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
module CLI
|
5
|
+
class Command
|
6
|
+
class Environment
|
7
|
+
class IRB < self
|
8
|
+
NAME = 'irb'
|
9
|
+
SHORT_DESCRIPTION = 'Run irb with mutant environment loaded'
|
10
|
+
SUBCOMMANDS = EMPTY_ARRAY
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def action
|
15
|
+
bootstrap.fmap { TOPLEVEL_BINDING.irb }
|
16
|
+
end
|
17
|
+
end # IRB
|
18
|
+
end # Environment
|
19
|
+
end # Command
|
20
|
+
end # CLI
|
21
|
+
end # Mutant
|
@@ -62,6 +62,7 @@ module Mutant
|
|
62
62
|
set(matcher: @config.matcher.add(attribute, value))
|
63
63
|
end
|
64
64
|
|
65
|
+
# rubocop:disable Metrics/MethodLength
|
65
66
|
def add_environment_options(parser)
|
66
67
|
parser.separator('Environment:')
|
67
68
|
parser.on('--zombie', 'Run mutant zombified') do
|
@@ -73,7 +74,14 @@ module Mutant
|
|
73
74
|
parser.on('-r', '--require NAME', 'Require file with NAME') do |name|
|
74
75
|
add(:requires, name)
|
75
76
|
end
|
77
|
+
parser.on('--env KEY=VALUE', 'Set environment variable') do |value|
|
78
|
+
match = ENV_VARIABLE_KEY_VALUE_REGEXP.match(value) || fail("Invalid env variable: #{value.inspect}")
|
79
|
+
set(
|
80
|
+
environment_variables: @config.environment_variables.merge(match[:key] => match[:value])
|
81
|
+
)
|
82
|
+
end
|
76
83
|
end
|
84
|
+
# rubocop:enable Metrics/MethodLength
|
77
85
|
|
78
86
|
def add_integration_options(parser)
|
79
87
|
parser.separator('Integration:')
|
@@ -4,7 +4,7 @@ module Mutant
|
|
4
4
|
module CLI
|
5
5
|
class Command
|
6
6
|
class Environment < self
|
7
|
-
SUBCOMMANDS = [Environment::Subject, Environment::Show, Environment::Test].freeze
|
7
|
+
SUBCOMMANDS = [Environment::Subject, Environment::Show, Environment::IRB, Environment::Test].freeze
|
8
8
|
end # Environment
|
9
9
|
|
10
10
|
class Root < self
|
data/lib/mutant/config.rb
CHANGED
@@ -5,9 +5,12 @@ module Mutant
|
|
5
5
|
#
|
6
6
|
# Does not reference any "external" volatile state. The configuration applied
|
7
7
|
# to current environment is being represented by the Mutant::Env object.
|
8
|
+
#
|
9
|
+
# rubocop:disable Metrics/ClassLength
|
8
10
|
class Config
|
9
11
|
include Adamantium, Anima.new(
|
10
12
|
:coverage_criteria,
|
13
|
+
:environment_variables,
|
11
14
|
:expression_parser,
|
12
15
|
:fail_fast,
|
13
16
|
:hooks,
|
@@ -48,16 +51,17 @@ module Mutant
|
|
48
51
|
# rubocop:disable Metrics/MethodLength
|
49
52
|
def merge(other)
|
50
53
|
other.with(
|
51
|
-
coverage_criteria:
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
coverage_criteria: coverage_criteria.merge(other.coverage_criteria),
|
55
|
+
environment_variables: environment_variables.merge(other.environment_variables),
|
56
|
+
fail_fast: fail_fast || other.fail_fast,
|
57
|
+
hooks: hooks + other.hooks,
|
58
|
+
includes: includes + other.includes,
|
59
|
+
integration: other.integration || integration,
|
60
|
+
jobs: other.jobs || jobs,
|
61
|
+
matcher: matcher.merge(other.matcher),
|
62
|
+
mutation_timeout: other.mutation_timeout || mutation_timeout,
|
63
|
+
requires: requires + other.requires,
|
64
|
+
zombie: zombie || other.zombie
|
61
65
|
)
|
62
66
|
end
|
63
67
|
# rubocop:enable Metrics/AbcSize
|
@@ -117,6 +121,24 @@ module Mutant
|
|
117
121
|
)
|
118
122
|
)
|
119
123
|
|
124
|
+
# Parse a hash of environment variables
|
125
|
+
#
|
126
|
+
# @param [Hash<Object,Object>]
|
127
|
+
#
|
128
|
+
# @return [Either<String,Hash<String,String>]
|
129
|
+
#
|
130
|
+
def self.parse_environment_variables(hash)
|
131
|
+
invalid = hash.keys.reject { |key| key.instance_of?(String) }
|
132
|
+
return Either::Left.new("Non string keys: #{invalid}") if invalid.any?
|
133
|
+
|
134
|
+
invalid = hash.keys.grep_v(ENV_VARIABLE_KEY_REGEXP)
|
135
|
+
return Either::Left.new("Invalid keys: #{invalid}") if invalid.any?
|
136
|
+
|
137
|
+
invalid = hash.values.reject { |value| value.instance_of?(String) }
|
138
|
+
return Either::Left.new("Non string values: #{invalid}") if invalid.any?
|
139
|
+
|
140
|
+
Either::Right.new(hash)
|
141
|
+
end
|
120
142
|
TRANSFORM = Transform::Sequence.new(
|
121
143
|
[
|
122
144
|
Transform::Exception.new(SystemCallError, :read.to_proc),
|
@@ -124,14 +146,23 @@ module Mutant
|
|
124
146
|
Transform::Hash.new(
|
125
147
|
optional: [
|
126
148
|
Transform::Hash::Key.new('coverage_criteria', ->(value) { CoverageCriteria::TRANSFORM.call(value) }),
|
127
|
-
Transform::Hash::Key.new(
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
149
|
+
Transform::Hash::Key.new(
|
150
|
+
'environment_variables',
|
151
|
+
Transform::Sequence.new(
|
152
|
+
[
|
153
|
+
Transform::Primitive.new(Hash),
|
154
|
+
Transform::Block.capture(:environment_variables, &method(:parse_environment_variables))
|
155
|
+
]
|
156
|
+
)
|
157
|
+
),
|
158
|
+
Transform::Hash::Key.new('fail_fast', Transform::BOOLEAN),
|
159
|
+
Transform::Hash::Key.new('hooks', PATHNAME_ARRAY),
|
160
|
+
Transform::Hash::Key.new('includes', Transform::STRING_ARRAY),
|
161
|
+
Transform::Hash::Key.new('integration', Transform::STRING),
|
162
|
+
Transform::Hash::Key.new('jobs', Transform::INTEGER),
|
163
|
+
Transform::Hash::Key.new('matcher', Matcher::Config::LOADER),
|
164
|
+
Transform::Hash::Key.new('mutation_timeout', Transform::FLOAT),
|
165
|
+
Transform::Hash::Key.new('requires', Transform::STRING_ARRAY)
|
135
166
|
],
|
136
167
|
required: []
|
137
168
|
),
|
@@ -141,4 +172,5 @@ module Mutant
|
|
141
172
|
|
142
173
|
private_constant(:TRANSFORM)
|
143
174
|
end # Config
|
175
|
+
# rubocop:enable Metrics/ClassLength
|
144
176
|
end # Mutant
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Expression
|
5
|
+
class Descendants < self
|
6
|
+
include Anima.new(:const_name)
|
7
|
+
|
8
|
+
REGEXP = /\Adescendants:(?<const_name>.+)\z/.freeze
|
9
|
+
|
10
|
+
def syntax
|
11
|
+
"descendants:#{const_name}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def matcher
|
15
|
+
Matcher::Descendants.new(const_name: const_name)
|
16
|
+
end
|
17
|
+
end # Descendants
|
18
|
+
end # Expression
|
19
|
+
end # Mutant
|
data/lib/mutant/matcher/chain.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Matcher
|
5
|
+
# Matcher for all descendants by constant name
|
6
|
+
class Descendants < self
|
7
|
+
include Anima.new(:const_name)
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
const = env.world.try_const_get(const_name) or return EMPTY_ARRAY
|
11
|
+
|
12
|
+
Chain.new(
|
13
|
+
matched_scopes(env, const).map { |scope| Scope.new(scope.raw) }
|
14
|
+
).call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def matched_scopes(env, const)
|
20
|
+
env.matchable_scopes.select do |scope|
|
21
|
+
scope.raw.equal?(const) || const > scope.raw
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end # Descendant
|
25
|
+
end # Matcher
|
26
|
+
end # Mutant
|
@@ -82,7 +82,17 @@ module Mutant
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def source_location
|
85
|
-
|
85
|
+
signature = sorbet_signature
|
86
|
+
|
87
|
+
if signature
|
88
|
+
signature.method.source_location
|
89
|
+
else
|
90
|
+
target_method.source_location
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def sorbet_signature
|
95
|
+
T::Private::Methods.signature_for_method(target_method)
|
86
96
|
end
|
87
97
|
|
88
98
|
def subject
|
@@ -21,7 +21,7 @@ module Mutant
|
|
21
21
|
# @return [Enumerable<Subject>]
|
22
22
|
def call(env)
|
23
23
|
Chain.new(
|
24
|
-
methods.map { |method| matcher.new(scope, method) }
|
24
|
+
methods(env).map { |method| matcher.new(scope, method) }
|
25
25
|
).call(env)
|
26
26
|
end
|
27
27
|
|
@@ -31,17 +31,16 @@ module Mutant
|
|
31
31
|
self.class::MATCHER
|
32
32
|
end
|
33
33
|
|
34
|
-
def methods
|
34
|
+
def methods(env)
|
35
35
|
candidate_names.each_with_object([]) do |name, methods|
|
36
|
-
method = access(name)
|
37
|
-
methods << method if method
|
36
|
+
method = access(env, name)
|
37
|
+
methods << method if method&.owner.equal?(candidate_scope)
|
38
38
|
end
|
39
39
|
end
|
40
|
-
memoize :methods
|
41
40
|
|
42
41
|
def candidate_names
|
43
42
|
CANDIDATE_NAMES
|
44
|
-
.map
|
43
|
+
.map { |name| candidate_scope.public_send(name, false) }
|
45
44
|
.reduce(:+)
|
46
45
|
.sort
|
47
46
|
end
|
@@ -55,7 +54,7 @@ module Mutant
|
|
55
54
|
|
56
55
|
private
|
57
56
|
|
58
|
-
def access(method_name)
|
57
|
+
def access(_env, method_name)
|
59
58
|
scope.method(method_name)
|
60
59
|
end
|
61
60
|
|
@@ -71,7 +70,7 @@ module Mutant
|
|
71
70
|
|
72
71
|
private
|
73
72
|
|
74
|
-
def access(method_name)
|
73
|
+
def access(_env, method_name)
|
75
74
|
scope.method(method_name)
|
76
75
|
end
|
77
76
|
|
@@ -84,11 +83,33 @@ module Mutant
|
|
84
83
|
class Instance < self
|
85
84
|
MATCHER = Matcher::Method::Instance
|
86
85
|
|
86
|
+
MESSAGE = <<~'MESSAGE'
|
87
|
+
Caught an exception while accessing a method with
|
88
|
+
#instance_method that is part of #{public,privat,protected}_instance_methods.
|
89
|
+
|
90
|
+
This is a bug in your ruby implementation its stdlib, libaries our your code.
|
91
|
+
|
92
|
+
Mutant will ignore this method:
|
93
|
+
|
94
|
+
Object: %<scope>s
|
95
|
+
Method: %<method_name>s
|
96
|
+
Exception: %<exception>s
|
97
|
+
|
98
|
+
See: https://github.com/mbj/mutant/issues/1273
|
99
|
+
MESSAGE
|
100
|
+
|
87
101
|
private
|
88
102
|
|
89
|
-
|
103
|
+
# rubocop:disable Lint/RescueException
|
104
|
+
def access(env, method_name)
|
90
105
|
scope.instance_method(method_name)
|
106
|
+
rescue Exception => exception
|
107
|
+
env.warn(
|
108
|
+
MESSAGE % { scope: scope, method_name: method_name, exception: exception }
|
109
|
+
)
|
110
|
+
nil
|
91
111
|
end
|
112
|
+
# rubocop:enable Lint/RescueException
|
92
113
|
|
93
114
|
def candidate_scope
|
94
115
|
scope
|
data/lib/mutant/version.rb
CHANGED
data/lib/mutant/world.rb
CHANGED
@@ -5,6 +5,7 @@ module Mutant
|
|
5
5
|
class World
|
6
6
|
include Adamantium, Anima.new(
|
7
7
|
:condition_variable,
|
8
|
+
:environment_variables,
|
8
9
|
:gem,
|
9
10
|
:gem_method,
|
10
11
|
:io,
|
@@ -49,6 +50,19 @@ module Mutant
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
53
|
+
# Try const get
|
54
|
+
#
|
55
|
+
# @param [String]
|
56
|
+
#
|
57
|
+
# @return [Class|Module|nil]
|
58
|
+
#
|
59
|
+
# rubocop:disable Lint/SuppressedException
|
60
|
+
def try_const_get(name)
|
61
|
+
kernel.const_get(name)
|
62
|
+
rescue NameError
|
63
|
+
end
|
64
|
+
# rubocop:enable Lint/SuppressedException
|
65
|
+
|
52
66
|
# Deadline
|
53
67
|
#
|
54
68
|
# @param [Float, nil] allowed_time
|
data/lib/mutant.rb
CHANGED
@@ -4,6 +4,7 @@ require 'diff/lcs'
|
|
4
4
|
require 'diff/lcs/hunk'
|
5
5
|
require 'digest/sha1'
|
6
6
|
require 'etc'
|
7
|
+
require 'irb'
|
7
8
|
require 'json'
|
8
9
|
require 'open3'
|
9
10
|
require 'optparse'
|
@@ -13,6 +14,7 @@ require 'pathname'
|
|
13
14
|
require 'regexp_parser'
|
14
15
|
require 'set'
|
15
16
|
require 'singleton'
|
17
|
+
require 'sorbet-runtime'
|
16
18
|
require 'stringio'
|
17
19
|
require 'unparser'
|
18
20
|
require 'yaml'
|
@@ -36,6 +38,11 @@ module Mutant
|
|
36
38
|
EMPTY_ARRAY = [].freeze
|
37
39
|
EMPTY_HASH = {}.freeze
|
38
40
|
SCOPE_OPERATOR = '::'
|
41
|
+
|
42
|
+
env_key = /[a-zA-Z_\d]+/
|
43
|
+
|
44
|
+
ENV_VARIABLE_KEY_VALUE_REGEXP = /\A(?<key>#{env_key}+)=(?<value>.*)\z/.freeze
|
45
|
+
ENV_VARIABLE_KEY_REGEXP = /\A#{env_key}\z/.freeze
|
39
46
|
end # Mutant
|
40
47
|
|
41
48
|
require 'mutant/procto'
|
@@ -162,23 +169,25 @@ require 'mutant/subject/method/instance'
|
|
162
169
|
require 'mutant/subject/method/singleton'
|
163
170
|
require 'mutant/subject/method/metaclass'
|
164
171
|
require 'mutant/matcher'
|
165
|
-
require 'mutant/matcher/config'
|
166
172
|
require 'mutant/matcher/chain'
|
173
|
+
require 'mutant/matcher/config'
|
174
|
+
require 'mutant/matcher/descendants'
|
175
|
+
require 'mutant/matcher/filter'
|
167
176
|
require 'mutant/matcher/method'
|
168
|
-
require 'mutant/matcher/method/singleton'
|
169
|
-
require 'mutant/matcher/method/metaclass'
|
170
177
|
require 'mutant/matcher/method/instance'
|
178
|
+
require 'mutant/matcher/method/metaclass'
|
179
|
+
require 'mutant/matcher/method/singleton'
|
171
180
|
require 'mutant/matcher/methods'
|
172
181
|
require 'mutant/matcher/namespace'
|
173
|
-
require 'mutant/matcher/scope'
|
174
|
-
require 'mutant/matcher/filter'
|
175
182
|
require 'mutant/matcher/null'
|
183
|
+
require 'mutant/matcher/scope'
|
176
184
|
require 'mutant/matcher/static'
|
177
185
|
require 'mutant/expression'
|
178
|
-
require 'mutant/expression/
|
186
|
+
require 'mutant/expression/descendants'
|
179
187
|
require 'mutant/expression/method'
|
180
188
|
require 'mutant/expression/methods'
|
181
189
|
require 'mutant/expression/namespace'
|
190
|
+
require 'mutant/expression/parser'
|
182
191
|
require 'mutant/test'
|
183
192
|
require 'mutant/timer'
|
184
193
|
require 'mutant/integration'
|
@@ -194,6 +203,7 @@ require 'mutant/cli'
|
|
194
203
|
require 'mutant/cli/command'
|
195
204
|
require 'mutant/cli/command/subscription'
|
196
205
|
require 'mutant/cli/command/environment'
|
206
|
+
require 'mutant/cli/command/environment/irb'
|
197
207
|
require 'mutant/cli/command/environment/run'
|
198
208
|
require 'mutant/cli/command/environment/show'
|
199
209
|
require 'mutant/cli/command/environment/subject'
|
@@ -231,46 +241,49 @@ require 'mutant/license/subscription/commercial'
|
|
231
241
|
|
232
242
|
module Mutant
|
233
243
|
WORLD = World.new(
|
234
|
-
condition_variable:
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
244
|
+
condition_variable: ConditionVariable,
|
245
|
+
environment_variables: ENV,
|
246
|
+
gem: Gem,
|
247
|
+
gem_method: method(:gem),
|
248
|
+
io: IO,
|
249
|
+
json: JSON,
|
250
|
+
kernel: Kernel,
|
251
|
+
load_path: $LOAD_PATH,
|
252
|
+
marshal: Marshal,
|
253
|
+
mutex: Mutex,
|
254
|
+
object_space: ObjectSpace,
|
255
|
+
open3: Open3,
|
256
|
+
pathname: Pathname,
|
257
|
+
process: Process,
|
258
|
+
stderr: $stderr,
|
259
|
+
stdout: $stdout,
|
260
|
+
thread: Thread,
|
261
|
+
timer: Timer.new(Process)
|
251
262
|
)
|
252
263
|
|
253
264
|
# Reopen class to initialize constant to avoid dep circle
|
254
265
|
class Config
|
255
266
|
DEFAULT = new(
|
256
|
-
coverage_criteria:
|
257
|
-
expression_parser:
|
267
|
+
coverage_criteria: Config::CoverageCriteria::EMPTY,
|
268
|
+
expression_parser: Expression::Parser.new([
|
269
|
+
Expression::Descendants,
|
258
270
|
Expression::Method,
|
259
271
|
Expression::Methods,
|
260
272
|
Expression::Namespace::Exact,
|
261
273
|
Expression::Namespace::Recursive
|
262
274
|
]),
|
263
|
-
fail_fast:
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
275
|
+
fail_fast: false,
|
276
|
+
environment_variables: EMPTY_HASH,
|
277
|
+
hooks: EMPTY_ARRAY,
|
278
|
+
includes: EMPTY_ARRAY,
|
279
|
+
integration: nil,
|
280
|
+
isolation: Mutant::Isolation::Fork.new(WORLD),
|
281
|
+
jobs: nil,
|
282
|
+
matcher: Matcher::Config::DEFAULT,
|
283
|
+
mutation_timeout: nil,
|
284
|
+
reporter: Reporter::CLI.build(WORLD.stdout),
|
285
|
+
requires: EMPTY_ARRAY,
|
286
|
+
zombie: false
|
274
287
|
)
|
275
288
|
end # Config
|
276
289
|
|
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.
|
4
|
+
version: 0.11.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: diff-lcs
|
@@ -58,20 +58,34 @@ dependencies:
|
|
58
58
|
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 2.0.3
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: sorbet-runtime
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.5.0
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.5.0
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
76
|
name: unparser
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
79
|
- - "~>"
|
66
80
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.6.
|
81
|
+
version: 0.6.2
|
68
82
|
type: :runtime
|
69
83
|
prerelease: false
|
70
84
|
version_requirements: !ruby/object:Gem::Requirement
|
71
85
|
requirements:
|
72
86
|
- - "~>"
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.6.
|
88
|
+
version: 0.6.2
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: parallel
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -180,6 +194,7 @@ files:
|
|
180
194
|
- lib/mutant/cli.rb
|
181
195
|
- lib/mutant/cli/command.rb
|
182
196
|
- lib/mutant/cli/command/environment.rb
|
197
|
+
- lib/mutant/cli/command/environment/irb.rb
|
183
198
|
- lib/mutant/cli/command/environment/run.rb
|
184
199
|
- lib/mutant/cli/command/environment/show.rb
|
185
200
|
- lib/mutant/cli/command/environment/subject.rb
|
@@ -192,6 +207,7 @@ files:
|
|
192
207
|
- lib/mutant/context.rb
|
193
208
|
- lib/mutant/env.rb
|
194
209
|
- lib/mutant/expression.rb
|
210
|
+
- lib/mutant/expression/descendants.rb
|
195
211
|
- lib/mutant/expression/method.rb
|
196
212
|
- lib/mutant/expression/methods.rb
|
197
213
|
- lib/mutant/expression/namespace.rb
|
@@ -211,6 +227,7 @@ files:
|
|
211
227
|
- lib/mutant/matcher.rb
|
212
228
|
- lib/mutant/matcher/chain.rb
|
213
229
|
- lib/mutant/matcher/config.rb
|
230
|
+
- lib/mutant/matcher/descendants.rb
|
214
231
|
- lib/mutant/matcher/filter.rb
|
215
232
|
- lib/mutant/matcher/method.rb
|
216
233
|
- lib/mutant/matcher/method/instance.rb
|
@@ -360,7 +377,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
360
377
|
requirements:
|
361
378
|
- - ">="
|
362
379
|
- !ruby/object:Gem::Version
|
363
|
-
version: '2.
|
380
|
+
version: '2.6'
|
364
381
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
365
382
|
requirements:
|
366
383
|
- - ">="
|