mutant 0.11.0 → 0.11.4
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/LICENSE +2 -2
 - data/lib/mutant/bootstrap.rb +4 -0
 - data/lib/mutant/cli/command/environment.rb +8 -0
 - 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/methods.rb +32 -9
 - data/lib/mutant/mutator/node/arguments.rb +13 -2
 - data/lib/mutant/mutator/node/block_pass.rb +1 -0
 - data/lib/mutant/version.rb +1 -1
 - data/lib/mutant/world.rb +14 -0
 - data/lib/mutant.rb +46 -36
 - metadata +9 -7
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 70a7ce19bef24f9e278efb7beee74d9ae0eed625f0e4e4a712d9330ac1907339
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 814ca08aed382018685010ca642903ea1e4da3226ae4c7c0fb0fae920818be49
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3461d1141fdb8ec16d4262aaf9542ec9db4fc00bc31adf97024803ebd71133de3738c55dd08000f080ae59c8a29a6877eb9758001ea42ff54637a7b09d91e1ac
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e03447c1d1d192fa98641fbee718ef3e6440b69a43d88023741635e348df94fe336cd92e716a1d8a9e638fba230530377a98ea413890f97b6654c0e45e88960e
         
     | 
    
        data/LICENSE
    CHANGED
    
    | 
         @@ -5,8 +5,8 @@ END-USER LICENSE AGREEMENT 
     | 
|
| 
       5 
5 
     | 
    
         
             
            IMPORTANT: THIS SOFTWARE END-USER LICENSE AGREEMENT ("EULA") IS A LEGAL
         
     | 
| 
       6 
6 
     | 
    
         
             
            AGREEMENT (“Agreement”) BETWEEN YOU (THE CUSTOMER, EITHER AS AN INDIVIDUAL OR,
         
     | 
| 
       7 
7 
     | 
    
         
             
            IF PURCHASED OR OTHERWISE ACQUIRED BY OR FOR AN ENTITY, AS AN ENTITY) AND
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            PROCESS AND USING  
     | 
| 
      
 8 
     | 
    
         
            +
            SCHIRP DSO LTD.  READ IT CAREFULLY BEFORE COMPLETING THE INSTALLATION
         
     | 
| 
      
 9 
     | 
    
         
            +
            PROCESS AND USING MUTANT AND RELATED SOFTWARE COMPONENTS (“SOFTWARE”).
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            IT PROVIDES A LICENSE TO USE THE SOFTWARE AND CONTAINS WARRANTY INFORMATION
         
     | 
| 
       12 
12 
     | 
    
         
             
            AND LIABILITY DISCLAIMERS. BY INSTALLING AND USING THE SOFTWARE, YOU ARE
         
     | 
    
        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 
     | 
    
         | 
| 
         @@ -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:')
         
     | 
    
        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
         
     | 
| 
         @@ -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,35 @@ 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:
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                      %<exception>s
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                      See: https://github.com/mbj/mutant/issues/1273
         
     | 
| 
      
 101 
     | 
    
         
            +
                    MESSAGE
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
       87 
103 
     | 
    
         
             
                  private
         
     | 
| 
       88 
104 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
                     
     | 
| 
      
 105 
     | 
    
         
            +
                    # rubocop:disable Lint/RescueException
         
     | 
| 
      
 106 
     | 
    
         
            +
                    def access(env, method_name)
         
     | 
| 
       90 
107 
     | 
    
         
             
                      scope.instance_method(method_name)
         
     | 
| 
      
 108 
     | 
    
         
            +
                    rescue Exception => exception
         
     | 
| 
      
 109 
     | 
    
         
            +
                      env.warn(
         
     | 
| 
      
 110 
     | 
    
         
            +
                        MESSAGE % { scope: scope, method_name: method_name, exception: exception }
         
     | 
| 
      
 111 
     | 
    
         
            +
                      )
         
     | 
| 
      
 112 
     | 
    
         
            +
                      nil
         
     | 
| 
       91 
113 
     | 
    
         
             
                    end
         
     | 
| 
      
 114 
     | 
    
         
            +
                    # rubocop:enable Lint/RescueException
         
     | 
| 
       92 
115 
     | 
    
         | 
| 
       93 
116 
     | 
    
         
             
                    def candidate_scope
         
     | 
| 
       94 
117 
     | 
    
         
             
                      scope
         
     | 
| 
         @@ -6,6 +6,8 @@ module Mutant 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  # Mutator for arguments node
         
     | 
| 
       7 
7 
     | 
    
         
             
                  class Arguments < self
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
                    ANONYMOUS_BLOCKARG_PRED = ::Parser::AST::Node.new(:blockarg, [nil]).method(:eql?)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       9 
11 
     | 
    
         
             
                    handle(:args)
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
                  private
         
     | 
| 
         @@ -17,15 +19,24 @@ module Mutant 
     | 
|
| 
       17 
19 
     | 
    
         
             
                    end
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
       19 
21 
     | 
    
         
             
                    def emit_argument_presence
         
     | 
| 
       20 
     | 
    
         
            -
                      emit_type
         
     | 
| 
      
 22 
     | 
    
         
            +
                      emit_type unless removed_block_arg?(EMPTY_ARRAY)
         
     | 
| 
       21 
23 
     | 
    
         | 
| 
       22 
24 
     | 
    
         
             
                      Util::Array::Presence.call(children).each do |children|
         
     | 
| 
       23 
     | 
    
         
            -
                        unless children.one? && n_mlhs?(children.first)
         
     | 
| 
      
 25 
     | 
    
         
            +
                        unless removed_block_arg?(children) || (children.one? && n_mlhs?(children.first))
         
     | 
| 
       24 
26 
     | 
    
         
             
                          emit_type(*children)
         
     | 
| 
       25 
27 
     | 
    
         
             
                        end
         
     | 
| 
       26 
28 
     | 
    
         
             
                      end
         
     | 
| 
       27 
29 
     | 
    
         
             
                    end
         
     | 
| 
       28 
30 
     | 
    
         | 
| 
      
 31 
     | 
    
         
            +
                    def removed_block_arg?(children)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      anonymous_block_arg? && children.none?(&ANONYMOUS_BLOCKARG_PRED)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    def anonymous_block_arg?
         
     | 
| 
      
 36 
     | 
    
         
            +
                      children.any?(&ANONYMOUS_BLOCKARG_PRED)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
                    memoize :anonymous_block_arg?
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
       29 
40 
     | 
    
         
             
                    def emit_argument_mutations
         
     | 
| 
       30 
41 
     | 
    
         
             
                      children.each_with_index do |child, index|
         
     | 
| 
       31 
42 
     | 
    
         
             
                        Mutator.mutate(child).each do |mutant|
         
     | 
    
        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
    
    | 
         @@ -38,6 +38,11 @@ module Mutant 
     | 
|
| 
       38 
38 
     | 
    
         
             
              EMPTY_ARRAY    = [].freeze
         
     | 
| 
       39 
39 
     | 
    
         
             
              EMPTY_HASH     = {}.freeze
         
     | 
| 
       40 
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
         
     | 
| 
       41 
46 
     | 
    
         
             
            end # Mutant
         
     | 
| 
       42 
47 
     | 
    
         | 
| 
       43 
48 
     | 
    
         
             
            require 'mutant/procto'
         
     | 
| 
         @@ -164,23 +169,25 @@ require 'mutant/subject/method/instance' 
     | 
|
| 
       164 
169 
     | 
    
         
             
            require 'mutant/subject/method/singleton'
         
     | 
| 
       165 
170 
     | 
    
         
             
            require 'mutant/subject/method/metaclass'
         
     | 
| 
       166 
171 
     | 
    
         
             
            require 'mutant/matcher'
         
     | 
| 
       167 
     | 
    
         
            -
            require 'mutant/matcher/config'
         
     | 
| 
       168 
172 
     | 
    
         
             
            require 'mutant/matcher/chain'
         
     | 
| 
      
 173 
     | 
    
         
            +
            require 'mutant/matcher/config'
         
     | 
| 
      
 174 
     | 
    
         
            +
            require 'mutant/matcher/descendants'
         
     | 
| 
      
 175 
     | 
    
         
            +
            require 'mutant/matcher/filter'
         
     | 
| 
       169 
176 
     | 
    
         
             
            require 'mutant/matcher/method'
         
     | 
| 
       170 
     | 
    
         
            -
            require 'mutant/matcher/method/singleton'
         
     | 
| 
       171 
     | 
    
         
            -
            require 'mutant/matcher/method/metaclass'
         
     | 
| 
       172 
177 
     | 
    
         
             
            require 'mutant/matcher/method/instance'
         
     | 
| 
      
 178 
     | 
    
         
            +
            require 'mutant/matcher/method/metaclass'
         
     | 
| 
      
 179 
     | 
    
         
            +
            require 'mutant/matcher/method/singleton'
         
     | 
| 
       173 
180 
     | 
    
         
             
            require 'mutant/matcher/methods'
         
     | 
| 
       174 
181 
     | 
    
         
             
            require 'mutant/matcher/namespace'
         
     | 
| 
       175 
     | 
    
         
            -
            require 'mutant/matcher/scope'
         
     | 
| 
       176 
     | 
    
         
            -
            require 'mutant/matcher/filter'
         
     | 
| 
       177 
182 
     | 
    
         
             
            require 'mutant/matcher/null'
         
     | 
| 
      
 183 
     | 
    
         
            +
            require 'mutant/matcher/scope'
         
     | 
| 
       178 
184 
     | 
    
         
             
            require 'mutant/matcher/static'
         
     | 
| 
       179 
185 
     | 
    
         
             
            require 'mutant/expression'
         
     | 
| 
       180 
     | 
    
         
            -
            require 'mutant/expression/ 
     | 
| 
      
 186 
     | 
    
         
            +
            require 'mutant/expression/descendants'
         
     | 
| 
       181 
187 
     | 
    
         
             
            require 'mutant/expression/method'
         
     | 
| 
       182 
188 
     | 
    
         
             
            require 'mutant/expression/methods'
         
     | 
| 
       183 
189 
     | 
    
         
             
            require 'mutant/expression/namespace'
         
     | 
| 
      
 190 
     | 
    
         
            +
            require 'mutant/expression/parser'
         
     | 
| 
       184 
191 
     | 
    
         
             
            require 'mutant/test'
         
     | 
| 
       185 
192 
     | 
    
         
             
            require 'mutant/timer'
         
     | 
| 
       186 
193 
     | 
    
         
             
            require 'mutant/integration'
         
     | 
| 
         @@ -234,46 +241,49 @@ require 'mutant/license/subscription/commercial' 
     | 
|
| 
       234 
241 
     | 
    
         | 
| 
       235 
242 
     | 
    
         
             
            module Mutant
         
     | 
| 
       236 
243 
     | 
    
         
             
              WORLD = World.new(
         
     | 
| 
       237 
     | 
    
         
            -
                condition_variable: 
     | 
| 
       238 
     | 
    
         
            -
                 
     | 
| 
       239 
     | 
    
         
            -
                 
     | 
| 
       240 
     | 
    
         
            -
                 
     | 
| 
       241 
     | 
    
         
            -
                 
     | 
| 
       242 
     | 
    
         
            -
                 
     | 
| 
       243 
     | 
    
         
            -
                 
     | 
| 
       244 
     | 
    
         
            -
                 
     | 
| 
       245 
     | 
    
         
            -
                 
     | 
| 
       246 
     | 
    
         
            -
                 
     | 
| 
       247 
     | 
    
         
            -
                 
     | 
| 
       248 
     | 
    
         
            -
                 
     | 
| 
       249 
     | 
    
         
            -
                 
     | 
| 
       250 
     | 
    
         
            -
                 
     | 
| 
       251 
     | 
    
         
            -
                 
     | 
| 
       252 
     | 
    
         
            -
                 
     | 
| 
       253 
     | 
    
         
            -
                 
     | 
| 
      
 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)
         
     | 
| 
       254 
262 
     | 
    
         
             
              )
         
     | 
| 
       255 
263 
     | 
    
         | 
| 
       256 
264 
     | 
    
         
             
              # Reopen class to initialize constant to avoid dep circle
         
     | 
| 
       257 
265 
     | 
    
         
             
              class Config
         
     | 
| 
       258 
266 
     | 
    
         
             
                DEFAULT = new(
         
     | 
| 
       259 
     | 
    
         
            -
                  coverage_criteria: 
     | 
| 
       260 
     | 
    
         
            -
                  expression_parser: 
     | 
| 
      
 267 
     | 
    
         
            +
                  coverage_criteria:     Config::CoverageCriteria::EMPTY,
         
     | 
| 
      
 268 
     | 
    
         
            +
                  expression_parser:     Expression::Parser.new([
         
     | 
| 
      
 269 
     | 
    
         
            +
                    Expression::Descendants,
         
     | 
| 
       261 
270 
     | 
    
         
             
                    Expression::Method,
         
     | 
| 
       262 
271 
     | 
    
         
             
                    Expression::Methods,
         
     | 
| 
       263 
272 
     | 
    
         
             
                    Expression::Namespace::Exact,
         
     | 
| 
       264 
273 
     | 
    
         
             
                    Expression::Namespace::Recursive
         
     | 
| 
       265 
274 
     | 
    
         
             
                  ]),
         
     | 
| 
       266 
     | 
    
         
            -
                  fail_fast: 
     | 
| 
       267 
     | 
    
         
            -
                   
     | 
| 
       268 
     | 
    
         
            -
                   
     | 
| 
       269 
     | 
    
         
            -
                   
     | 
| 
       270 
     | 
    
         
            -
                   
     | 
| 
       271 
     | 
    
         
            -
                   
     | 
| 
       272 
     | 
    
         
            -
                   
     | 
| 
       273 
     | 
    
         
            -
                   
     | 
| 
       274 
     | 
    
         
            -
                   
     | 
| 
       275 
     | 
    
         
            -
                   
     | 
| 
       276 
     | 
    
         
            -
                   
     | 
| 
      
 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
         
     | 
| 
       277 
287 
     | 
    
         
             
                )
         
     | 
| 
       278 
288 
     | 
    
         
             
              end # Config
         
     | 
| 
       279 
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.11. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.11.4
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Markus Schirp
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2022-02-14 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. 
     | 
| 
      
 33 
     | 
    
         
            +
                    version: 3.1.0
         
     | 
| 
       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. 
     | 
| 
      
 40 
     | 
    
         
            +
                    version: 3.1.0
         
     | 
| 
       41 
41 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
42 
     | 
    
         
             
              name: regexp_parser
         
     | 
| 
       43 
43 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -78,14 +78,14 @@ dependencies: 
     | 
|
| 
       78 
78 
     | 
    
         
             
                requirements:
         
     | 
| 
       79 
79 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       80 
80 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       81 
     | 
    
         
            -
                    version: 0.6. 
     | 
| 
      
 81 
     | 
    
         
            +
                    version: 0.6.4
         
     | 
| 
       82 
82 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       83 
83 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       84 
84 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       85 
85 
     | 
    
         
             
                requirements:
         
     | 
| 
       86 
86 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       87 
87 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       88 
     | 
    
         
            -
                    version: 0.6. 
     | 
| 
      
 88 
     | 
    
         
            +
                    version: 0.6.4
         
     | 
| 
       89 
89 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       90 
90 
     | 
    
         
             
              name: parallel
         
     | 
| 
       91 
91 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -207,6 +207,7 @@ files: 
     | 
|
| 
       207 
207 
     | 
    
         
             
            - lib/mutant/context.rb
         
     | 
| 
       208 
208 
     | 
    
         
             
            - lib/mutant/env.rb
         
     | 
| 
       209 
209 
     | 
    
         
             
            - lib/mutant/expression.rb
         
     | 
| 
      
 210 
     | 
    
         
            +
            - lib/mutant/expression/descendants.rb
         
     | 
| 
       210 
211 
     | 
    
         
             
            - lib/mutant/expression/method.rb
         
     | 
| 
       211 
212 
     | 
    
         
             
            - lib/mutant/expression/methods.rb
         
     | 
| 
       212 
213 
     | 
    
         
             
            - lib/mutant/expression/namespace.rb
         
     | 
| 
         @@ -226,6 +227,7 @@ files: 
     | 
|
| 
       226 
227 
     | 
    
         
             
            - lib/mutant/matcher.rb
         
     | 
| 
       227 
228 
     | 
    
         
             
            - lib/mutant/matcher/chain.rb
         
     | 
| 
       228 
229 
     | 
    
         
             
            - lib/mutant/matcher/config.rb
         
     | 
| 
      
 230 
     | 
    
         
            +
            - lib/mutant/matcher/descendants.rb
         
     | 
| 
       229 
231 
     | 
    
         
             
            - lib/mutant/matcher/filter.rb
         
     | 
| 
       230 
232 
     | 
    
         
             
            - lib/mutant/matcher/method.rb
         
     | 
| 
       231 
233 
     | 
    
         
             
            - lib/mutant/matcher/method/instance.rb
         
     | 
| 
         @@ -382,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       382 
384 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       383 
385 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       384 
386 
     | 
    
         
             
            requirements: []
         
     | 
| 
       385 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 387 
     | 
    
         
            +
            rubygems_version: 3.3.3
         
     | 
| 
       386 
388 
     | 
    
         
             
            signing_key:
         
     | 
| 
       387 
389 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       388 
390 
     | 
    
         
             
            summary: ''
         
     |