Module: Kamal::Lint::KamalVersion

Defined in:
lib/kamal/lint/kamal_version.rb

Overview

Detect the installed Kamal version from (in priority order):

1. explicit override
2. Bundler.locked_gems
3. Gem.loaded_specs / Gem::Specification
4. shell out to `kamal version`

Class Method Summary collapse

Class Method Details

.detect(override: nil) ⇒ Object



15
16
17
18
19
# File 'lib/kamal/lint/kamal_version.rb', line 15

def detect(override: nil)
  return normalize(override) if override

  from_bundler || from_loaded_specs || from_shell
end

.from_bundlerObject



21
22
23
24
25
26
27
28
29
30
# File 'lib/kamal/lint/kamal_version.rb', line 21

def from_bundler
  return nil unless defined?(Bundler)

  locked = Bundler.locked_gems&.specs&.find { |s| s.name == "kamal" }
  locked&.version&.to_s
rescue Bundler::GemfileNotFound
  nil
rescue => _e
  nil
end

.from_loaded_specsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/kamal/lint/kamal_version.rb', line 32

def from_loaded_specs
  spec = Gem.loaded_specs["kamal"] if defined?(Gem) && Gem.respond_to?(:loaded_specs)
  return spec.version.to_s if spec

  if defined?(Gem::Specification)
    found = Gem::Specification.find_all_by_name("kamal").max_by(&:version)
    return found&.version&.to_s
  end

  nil
rescue => _e
  nil
end

.from_shellObject



46
47
48
49
50
51
52
53
# File 'lib/kamal/lint/kamal_version.rb', line 46

def from_shell
  out, _err, status = Open3.capture3("kamal", "version")
  return nil unless status.success?

  out.strip.split.last
rescue Errno::ENOENT
  nil
end

.normalize(value) ⇒ Object



55
56
57
58
59
# File 'lib/kamal/lint/kamal_version.rb', line 55

def normalize(value)
  return nil if value.nil? || value.to_s.empty?

  value.to_s.strip
end