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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccd2a5c4c1c3ddf3b7eea82c613a144594609387a414cac729b75c4645295f47
4
- data.tar.gz: e173ad25eb08658a040a7ca7cb6dca36a1d8bc9f01137e63fed081069b3ab9cb
3
+ metadata.gz: b75a7265756d1903cb93a5937959a7fca2a38d157eedf9287d1004b7bd5a05a4
4
+ data.tar.gz: 96c7945d43c9ba8dd5c9ef362b4bccc5a536eddf91526a9cb1bce4333df542cc
5
5
  SHA512:
6
- metadata.gz: bdebc9987d92b122b409715cc7933dc86952ae6dc58ed8f9a5525bcbfe8dc0aae93cf773622eced59643d27d4311df1f94f9c41a1abd1adc93e4a6b65771118d
7
- data.tar.gz: 9e7d2dde25b8e532301475e8b7bc970626db00d36ce0abd5e4082aa2b39599a86372b4de93e5d61470f974f90539cf5445d51e242bcfbfec600ad8a5fca2b5aa
6
+ metadata.gz: 53bf6c9d0de1fb8305fa7e7fce7e2072e381c6a088b0f6e08049222f46de4f908466d498c104f72fd19ddcf1cd7fa2f1cbc2beff099bd5529e880b3bf6a4c2ae
7
+ data.tar.gz: 3cc43c8eefce22bceb8465c4b475d4e0cc5b1e2c01a29997713e137605483d33ff792e368a37afd66316113f0495ae2ac265ec22af638cb112785da95f2261f9
@@ -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: coverage_criteria.merge(other.coverage_criteria),
52
- fail_fast: fail_fast || other.fail_fast,
53
- hooks: hooks + other.hooks,
54
- includes: includes + other.includes,
55
- integration: other.integration || integration,
56
- jobs: other.jobs || jobs,
57
- matcher: matcher.merge(other.matcher),
58
- mutation_timeout: other.mutation_timeout || mutation_timeout,
59
- requires: requires + other.requires,
60
- zombie: zombie || other.zombie
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('fail_fast', Transform::BOOLEAN),
128
- Transform::Hash::Key.new('hooks', PATHNAME_ARRAY),
129
- Transform::Hash::Key.new('includes', Transform::STRING_ARRAY),
130
- Transform::Hash::Key.new('integration', Transform::STRING),
131
- Transform::Hash::Key.new('jobs', Transform::INTEGER),
132
- Transform::Hash::Key.new('matcher', Matcher::Config::LOADER),
133
- Transform::Hash::Key.new('mutation_timeout', Transform::FLOAT),
134
- Transform::Hash::Key.new('requires', Transform::STRING_ARRAY)
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
@@ -14,7 +14,7 @@ module Mutant
14
14
  def call(env)
15
15
  matchers.flat_map do |matcher|
16
16
  matcher.call(env)
17
- end
17
+ end.uniq
18
18
  end
19
19
 
20
20
  end # Chain
@@ -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
- target_method.source_location
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.owner.equal?(candidate_scope)
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(&candidate_scope.public_method(:public_send))
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
- def access(method_name)
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
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mutant
4
4
  # Current mutant version
5
- VERSION = '0.10.34'
5
+ VERSION = '0.11.2'
6
6
  end # Mutant
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/parser'
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: ConditionVariable,
235
- gem: Gem,
236
- gem_method: method(:gem),
237
- io: IO,
238
- json: JSON,
239
- kernel: Kernel,
240
- load_path: $LOAD_PATH,
241
- marshal: Marshal,
242
- mutex: Mutex,
243
- object_space: ObjectSpace,
244
- open3: Open3,
245
- pathname: Pathname,
246
- process: Process,
247
- stderr: $stderr,
248
- stdout: $stdout,
249
- thread: Thread,
250
- timer: Timer.new(Process)
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: Config::CoverageCriteria::EMPTY,
257
- expression_parser: Expression::Parser.new([
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: false,
264
- hooks: EMPTY_ARRAY,
265
- includes: EMPTY_ARRAY,
266
- integration: nil,
267
- isolation: Mutant::Isolation::Fork.new(WORLD),
268
- jobs: nil,
269
- matcher: Matcher::Config::DEFAULT,
270
- mutation_timeout: nil,
271
- reporter: Reporter::CLI.build(WORLD.stdout),
272
- requires: EMPTY_ARRAY,
273
- zombie: false
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.10.34
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-08-30 00:00:00.000000000 Z
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.0
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.0
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.5'
380
+ version: '2.6'
364
381
  required_rubygems_version: !ruby/object:Gem::Requirement
365
382
  requirements:
366
383
  - - ">="