mutant 0.11.18 → 0.11.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant/ast/find_metaclass_containing.rb +1 -1
  3. data/lib/mutant/ast/meta/const.rb +1 -1
  4. data/lib/mutant/ast/meta/optarg.rb +1 -1
  5. data/lib/mutant/ast/meta/resbody.rb +1 -1
  6. data/lib/mutant/ast/meta/send.rb +3 -3
  7. data/lib/mutant/ast/meta/symbol.rb +1 -1
  8. data/lib/mutant/ast/types.rb +2 -1311
  9. data/lib/mutant/bootstrap.rb +2 -2
  10. data/lib/mutant/cli/command/environment/run.rb +1 -1
  11. data/lib/mutant/cli/command/environment.rb +1 -3
  12. data/lib/mutant/cli/command/util.rb +6 -6
  13. data/lib/mutant/config/coverage_criteria.rb +13 -4
  14. data/lib/mutant/config.rb +51 -24
  15. data/lib/mutant/context.rb +1 -6
  16. data/lib/mutant/env.rb +1 -1
  17. data/lib/mutant/expression/method.rb +6 -3
  18. data/lib/mutant/expression/methods.rb +2 -2
  19. data/lib/mutant/expression/namespace.rb +2 -2
  20. data/lib/mutant/expression/parser.rb +1 -1
  21. data/lib/mutant/hooks.rb +4 -4
  22. data/lib/mutant/isolation/fork.rb +1 -1
  23. data/lib/mutant/license/subscription/commercial.rb +3 -3
  24. data/lib/mutant/license/subscription/opensource.rb +5 -9
  25. data/lib/mutant/license/subscription.rb +1 -1
  26. data/lib/mutant/matcher/chain.rb +1 -1
  27. data/lib/mutant/matcher/config.rb +10 -4
  28. data/lib/mutant/matcher/descendants.rb +1 -1
  29. data/lib/mutant/matcher/filter.rb +1 -1
  30. data/lib/mutant/matcher/method/instance.rb +9 -4
  31. data/lib/mutant/matcher/method/metaclass.rb +4 -17
  32. data/lib/mutant/matcher/method/singleton.rb +3 -13
  33. data/lib/mutant/matcher/method.rb +4 -4
  34. data/lib/mutant/matcher/methods.rb +4 -2
  35. data/lib/mutant/matcher/namespace.rb +2 -2
  36. data/lib/mutant/matcher/scope.rb +3 -3
  37. data/lib/mutant/matcher/static.rb +1 -1
  38. data/lib/mutant/matcher.rb +2 -2
  39. data/lib/mutant/meta/example/verification.rb +2 -2
  40. data/lib/mutant/meta/example.rb +4 -4
  41. data/lib/mutant/mutation/config.rb +10 -4
  42. data/lib/mutant/mutation/runner/sink.rb +80 -0
  43. data/lib/mutant/mutation/runner.rb +61 -0
  44. data/lib/mutant/mutation.rb +1 -1
  45. data/lib/mutant/mutator/node/block.rb +2 -2
  46. data/lib/mutant/mutator/node/define.rb +1 -1
  47. data/lib/mutant/mutator/node/if.rb +9 -0
  48. data/lib/mutant/mutator/node/rescue.rb +1 -1
  49. data/lib/mutant/mutator/node/send.rb +4 -4
  50. data/lib/mutant/mutator/regexp.rb +2 -2
  51. data/lib/mutant/parallel/source.rb +1 -1
  52. data/lib/mutant/pipe.rb +3 -3
  53. data/lib/mutant/registry.rb +2 -2
  54. data/lib/mutant/reporter/cli/format.rb +3 -3
  55. data/lib/mutant/reporter/cli/printer.rb +2 -2
  56. data/lib/mutant/reporter/cli.rb +4 -4
  57. data/lib/mutant/reporter/sequence.rb +1 -1
  58. data/lib/mutant/repository.rb +1 -1
  59. data/lib/mutant/result.rb +1 -1
  60. data/lib/mutant/scope.rb +1 -1
  61. data/lib/mutant/selector/expression.rb +1 -1
  62. data/lib/mutant/subject.rb +2 -2
  63. data/lib/mutant/timer.rb +3 -3
  64. data/lib/mutant/transform.rb +14 -14
  65. data/lib/mutant/version.rb +1 -1
  66. data/lib/mutant.rb +13 -11
  67. metadata +9 -9
  68. data/lib/mutant/runner/sink.rb +0 -78
  69. data/lib/mutant/runner.rb +0 -60
@@ -56,13 +56,13 @@ module Mutant
56
56
 
57
57
  # Wrapper adding a name to a transformation
58
58
  class Named < self
59
- include Concord.new(:name, :transformer)
59
+ include Anima.new(:name, :transform)
60
60
 
61
61
  # Apply transformation to input
62
62
  #
63
63
  # @return [Either<Error, Object>]
64
64
  def call(input)
65
- transformer.call(input).lmap(&method(:wrap_error))
65
+ transform.call(input).lmap(&method(:wrap_error))
66
66
  end
67
67
 
68
68
  # Named slug
@@ -166,7 +166,7 @@ module Mutant
166
166
 
167
167
  # Transform guarding a specific primitive
168
168
  class Primitive < self
169
- include Concord.new(:primitive)
169
+ include Anima.new(:primitive)
170
170
 
171
171
  MESSAGE = 'Expected: %<expected>s but got: %<actual>s'
172
172
 
@@ -228,10 +228,10 @@ module Mutant
228
228
 
229
229
  # Transform an array via mapping it over transform
230
230
  class Array < self
231
- include Concord.new(:transform)
231
+ include Anima.new(:transform)
232
232
 
233
233
  MESSAGE = 'Failed to coerce array at index: %<index>d'
234
- PRIMITIVE = Primitive.new(::Array)
234
+ PRIMITIVE = Primitive.new(primitive: ::Array)
235
235
 
236
236
  private_constant(*constants(false))
237
237
 
@@ -275,7 +275,7 @@ module Mutant
275
275
  include Anima.new(:optional, :required)
276
276
 
277
277
  KEY_MESSAGE = 'Missing keys: %<missing>s, Unexpected keys: %<unexpected>s'
278
- PRIMITIVE = Primitive.new(::Hash)
278
+ PRIMITIVE = Primitive.new(primitive: ::Hash)
279
279
 
280
280
  private_constant(*constants(false))
281
281
 
@@ -293,7 +293,7 @@ module Mutant
293
293
 
294
294
  # Key specific transformation
295
295
  class Key < Transform
296
- include Concord::Public.new(:value, :transform)
296
+ include Anima.new(:value, :transform)
297
297
 
298
298
  # Rendering slug
299
299
  #
@@ -401,7 +401,7 @@ module Mutant
401
401
 
402
402
  # Sequence of transformations
403
403
  class Sequence < self
404
- include Concord.new(:steps)
404
+ include Anima.new(:steps)
405
405
 
406
406
  # Apply transformation to input
407
407
  #
@@ -423,7 +423,7 @@ module Mutant
423
423
 
424
424
  # Always successful transformation
425
425
  class Success < self
426
- include Concord.new(:block)
426
+ include Anima.new(:block)
427
427
 
428
428
  # Apply transformation to input
429
429
  #
@@ -437,7 +437,7 @@ module Mutant
437
437
 
438
438
  # Generic exception transformer
439
439
  class Exception < self
440
- include Concord.new(:error_class, :block)
440
+ include Anima.new(:error_class, :block)
441
441
 
442
442
  # Apply transformation to input
443
443
  #
@@ -452,9 +452,9 @@ module Mutant
452
452
  end # Exception
453
453
 
454
454
  BOOLEAN = Transform::Boolean.new
455
- FLOAT = Transform::Primitive.new(Float)
456
- INTEGER = Transform::Primitive.new(Integer)
457
- STRING = Transform::Primitive.new(String)
458
- STRING_ARRAY = Transform::Array.new(STRING)
455
+ FLOAT = Transform::Primitive.new(primitive: Float)
456
+ INTEGER = Transform::Primitive.new(primitive: Integer)
457
+ STRING = Transform::Primitive.new(primitive: String)
458
+ STRING_ARRAY = Transform::Array.new(transform: STRING)
459
459
  end # Transform
460
460
  end # Mutant
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mutant
4
4
  # Current mutant version
5
- VERSION = '0.11.18'
5
+ VERSION = '0.11.19'
6
6
  end # Mutant
data/lib/mutant.rb CHANGED
@@ -224,8 +224,8 @@ module Mutant
224
224
  require 'mutant/cli/command/environment/test'
225
225
  require 'mutant/cli/command/util'
226
226
  require 'mutant/cli/command/root'
227
- require 'mutant/runner'
228
- require 'mutant/runner/sink'
227
+ require 'mutant/mutation/runner'
228
+ require 'mutant/mutation/runner/sink'
229
229
  require 'mutant/result'
230
230
  require 'mutant/reporter'
231
231
  require 'mutant/reporter/null'
@@ -295,7 +295,7 @@ module Mutant
295
295
  )
296
296
  end
297
297
 
298
- timer = Timer.new(Process)
298
+ timer = Timer.new(process: Process)
299
299
 
300
300
  recorder = Segment::Recorder.new(
301
301
  gen_id: gen_id,
@@ -333,19 +333,21 @@ module Mutant
333
333
  class Config
334
334
  DEFAULT = new(
335
335
  coverage_criteria: Config::CoverageCriteria::DEFAULT,
336
- expression_parser: Expression::Parser.new([
337
- Expression::Descendants,
338
- Expression::Method,
339
- Expression::Methods,
340
- Expression::Namespace::Exact,
341
- Expression::Namespace::Recursive
342
- ]),
336
+ expression_parser: Expression::Parser.new(
337
+ types: [
338
+ Expression::Descendants,
339
+ Expression::Method,
340
+ Expression::Methods,
341
+ Expression::Namespace::Exact,
342
+ Expression::Namespace::Recursive
343
+ ]
344
+ ),
343
345
  environment_variables: EMPTY_HASH,
344
346
  fail_fast: false,
345
347
  hooks: EMPTY_ARRAY,
346
348
  includes: EMPTY_ARRAY,
347
349
  integration: nil,
348
- isolation: Mutant::Isolation::Fork.new(WORLD),
350
+ isolation: Mutant::Isolation::Fork.new(world: WORLD),
349
351
  jobs: nil,
350
352
  matcher: Matcher::Config::DEFAULT,
351
353
  mutation: Mutation::Config::DEFAULT,
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.11.18
4
+ version: 0.11.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-08 00:00:00.000000000 Z
11
+ date: 2023-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diff-lcs
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.0
33
+ version: 3.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.2.0
40
+ version: 3.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: regexp_parser
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.6.6
75
+ version: 0.6.7
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.6.6
82
+ version: 0.6.7
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: parallel
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -235,6 +235,8 @@ files:
235
235
  - lib/mutant/meta/example/verification.rb
236
236
  - lib/mutant/mutation.rb
237
237
  - lib/mutant/mutation/config.rb
238
+ - lib/mutant/mutation/runner.rb
239
+ - lib/mutant/mutation/runner/sink.rb
238
240
  - lib/mutant/mutator.rb
239
241
  - lib/mutant/mutator/node.rb
240
242
  - lib/mutant/mutator/node/and_asgn.rb
@@ -330,8 +332,6 @@ files:
330
332
  - lib/mutant/repository/diff/ranges.rb
331
333
  - lib/mutant/require_highjack.rb
332
334
  - lib/mutant/result.rb
333
- - lib/mutant/runner.rb
334
- - lib/mutant/runner/sink.rb
335
335
  - lib/mutant/scope.rb
336
336
  - lib/mutant/segment.rb
337
337
  - lib/mutant/segment/recorder.rb
@@ -372,7 +372,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
372
372
  - !ruby/object:Gem::Version
373
373
  version: '0'
374
374
  requirements: []
375
- rubygems_version: 3.3.26
375
+ rubygems_version: 3.4.10
376
376
  signing_key:
377
377
  specification_version: 4
378
378
  summary: ''
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Mutant
4
- module Runner
5
- class Sink
6
- include Concord.new(:env)
7
-
8
- # Initialize object
9
- #
10
- # @return [undefined]
11
- def initialize(*)
12
- super
13
- @start = env.world.timer.now
14
- @subject_results = {}
15
- end
16
-
17
- # Runner status
18
- #
19
- # @return [Result::Env]
20
- def status
21
- Result::Env.new(
22
- env: env,
23
- runtime: env.world.timer.now - @start,
24
- subject_results: @subject_results.values
25
- )
26
- end
27
-
28
- # Test if scheduling stopped
29
- #
30
- # @return [Boolean]
31
- def stop?
32
- status.stop?
33
- end
34
-
35
- # Handle mutation finish
36
- #
37
- # @param [Result::MutationIndex] mutation_index_result
38
- #
39
- # @return [self]
40
- def result(mutation_index_result)
41
- mutation_result = mutation_result(mutation_index_result)
42
-
43
- subject = mutation_result.mutation.subject
44
-
45
- @subject_results[subject] = Result::Subject.new(
46
- subject: subject,
47
- coverage_results: previous_coverage_results(subject).dup << coverage_result(mutation_result),
48
- tests: env.selections.fetch(subject)
49
- )
50
-
51
- self
52
- end
53
-
54
- private
55
-
56
- def coverage_result(mutation_result)
57
- Result::Coverage.new(
58
- mutation_result: mutation_result,
59
- criteria_result: mutation_result.criteria_result(env.config.coverage_criteria)
60
- )
61
- end
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
-
71
- def previous_coverage_results(subject)
72
- subject_result = @subject_results.fetch(subject) { return EMPTY_ARRAY }
73
- subject_result.coverage_results
74
- end
75
-
76
- end # Sink
77
- end # Runner
78
- end # Mutant
data/lib/mutant/runner.rb DELETED
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Mutant
4
- # Runner
5
- module Runner
6
- # Run against env
7
- #
8
- # @return [Either<String, Result>]
9
- def self.call(env)
10
- reporter(env).start(env)
11
-
12
- Either::Right.new(run_mutation_analysis(env))
13
- end
14
-
15
- def self.run_mutation_analysis(env)
16
- reporter = reporter(env)
17
-
18
- env
19
- .record(:analysis) { run_driver(reporter, async_driver(env)) }
20
- .tap { |result| env.record(:report) { reporter.report(result) } }
21
- end
22
- private_class_method :run_mutation_analysis
23
-
24
- def self.async_driver(env)
25
- Parallel.async(env.world, mutation_test_config(env))
26
- end
27
- private_class_method :async_driver
28
-
29
- def self.run_driver(reporter, driver)
30
- Signal.trap('INT') do
31
- driver.stop
32
- end
33
-
34
- loop do
35
- status = driver.wait_timeout(reporter.delay)
36
- break status.payload if status.done?
37
- reporter.progress(status)
38
- end
39
- end
40
- private_class_method :run_driver
41
-
42
- def self.mutation_test_config(env)
43
- Parallel::Config.new(
44
- block: env.method(:cover_index),
45
- jobs: env.config.jobs,
46
- process_name: 'mutant-worker-process',
47
- sink: Sink.new(env),
48
- source: Parallel::Source::Array.new(env.mutations.each_index.to_a),
49
- thread_name: 'mutant-worker-thread'
50
- )
51
- end
52
- private_class_method :mutation_test_config
53
-
54
- def self.reporter(env)
55
- env.config.reporter
56
- end
57
- private_class_method :reporter
58
-
59
- end # Runner
60
- end # Mutant