Class: Gem::RequestSet

Inherits:
Object
  • Object
show all
Includes:
TSort
Defined in:
lib/rubygems/request_set.rb

Defined Under Namespace

Classes: GemDepedencyAPI

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*deps) {|_self| ... } ⇒ RequestSet

Returns a new instance of RequestSet.

Yields:

  • (_self)

Yield Parameters:



13
14
15
16
17
# File 'lib/rubygems/request_set.rb', line 13

def initialize(*deps)
  @dependencies = deps

  yield self if block_given?
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies



19
20
21
# File 'lib/rubygems/request_set.rb', line 19

def dependencies
  @dependencies
end

Instance Method Details

#gem(name, *reqs) ⇒ Object

Declare that a gem of name name with reqs requirements is needed.



24
25
26
# File 'lib/rubygems/request_set.rb', line 24

def gem(name, *reqs)
  @dependencies << Gem::Dependency.new(name, reqs)
end

#import(deps) ⇒ Object

Add deps Gem::Depedency objects to the set.



30
31
32
# File 'lib/rubygems/request_set.rb', line 30

def import(deps)
  @dependencies += deps
end

#install(options, &b) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/rubygems/request_set.rb', line 119

def install(options, &b)
  if dir = options[:install_dir]
    return install_into(dir, false, &b)
  end

  cache_dir = options[:cache_dir] || Gem.dir

  specs = []

  sorted_requests.each do |req|
    if req.installed?
      b.call req, nil if b
      next
    end

    path = req.download cache_dir

    inst = Gem::Installer.new path, options

    b.call req, inst if b

    specs << inst.install
  end

  specs
end

#install_into(dir, force = true, &b) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/rubygems/request_set.rb', line 91

def install_into(dir, force=true, &b)
  existing = force ? [] : specs_in(dir)

  dir = File.expand_path dir

  installed = []

  sorted_requests.each do |req|
    if existing.find { |s| s.full_name == req.spec.full_name }
      b.call req, nil if b
      next
    end

    path = req.download(dir)

    inst = Gem::Installer.new path, :install_dir => dir,
                                    :only_install_dir => true

    b.call req, inst if b

    inst.install

    installed << req
  end

  installed
end

#load_gemdeps(path) ⇒ Object

Load a dependency management file.



52
53
54
55
# File 'lib/rubygems/request_set.rb', line 52

def load_gemdeps(path)
  gf = GemDepedencyAPI.new(self, path)
  gf.load
end

#resolve(set = nil) ⇒ Object

Resolve the requested dependencies and return an Array of Specification objects to be activated.



37
38
39
40
# File 'lib/rubygems/request_set.rb', line 37

def resolve(set=nil)
  r = Gem::DependencyResolver.new(@dependencies, set)
  @requests = r.resolve
end

#resolve_currentObject

Resolve the requested dependencies against the gems available via Gem.path and return an Array of Specification objects to be activated.



46
47
48
# File 'lib/rubygems/request_set.rb', line 46

def resolve_current
  resolve DependencyResolver::CurrentSet.new
end

#sorted_requestsObject



81
82
83
# File 'lib/rubygems/request_set.rb', line 81

def sorted_requests
  @sorted ||= strongly_connected_components.flatten
end

#specsObject



57
58
59
# File 'lib/rubygems/request_set.rb', line 57

def specs
  @specs ||= @requests.map { |r| r.full_spec }
end

#specs_in(dir) ⇒ Object



85
86
87
88
89
# File 'lib/rubygems/request_set.rb', line 85

def specs_in(dir)
  Dir["#{dir}/specifications/*.gemspec"].map do |g|
    Gem::Specification.load g
  end
end

#tsort_each_child(node) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rubygems/request_set.rb', line 65

def tsort_each_child(node)
  node.spec.dependencies.each do |dep|
    next if dep.type == :development

    match = @requests.find { |r| dep.match? r.spec.name, r.spec.version }
    if match
      begin
        yield match
      rescue TSort::Cyclic
      end
    else
      raise Gem::DependencyError, "Unresolved depedency found during sorting - #{dep}"
    end
  end
end

#tsort_each_node(&block) ⇒ Object



61
62
63
# File 'lib/rubygems/request_set.rb', line 61

def tsort_each_node(&block)
  @requests.each(&block)
end