Class: Gem::Resolver::VendorSet

Inherits:
Set
  • Object
show all
Defined in:
lib/rubygems/resolver/vendor_set.rb

Overview

A VendorSet represents gems that have been unpacked into a specific directory that contains a gemspec.

This is used for gem dependency file support.

Example:

set = Gem::Resolver::VendorSet.new

set.add_vendor_gem 'rake', 'vendor/rake'

The directory vendor/rake must contain an unpacked rake gem along with a rake.gemspec (watching the given name).

Instance Attribute Summary collapse

Attributes inherited from Set

#errors, #prerelease, #remote

Instance Method Summary collapse

Methods inherited from Set

#prefetch, #remote?

Constructor Details

#initializeVendorSet

:nodoc:


24
25
26
27
28
29
# File 'lib/rubygems/resolver/vendor_set.rb', line 24

def initialize # :nodoc:
  super()

  @directories = {}
  @specs       = {}
end

Instance Attribute Details

#specsObject (readonly)

The specifications for this set.


22
23
24
# File 'lib/rubygems/resolver/vendor_set.rb', line 22

def specs
  @specs
end

Instance Method Details

#add_vendor_gem(name, directory) ⇒ Object

Adds a specification to the set with the given name which has been unpacked into the given directory.


35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rubygems/resolver/vendor_set.rb', line 35

def add_vendor_gem(name, directory) # :nodoc:
  gemspec = File.join directory, "#{name}.gemspec"

  spec = Gem::Specification.load gemspec

  raise Gem::GemNotFoundException,
        "unable to find #{gemspec} for gem #{name}" unless spec

  spec.full_gem_path = File.expand_path directory

  @specs[spec.name]  = spec
  @directories[spec] = directory

  spec
end

#find_all(req) ⇒ Object

Returns an Array of VendorSpecification objects matching the DependencyRequest req.


55
56
57
58
59
60
61
62
# File 'lib/rubygems/resolver/vendor_set.rb', line 55

def find_all(req)
  @specs.values.select do |spec|
    req.match? spec
  end.map do |spec|
    source = Gem::Source::Vendor.new @directories[spec]
    Gem::Resolver::VendorSpecification.new self, spec, source
  end
end

#load_spec(name, version, platform, source) ⇒ Object

Loads a spec with the given name. version, platform and source are ignored.


68
69
70
# File 'lib/rubygems/resolver/vendor_set.rb', line 68

def load_spec(name, version, platform, source) # :nodoc:
  @specs.fetch name
end

#pretty_print(q) ⇒ Object

:nodoc:


72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/rubygems/resolver/vendor_set.rb', line 72

def pretty_print(q) # :nodoc:
  q.group 2, '[VendorSet', ']' do
    next if @directories.empty?
    q.breakable

    dirs = @directories.map do |spec, directory|
      "#{spec.full_name}: #{directory}"
    end

    q.seplist dirs do |dir|
      q.text dir
    end
  end
end