class Devpack::Gems
Loads requested gems from configuration
Public Class Methods
new(config, glob = GemGlob.new)
click to toggle source
# File lib/devpack/gems.rb, line 8 def initialize(config, glob = GemGlob.new) @config = config @gem_glob = glob @failures = [] @missing = [] end
Public Instance Methods
load()
click to toggle source
# File lib/devpack/gems.rb, line 15 def load return [] if @config.requested_gems.nil? gems, time = timed { load_devpack } names = gems.map(&:first) summarize(gems, time) names end
Private Instance Methods
activate(name, version)
click to toggle source
# File lib/devpack/gems.rb, line 52 def activate(name, version) spec = GemSpec.new(@gem_glob, name, version) update_load_path(spec.require_paths) # NOTE: do this before we require, because some gems use the gemspec to # declare their version... Gem.loaded_specs[name] = spec.gemspec loaded = Kernel.require(name) spec.gemspec&.activated = true spec.gemspec&.instance_variable_set(:@loaded, true) loaded end
deactivate(name)
click to toggle source
# File lib/devpack/gems.rb, line 64 def deactivate(name) Gem.loaded_specs.delete(name) end
load_devpack()
click to toggle source
# File lib/devpack/gems.rb, line 34 def load_devpack @config.requested_gems.map do |requested| name, _, version = requested.partition(':') load_gem(name, version.empty? ? nil : Gem::Requirement.new("= #{version}")) end.compact end
load_error_message(error)
click to toggle source
# File lib/devpack/gems.rb, line 72 def load_error_message(error) return "(#{error.message})" unless Devpack.debug? %[(#{error.message})\n#{error.backtrace.join("\n")}] end
load_gem(name, requirement)
click to toggle source
# File lib/devpack/gems.rb, line 41 def load_gem(name, requirement) [name, activate(name, requirement)] rescue LoadError => e deactivate(name) @failures << { name: name, message: load_error_message(e) } nil rescue GemNotFoundError => e @missing << { name: name, version: e.message == '-' ? nil : e.message } nil end
summarize(gems, time)
click to toggle source
# File lib/devpack/gems.rb, line 26 def summarize(gems, time) @failures.each do |failure| warn(:error, Messages.failure(failure[:name], failure[:message])) end warn(:success, Messages.loaded(@config.devpack_path, gems, time.round(2))) warn(:info, Messages.install_missing(@missing)) unless @missing.empty? end
update_load_path(paths)
click to toggle source
# File lib/devpack/gems.rb, line 78 def update_load_path(paths) $LOAD_PATH.concat(paths) end
warn(level, message)
click to toggle source
# File lib/devpack/gems.rb, line 68 def warn(level, message) Devpack.warn(level, message) end