mutant 0.10.34 → 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="