Sha256: 068ae6909a4c6cbcd809155af56ddc3e9f6b08c64fb9f245c5b210c8b7480d86

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

# typed: strict
# frozen_string_literal: true

require 'uri'
require 'securerandom'

module Minitest
  module Distributed
    class Configuration < T::Struct
      DEFAULT_BATCH_SIZE = 10
      DEFAULT_MAX_ATTEMPTS = 3
      DEFAULT_TEST_TIMEOUT = 30.0 # seconds

      class << self
        extend T::Sig

        sig { params(env: T::Hash[String, T.nilable(String)]).returns(T.attached_class) }
        def from_env(env = ENV.to_h)
          new(
            coordinator_uri: URI(env['MINITEST_COORDINATOR'] || 'memory:'),
            run_id: env['MINITEST_RUN_ID'] || SecureRandom.uuid,
            worker_id: env['MINITEST_WORKER_ID'] || SecureRandom.uuid,
            test_timeout: Float(env['MINITEST_TEST_TIMEOUT'] || DEFAULT_TEST_TIMEOUT),
            test_batch_size: Integer(env['MINITEST_TEST_BATCH_SIZE'] || DEFAULT_BATCH_SIZE),
            max_attempts: Integer(env['MINITEST_MAX_ATTEMPTS'] || DEFAULT_MAX_ATTEMPTS),
          )
        end
      end

      extend T::Sig

      prop :coordinator_uri, URI::Generic, default: URI('memory:')
      prop :run_id, String, factory: -> { SecureRandom.uuid }
      prop :worker_id, String, factory: -> { SecureRandom.uuid }
      prop :test_timeout, Float, default: DEFAULT_TEST_TIMEOUT
      prop :test_batch_size, Integer, default: DEFAULT_BATCH_SIZE
      prop :max_attempts, Integer, default: DEFAULT_MAX_ATTEMPTS

      sig { returns(Coordinators::CoordinatorInterface) }
      def coordinator
        @coordinator = T.let(@coordinator, T.nilable(Coordinators::CoordinatorInterface))
        @coordinator ||= case coordinator_uri.scheme
        when 'redis'
          Coordinators::RedisCoordinator.new(configuration: self)
        when 'memory'
          Coordinators::MemoryCoordinator.new(configuration: self)
        else
          raise NotImplementedError, "Unknown coordinator implementation: #{coordinator_uri.scheme}"
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
minitest-distributed-0.1.2 lib/minitest/distributed/configuration.rb