Module: Riffer::Helpers::Dependencies

Included in:
Providers::Base
Defined in:
lib/riffer/helpers/dependencies.rb

Overview

Helper module for lazy loading gem dependencies.

Used by providers to load their required gems only when needed.

Defined Under Namespace

Classes: LoadError, VersionError

Instance Method Summary collapse

Instance Method Details

#depends_on(gem_name, req: true) ⇒ Object

Declares a dependency on a gem.

Verifies the gem is installed and satisfies version requirements, then requires it.

Raises LoadError if the gem is not installed. Raises VersionError if the gem version does not satisfy requirements.

: (String, ?req: (bool | String)) -> true



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/riffer/helpers/dependencies.rb', line 23

def depends_on(gem_name, req: true)
  gem(gem_name)

  return true unless defined?(Bundler)

  gem_version = Gem.loaded_specs[gem_name].version
  gem_dependency = Bundler.load.dependencies.find { |g| g.name == gem_name }
  gem_requirement = gem_dependency&.requirement

  unless gem_requirement
    raise VersionError, "The #{gem_name} gem is installed but not specified in your Bundler dependencies (e.g., Gemfile)."
  end

  unless gem_requirement.satisfied_by?(gem_version)
    raise VersionError, "The #{gem_name} gem is installed, but version #{gem_requirement} is required. You have #{gem_version}."
  end

  lib_name = gem_name if req == true
  lib_name = req if req.is_a?(String)

  require(lib_name) if lib_name

  true
rescue ::LoadError
  raise LoadError, "Could not load #{gem_name}. Please ensure that the #{gem_name} gem is installed."
end