Class: Bundler::LockfileParser

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/lockfile_parser.rb

Constant Summary collapse

BUNDLED =
"BUNDLED WITH".freeze
DEPENDENCIES =
"DEPENDENCIES".freeze
PLATFORMS =
"PLATFORMS".freeze
RUBY =
"RUBY VERSION".freeze
GIT =
"GIT".freeze
GEM =
"GEM".freeze
PATH =
"PATH".freeze
PLUGIN =
"PLUGIN SOURCE".freeze
SPECS =
"  specs:".freeze
OPTIONS =
/^  ([a-z]+): (.*)$/i.freeze
SOURCE =
[GIT, GEM, PATH, PLUGIN].freeze
SECTIONS_BY_VERSION_INTRODUCED =
{
  Gem::Version.create("1.0") => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze,
  Gem::Version.create("1.10") => [BUNDLED].freeze,
  Gem::Version.create("1.12") => [RUBY].freeze,
  Gem::Version.create("1.13") => [PLUGIN].freeze,
}.freeze
KNOWN_SECTIONS =
SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze
ENVIRONMENT_VERSION_SECTIONS =
[BUNDLED, RUBY].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lockfile) ⇒ LockfileParser

Returns a new instance of LockfileParser.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/bundler/lockfile_parser.rb', line 49

def initialize(lockfile)
  @platforms    = []
  @sources      = []
  @dependencies = {}
  @state        = nil
  @specs        = {}

  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
  @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

Instance Attribute Details

#bundler_versionObject (readonly)

Returns the value of attribute bundler_version.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def bundler_version
  @bundler_version
end

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def dependencies
  @dependencies
end

#platformsObject (readonly)

Returns the value of attribute platforms.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def platforms
  @platforms
end

#ruby_versionObject (readonly)

Returns the value of attribute ruby_version.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def ruby_version
  @ruby_version
end

#sourcesObject (readonly)

Returns the value of attribute sources.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def sources
  @sources
end

#specsObject (readonly)

Returns the value of attribute specs.



5
6
7
# File 'lib/bundler/lockfile_parser.rb', line 5

def specs
  @specs
end

Class Method Details

.sections_in_lockfile(lockfile_contents) ⇒ Object



30
31
32
# File 'lib/bundler/lockfile_parser.rb', line 30

def self.sections_in_lockfile(lockfile_contents)
  lockfile_contents.scan(/^\w[\w ]*$/).uniq
end

.sections_to_ignore(base_version = nil) ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'lib/bundler/lockfile_parser.rb', line 38

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) ⇒ Object



34
35
36
# File 'lib/bundler/lockfile_parser.rb', line 34

def self.unknown_sections_in_lockfile(lockfile_contents)
  sections_in_lockfile(lockfile_contents) - KNOWN_SECTIONS
end

Instance Method Details

#warn_for_outdated_bundler_versionObject



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/bundler/lockfile_parser.rb', line 87

def warn_for_outdated_bundler_version
  return unless bundler_version
  return if bundler_version.segments.last == "dev"
  prerelease_text = bundler_version.prerelease? ? " --pre" : ""
  current_version = Gem::Version.create(Bundler::VERSION)
  return unless 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 to " \
       "upgrade to the version that created the lockfile by running `gem install " \
       "bundler:#{bundler_version}#{prerelease_text}`.\n"
end