molinillo 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/molinillo/dependency_graph.rb +3 -1
- data/lib/molinillo/dependency_graph/detach_vertex_named.rb +9 -2
- data/lib/molinillo/dependency_graph/vertex.rb +2 -0
- data/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/molinillo/resolution.rb +5 -6
- data/spec/dependency_graph_spec.rb +1 -1
- data/spec/fuzz_spec.rb +78 -0
- data/spec/resolver_spec.rb +52 -16
- data/spec/spec_helper.rb +5 -0
- data/spec/spec_helper/index.rb +11 -3
- data/spec/spec_helper/naive_resolver.rb +48 -0
- data/spec/spec_helper/specification.rb +3 -2
- metadata +12 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3f407e98934857813a1d4e17fbf807171bfbd02
|
4
|
+
data.tar.gz: 5ca9cff1741fb50a1c8767a7fb6aadc6465d1b70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a683263d7bf6566b74e88d948c20a6b2ec18cbbf26ae68e335ec27ab61708c25b9565329b6295e90bad515322196792d94df6f1d651997d84f32066253b6d85
|
7
|
+
data.tar.gz: d529667799bbb115b1fadd3fffa107fadca0ec456b0c00a97af9404713b45d1ec6a4ae54a8f2309acd68ea068018f7cf63c494b91effcbbf80fc112390340bbb
|
@@ -119,6 +119,7 @@ module Molinillo
|
|
119
119
|
# {Vertex#successors}
|
120
120
|
def ==(other)
|
121
121
|
return false unless other
|
122
|
+
return true if equal?(other)
|
122
123
|
vertices.each do |name, vertex|
|
123
124
|
other_vertex = other.vertex_named(name)
|
124
125
|
return false unless other_vertex
|
@@ -134,6 +135,7 @@ module Molinillo
|
|
134
135
|
def add_child_vertex(name, payload, parent_names, requirement)
|
135
136
|
root = !parent_names.delete(nil) { true }
|
136
137
|
vertex = add_vertex(name, payload, root)
|
138
|
+
vertex.explicit_requirements << requirement if root
|
137
139
|
parent_names.each do |parent_name|
|
138
140
|
parent_node = vertex_named(parent_name)
|
139
141
|
add_edge(parent_node, vertex, requirement)
|
@@ -152,7 +154,7 @@ module Molinillo
|
|
152
154
|
# Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
|
153
155
|
# removing any non-root vertices that were orphaned in the process
|
154
156
|
# @param [String] name
|
155
|
-
# @return [
|
157
|
+
# @return [Array<Vertex>] the vertices which have been detached
|
156
158
|
def detach_vertex_named(name)
|
157
159
|
log.detach_vertex_named(self, name)
|
158
160
|
end
|
@@ -14,16 +14,23 @@ module Molinillo
|
|
14
14
|
|
15
15
|
# (see Action#up)
|
16
16
|
def up(graph)
|
17
|
-
return unless @vertex = graph.vertices.delete(name)
|
17
|
+
return [] unless @vertex = graph.vertices.delete(name)
|
18
|
+
|
19
|
+
removed_vertices = [@vertex]
|
18
20
|
@vertex.outgoing_edges.each do |e|
|
19
21
|
v = e.destination
|
20
22
|
v.incoming_edges.delete(e)
|
21
|
-
|
23
|
+
if !v.root? && v.incoming_edges.empty?
|
24
|
+
removed_vertices.concat graph.detach_vertex_named(v.name)
|
25
|
+
end
|
22
26
|
end
|
27
|
+
|
23
28
|
@vertex.incoming_edges.each do |e|
|
24
29
|
v = e.origin
|
25
30
|
v.outgoing_edges.delete(e)
|
26
31
|
end
|
32
|
+
|
33
|
+
removed_vertices
|
27
34
|
end
|
28
35
|
|
29
36
|
# (see Action#down)
|
@@ -81,6 +81,7 @@ module Molinillo
|
|
81
81
|
# @return [Boolean] whether the two vertices are equal, determined
|
82
82
|
# by a recursive traversal of each {Vertex#successors}
|
83
83
|
def ==(other)
|
84
|
+
return true if equal?(other)
|
84
85
|
shallow_eql?(other) &&
|
85
86
|
successors.to_set == other.successors.to_set
|
86
87
|
end
|
@@ -89,6 +90,7 @@ module Molinillo
|
|
89
90
|
# @return [Boolean] whether the two vertices are equal, determined
|
90
91
|
# solely by {#name} and {#payload} equality
|
91
92
|
def shallow_eql?(other)
|
93
|
+
return true if equal?(other)
|
92
94
|
other &&
|
93
95
|
name == other.name &&
|
94
96
|
payload == other.payload
|
data/lib/molinillo/resolution.rb
CHANGED
@@ -366,13 +366,12 @@ module Molinillo
|
|
366
366
|
if matching_deps.empty? && !succ.root? && succ.predecessors.to_a == [vertex]
|
367
367
|
debug(depth) { "Removing orphaned spec #{succ.name} after swapping #{name}" }
|
368
368
|
succ.requirements.each { |r| @parent_of.delete(r) }
|
369
|
-
activated.detach_vertex_named(succ.name)
|
370
369
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
370
|
+
removed_names = activated.detach_vertex_named(succ.name).map(&:name)
|
371
|
+
requirements.delete_if do |r|
|
372
|
+
# the only removed vertices are those with no other requirements,
|
373
|
+
# so it's safe to delete only based upon name here
|
374
|
+
removed_names.include?(name_for(r))
|
376
375
|
end
|
377
376
|
elsif !matching_deps.include?(outgoing_edge.requirement)
|
378
377
|
activated.delete_edge(outgoing_edge)
|
@@ -57,7 +57,7 @@ module Molinillo
|
|
57
57
|
@graph.detach_vertex_named(root.name)
|
58
58
|
expect(@graph.vertex_named(root.name)).to be_nil
|
59
59
|
expect(@graph.vertex_named(child.name)).to eq(child)
|
60
|
-
expect(child.predecessors).to
|
60
|
+
expect(child.predecessors).to contain_exactly(root2)
|
61
61
|
expect(@graph.vertices.count).to eq(2)
|
62
62
|
end
|
63
63
|
|
data/spec/fuzz_spec.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'spec_helper/naive_resolver'
|
4
|
+
|
5
|
+
describe 'fuzzing' do
|
6
|
+
CONSTRAINTS = %w(<= ~> > < >= =).freeze
|
7
|
+
let(:dependencies) do
|
8
|
+
index.specs.keys.sample(Random.rand(5)).
|
9
|
+
map do |d|
|
10
|
+
VersionKit::Dependency.new(
|
11
|
+
d,
|
12
|
+
"#{CONSTRAINTS.sample} #{Random.rand(2)}.#{Random.rand(2)}"
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
let(:index) { Molinillo::TestIndex.from_fixture('fuzz') }
|
17
|
+
let(:ui) { Molinillo::TestUI.new }
|
18
|
+
let(:resolver) { Molinillo::Resolver.new(index, ui) }
|
19
|
+
|
20
|
+
subject { resolver.resolve(dependencies) }
|
21
|
+
|
22
|
+
def validate_dependency_graph_from(graph, dependency)
|
23
|
+
vertex = graph.vertex_named(dependency.name)
|
24
|
+
spec = vertex.payload
|
25
|
+
expect(dependency).to be_satisfied_by(spec.version)
|
26
|
+
expect(spec.dependencies).to match_array(vertex.outgoing_edges.map(&:requirement))
|
27
|
+
spec.dependencies.each do |d|
|
28
|
+
validate_dependency_graph_from(graph, d)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_dependency_graph(graph)
|
33
|
+
dependencies.each do |d|
|
34
|
+
validate_dependency_graph_from(graph, d)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def all_possible_graphs
|
39
|
+
dependencies.reduce([]) { |d| strings(graphs, d) }
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:naive) { Molinillo::NaiveResolver.resolve(index, dependencies) }
|
43
|
+
|
44
|
+
def validate_unresolvable(error)
|
45
|
+
expect(naive).to be_nil,
|
46
|
+
'Got an error resolving but the naive resolver found ' \
|
47
|
+
"#{naive && naive.map(&:payload).map(&:to_s)}:\n#{error}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.fuzz!(seeds = [])
|
51
|
+
seeds.each do |seed|
|
52
|
+
it "fuzzes with seed #{seed}" do
|
53
|
+
Random.srand seed
|
54
|
+
graph, error = begin
|
55
|
+
subject
|
56
|
+
[subject, nil]
|
57
|
+
rescue => e
|
58
|
+
[nil, e]
|
59
|
+
end
|
60
|
+
validate_dependency_graph(graph) if graph
|
61
|
+
validate_unresolvable(error) if error
|
62
|
+
expect(graph).to eq(naive),
|
63
|
+
"#{graph && graph.map(&:payload).map(&:to_s)} vs #{naive && naive.map(&:payload).map(&:to_s)}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
fuzz! [
|
69
|
+
8,
|
70
|
+
9,
|
71
|
+
125,
|
72
|
+
188,
|
73
|
+
666,
|
74
|
+
7_898_789,
|
75
|
+
0.35096144504316984,
|
76
|
+
3.14159,
|
77
|
+
].concat(Array.new(ENV.fetch('MOLINILLO_FUZZER', '0').to_i) { Random.rand })
|
78
|
+
end if RUBY_VERSION >= '1.9'
|
data/spec/resolver_spec.rb
CHANGED
@@ -1,25 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require File.expand_path('../spec_helper', __FILE__)
|
3
|
-
require 'json'
|
4
|
-
require 'pathname'
|
5
3
|
|
6
4
|
module Molinillo
|
7
|
-
FIXTURE_DIR = Pathname.new('spec/resolver_integration_specs')
|
8
|
-
FIXTURE_INDEX_DIR = FIXTURE_DIR + 'index'
|
9
5
|
FIXTURE_CASE_DIR = FIXTURE_DIR + 'case'
|
10
6
|
|
11
7
|
class TestCase
|
12
|
-
require File.expand_path('../spec_helper/index', __FILE__)
|
13
|
-
require File.expand_path('../spec_helper/specification', __FILE__)
|
14
|
-
require File.expand_path('../spec_helper/ui', __FILE__)
|
15
|
-
|
16
8
|
attr_accessor :name, :requested, :base, :conflicts, :resolver, :result, :index
|
17
9
|
|
18
10
|
def initialize(fixture_path)
|
19
11
|
File.open(fixture_path) do |fixture|
|
20
12
|
JSON.load(fixture).tap do |test_case|
|
21
13
|
self.name = test_case['name']
|
22
|
-
self.index = TestIndex.
|
14
|
+
self.index = TestIndex.from_fixture(test_case['index'] || 'awesome')
|
23
15
|
self.requested = test_case['requested'].map do |(name, reqs)|
|
24
16
|
VersionKit::Dependency.new name, reqs.split(',').map(&:chomp)
|
25
17
|
end
|
@@ -90,7 +82,7 @@ module Molinillo
|
|
90
82
|
|
91
83
|
describe 'in general' do
|
92
84
|
before do
|
93
|
-
@resolver = described_class.new(TestIndex.
|
85
|
+
@resolver = described_class.new(TestIndex.from_fixture('awesome'), TestUI.new)
|
94
86
|
end
|
95
87
|
|
96
88
|
it 'can resolve a list of 0 requirements' do
|
@@ -122,7 +114,7 @@ module Molinillo
|
|
122
114
|
end
|
123
115
|
|
124
116
|
it 'can resolve when two specs have the same dependencies' do
|
125
|
-
index = BundlerIndex.
|
117
|
+
index = BundlerIndex.from_fixture('rubygems-2016-09-11')
|
126
118
|
@resolver = described_class.new(index, TestUI.new)
|
127
119
|
demands = [
|
128
120
|
VersionKit::Dependency.new('chef', '~> 12.1.2'),
|
@@ -182,7 +174,7 @@ module Molinillo
|
|
182
174
|
end
|
183
175
|
|
184
176
|
it 'can resolve when two specs have the same dependencies and swapping happens' do
|
185
|
-
index = BundlerIndex.
|
177
|
+
index = BundlerIndex.from_fixture('rubygems-2016-10-06')
|
186
178
|
@resolver = described_class.new(index, TestUI.new)
|
187
179
|
demands = [
|
188
180
|
VersionKit::Dependency.new('avro_turf', '0.6.2'),
|
@@ -243,7 +235,7 @@ module Molinillo
|
|
243
235
|
end
|
244
236
|
|
245
237
|
it 'can unwind when the conflict has a common parent' do
|
246
|
-
index = BundlerIndex.
|
238
|
+
index = BundlerIndex.from_fixture('rubygems-2016-11-05')
|
247
239
|
@resolver = described_class.new(index, TestUI.new)
|
248
240
|
demands = [
|
249
241
|
VersionKit::Dependency.new('github-pages', '>= 0'),
|
@@ -256,7 +248,7 @@ module Molinillo
|
|
256
248
|
end
|
257
249
|
|
258
250
|
it 'can resolve when swapping changes transitive dependencies' do
|
259
|
-
index = TestIndex.
|
251
|
+
index = TestIndex.from_fixture('restkit')
|
260
252
|
def index.sort_dependencies(dependencies, activated, conflicts)
|
261
253
|
dependencies.sort_by do |d|
|
262
254
|
[
|
@@ -315,11 +307,11 @@ module Molinillo
|
|
315
307
|
end
|
316
308
|
|
317
309
|
def versions_of(dependency_name)
|
318
|
-
specs[dependency_name].count
|
310
|
+
Array(specs[dependency_name]).count
|
319
311
|
end
|
320
312
|
end
|
321
313
|
|
322
|
-
index = swap_child_with_successors_index.
|
314
|
+
index = swap_child_with_successors_index.from_fixture('swap_child_with_successors')
|
323
315
|
@resolver = described_class.new(index, TestUI.new)
|
324
316
|
demands = [
|
325
317
|
VersionKit::Dependency.new('build-essential', '>= 0.0.0'),
|
@@ -340,6 +332,50 @@ module Molinillo
|
|
340
332
|
|
341
333
|
expect(resolved.map(&:payload).map(&:to_s)).to match_array(expected)
|
342
334
|
end
|
335
|
+
|
336
|
+
it 'can resolve ur face' do
|
337
|
+
index = TestIndex.new(
|
338
|
+
'a' => [
|
339
|
+
TestSpecification.new('name' => 'a', 'version' => '1.0.0', 'dependencies' => { 'z' => '= 2.0.0' }),
|
340
|
+
TestSpecification.new('name' => 'a', 'version' => '2.0.0', 'dependencies' => { 'z' => '= 1.0.0' }),
|
341
|
+
],
|
342
|
+
'b' => [
|
343
|
+
TestSpecification.new('name' => 'b', 'version' => '1.0.0', 'dependencies' => { 'a' => '< 2' }),
|
344
|
+
TestSpecification.new('name' => 'b', 'version' => '2.0.0', 'dependencies' => { 'a' => '< 2' }),
|
345
|
+
],
|
346
|
+
'c' => [
|
347
|
+
TestSpecification.new('name' => 'c', 'version' => '1.0.0'),
|
348
|
+
TestSpecification.new('name' => 'c', 'version' => '2.0.0', 'dependencies' => { 'b' => '< 2' }),
|
349
|
+
],
|
350
|
+
'z' => [
|
351
|
+
TestSpecification.new('name' => 'z', 'version' => '1.0.0'),
|
352
|
+
TestSpecification.new('name' => 'z', 'version' => '2.0.0'),
|
353
|
+
]
|
354
|
+
)
|
355
|
+
def index.sort_dependencies(dependencies, _activated, _conflicts)
|
356
|
+
index = ['c (>= 1.0.0)', 'b (< 2.0.0)', 'a (< 2.0.0)', 'c (= 1.0.0)']
|
357
|
+
dependencies.sort_by do |dep|
|
358
|
+
[
|
359
|
+
index.index(dep.to_s) || 999,
|
360
|
+
]
|
361
|
+
end
|
362
|
+
end
|
363
|
+
@resolver = described_class.new(index, TestUI.new)
|
364
|
+
demands = [
|
365
|
+
VersionKit::Dependency.new('c', '= 1.0.0'),
|
366
|
+
VersionKit::Dependency.new('c', '>= 1.0.0'),
|
367
|
+
VersionKit::Dependency.new('z', '>= 1.0.0'),
|
368
|
+
]
|
369
|
+
|
370
|
+
resolved = @resolver.resolve(demands, DependencyGraph.new)
|
371
|
+
|
372
|
+
expected = [
|
373
|
+
'c (1.0.0)',
|
374
|
+
'z (2.0.0)',
|
375
|
+
]
|
376
|
+
|
377
|
+
expect(resolved.map(&:payload).map(&:to_s)).to match_array(expected)
|
378
|
+
end
|
343
379
|
end
|
344
380
|
end
|
345
381
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -24,6 +24,7 @@ end
|
|
24
24
|
#-----------------------------------------------------------------------------#
|
25
25
|
|
26
26
|
require 'pathname'
|
27
|
+
require 'json'
|
27
28
|
ROOT = Pathname.new(File.expand_path('../../', __FILE__))
|
28
29
|
$LOAD_PATH.unshift((ROOT + 'lib').to_s)
|
29
30
|
$LOAD_PATH.unshift((ROOT + 'spec').to_s)
|
@@ -31,6 +32,10 @@ $LOAD_PATH.unshift((ROOT + 'spec').to_s)
|
|
31
32
|
require 'version_kit'
|
32
33
|
require 'molinillo'
|
33
34
|
|
35
|
+
require 'spec_helper/index'
|
36
|
+
require 'spec_helper/specification'
|
37
|
+
require 'spec_helper/ui'
|
38
|
+
|
34
39
|
RSpec.configure do |config|
|
35
40
|
# Enable flags like --only-failures and --next-failure
|
36
41
|
config.example_status_persistence_file_path = '.rspec_status'
|
data/spec/spec_helper/index.rb
CHANGED
@@ -1,19 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module Molinillo
|
3
|
+
FIXTURE_DIR = Pathname.new('spec/resolver_integration_specs')
|
4
|
+
FIXTURE_INDEX_DIR = FIXTURE_DIR + 'index'
|
5
|
+
|
3
6
|
class TestIndex
|
4
7
|
attr_accessor :specs
|
5
8
|
include SpecificationProvider
|
6
9
|
|
7
|
-
def
|
10
|
+
def self.from_fixture(fixture_name)
|
8
11
|
File.open(FIXTURE_INDEX_DIR + (fixture_name + '.json'), 'r') do |fixture|
|
9
|
-
|
12
|
+
sorted_specs = JSON.load(fixture).reduce(Hash.new([])) do |specs_by_name, (name, versions)|
|
10
13
|
specs_by_name.tap do |specs|
|
11
14
|
specs[name] = versions.map { |s| TestSpecification.new s }.sort_by(&:version)
|
12
15
|
end
|
13
16
|
end
|
17
|
+
return new(sorted_specs)
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
21
|
+
def initialize(specs_by_name)
|
22
|
+
self.specs = specs_by_name
|
23
|
+
end
|
24
|
+
|
17
25
|
def requirement_satisfied_by?(requirement, _activated, spec)
|
18
26
|
case requirement
|
19
27
|
when TestSpecification
|
@@ -27,7 +35,7 @@ module Molinillo
|
|
27
35
|
@search_for ||= {}
|
28
36
|
@search_for[dependency] ||= begin
|
29
37
|
pre_release = dependency_pre_release?(dependency)
|
30
|
-
specs[dependency.name].select do |spec|
|
38
|
+
Array(specs[dependency.name]).select do |spec|
|
31
39
|
(pre_release ? true : !spec.version.pre_release?) &&
|
32
40
|
dependency.satisfied_by?(spec.version)
|
33
41
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
4
|
+
# rubocop:disable Metrics/LineLength
|
5
|
+
# rubocop:disable Style/Semicolon
|
6
|
+
|
7
|
+
module Molinillo
|
8
|
+
class NaiveResolver
|
9
|
+
def self.resolve(index, dependencies)
|
10
|
+
activated = Molinillo::DependencyGraph.new
|
11
|
+
level = 0
|
12
|
+
dependencies.each { |d| activated.add_child_vertex(d.name, nil, [nil], d) }
|
13
|
+
activated.tag(level)
|
14
|
+
possibilities_by_level = {}
|
15
|
+
loop do
|
16
|
+
vertex = activated.find { |a| !a.requirements.empty? && a.payload.nil? }
|
17
|
+
break unless vertex
|
18
|
+
possibilities = possibilities_by_level[level] ||= index.search_for(VersionKit::Dependency.new(vertex.name, '>= 0.0.0-a'))
|
19
|
+
possibilities.select! do |spec|
|
20
|
+
vertex.requirements.all? { |r| r.satisfied_by?(spec.version) && (!spec.version.pre_release? || index.send(:dependency_pre_release?, r)) } &&
|
21
|
+
spec.dependencies.all? { |d| v = activated.vertex_named(d.name); !v || !v.payload || d.satisfied_by?(v.payload.version) }
|
22
|
+
end
|
23
|
+
warn "level = #{level} possibilities = #{possibilities.map(&:to_s)} requirements = #{vertex.requirements.map(&:to_s)}"
|
24
|
+
if spec = possibilities.pop
|
25
|
+
warn "trying #{spec}"
|
26
|
+
activated.set_payload(vertex.name, spec)
|
27
|
+
spec.dependencies.each do |d|
|
28
|
+
activated.add_child_vertex(d.name, nil, [spec.name], d)
|
29
|
+
end
|
30
|
+
level += 1
|
31
|
+
warn "tagging level #{level}"
|
32
|
+
activated.tag(level)
|
33
|
+
next
|
34
|
+
end
|
35
|
+
level = possibilities_by_level.reverse_each.find(proc { [-1, nil] }) { |_l, p| !p.empty? }.first
|
36
|
+
warn "going back to level #{level}"
|
37
|
+
possibilities_by_level.reject! { |l, _| l > level }
|
38
|
+
return nil if level < 0
|
39
|
+
activated.rewind_to(level)
|
40
|
+
activated.tag(level)
|
41
|
+
end
|
42
|
+
|
43
|
+
activated
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.warn(*); end
|
47
|
+
end
|
48
|
+
end
|
@@ -5,8 +5,9 @@ module Molinillo
|
|
5
5
|
def initialize(hash)
|
6
6
|
self.name = hash['name']
|
7
7
|
self.version = VersionKit::Version.new(hash['version'])
|
8
|
-
self.dependencies = hash
|
9
|
-
|
8
|
+
self.dependencies = hash.fetch('dependencies') { Hash.new }.map do |(name, requirement)|
|
9
|
+
requirements = requirement.split(',').map(&:chomp)
|
10
|
+
VersionKit::Dependency.new(name, requirements)
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: molinillo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel E. Giddins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description:
|
@@ -70,10 +70,12 @@ files:
|
|
70
70
|
- spec/dependency_graph/log_spec.rb
|
71
71
|
- spec/dependency_graph_spec.rb
|
72
72
|
- spec/errors_spec.rb
|
73
|
+
- spec/fuzz_spec.rb
|
73
74
|
- spec/resolver_integration_specs/index_from_rubygems.rb
|
74
75
|
- spec/resolver_spec.rb
|
75
76
|
- spec/spec_helper.rb
|
76
77
|
- spec/spec_helper/index.rb
|
78
|
+
- spec/spec_helper/naive_resolver.rb
|
77
79
|
- spec/spec_helper/specification.rb
|
78
80
|
- spec/spec_helper/ui.rb
|
79
81
|
- spec/state_spec.rb
|
@@ -87,12 +89,12 @@ require_paths:
|
|
87
89
|
- lib
|
88
90
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
91
|
requirements:
|
90
|
-
- -
|
92
|
+
- - '>='
|
91
93
|
- !ruby/object:Gem::Version
|
92
94
|
version: '0'
|
93
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
96
|
requirements:
|
95
|
-
- -
|
97
|
+
- - '>='
|
96
98
|
- !ruby/object:Gem::Version
|
97
99
|
version: '0'
|
98
100
|
requirements: []
|
@@ -105,9 +107,11 @@ test_files:
|
|
105
107
|
- spec/dependency_graph/log_spec.rb
|
106
108
|
- spec/dependency_graph_spec.rb
|
107
109
|
- spec/errors_spec.rb
|
110
|
+
- spec/fuzz_spec.rb
|
108
111
|
- spec/resolver_integration_specs/index_from_rubygems.rb
|
109
112
|
- spec/resolver_spec.rb
|
110
113
|
- spec/spec_helper/index.rb
|
114
|
+
- spec/spec_helper/naive_resolver.rb
|
111
115
|
- spec/spec_helper/specification.rb
|
112
116
|
- spec/spec_helper/ui.rb
|
113
117
|
- spec/spec_helper.rb
|