Class: Agent::Homedir::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/agent/homedir/resolver.rb

Constant Summary collapse

VALID_OSES =
%i[macos linux windows].freeze
WINDOWS_DRIVE_PATH =
/\A[A-Za-z]:[\/\\]/.freeze
WINDOWS_UNC_PATH =
/\A[\/\\]{2}[^\/\\]+[\/\\]+[^\/\\]+/.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env: ENV.to_h, home: ENV["HOME"], os: self.class.default_os, entries: Registry.entries) ⇒ Resolver

Returns a new instance of Resolver.



37
38
39
40
41
42
43
44
45
# File 'lib/agent/homedir/resolver.rb', line 37

def initialize(env: ENV.to_h, home: ENV["HOME"], os: self.class.default_os, entries: Registry.entries)
  fail ArgumentError, "Invalid OS #{os.inspect}; expected one of #{VALID_OSES.inspect}" unless VALID_OSES.include?(os)

  @env = snapshot_value(env)
  @home = snapshot_value(home)
  @os = os
  @entries = snapshot_value(entries)
  @memoization_monitor = Monitor.new
end

Class Method Details

.default_osObject



17
18
19
# File 'lib/agent/homedir/resolver.rb', line 17

def default_os
  @default_os ||= detect_os(RbConfig::CONFIG["host_os"])
end

Instance Method Details

#[](name) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/agent/homedir/resolver.rb', line 75

def [](name)
  key = name.to_sym
  entry = entry_for(key)

  Entry.new(
    name: key,
    label: entry.fetch(:label),
    env_override: entry[:env],
    verified_on: parse_verified_on(key, entry[:verified_on]),
    resolver: self
  )
end

#agentsObject



96
97
98
99
100
101
102
# File 'lib/agent/homedir/resolver.rb', line 96

def agents
  return @agents if @agents

  @memoization_monitor.synchronize do
    @agents ||= names.map { self[_1] }.freeze
  end
end

#candidates(name) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/agent/homedir/resolver.rb', line 66

def candidates(name)
  home_root = ensure_home_root!
  specs = path_specs_for(name)
  expanded = expand_specs(specs, home_root)
  fail ArgumentError, no_paths_message(name, "current os paths are empty") if expanded.empty?

  expanded.freeze
end

#home(name) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/agent/homedir/resolver.rb', line 47

def home(name)
  ensure_home_root!

  override = env_override_for(name)
  return override if override

  available_candidates = candidates(name)
  find_directory_candidate(available_candidates) || available_candidates.first
end

#installedObject



104
105
106
# File 'lib/agent/homedir/resolver.rb', line 104

def installed
  agents.select(&:installed?).freeze
end

#installed?(name) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
60
61
62
63
64
# File 'lib/agent/homedir/resolver.rb', line 57

def installed?(name)
  ensure_home_root!

  override = env_override_for(name)
  return true if directory_path?(override)

  candidates(name).any? { directory_path?(_1) }
end

#namesObject



88
89
90
91
92
93
94
# File 'lib/agent/homedir/resolver.rb', line 88

def names
  return @names if @names

  @memoization_monitor.synchronize do
    @names ||= @entries.keys.freeze
  end
end