Class: Gem::RequestSet::Lockfile
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Exceptions:
| |
Inherits: | Object |
Defined in: | lib/rubygems/request_set/lockfile.rb |
Overview
Parses a gem.deps.rb.lock file and constructs a LockSet containing the dependencies found inside. If the lock file is missing no LockSet is constructed.
Class Method Summary
-
.build(request_set, gem_deps_file, dependencies = nil)
Creates a new
Lockfile
for the givenrequest_set
andgem_deps_file
location. - .new(request_set, gem_deps_file, dependencies) ⇒ Lockfile constructor
- .requests_to_deps(requests) Internal use only
Instance Attribute Summary
-
#platforms
readonly
The platforms for this
Lockfile
.
Instance Method Summary
- #add_GIT(out, git_requests)
- #spec_groups
-
#to_s
The contents of the lock file.
-
#write
Writes the lock file alongside the gem dependencies file.
- #requests private
- #add_DEPENDENCIES(out) Internal use only
- #add_GEM(out, spec_groups) Internal use only
- #add_PATH(out, path_requests) Internal use only
- #add_PLATFORMS(out) Internal use only
- #relative_path_from(dest, base) Internal use only
Constructor Details
.new(request_set, gem_deps_file, dependencies) ⇒ Lockfile
# File 'lib/rubygems/request_set/lockfile.rb', line 74
def initialize(request_set, gem_deps_file, dependencies) @set = request_set @dependencies = dependencies @gem_deps_file = File. (gem_deps_file) @gem_deps_dir = File.dirname(@gem_deps_file) @platforms = [] end
Class Method Details
.build(request_set, gem_deps_file, dependencies = nil)
Creates a new Lockfile
for the given request_set
and gem_deps_file
location.
# File 'lib/rubygems/request_set/lockfile.rb', line 44
def self.build(request_set, gem_deps_file, dependencies = nil) request_set.resolve dependencies ||= requests_to_deps request_set.sorted_requests new request_set, gem_deps_file, dependencies end
.requests_to_deps(requests)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/request_set/lockfile.rb', line 50
def self.requests_to_deps(requests) # :nodoc: deps = {} requests.each do |request| spec = request.spec name = request.name requirement = request.request.dependency.requirement deps[name] = if [Gem::Resolver::VendorSpecification, Gem::Resolver::GitSpecification].include? spec.class Gem::Requirement.source_set else requirement end end deps end
Instance Attribute Details
#platforms (readonly)
The platforms for this Lockfile
# File 'lib/rubygems/request_set/lockfile.rb', line 72
attr_reader :platforms
Instance Method Details
#add_DEPENDENCIES(out)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/request_set/lockfile.rb', line 82
def add_DEPENDENCIES(out) # :nodoc: out << "DEPENDENCIES" out.concat @dependencies.sort.map {|name, requirement| " #{name}#{requirement.for_lockfile}" } out << nil end
#add_GEM(out, spec_groups)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/request_set/lockfile.rb', line 92
def add_GEM(out, spec_groups) # :nodoc: return if spec_groups.empty? source_groups = spec_groups.values.flatten.group_by do |request| request.spec.source.uri end source_groups.sort_by {|group,| group.to_s }.map do |group, requests| out << "GEM" out << " remote: #{group}" out << " specs:" requests.sort_by(&:name).each do |request| next if request.spec.name == "bundler" platform = "-#{request.spec.platform}" unless request.spec.platform == Gem::Platform::RUBY out << " #{request.name} (#{request.version}#{platform})" request.full_spec.dependencies.sort.each do |dependency| next if dependency.type == :development requirement = dependency.requirement out << " #{dependency.name}#{requirement.for_lockfile}" end end out << nil end end
#add_GIT(out, git_requests)
[ GitHub ]# File 'lib/rubygems/request_set/lockfile.rb', line 122
def add_GIT(out, git_requests) return if git_requests.empty? by_repository_revision = git_requests.group_by do |request| source = request.spec.source [source.repository, source.rev_parse] end by_repository_revision.each do |(repository, revision), requests| out << "GIT" out << " remote: #{repository}" out << " revision: #{revision}" out << " specs:" requests.sort_by(&:name).each do |request| out << " #{request.name} (#{request.version})" dependencies = request.spec.dependencies.sort_by(&:name) dependencies.each do |dep| out << " #{dep.name}#{dep.requirement.for_lockfile}" end end out << nil end end
#add_PATH(out, path_requests)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/request_set/lockfile.rb', line 163
def add_PATH(out, path_requests) # :nodoc: return if path_requests.empty? out << "PATH" path_requests.each do |request| directory = File. (request.spec.source.uri) out << " remote: #{relative_path_from directory, @gem_deps_dir}" out << " specs:" out << " #{request.name} (#{request.version})" end out << nil end
#add_PLATFORMS(out)
This method is for internal use only.
[ GitHub ]
#relative_path_from(dest, base)
This method is for internal use only.
[ GitHub ]
# File 'lib/rubygems/request_set/lockfile.rb', line 148
def relative_path_from(dest, base) # :nodoc: dest = File. (dest) base = File. (base) if dest.index(base) == 0 offset = dest[base.size + 1..-1] return "." unless offset offset else dest end end
#requests (private)
[ GitHub ]# File 'lib/rubygems/request_set/lockfile.rb', line 230
def requests @set.sorted_requests end
#spec_groups
[ GitHub ]# File 'lib/rubygems/request_set/lockfile.rb', line 192
def spec_groups requests.group_by {|request| request.spec.class } end
#to_s
The contents of the lock file.
# File 'lib/rubygems/request_set/lockfile.rb', line 199
def to_s out = [] groups = spec_groups add_PATH out, groups.delete(Gem::Resolver::VendorSpecification) { [] } add_GIT out, groups.delete(Gem::Resolver::GitSpecification) { [] } add_GEM out, groups add_PLATFORMS out add_DEPENDENCIES out out.join "\n" end
#write
Writes the lock file alongside the gem dependencies file
# File 'lib/rubygems/request_set/lockfile.rb', line 220
def write content = to_s File.open "#{@gem_deps_file}.lock", "w" do |io| io.write content end end