molinillo 0.2.0 → 0.2.1

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: 59b5cd0ec4345cc73a54775616b40161fb2af5a4
4
- data.tar.gz: d38ad81fd35dcb0cc20a05005f5945c51c22b041
3
+ metadata.gz: aac1d186cbe00eb9659705c4c35c8cfc3b6f4e84
4
+ data.tar.gz: 3ea34b9aa3e68233ee0744442f136eeec3972e08
5
5
  SHA512:
6
- metadata.gz: 7ef9ce46b630677f9ad68fe2861be96bce9a90e66e12e065f75387ed01cf50c6200e8bb79128abec09a4a56f5fd11ab5f47d1e7eb3754549c6f2fd7cd3c4ca3e
7
- data.tar.gz: 731564965a432a6b80a74ccc312936e43c1b3ad11f8be2f322eee01e8ce3d831c91979139b079436b20bd072d52640420356c9a6db095f4582d5a514bd25485d
6
+ metadata.gz: 250f701b7bf421d1e964fe6051f15652f4a2ab4611763b070732b51eef770739ef892c7df461845c859c85e4b4c2e10595caa0eabf3082c9d6c7f84541c856dc
7
+ data.tar.gz: 84858314e130d50eabf2fabe9da871003d8c75633e55cb35713968c8ac2fdfab8a8a21b1957e6ae89c53df80bb006e5a1039a685fa8f35ec9d80b8dd63b4aa75
data/README.md CHANGED
@@ -28,7 +28,7 @@ $ gem install molinillo
28
28
 
29
29
  ## Usage
30
30
 
31
- Look at the test suite for example usage. Better documentation and examples are
31
+ See the [ARCHITECTURE](ARCHITECTURE.md) file for an overview and look at the test suite for example usage. Better documentation and examples are
32
32
  forthcoming.
33
33
 
34
34
  ## Contributing
@@ -1,3 +1,3 @@
1
1
  module Molinillo
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
@@ -229,7 +229,7 @@ module Molinillo
229
229
  # `requirement`.
230
230
  def find_state_for(requirement)
231
231
  return nil unless requirement
232
- states.find { |i| requirement == i.requirement }
232
+ states.reverse_each.find { |i| requirement == i.requirement && i.is_a?(DependencyState) }
233
233
  end
234
234
 
235
235
  # @return [Boolean] whether or not the given state has any possibilities
@@ -320,12 +320,24 @@ module Molinillo
320
320
  new_requirements = requirements.dup
321
321
  push_state_for_requirements(new_requirements)
322
322
  else
323
+ return if attempt_to_swap_possibility
323
324
  create_conflict
324
325
  debug(depth) { "Unsatisfied by existing spec (#{existing_node.payload})" }
325
326
  unwind_for_conflict
326
327
  end
327
328
  end
328
329
 
330
+ # Attempts to swp the current {#possibility} with the already-activated
331
+ # spec with the given name
332
+ # @return [Boolean] Whether the possibility was swapped into {#activated}
333
+ def attempt_to_swap_possibility
334
+ swapped = activated.dup
335
+ swapped.vertex_named(name).payload = possibility
336
+ return unless swapped.vertex_named(name).requirements.
337
+ all? { |r| requirement_satisfied_by?(r, swapped, possibility) }
338
+ attempt_to_activate_new_spec
339
+ end
340
+
329
341
  # Attempts to activate the current {#possibility} (given that it hasn't
330
342
  # already been activated)
331
343
  # @return [void]
@@ -383,7 +395,7 @@ module Molinillo
383
395
  # @param [Array] new_requirements
384
396
  # @return [void]
385
397
  def push_state_for_requirements(new_requirements)
386
- new_requirements = sort_dependencies(new_requirements, activated, conflicts)
398
+ new_requirements = sort_dependencies(new_requirements.uniq, activated, conflicts)
387
399
  new_requirement = new_requirements.shift
388
400
  states.push DependencyState.new(
389
401
  new_requirement ? name_for(new_requirement) : '',
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'json'
4
+ require 'open-uri'
5
+ require 'set'
6
+
7
+ GEMS = %w(rails capybara bundler).freeze
8
+
9
+ VERSION_PATTERN = /\A
10
+ [0-9]+\.[0-9]+\.[0-9]+ (?# Number component)
11
+ ([-][0-9a-z-]+(\.[0-9a-z-]+)*)? (?# Pre-release component)
12
+ ([+][0-9a-z-]+(\.[0-9a-z-]+)*)? (?# Build component)
13
+ \Z/xi
14
+
15
+ def coerce_to_semver(version)
16
+ return version if version.sub(/^(\S+\s+)/, '') =~ VERSION_PATTERN
17
+ return "#{Regexp.last_match[1]}#{Regexp.last_match[2]}" if version =~ /^(\S+\s+)? (\d+\.\d+\.\d+) (?: \.\d+)*$/ix
18
+
19
+ parts = version.split(/[\.-]/, 4)
20
+ 4.times do |i|
21
+ if parts[i] =~ /-?([a-zA-Z])/
22
+ parts << '0' until parts.size >= 3
23
+ parts[i].sub!(/-?([a-zA-Z]+)/, '')
24
+ parts[i] = '0' if parts[i].empty?
25
+ parts[3] = Regexp.last_match[1] + parts[i..-1].join('')
26
+ end
27
+ end
28
+ semver = parts[0..2].join('.')
29
+ semver.sub!(/([a-zA-Z])/, '-\1')
30
+ semver += '-' + parts[-1] if parts.size > 3
31
+ semver
32
+ end
33
+
34
+ def coerce_dependencies_to_semver(deps)
35
+ dependencies = {}
36
+ deps.each do |name, req|
37
+ dependencies[name] = req.split(',').map { |r| coerce_to_semver(r) }.join(',')
38
+ end
39
+ dependencies
40
+ end
41
+
42
+ gems = Set.new(GEMS)
43
+ downloaded_gems = Set.new
44
+ specs = []
45
+
46
+ loop do
47
+ size = gems.size
48
+ (gems ^ downloaded_gems).each_slice(200) do |g|
49
+ specs += JSON.load open("http://bundler.rubygems.org/api/v1/dependencies.json?gems=#{g.join(',')}")
50
+ end
51
+ downloaded_gems.merge(gems)
52
+
53
+ gems.merge(specs.flat_map { |s| s['dependencies'].map(&:first) })
54
+
55
+ break if gems.size == size
56
+ end
57
+
58
+ specs.reject! { |s| s['platform'] != 'ruby' }
59
+ specs.uniq! { |s| [s['name'], s['number']] }
60
+ specs.sort_by! { |s| s['name'].downcase }
61
+ specs = specs.group_by { |s| s['name'] }.values.map do |spec|
62
+ [spec.first['name'], spec.flat_map do |s|
63
+ {
64
+ 'name' => s['name'],
65
+ 'version' => coerce_to_semver(s['number']),
66
+ 'dependencies' => coerce_dependencies_to_semver(Hash[s['dependencies']])
67
+ }
68
+ end.uniq { |s| s['version'] }.sort_by { |s| Gem::Version.new(s['version']) }
69
+ ]
70
+ end
71
+
72
+ specs = Hash[specs]
73
+
74
+ json = JSON.pretty_generate(specs)
75
+
76
+ File.open('index/rubygems.json', 'w') { |f| f.write json }
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.2.0
4
+ version: 0.2.1
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: 2014-12-25 00:00:00.000000000 Z
11
+ date: 2015-02-21 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:
@@ -45,6 +45,9 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - LICENSE
49
+ - README.md
50
+ - lib/molinillo.rb
48
51
  - lib/molinillo/dependency_graph.rb
49
52
  - lib/molinillo/errors.rb
50
53
  - lib/molinillo/gem_metadata.rb
@@ -53,15 +56,13 @@ files:
53
56
  - lib/molinillo/resolution.rb
54
57
  - lib/molinillo/resolver.rb
55
58
  - lib/molinillo/state.rb
56
- - lib/molinillo.rb
57
- - README.md
58
- - LICENSE
59
59
  - spec/dependency_graph_spec.rb
60
+ - spec/resolver_integration_specs/index_from_rubygems.rb
60
61
  - spec/resolver_spec.rb
62
+ - spec/spec_helper.rb
61
63
  - spec/spec_helper/index.rb
62
64
  - spec/spec_helper/specification.rb
63
65
  - spec/spec_helper/ui.rb
64
- - spec/spec_helper.rb
65
66
  - spec/state_spec.rb
66
67
  homepage: https://github.com/CocoaPods/Molinillo
67
68
  licenses:
@@ -73,22 +74,23 @@ require_paths:
73
74
  - lib
74
75
  required_ruby_version: !ruby/object:Gem::Requirement
75
76
  requirements:
76
- - - '>='
77
+ - - ">="
77
78
  - !ruby/object:Gem::Version
78
79
  version: '0'
79
80
  required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  requirements:
81
- - - '>='
82
+ - - ">="
82
83
  - !ruby/object:Gem::Version
83
84
  version: '0'
84
85
  requirements: []
85
86
  rubyforge_project:
86
- rubygems_version: 2.0.14
87
+ rubygems_version: 2.4.5
87
88
  signing_key:
88
89
  specification_version: 4
89
90
  summary: Provides support for dependency resolution
90
91
  test_files:
91
92
  - spec/dependency_graph_spec.rb
93
+ - spec/resolver_integration_specs/index_from_rubygems.rb
92
94
  - spec/resolver_spec.rb
93
95
  - spec/spec_helper/index.rb
94
96
  - spec/spec_helper/specification.rb