Class: Yoker::Detectors::VersionManagerDetector

Inherits:
Object
  • Object
show all
Defined in:
lib/yoker/detectors/version_manager_detector.rb

Constant Summary collapse

PREFERENCE_ORDER =

Preference order for version managers

%w[mise rvm rbenv].freeze

Class Method Summary collapse

Class Method Details

.command_exists?(command) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/yoker/detectors/version_manager_detector.rb', line 55

def self.command_exists?(command)
  system("which #{command} > /dev/null 2>&1")
end

.current_ruby_versionObject



59
60
61
# File 'lib/yoker/detectors/version_manager_detector.rb', line 59

def self.current_ruby_version
  RUBY_VERSION
end

.detectObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/yoker/detectors/version_manager_detector.rb', line 9

def self.detect
  # First, check which version managers are actually installed
  installed_managers = detect_installed_managers

  return "none" if installed_managers.empty?

  # Check for configuration files that match installed managers
  file_based_detection = detect_from_files

  # If we found a config file for an installed manager, use it
  return file_based_detection if file_based_detection && installed_managers.include?(file_based_detection)

  # Otherwise, return the highest priority installed manager
  PREFERENCE_ORDER.each do |manager|
    return manager if installed_managers.include?(manager)
  end

  "none"
end

.detect_from_filesObject



44
45
46
47
48
49
50
51
52
53
# File 'lib/yoker/detectors/version_manager_detector.rb', line 44

def self.detect_from_files
  # Check for version manager configuration files
  return "mise" if File.exist?("mise.toml") || File.exist?(".mise.toml")
  return "mise" if File.exist?(".tool-versions") # mise/asdf format
  return "rvm" if File.exist?(".rvmrc") || File.exist?(".ruby-gemset")
  # .ruby-version alone suggests rbenv
  return "rbenv" if File.exist?(".ruby-version") && !File.exist?(".ruby-gemset")

  nil
end

.detect_installed_managersObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/yoker/detectors/version_manager_detector.rb', line 29

def self.detect_installed_managers
  managers = []

  # Check for mise
  managers << "mise" if command_exists?("mise")

  # Check for rvm
  managers << "rvm" if command_exists?("rvm")

  # Check for rbenv
  managers << "rbenv" if command_exists?("rbenv")

  managers
end

.ruby_version_from_fileObject



63
64
65
66
67
68
69
70
71
# File 'lib/yoker/detectors/version_manager_detector.rb', line 63

def self.ruby_version_from_file
  if File.exist?("mise.toml")
    extract_ruby_from_mise_toml
  elsif File.exist?(".ruby-version")
    File.read(".ruby-version").strip
  elsif File.exist?(".tool-versions")
    extract_ruby_from_tool_versions
  end
end