bundler 1.8.9 → 1.9.0.pre
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +9 -7
- data/CHANGELOG.md +8 -33
- data/Rakefile +51 -8
- data/lib/bundler/cli/gem.rb +20 -1
- data/lib/bundler/cli/install.rb +1 -1
- data/lib/bundler/definition.rb +8 -12
- data/lib/bundler/dep_proxy.rb +2 -2
- data/lib/bundler/installer.rb +12 -18
- data/lib/bundler/resolver.rb +168 -383
- data/lib/bundler/rubygems_ext.rb +1 -1
- data/lib/bundler/rubygems_integration.rb +6 -14
- data/lib/bundler/runtime.rb +3 -0
- data/lib/bundler/shared_helpers.rb +12 -7
- data/lib/bundler/source.rb +0 -5
- data/lib/bundler/source/path.rb +2 -1
- data/lib/bundler/source/path/installer.rb +0 -2
- data/lib/bundler/source/rubygems.rb +9 -11
- data/lib/bundler/templates/newgem/Rakefile.tt +0 -1
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo.rb +5 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/dependency_graph.rb +266 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/errors.rb +69 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/gem_metadata.rb +3 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/modules/specification_provider.rb +90 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/modules/ui.rb +63 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolution.rb +412 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolver.rb +43 -0
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/state.rb +43 -0
- data/lib/bundler/vendor/{thor.rb → thor-0.19.1/lib/thor.rb} +57 -53
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions.rb +34 -34
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/create_file.rb +7 -7
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/create_link.rb +2 -2
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/directory.rb +11 -11
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/empty_directory.rb +2 -2
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/file_manipulation.rb +14 -14
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/actions/inject_into_file.rb +24 -24
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/base.rb +71 -71
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/command.rb +8 -8
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/core_ext/hash_with_indifferent_access.rb +2 -2
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/core_ext/io_binary_read.rb +1 -1
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/core_ext/ordered_hash.rb +2 -2
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/error.rb +3 -3
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/group.rb +27 -27
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/invocation.rb +16 -11
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/line_editor/basic.rb +2 -2
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/line_editor/readline.rb +7 -7
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/parser/argument.rb +7 -7
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/parser/arguments.rb +10 -10
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/parser/option.rb +14 -10
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/parser/options.rb +12 -12
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/rake_compat.rb +14 -14
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/runner.rb +76 -76
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/shell.rb +18 -18
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/shell/basic.rb +31 -30
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/shell/color.rb +10 -10
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/shell/html.rb +28 -28
- data/lib/bundler/vendor/{thor → thor-0.19.1/lib/thor}/util.rb +61 -61
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/version.rb +3 -0
- data/lib/bundler/vendored_molinillo.rb +5 -0
- data/lib/bundler/vendored_thor.rb +3 -6
- data/lib/bundler/version.rb +1 -1
- metadata +44 -35
- data/lib/bundler/vendor/.document +0 -0
- data/lib/bundler/vendor/thor/line_editor.rb +0 -17
- data/lib/bundler/vendor/thor/parser.rb +0 -4
- data/lib/bundler/vendor/thor/version.rb +0 -3
data/lib/bundler/rubygems_ext.rb
CHANGED
@@ -72,7 +72,7 @@ module Gem
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def to_gemfile(path = nil)
|
75
|
-
gemfile = "source
|
75
|
+
gemfile = "source 'https://rubygems.org'\n"
|
76
76
|
gemfile << dependencies_to_gemfile(nondevelopment_dependencies)
|
77
77
|
unless development_dependencies.empty?
|
78
78
|
gemfile << "\n"
|
@@ -161,14 +161,12 @@ module Bundler
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def with_build_args(args)
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
self.build_args = old_args
|
171
|
-
end
|
164
|
+
old_args = self.build_args
|
165
|
+
begin
|
166
|
+
self.build_args = args
|
167
|
+
yield
|
168
|
+
ensure
|
169
|
+
self.build_args = old_args
|
172
170
|
end
|
173
171
|
end
|
174
172
|
|
@@ -585,12 +583,6 @@ module Bundler
|
|
585
583
|
def ext_lock
|
586
584
|
Gem::Ext::Builder::CHDIR_MONITOR
|
587
585
|
end
|
588
|
-
|
589
|
-
def find_name(name)
|
590
|
-
Gem::Specification.stubs.find_all do |spec|
|
591
|
-
spec.name == name
|
592
|
-
end.map(&:to_spec)
|
593
|
-
end
|
594
586
|
end
|
595
587
|
|
596
588
|
end
|
data/lib/bundler/runtime.rb
CHANGED
@@ -35,27 +35,32 @@ module Bundler
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def default_bundle_dir
|
38
|
-
bundle_dir = find_directory(".bundle")
|
39
|
-
return nil unless bundle_dir
|
40
|
-
|
41
38
|
global_bundle_dir = File.join(Bundler.rubygems.user_home, ".bundle")
|
42
|
-
|
39
|
+
bundle_dir = find_directory(".bundle")
|
43
40
|
|
44
|
-
|
41
|
+
if bundle_dir && bundle_dir != global_bundle_dir
|
42
|
+
Pathname.new(bundle_dir)
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
45
46
|
end
|
46
47
|
|
47
48
|
def in_bundle?
|
48
49
|
find_gemfile
|
49
50
|
end
|
50
51
|
|
52
|
+
def chdir_monitor
|
53
|
+
Bundler.rubygems.ext_lock
|
54
|
+
end
|
55
|
+
|
51
56
|
def chdir(dir, &blk)
|
52
|
-
|
57
|
+
chdir_monitor.synchronize do
|
53
58
|
Dir.chdir dir, &blk
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
57
62
|
def pwd
|
58
|
-
|
63
|
+
chdir_monitor.synchronize do
|
59
64
|
Dir.pwd
|
60
65
|
end
|
61
66
|
end
|
data/lib/bundler/source.rb
CHANGED
data/lib/bundler/source/path.rb
CHANGED
@@ -130,7 +130,8 @@ module Bundler
|
|
130
130
|
index = Index.new
|
131
131
|
|
132
132
|
if File.directory?(expanded_path)
|
133
|
-
|
133
|
+
# We sort depth-first since `<<` will override the earlier-found specs
|
134
|
+
Dir["#{expanded_path}/#{@glob}"].sort_by { |p| -p.split(File::SEPARATOR).size }.each do |file|
|
134
135
|
spec = Bundler.load_gemspec(file)
|
135
136
|
if spec
|
136
137
|
spec.loaded_from = file.to_s
|
@@ -36,15 +36,11 @@ module Bundler
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def eql?(o)
|
39
|
-
o.is_a?(Rubygems) && o.
|
39
|
+
o.is_a?(Rubygems) && remotes_equal?(o.remotes)
|
40
40
|
end
|
41
41
|
|
42
42
|
alias == eql?
|
43
43
|
|
44
|
-
def include?(o)
|
45
|
-
o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty?
|
46
|
-
end
|
47
|
-
|
48
44
|
def can_lock?(spec)
|
49
45
|
spec.source.is_a?(Rubygems)
|
50
46
|
end
|
@@ -204,12 +200,6 @@ module Bundler
|
|
204
200
|
|
205
201
|
protected
|
206
202
|
|
207
|
-
def credless_remotes
|
208
|
-
remotes.map(&method(:suppress_configured_credentials))
|
209
|
-
end
|
210
|
-
|
211
|
-
private
|
212
|
-
|
213
203
|
def source_uris_for_spec(spec)
|
214
204
|
specs.search_all(spec.name).inject([]) do |uris, s|
|
215
205
|
uris << s.source_uri.without_credentials if s.source_uri
|
@@ -217,6 +207,8 @@ module Bundler
|
|
217
207
|
end
|
218
208
|
end
|
219
209
|
|
210
|
+
private
|
211
|
+
|
220
212
|
def loaded_from(spec)
|
221
213
|
"#{Bundler.rubygems.gem_dir}/specifications/#{spec.full_name}.gemspec"
|
222
214
|
end
|
@@ -315,6 +307,8 @@ module Bundler
|
|
315
307
|
# the gemspecs of those gems, if the non-api sites contain more than
|
316
308
|
# about 100 gems, we just treat all sites as non-api for speed.
|
317
309
|
allow_api = idx.size < API_REQUEST_LIMIT && dependency_names.size < API_REQUEST_LIMIT
|
310
|
+
Bundler.ui.debug "Need to query more than #{API_REQUEST_LIMIT} gems." \
|
311
|
+
" Downloading full index instead..." unless allow_api
|
318
312
|
|
319
313
|
if allow_api
|
320
314
|
api_fetchers.each do |f|
|
@@ -376,6 +370,10 @@ module Bundler
|
|
376
370
|
spec.loaded_from && spec.loaded_from.include?("specifications/default/")
|
377
371
|
end
|
378
372
|
|
373
|
+
def remotes_equal?(other_remotes)
|
374
|
+
remotes.map(&method(:suppress_configured_credentials)) == other_remotes.map(&method(:suppress_configured_credentials))
|
375
|
+
end
|
376
|
+
|
379
377
|
end
|
380
378
|
end
|
381
379
|
end
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
|
29
29
|
end
|
30
30
|
|
31
|
-
spec.add_development_dependency "bundler", "~> <%=
|
31
|
+
spec.add_development_dependency "bundler", "~> <%= config[:bundler_version] %>"
|
32
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
33
|
<%- if config[:ext] -%>
|
34
34
|
spec.add_development_dependency "rake-compiler"
|
@@ -0,0 +1,266 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'tsort'
|
3
|
+
|
4
|
+
module Bundler::Molinillo
|
5
|
+
# A directed acyclic graph that is tuned to hold named dependencies
|
6
|
+
class DependencyGraph
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
# Enumerates through the vertices of the graph.
|
10
|
+
# @return [Array<Vertex>] The graph's vertices.
|
11
|
+
def each
|
12
|
+
vertices.values.each { |v| yield v }
|
13
|
+
end
|
14
|
+
|
15
|
+
include TSort
|
16
|
+
|
17
|
+
alias_method :tsort_each_node, :each
|
18
|
+
|
19
|
+
def tsort_each_child(vertex, &block)
|
20
|
+
vertex.successors.each(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Topologically sorts the given vertices.
|
24
|
+
# @param [Enumerable<Vertex>] vertices the vertices to be sorted, which must
|
25
|
+
# all belong to the same graph.
|
26
|
+
# @return [Array<Vertex>] The sorted vertices.
|
27
|
+
def self.tsort(vertices)
|
28
|
+
TSort.tsort(
|
29
|
+
lambda { |b| vertices.each(&b) },
|
30
|
+
lambda { |v, &b| (v.successors & vertices).each(&b) }
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
# A directed edge of a {DependencyGraph}
|
35
|
+
# @attr [Vertex] origin The origin of the directed edge
|
36
|
+
# @attr [Vertex] destination The destination of the directed edge
|
37
|
+
# @attr [Array] requirements The requirements the directed edge represents
|
38
|
+
Edge = Struct.new(:origin, :destination, :requirements)
|
39
|
+
|
40
|
+
# @return [{String => Vertex}] vertices that have no {Vertex#predecessors},
|
41
|
+
# keyed by by {Vertex#name}
|
42
|
+
attr_reader :root_vertices
|
43
|
+
# @return [{String => Vertex}] the vertices of the dependency graph, keyed
|
44
|
+
# by {Vertex#name}
|
45
|
+
attr_reader :vertices
|
46
|
+
# @return [Set<Edge>] the edges of the dependency graph
|
47
|
+
attr_reader :edges
|
48
|
+
|
49
|
+
def initialize
|
50
|
+
@vertices = {}
|
51
|
+
@edges = Set.new
|
52
|
+
@root_vertices = {}
|
53
|
+
end
|
54
|
+
|
55
|
+
# Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
|
56
|
+
# have the correct {Vertex#graph} set
|
57
|
+
def initialize_copy(other)
|
58
|
+
super
|
59
|
+
@vertices = other.vertices.reduce({}) do |vertices, (name, vertex)|
|
60
|
+
vertices.tap do |hash|
|
61
|
+
hash[name] = vertex.dup.tap { |v| v.graph = self }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@root_vertices = Hash[vertices.select { |n, _v| other.root_vertices[n] }]
|
65
|
+
@edges = other.edges.map do |edge|
|
66
|
+
Edge.new(
|
67
|
+
vertex_named(edge.origin.name),
|
68
|
+
vertex_named(edge.destination.name),
|
69
|
+
edge.requirements.dup
|
70
|
+
)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [String] a string suitable for debugging
|
75
|
+
def inspect
|
76
|
+
"#{self.class}:#{vertices.values.inspect}"
|
77
|
+
end
|
78
|
+
|
79
|
+
# @return [Boolean] whether the two dependency graphs are equal, determined
|
80
|
+
# by a recursive traversal of each {#root_vertices} and its
|
81
|
+
# {Vertex#successors}
|
82
|
+
def ==(other)
|
83
|
+
root_vertices == other.root_vertices
|
84
|
+
end
|
85
|
+
|
86
|
+
# @param [String] name
|
87
|
+
# @param [Object] payload
|
88
|
+
# @param [Array<String>] parent_names
|
89
|
+
# @param [Object] requirement the requirement that is requiring the child
|
90
|
+
# @return [void]
|
91
|
+
def add_child_vertex(name, payload, parent_names, requirement)
|
92
|
+
is_root = parent_names.include?(nil)
|
93
|
+
parent_nodes = parent_names.compact.map { |n| vertex_named(n) }
|
94
|
+
vertex = vertex_named(name) || if is_root
|
95
|
+
add_root_vertex(name, payload)
|
96
|
+
else
|
97
|
+
add_vertex(name, payload)
|
98
|
+
end
|
99
|
+
vertex.payload ||= payload
|
100
|
+
parent_nodes.each do |parent_node|
|
101
|
+
add_edge(parent_node, vertex, requirement)
|
102
|
+
end
|
103
|
+
vertex
|
104
|
+
end
|
105
|
+
|
106
|
+
# @param [String] name
|
107
|
+
# @param [Object] payload
|
108
|
+
# @return [Vertex] the vertex that was added to `self`
|
109
|
+
def add_vertex(name, payload)
|
110
|
+
vertex = vertices[name] ||= Vertex.new(self, name, payload)
|
111
|
+
vertex.tap { |v| v.payload = payload }
|
112
|
+
end
|
113
|
+
|
114
|
+
# @param [String] name
|
115
|
+
# @param [Object] payload
|
116
|
+
# @return [Vertex] the vertex that was added to `self`
|
117
|
+
def add_root_vertex(name, payload)
|
118
|
+
add_vertex(name, payload).tap { |v| root_vertices[name] = v }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
|
122
|
+
# removing any non-root vertices that were orphaned in the process
|
123
|
+
# @param [String] name
|
124
|
+
# @return [void]
|
125
|
+
def detach_vertex_named(name)
|
126
|
+
vertex = vertex_named(name)
|
127
|
+
return unless vertex
|
128
|
+
successors = vertex.successors
|
129
|
+
vertices.delete(name)
|
130
|
+
edges.reject! { |e| e.origin == vertex || e.destination == vertex }
|
131
|
+
successors.each { |v| detach_vertex_named(v.name) unless root_vertices[v.name] || v.predecessors.any? }
|
132
|
+
end
|
133
|
+
|
134
|
+
# @param [String] name
|
135
|
+
# @return [Vertex,nil] the vertex with the given name
|
136
|
+
def vertex_named(name)
|
137
|
+
vertices[name]
|
138
|
+
end
|
139
|
+
|
140
|
+
# @param [String] name
|
141
|
+
# @return [Vertex,nil] the root vertex with the given name
|
142
|
+
def root_vertex_named(name)
|
143
|
+
root_vertices[name]
|
144
|
+
end
|
145
|
+
|
146
|
+
# Adds a new {Edge} to the dependency graph
|
147
|
+
# @param [Vertex] origin
|
148
|
+
# @param [Vertex] destination
|
149
|
+
# @param [Object] requirement the requirement that this edge represents
|
150
|
+
# @return [Edge] the added edge
|
151
|
+
def add_edge(origin, destination, requirement)
|
152
|
+
if origin == destination || destination.path_to?(origin)
|
153
|
+
raise CircularDependencyError.new([origin, destination])
|
154
|
+
end
|
155
|
+
Edge.new(origin, destination, [requirement]).tap { |e| edges << e }
|
156
|
+
end
|
157
|
+
|
158
|
+
# A vertex in a {DependencyGraph} that encapsulates a {#name} and a
|
159
|
+
# {#payload}
|
160
|
+
class Vertex
|
161
|
+
# @return [DependencyGraph] the graph this vertex is a node of
|
162
|
+
attr_accessor :graph
|
163
|
+
|
164
|
+
# @return [String] the name of the vertex
|
165
|
+
attr_accessor :name
|
166
|
+
|
167
|
+
# @return [Object] the payload the vertex holds
|
168
|
+
attr_accessor :payload
|
169
|
+
|
170
|
+
# @return [Arrary<Object>] the explicit requirements that required
|
171
|
+
# this vertex
|
172
|
+
attr_reader :explicit_requirements
|
173
|
+
|
174
|
+
# @param [DependencyGraph] graph see {#graph}
|
175
|
+
# @param [String] name see {#name}
|
176
|
+
# @param [Object] payload see {#payload}
|
177
|
+
def initialize(graph, name, payload)
|
178
|
+
@graph = graph
|
179
|
+
@name = name
|
180
|
+
@payload = payload
|
181
|
+
@explicit_requirements = []
|
182
|
+
end
|
183
|
+
|
184
|
+
# @return [Array<Object>] all of the requirements that required
|
185
|
+
# this vertex
|
186
|
+
def requirements
|
187
|
+
incoming_edges.map(&:requirements).flatten + explicit_requirements
|
188
|
+
end
|
189
|
+
|
190
|
+
# @return [Array<Edge>] the edges of {#graph} that have `self` as their
|
191
|
+
# {Edge#origin}
|
192
|
+
def outgoing_edges
|
193
|
+
graph.edges.select { |e| e.origin.shallow_eql?(self) }
|
194
|
+
end
|
195
|
+
|
196
|
+
# @return [Array<Edge>] the edges of {#graph} that have `self` as their
|
197
|
+
# {Edge#destination}
|
198
|
+
def incoming_edges
|
199
|
+
graph.edges.select { |e| e.destination.shallow_eql?(self) }
|
200
|
+
end
|
201
|
+
|
202
|
+
# @return [Set<Vertex>] the vertices of {#graph} that have an edge with
|
203
|
+
# `self` as their {Edge#destination}
|
204
|
+
def predecessors
|
205
|
+
incoming_edges.map(&:origin).to_set
|
206
|
+
end
|
207
|
+
|
208
|
+
# @return [Set<Vertex>] the vertices of {#graph} that have an edge with
|
209
|
+
# `self` as their {Edge#origin}
|
210
|
+
def successors
|
211
|
+
outgoing_edges.map(&:destination).to_set
|
212
|
+
end
|
213
|
+
|
214
|
+
# @return [Set<Vertex>] the vertices of {#graph} where `self` is an
|
215
|
+
# {#ancestor?}
|
216
|
+
def recursive_successors
|
217
|
+
successors + successors.map(&:recursive_successors).reduce(Set.new, &:+)
|
218
|
+
end
|
219
|
+
|
220
|
+
# @return [String] a string suitable for debugging
|
221
|
+
def inspect
|
222
|
+
"#{self.class}:#{name}(#{payload.inspect})"
|
223
|
+
end
|
224
|
+
|
225
|
+
# @return [Boolean] whether the two vertices are equal, determined
|
226
|
+
# by a recursive traversal of each {Vertex#successors}
|
227
|
+
def ==(other)
|
228
|
+
shallow_eql?(other) &&
|
229
|
+
successors == other.successors
|
230
|
+
end
|
231
|
+
|
232
|
+
# @return [Boolean] whether the two vertices are equal, determined
|
233
|
+
# solely by {#name} and {#payload} equality
|
234
|
+
def shallow_eql?(other)
|
235
|
+
other &&
|
236
|
+
name == other.name &&
|
237
|
+
payload == other.payload
|
238
|
+
end
|
239
|
+
|
240
|
+
alias_method :eql?, :==
|
241
|
+
|
242
|
+
# @return [Fixnum] a hash for the vertex based upon its {#name}
|
243
|
+
def hash
|
244
|
+
name.hash
|
245
|
+
end
|
246
|
+
|
247
|
+
# Is there a path from `self` to `other` following edges in the
|
248
|
+
# dependency graph?
|
249
|
+
# @return true iff there is a path following edges within this {#graph}
|
250
|
+
def path_to?(other)
|
251
|
+
successors.include?(other) || successors.any? { |v| v.path_to?(other) }
|
252
|
+
end
|
253
|
+
|
254
|
+
alias_method :descendent?, :path_to?
|
255
|
+
|
256
|
+
# Is there a path from `other` to `self` following edges in the
|
257
|
+
# dependency graph?
|
258
|
+
# @return true iff there is a path following edges within this {#graph}
|
259
|
+
def ancestor?(other)
|
260
|
+
predecessors.include?(other) || predecessors.any? { |v| v.ancestor?(other) }
|
261
|
+
end
|
262
|
+
|
263
|
+
alias_method :is_reachable_from?, :ancestor?
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|