Class: Mutant::Config Private

Inherits:
Object
  • Object
show all
Includes:
Unparser::Adamantium
Defined in:
lib/mutant.rb,
lib/mutant/config.rb,
lib/mutant/config/coverage_criteria.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Standalone configuration of a mutant execution.

Does not reference any “external” volatile state. The configuration applied to current environment is being represented by the Mutant::Env object.

rubocop:disable Metrics/ClassLength

Defined Under Namespace

Classes: CoverageCriteria

Constant Summary collapse

DEFAULT =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

new(
  coverage_criteria:     Config::CoverageCriteria::DEFAULT,
  expression_parser:     Expression::Parser.new([
    Expression::Descendants,
    Expression::Method,
    Expression::Methods,
    Expression::Namespace::Exact,
    Expression::Namespace::Recursive
  ]),
  environment_variables: EMPTY_HASH,
  fail_fast:             false,
  hooks:                 EMPTY_ARRAY,
  includes:              EMPTY_ARRAY,
  integration:           nil,
  isolation:             Mutant::Isolation::Fork.new(WORLD),
  jobs:                  nil,
  matcher:               Matcher::Config::DEFAULT,
  mutation:              Mutation::Config::DEFAULT,
  reporter:              Reporter::CLI.build(WORLD.stdout),
  requires:              EMPTY_ARRAY
)
MORE_THAN_ONE_CONFIG_FILE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

<<~'MESSAGE'
  Found more than one candidate for use as implicit config file: %s
MESSAGE
CANDIDATES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

%w[
  .mutant.yml
  config/mutant.yml
  mutant.yml
].freeze
MUTATION_TIMEOUT_DEPRECATION =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

<<~'MESSAGE'
  Deprecated configuration toplevel key `mutation_timeout` found.

  This key will be removed in the next major version.
  Instead place your mutation timeout configuration under the `mutation` key
  like this:

  ```
  # mutant.yml
  mutation:
    timeout: 10.0 # float here.
  ```
MESSAGE
PATHNAME_ARRAY =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Transform::Array.new(
  Transform::Sequence.new(
    [
      Transform::STRING,
      Transform::Exception.new(ArgumentError, Pathname.public_method(:new))
    ]
  )
)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.deprecations(reporter, hash) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



160
161
162
163
164
165
166
167
168
# File 'lib/mutant/config.rb', line 160

def self.deprecations(reporter, hash)
  if hash.key?('mutation_timeout')
    reporter.warn(MUTATION_TIMEOUT_DEPRECATION)

    (hash['mutation'] ||= {})['timeout'] ||= hash.delete('mutation_timeout')
  end

  hash
end

.envConfig

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The configuration from the environment

Returns:



128
129
130
# File 'lib/mutant/config.rb', line 128

def self.env
  DEFAULT.with(jobs: Etc.nprocessors)
end

.load_config_file(env) ⇒ Either<String,Config>

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Load config file

Parameters:

Returns:



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/mutant/config.rb', line 87

def self.load_config_file(env)
  files = CANDIDATES
    .map(&env.world.pathname.public_method(:new))
    .select(&:readable?)

  if files.one?
    load_contents(env, files.first).fmap(&DEFAULT.public_method(:with))
  elsif files.empty?
    Either::Right.new(DEFAULT)
  else
    Either::Left.new(MORE_THAN_ONE_CONFIG_FILE % files.join(', '))
  end
end

.parse_environment_variables(hash) ⇒ Either<String,Hash<String,String>]

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parse a hash of environment variables

Parameters:

  • (Hash<Object,Object>)

Returns:

  • (Either<String,Hash<String,String>])

    Either<String,Hash<String,String>]



147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/mutant/config.rb', line 147

def self.parse_environment_variables(hash)
  invalid = hash.keys.reject { |key| key.instance_of?(String) }
  return Either::Left.new("Non string keys: #{invalid}") if invalid.any?

  invalid = hash.keys.grep_v(ENV_VARIABLE_KEY_REGEXP)
  return Either::Left.new("Invalid keys: #{invalid}") if invalid.any?

  invalid = hash.values.reject { |value| value.instance_of?(String) }
  return Either::Left.new("Non string values: #{invalid}") if invalid.any?

  Either::Right.new(hash)
end

Instance Method Details

#merge(other) ⇒ Config

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Merge with other config

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/MethodLength

Parameters:

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/mutant/config.rb', line 65

def merge(other)
  other.with(
    coverage_criteria:     coverage_criteria.merge(other.coverage_criteria),
    environment_variables: environment_variables.merge(other.environment_variables),
    fail_fast:             fail_fast || other.fail_fast,
    hooks:                 hooks + other.hooks,
    includes:              includes + other.includes,
    integration:           other.integration || integration,
    jobs:                  other.jobs || jobs,
    matcher:               matcher.merge(other.matcher),
    mutation:              mutation.merge(other.mutation),
    requires:              requires + other.requires
  )
end