mutant 0.11.18 → 0.11.19

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.
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