class Warbler::Gems

A set of gems. This only exists to allow expected operations to be used to add gems, and for backwards compatibility. It would be easier to just use a hash.

Constants

ANY_VERSION

Public Class Methods

new(gems = nil) click to toggle source
# File lib/warbler/gems.rb, line 16
def initialize(gems = nil)
  if gems.is_a?(Hash)
    self.merge!(gems)
  elsif gems.is_a?(Array)
    gems.each {|gem| self << gem }
  end
end

Public Instance Methods

+(other) click to toggle source
# File lib/warbler/gems.rb, line 29
def +(other)
  @specs = nil
  other.each {|g| self[g] ||= ANY_VERSION }
  self
end
-(other) click to toggle source
# File lib/warbler/gems.rb, line 35
def -(other)
  @specs = nil
  other.each {|g| self.delete(g)}
  self
end
<<(gem) click to toggle source
# File lib/warbler/gems.rb, line 24
def <<(gem)
  @specs = nil
  self[gem] ||= ANY_VERSION
end
full_name_for(name, gem_dependencies) click to toggle source
# File lib/warbler/gems.rb, line 41
def full_name_for(name, gem_dependencies)
  gem_spec = specs(gem_dependencies).detect{ |spec| spec.name == name }
  gem_spec.nil? ? name : gem_spec.full_name
end
specs(gem_dependencies) click to toggle source
# File lib/warbler/gems.rb, line 46
def specs(gem_dependencies)
  @specs ||= map { |gem, version| find_single_gem_files(gem_dependencies, gem, version) }.flatten.compact
end

Private Instance Methods

find_single_gem_files(gem_dependencies, gem_pattern, version = nil) click to toggle source

Add a single gem to WEB-INF/gems

# File lib/warbler/gems.rb, line 53
def find_single_gem_files(gem_dependencies, gem_pattern, version = nil)
  gem_spec_class = Gem::Specification
  gem_spec_class = Gem::BasicSpecification if Gem.const_defined?(:BasicSpecification)
  # Gem::Specification < Gem::BasicSpecification (since RGs 2.1)
  case gem_pattern
  when gem_spec_class
    return BundlerHelper.to_spec(gem_pattern)
  when Gem::Dependency
    gem = gem_pattern
  else
    gem = Gem::Dependency.new(gem_pattern, Gem::Requirement.create(version))
  end
  # skip development dependencies
  return nil if gem.respond_to?(:type) and gem.type != :runtime

  # Deal with deprecated Gem.source_index and #search
  matched = gem.respond_to?(:to_spec) ? [ gem.to_spec ] : Gem.source_index.search(gem)
  fail "gem '#{gem}' not installed" if matched.empty?
  spec = matched.last
  return spec unless gem_dependencies
  [spec] + spec.dependencies.map { |dependent_gem| find_single_gem_files(gem_dependencies, dependent_gem) }
end