In Files

  • bundler/lockfile_parser.rb

Class/Module Index [+]

Quicksearch

Bundler::LockfileParser

Attributes

bundler_version[R]
dependencies[R]
platforms[R]
ruby_version[R]
sources[R]
specs[R]

Public Class Methods

new(lockfile) click to toggle source
 
               # File bundler/lockfile_parser.rb, line 61
def initialize(lockfile)
  @platforms    = []
  @sources      = []
  @dependencies = {}
  @state        = nil
  @specs        = {}

  @rubygems_aggregate = Source::Rubygems.new

  if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
    raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \
      "Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock."
  end

  lockfile.split(/(?:\r?\n)+/).each do |line|
    if SOURCE.include?(line)
      @state = :source
      parse_source(line)
    elsif line == DEPENDENCIES
      @state = :dependency
    elsif line == PLATFORMS
      @state = :platform
    elsif line == RUBY
      @state = :ruby
    elsif line == BUNDLED
      @state = :bundled_with
    elsif line =~ /^[^\s]/
      @state = nil
    elsif @state
      send("parse_#{@state}", line)
    end
  end
  @sources << @rubygems_aggregate unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
  @specs = @specs.values.sort_by(&:identifier)
  warn_for_outdated_bundler_version
rescue ArgumentError => e
  Bundler.ui.debug(e)
  raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \
    "and then `bundle install` to generate a new lockfile."
end
            
sections_in_lockfile(lockfile_contents) click to toggle source
 
               # File bundler/lockfile_parser.rb, line 42
def self.sections_in_lockfile(lockfile_contents)
  lockfile_contents.scan(/^\w[\w ]*$/).uniq
end
            
sections_to_ignore(base_version = nil) click to toggle source
 
               # File bundler/lockfile_parser.rb, line 50
def self.sections_to_ignore(base_version = nil)
  base_version &&= base_version.release
  base_version ||= Gem::Version.create("1.0".dup)
  attributes = []
  SECTIONS_BY_VERSION_INTRODUCED.each do |version, introduced|
    next if version <= base_version
    attributes += introduced
  end
  attributes
end
            
unknown_sections_in_lockfile(lockfile_contents) click to toggle source
 
               # File bundler/lockfile_parser.rb, line 46
def self.unknown_sections_in_lockfile(lockfile_contents)
  sections_in_lockfile(lockfile_contents) - KNOWN_SECTIONS
end
            

Public Instance Methods

warn_for_outdated_bundler_version() click to toggle source
 
               # File bundler/lockfile_parser.rb, line 102
def warn_for_outdated_bundler_version
  return unless bundler_version
  prerelease_text = bundler_version.prerelease? ? " --pre" : ""
  current_version = Gem::Version.create(Bundler::VERSION)
  case current_version.segments.first <=> bundler_version.segments.first
  when -1
    raise LockfileError, "You must use Bundler #{bundler_version.segments.first} or greater with this lockfile."
  when 0
    if current_version < bundler_version
      Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \
           "than the version that created the lockfile (#{bundler_version}). We suggest you " \
           "upgrade to the latest version of Bundler by running `gem " \
           "install bundler#{prerelease_text}`.\n"
    end
  end
end