Module: Polyrun::Config::Resolver

Defined in:
lib/polyrun/config/resolver.rb

Overview

Single source for values derived from polyrun.yml, ENV, and CI detection. Used by Effective, CLI helpers, and prepare.

Class Method Summary collapse

Class Method Details

.env_int(name, fallback, env = ENV) ⇒ Object



11
12
13
14
15
16
# File 'lib/polyrun/config/resolver.rb', line 11

def env_int(name, fallback, env = ENV)
  s = env[name]
  return fallback if s.nil? || s.empty?

  Integer(s, exception: false) || fallback
end

.merged_prepare_env(prep, env = ENV) ⇒ Object

Same merge order as polyrun prepare: YAML prepare.env overrides process ENV for overlapping keys.



23
24
25
26
# File 'lib/polyrun/config/resolver.rb', line 23

def merged_prepare_env(prep, env = ENV)
  prep_env = prepare_env_yaml_string_map(prep)
  env.to_h.merge(prep_env)
end

.parallel_worker_count_default(env = ENV) ⇒ Object



73
74
75
# File 'lib/polyrun/config/resolver.rb', line 73

def parallel_worker_count_default(env = ENV)
  env_int("POLYRUN_WORKERS", Polyrun::Config::DEFAULT_PARALLEL_WORKERS, env)
end

.partition_int(pc, keys, default) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/polyrun/config/resolver.rb', line 28

def partition_int(pc, keys, default)
  keys.each do |k|
    v = pc[k] || pc[k.to_sym]
    next if v.nil? || v.to_s.empty?

    i = Integer(v, exception: false)
    return i unless i.nil?
  end
  default
end

.prepare_env_yaml_string_map(prep) ⇒ Object



18
19
20
# File 'lib/polyrun/config/resolver.rb', line 18

def prepare_env_yaml_string_map(prep)
  (prep["env"] || prep[:env] || {}).transform_keys(&:to_s).transform_values(&:to_s)
end

.resolve_partition_timing_granularity(pc, cli_val, env = ENV) ⇒ Object

cli_val is an override (e.g. run-shards –timing-granularity); nil uses YAML then POLYRUN_TIMING_GRANULARITY.



66
67
68
69
70
71
# File 'lib/polyrun/config/resolver.rb', line 66

def resolve_partition_timing_granularity(pc, cli_val, env = ENV)
  raw = cli_val
  raw ||= pc && (pc["timing_granularity"] || pc[:timing_granularity])
  raw ||= env["POLYRUN_TIMING_GRANULARITY"]
  Polyrun::Partition::TimingKeys.normalize_granularity(raw || "file")
end

.resolve_shard_index(pc, env = ENV) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/polyrun/config/resolver.rb', line 39

def resolve_shard_index(pc, env = ENV)
  return Integer(env["POLYRUN_SHARD_INDEX"]) if env["POLYRUN_SHARD_INDEX"] && !env["POLYRUN_SHARD_INDEX"].empty?

  ci = Polyrun::Env::Ci.detect_shard_index
  return ci unless ci.nil?

  partition_int(pc, %w[shard_index shard], 0)
end

.resolve_shard_processes(pc, env = ENV) ⇒ Object

Processes per CI matrix job for ci-shard-run / ci-shard-rspec (NxM: N jobs × M processes). POLYRUN_SHARD_PROCESSES or partition.shard_processes; CLI --shard-processes / --workers overrides.



59
60
61
62
63
# File 'lib/polyrun/config/resolver.rb', line 59

def resolve_shard_processes(pc, env = ENV)
  return Integer(env["POLYRUN_SHARD_PROCESSES"]) if env["POLYRUN_SHARD_PROCESSES"] && !env["POLYRUN_SHARD_PROCESSES"].empty?

  partition_int(pc, %w[shard_processes shard_workers workers_per_shard], 1)
end

.resolve_shard_total(pc, env = ENV) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/polyrun/config/resolver.rb', line 48

def resolve_shard_total(pc, env = ENV)
  return Integer(env["POLYRUN_SHARD_TOTAL"]) if env["POLYRUN_SHARD_TOTAL"] && !env["POLYRUN_SHARD_TOTAL"].empty?

  ci = Polyrun::Env::Ci.detect_shard_total
  return ci unless ci.nil?

  partition_int(pc, %w[shard_total total], 1)
end