molinillo 0.2.3 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63ad00d58586b91b92f5960997bc8654c20fc5b2
4
- data.tar.gz: b9db062ba89b4a8981e94307882b1ee41c799cfb
3
+ metadata.gz: 69f2c3781273e6f2e5c06758ed06c441691a9bcc
4
+ data.tar.gz: e43917b29522495a4108ad810a8ddc6879585fc1
5
5
  SHA512:
6
- metadata.gz: 94bfb948e6ed3ac1be08b8a0cd51a26863f00fcb3793a8d21279a5ac741c3569bf7caa1bc6ff978fc933c7b8c8d27a8e5192f9b6c662546f51bf086dc1ba67f0
7
- data.tar.gz: 4cb1385a6b9d1bad57fb7df365cb84cd6bf880fc8156e762695997c0e847c69b6c3b36c9b97f87845d495d310b859ab745e46c1fdc54c71a12e6582dca4a74fc
6
+ metadata.gz: 534b055dd96c322231c79e6624687764ad99bf67c8c15f0293320d695465b8041e7086f27bdff79b3378a568a5998b0ec2242a31043b52e1ee6f736839b0ebf8
7
+ data.tar.gz: f9c29fb00c70d2638086404f91baa6d0fc9b0c837aa28bd0819fa6dfd44f6466d33941241438cb45b88f066ec97025cf79f611c5f6999b61fd56cd714eae215c
@@ -1,3 +1,3 @@
1
1
  module Molinillo
2
- VERSION = '0.2.3'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -86,5 +86,14 @@ module Molinillo
86
86
  ]
87
87
  end
88
88
  end
89
+
90
+ # Returns whether this dependency, which has no possible matching
91
+ # specifications, can safely be ignored.
92
+ #
93
+ # @param [Object] dependency
94
+ # @return [Boolean] whether this dependency can safely be skipped.
95
+ def allow_missing?(dependency)
96
+ false
97
+ end
89
98
  end
90
99
  end
@@ -93,7 +93,7 @@ module Molinillo
93
93
  def start_resolution
94
94
  @started_at = Time.now
95
95
 
96
- states.push(initial_state)
96
+ handle_missing_or_push_dependency_state(initial_state)
97
97
 
98
98
  debug { "Starting resolution (#{@started_at})" }
99
99
  resolver_ui.before_resolution
@@ -116,7 +116,8 @@ module Molinillo
116
116
 
117
117
  ResolutionState.new.members.each do |member|
118
118
  define_method member do |*args, &block|
119
- state.send(member, *args, &block)
119
+ current_state = state || ResolutionState.empty
120
+ current_state.send(member, *args, &block)
120
121
  end
121
122
  end
122
123
 
@@ -397,19 +398,33 @@ module Molinillo
397
398
  # requirements
398
399
  # @param [Array] new_requirements
399
400
  # @return [void]
400
- def push_state_for_requirements(new_requirements)
401
- new_requirements = sort_dependencies(new_requirements.uniq, activated, conflicts)
401
+ def push_state_for_requirements(new_requirements, new_activated = activated.dup)
402
+ new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts)
402
403
  new_requirement = new_requirements.shift
403
- states.push DependencyState.new(
404
- new_requirement ? name_for(new_requirement) : '',
405
- new_requirements,
406
- activated.dup,
407
- new_requirement,
408
- new_requirement ? search_for(new_requirement) : [],
409
- depth,
410
- conflicts.dup
404
+ new_name = new_requirement ? name_for(new_requirement) : ''
405
+ possibilities = new_requirement ? search_for(new_requirement) : []
406
+ handle_missing_or_push_dependency_state DependencyState.new(
407
+ new_name, new_requirements, new_activated,
408
+ new_requirement, possibilities, depth, conflicts.dup
411
409
  )
412
410
  end
411
+
412
+ # Pushes a new {DependencyState}.
413
+ # If the {#specification_provider} says to
414
+ # {SpecificationProvider#allow_missing?} that particular requirement, and
415
+ # there are no possibilities for that requirement, then `state` is not
416
+ # pushed, and the node in {#activated} is removed, and we continue
417
+ # resolving the remaining requirements.
418
+ # @param [DependencyState] state
419
+ # @return [void]
420
+ def handle_missing_or_push_dependency_state(state)
421
+ if state.requirement && state.possibilities.empty? && allow_missing?(state.requirement)
422
+ state.activated.detach_vertex_named(state.name)
423
+ push_state_for_requirements(state.requirements, state.activated)
424
+ else
425
+ states.push state
426
+ end
427
+ end
413
428
  end
414
429
  end
415
430
  end
@@ -17,6 +17,14 @@ module Molinillo
17
17
  :conflicts
18
18
  )
19
19
 
20
+ class ResolutionState
21
+ # Returns an empty resolution state
22
+ # @return [ResolutionState] an empty state
23
+ def self.empty
24
+ new(nil, [], DependencyGraph.new, nil, nil, 0, Set.new)
25
+ end
26
+ end
27
+
20
28
  # A state that encapsulates a set of {#requirements} with an {Array} of
21
29
  # possibilities
22
30
  class DependencyState < ResolutionState
@@ -106,6 +106,24 @@ module Molinillo
106
106
  @resolver.resolve([VersionKit::Dependency.new('missing', '3.0')], DependencyGraph.new)
107
107
  end.message.should.match /required by `user-specified dependency`/
108
108
  end
109
+
110
+ it 'can handle when allow_missing? returns true for the only requirement' do
111
+ dep = VersionKit::Dependency.new('missing', '3.0')
112
+ @resolver.specification_provider.stubs(:allow_missing?).with(dep).returns(true)
113
+ @resolver.resolve([dep], DependencyGraph.new).to_a.should == []
114
+ end
115
+
116
+ it 'can handle when allow_missing? returns true for a nested requirement' do
117
+ index = TestIndex.new('awesome')
118
+ dep = VersionKit::Dependency.new('actionpack', '1.2.3')
119
+ @resolver.specification_provider.stubs(:allow_missing?).
120
+ with { |d| d.name == 'activesupport' }.returns(true)
121
+ @resolver.specification_provider.stubs(:search_for).
122
+ with { |d| d.name == 'activesupport' }.returns([])
123
+ @resolver.specification_provider.stubs(:search_for).
124
+ with { |d| d.name == 'actionpack' }.returns(index.search_for(dep))
125
+ @resolver.resolve([dep], DependencyGraph.new).map(&:payload).map(&:to_s).should == ['actionpack (1.2.3)']
126
+ end
109
127
  end
110
128
  end
111
129
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: molinillo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
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: 2015-03-28 00:00:00.000000000 Z
11
+ date: 2015-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: '0'
85
85
  requirements: []
86
86
  rubyforge_project:
87
- rubygems_version: 2.4.6
87
+ rubygems_version: 2.4.8
88
88
  signing_key:
89
89
  specification_version: 4
90
90
  summary: Provides support for dependency resolution