rubygems-update 3.2.3 → 3.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/{History.txt → CHANGELOG.md} +480 -427
  3. data/Manifest.txt +30 -27
  4. data/Rakefile +20 -28
  5. data/bundler/CHANGELOG.md +73 -2
  6. data/bundler/bundler.gemspec +1 -1
  7. data/bundler/lib/bundler.rb +0 -1
  8. data/bundler/lib/bundler/build_metadata.rb +2 -2
  9. data/bundler/lib/bundler/cli.rb +3 -5
  10. data/bundler/lib/bundler/cli/cache.rb +1 -0
  11. data/bundler/lib/bundler/cli/gem.rb +14 -0
  12. data/bundler/lib/bundler/compact_index_client/updater.rb +0 -8
  13. data/bundler/lib/bundler/definition.rb +17 -27
  14. data/bundler/lib/bundler/dep_proxy.rb +15 -8
  15. data/bundler/lib/bundler/feature_flag.rb +0 -1
  16. data/bundler/lib/bundler/fetcher.rb +0 -1
  17. data/bundler/lib/bundler/gem_helper.rb +9 -7
  18. data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
  19. data/bundler/lib/bundler/index.rb +6 -5
  20. data/bundler/lib/bundler/installer.rb +0 -17
  21. data/bundler/lib/bundler/installer/standalone.rb +15 -0
  22. data/bundler/lib/bundler/lazy_specification.rb +9 -18
  23. data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
  24. data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
  25. data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  26. data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
  27. data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  28. data/bundler/{man → lib/bundler/man}/bundle-config.1 +4 -4
  29. data/bundler/lib/bundler/man/bundle-config.1.ronn +3 -3
  30. data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  31. data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  32. data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
  33. data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
  34. data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
  35. data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  36. data/bundler/{man → lib/bundler/man}/bundle-install.1 +1 -1
  37. data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
  38. data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  39. data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
  40. data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  41. data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  42. data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  43. data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  44. data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
  45. data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
  46. data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  47. data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
  48. data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
  49. data/bundler/{man → lib/bundler/man}/index.txt +0 -0
  50. data/bundler/lib/bundler/resolver.rb +82 -43
  51. data/bundler/lib/bundler/resolver/spec_group.rb +56 -44
  52. data/bundler/lib/bundler/rubygems_ext.rb +16 -0
  53. data/bundler/lib/bundler/settings.rb +1 -1
  54. data/bundler/lib/bundler/shared_helpers.rb +2 -2
  55. data/bundler/lib/bundler/source/git.rb +19 -17
  56. data/bundler/lib/bundler/source/git/git_proxy.rb +54 -49
  57. data/bundler/lib/bundler/source/path/installer.rb +2 -0
  58. data/bundler/lib/bundler/source/rubygems.rb +10 -2
  59. data/bundler/lib/bundler/source_list.rb +2 -4
  60. data/bundler/lib/bundler/spec_set.rb +5 -4
  61. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  62. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +1 -1
  63. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  64. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +3 -0
  65. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  66. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -1
  67. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  68. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +2 -2
  69. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +11 -0
  70. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +11 -7
  71. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +5 -6
  72. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
  73. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
  74. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
  75. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
  76. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
  77. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
  78. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
  79. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  80. data/bundler/lib/bundler/version.rb +1 -1
  81. data/lib/rubygems.rb +2 -2
  82. data/lib/rubygems/commands/setup_command.rb +16 -62
  83. data/lib/rubygems/ext/builder.rb +5 -4
  84. data/lib/rubygems/ext/cmake_builder.rb +1 -2
  85. data/lib/rubygems/ext/configure_builder.rb +1 -2
  86. data/lib/rubygems/installer_uninstaller_utils.rb +6 -1
  87. data/lib/rubygems/platform.rb +0 -4
  88. data/lib/rubygems/remote_fetcher.rb +3 -1
  89. data/lib/rubygems/requirement.rb +1 -1
  90. data/lib/rubygems/resolver/best_set.rb +1 -1
  91. data/lib/rubygems/resolver/index_specification.rb +8 -2
  92. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  93. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -1
  94. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  95. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +2 -2
  96. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +11 -0
  97. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +11 -7
  98. data/lib/rubygems/specification.rb +18 -14
  99. data/lib/rubygems/test_case.rb +17 -4
  100. data/rubygems-update.gemspec +2 -2
  101. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  102. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  103. data/test/rubygems/test_gem.rb +5 -0
  104. data/test/rubygems/test_gem_commands_setup_command.rb +21 -37
  105. data/test/rubygems/test_gem_dependency_installer.rb +52 -47
  106. data/test/rubygems/test_gem_ext_builder.rb +30 -6
  107. data/test/rubygems/test_gem_ext_cmake_builder.rb +2 -4
  108. data/test/rubygems/test_gem_ext_configure_builder.rb +2 -2
  109. data/test/rubygems/test_gem_installer.rb +2 -0
  110. data/test/rubygems/test_gem_platform.rb +8 -0
  111. data/test/rubygems/test_gem_remote_fetcher.rb +1 -1
  112. data/test/rubygems/test_gem_requirement.rb +35 -1
  113. data/test/rubygems/test_gem_resolver_best_set.rb +23 -0
  114. data/test/rubygems/test_gem_specification.rb +9 -3
  115. data/test/rubygems/test_gem_stream_ui.rb +1 -1
  116. metadata +34 -55
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OUTDATED" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-OUTDATED" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-outdated\fR \- List installed gems with newer versions available
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PLATFORM" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-PLATFORM" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-platform\fR \- Displays platform compatibility information
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PRISTINE" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-PRISTINE" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-REMOVE" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-REMOVE" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-SHOW" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-SHOW" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-UPDATE" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-UPDATE" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-update\fR \- Update your gems to the latest available versions
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-VIZ" "1" "November 2020" "" ""
4
+ .TH "BUNDLE\-VIZ" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE" "1" "November 2020" "" ""
4
+ .TH "BUNDLE" "1" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\fR \- Ruby Dependency Management
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "GEMFILE" "5" "November 2020" "" ""
4
+ .TH "GEMFILE" "5" "January 2021" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
File without changes
@@ -5,6 +5,8 @@ module Bundler
5
5
  require_relative "vendored_molinillo"
6
6
  require_relative "resolver/spec_group"
7
7
 
8
+ include GemHelpers
9
+
8
10
  # Figures out the best possible configuration of gems that satisfies
9
11
  # the list of passed dependencies and any child dependencies without
10
12
  # causing any gem activation errors.
@@ -16,7 +18,6 @@ module Bundler
16
18
  # <GemBundle>,nil:: If the list of dependencies can be resolved, a
17
19
  # collection of gemspecs is returned. Otherwise, nil is returned.
18
20
  def self.resolve(requirements, index, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
19
- platforms = Set.new(platforms) if platforms
20
21
  base = SpecSet.new(base) unless base.is_a?(SpecSet)
21
22
  resolver = new(index, source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
22
23
  result = resolver.start(requirements)
@@ -32,14 +33,17 @@ module Bundler
32
33
  @base_dg = Molinillo::DependencyGraph.new
33
34
  @base.each do |ls|
34
35
  dep = Dependency.new(ls.name, ls.version)
35
- @base_dg.add_vertex(ls.name, DepProxy.new(dep, ls.platform), true)
36
+ @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
36
37
  end
37
38
  additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
38
39
  @platforms = platforms
40
+ @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
39
41
  @gem_version_promoter = gem_version_promoter
40
- @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
41
42
  @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
42
43
  @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.disable_multisource?
44
+
45
+ @variant_specific_names = []
46
+ @generic_names = []
43
47
  end
44
48
 
45
49
  def start(requirements)
@@ -75,7 +79,7 @@ module Bundler
75
79
  return unless debug?
76
80
  debug_info = yield
77
81
  debug_info = debug_info.inspect unless debug_info.is_a?(String)
78
- puts debug_info.split("\n").map {|s| "BUNDLER: " + " " * depth + s }
82
+ puts debug_info.split("\n").map {|s| depth == 0 ? "BUNDLER: #{s}" : "BUNDLER(#{depth}): #{s}" }
79
83
  end
80
84
 
81
85
  def debug?
@@ -103,14 +107,24 @@ module Bundler
103
107
  include Molinillo::SpecificationProvider
104
108
 
105
109
  def dependencies_for(specification)
106
- specification.dependencies_for_activated_platforms
110
+ all_dependencies = specification.dependencies_for_activated_platforms
111
+
112
+ if @variant_specific_names.include?(specification.name)
113
+ @variant_specific_names |= all_dependencies.map(&:name) - @generic_names
114
+ else
115
+ generic_names, variant_specific_names = specification.partitioned_dependency_names_for_activated_platforms
116
+ @variant_specific_names |= variant_specific_names - @generic_names
117
+ @generic_names |= generic_names
118
+ end
119
+
120
+ all_dependencies
107
121
  end
108
122
 
109
123
  def search_for(dependency_proxy)
110
124
  platform = dependency_proxy.__platform
111
125
  dependency = dependency_proxy.dep
112
- @search_for[dependency_proxy] ||= begin
113
- name = dependency.name
126
+ name = dependency.name
127
+ search_result = @search_for[dependency_proxy] ||= begin
114
128
  index = index_for(dependency)
115
129
  results = index.search(dependency, @base[name])
116
130
 
@@ -137,36 +151,48 @@ module Bundler
137
151
  end
138
152
  nested.reduce([]) do |groups, (version, specs)|
139
153
  next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
140
- spec_group = SpecGroup.new(specs)
141
- spec_group.ignores_bundler_dependencies = @allow_bundler_dependency_conflicts
142
- groups << spec_group
154
+
155
+ specs_by_platform = Hash.new do |current_specs, current_platform|
156
+ current_specs[current_platform] = select_best_platform_match(specs, current_platform)
157
+ end
158
+
159
+ spec_group_ruby = SpecGroup.create_for(specs_by_platform, [Gem::Platform::RUBY], Gem::Platform::RUBY)
160
+ groups << spec_group_ruby if spec_group_ruby
161
+
162
+ next groups if @resolving_only_for_ruby
163
+
164
+ spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform)
165
+ groups << spec_group if spec_group
166
+
167
+ groups
143
168
  end
144
169
  else
145
170
  []
146
171
  end
147
172
  # GVP handles major itself, but it's still a bit risky to trust it with it
148
173
  # until we get it settled with new behavior. For 2.x it can take over all cases.
149
- search = if !@use_gvp
174
+ if !@use_gvp
150
175
  spec_groups
151
176
  else
152
177
  @gem_version_promoter.sort_versions(dependency, spec_groups)
153
178
  end
154
- selected_sgs = []
155
- search.each do |sg|
156
- next unless sg.for?(platform)
157
- sg_all_platforms = sg.copy_for(self.class.sort_platforms(@platforms).reverse)
158
- next unless sg_all_platforms
159
-
160
- selected_sgs << sg_all_platforms
161
-
162
- next if sg_all_platforms.activated_platforms == [Gem::Platform::RUBY]
163
- # Add a spec group for "non platform specific spec" as the fallback
164
- # spec group.
165
- sg_ruby = sg.copy_for([Gem::Platform::RUBY])
166
- selected_sgs.insert(-2, sg_ruby) if sg_ruby
179
+ end
180
+
181
+ unless search_result.empty?
182
+ specific_dependency = @variant_specific_names.include?(name)
183
+ return search_result unless specific_dependency
184
+
185
+ search_result.each do |sg|
186
+ if @generic_names.include?(name)
187
+ @variant_specific_names -= [name]
188
+ sg.activate_all_platforms!
189
+ else
190
+ sg.activate_platform!(platform)
191
+ end
167
192
  end
168
- selected_sgs
169
193
  end
194
+
195
+ search_result
170
196
  end
171
197
 
172
198
  def index_for(dependency)
@@ -206,6 +232,10 @@ module Bundler
206
232
  requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
207
233
  end
208
234
 
235
+ def dependencies_equal?(dependencies, other_dependencies)
236
+ dependencies.map(&:dep) == other_dependencies.map(&:dep)
237
+ end
238
+
209
239
  def relevant_sources_for_vertex(vertex)
210
240
  if vertex.root?
211
241
  [@source_requirements[vertex.name]]
@@ -233,13 +263,6 @@ module Bundler
233
263
  end
234
264
  end
235
265
 
236
- # Sort platforms from most general to most specific
237
- def self.sort_platforms(platforms)
238
- platforms.sort_by do |platform|
239
- platform_sort_key(platform)
240
- end
241
- end
242
-
243
266
  def self.platform_sort_key(platform)
244
267
  # Prefer specific platform to not specific platform
245
268
  return ["99-LAST", "", "", ""] if Gem::Platform::RUBY == platform
@@ -324,10 +347,16 @@ module Bundler
324
347
  def version_conflict_message(e)
325
348
  # only show essential conflicts, if possible
326
349
  conflicts = e.conflicts.dup
327
- conflicts.delete_if do |_name, conflict|
328
- deps = conflict.requirement_trees.map(&:last).flatten(1)
329
- !Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
350
+
351
+ if conflicts["bundler"]
352
+ conflicts.replace("bundler" => conflicts["bundler"])
353
+ else
354
+ conflicts.delete_if do |_name, conflict|
355
+ deps = conflict.requirement_trees.map(&:last).flatten(1)
356
+ !Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
357
+ end
330
358
  end
359
+
331
360
  e = Molinillo::VersionConflict.new(conflicts, e.specification_provider) unless conflicts.empty?
332
361
 
333
362
  solver_name = "Bundler"
@@ -355,15 +384,25 @@ module Bundler
355
384
  :additional_message_for_conflict => lambda do |o, name, conflict|
356
385
  if name == "bundler"
357
386
  o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
358
- other_bundler_required = !conflict.requirement.requirement.satisfied_by?(Gem::Version.new(Bundler::VERSION))
359
- end
360
387
 
361
- if name == "bundler" && other_bundler_required
362
- o << "\n"
363
- o << "This Gemfile requires a different version of Bundler.\n"
364
- o << "Perhaps you need to update Bundler by running `gem install bundler`?\n"
365
- end
366
- if conflict.locked_requirement
388
+ conflict_dependency = conflict.requirement
389
+ conflict_requirement = conflict_dependency.requirement
390
+ other_bundler_required = !conflict_requirement.satisfied_by?(Gem::Version.new(Bundler::VERSION))
391
+
392
+ if other_bundler_required
393
+ o << "\n\n"
394
+
395
+ candidate_specs = @source_requirements[:default_bundler].specs.search(conflict_dependency)
396
+ if candidate_specs.any?
397
+ target_version = candidate_specs.last.version
398
+ new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
399
+ o << "Your bundle requires a different version of Bundler than the one you're running.\n"
400
+ o << "Install the necessary version with `gem install bundler:#{target_version}` and rerun bundler using `#{new_command}`\n"
401
+ else
402
+ o << "Your bundle requires a different version of Bundler than the one you're running, and that version could not be found.\n"
403
+ end
404
+ end
405
+ elsif conflict.locked_requirement
367
406
  o << "\n"
368
407
  o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)
369
408
  o << %(the gems in your Gemfile, which may resolve the conflict.\n)
@@ -3,28 +3,37 @@
3
3
  module Bundler
4
4
  class Resolver
5
5
  class SpecGroup
6
- include GemHelpers
7
-
8
6
  attr_accessor :name, :version, :source
9
- attr_accessor :ignores_bundler_dependencies, :activated_platforms
7
+ attr_accessor :activated_platforms
8
+
9
+ def self.create_for(specs, all_platforms, specific_platform)
10
+ specific_platform_specs = specs[specific_platform]
11
+ return unless specific_platform_specs.any?
12
+
13
+ platforms = all_platforms.select {|p| specs[p].any? }
14
+
15
+ new(specific_platform_specs.first, specs, platforms)
16
+ end
10
17
 
11
- def initialize(all_specs)
12
- @all_specs = all_specs
13
- raise ArgumentError, "cannot initialize with an empty value" unless exemplary_spec = all_specs.first
18
+ def initialize(exemplary_spec, specs, relevant_platforms)
19
+ @exemplary_spec = exemplary_spec
14
20
  @name = exemplary_spec.name
15
21
  @version = exemplary_spec.version
16
22
  @source = exemplary_spec.source
17
23
 
18
- @activated_platforms = []
19
- @dependencies = nil
20
- @specs = Hash.new do |specs, platform|
21
- specs[platform] = select_best_platform_match(all_specs, platform)
24
+ @all_platforms = relevant_platforms
25
+ @activated_platforms = relevant_platforms
26
+ @dependencies = Hash.new do |dependencies, platforms|
27
+ dependencies[platforms] = dependencies_for(platforms)
22
28
  end
23
- @ignores_bundler_dependencies = true
29
+ @partitioned_dependency_names = Hash.new do |partitioned_dependency_names, platforms|
30
+ partitioned_dependency_names[platforms] = partitioned_dependency_names_for(platforms)
31
+ end
32
+ @specs = specs
24
33
  end
25
34
 
26
35
  def to_specs
27
- @activated_platforms.map do |p|
36
+ activated_platforms.map do |p|
28
37
  specs = @specs[p]
29
38
  next unless specs.any?
30
39
 
@@ -36,18 +45,12 @@ module Bundler
36
45
  end.flatten.compact.uniq
37
46
  end
38
47
 
39
- def copy_for(platforms)
40
- platforms.select! {|p| for?(p) }
41
- return unless platforms.any?
42
-
43
- copied_sg = self.class.new(@all_specs)
44
- copied_sg.ignores_bundler_dependencies = @ignores_bundler_dependencies
45
- copied_sg.activated_platforms = platforms
46
- copied_sg
48
+ def activate_platform!(platform)
49
+ self.activated_platforms = [platform]
47
50
  end
48
51
 
49
- def for?(platform)
50
- @specs[platform].any?
52
+ def activate_all_platforms!
53
+ self.activated_platforms = @all_platforms
51
54
  end
52
55
 
53
56
  def to_s
@@ -56,11 +59,11 @@ module Bundler
56
59
  end
57
60
 
58
61
  def dependencies_for_activated_platforms
59
- dependencies = @activated_platforms.map {|p| __dependencies[p] }
60
- metadata_dependencies = @activated_platforms.map do |platform|
61
- metadata_dependencies(@specs[platform].first, platform)
62
- end
63
- dependencies.concat(metadata_dependencies).flatten
62
+ @dependencies[activated_platforms]
63
+ end
64
+
65
+ def partitioned_dependency_names_for_activated_platforms
66
+ @partitioned_dependency_names[activated_platforms]
64
67
  end
65
68
 
66
69
  def ==(other)
@@ -86,34 +89,43 @@ module Bundler
86
89
  protected
87
90
 
88
91
  def sorted_activated_platforms
89
- @activated_platforms.sort_by(&:to_s)
92
+ activated_platforms.sort_by(&:to_s)
90
93
  end
91
94
 
92
95
  private
93
96
 
94
- def __dependencies
95
- @dependencies = Hash.new do |dependencies, platform|
96
- dependencies[platform] = []
97
- specs = @specs[platform]
98
- if spec = specs.first
99
- spec.dependencies.each do |dep|
100
- next if dep.type == :development
101
- next if @ignores_bundler_dependencies && dep.name == "bundler".freeze
102
- dependencies[platform] << DepProxy.new(dep, platform)
103
- end
104
- end
105
- dependencies[platform]
97
+ def dependencies_for(platforms)
98
+ platforms.map do |platform|
99
+ __dependencies(platform) + metadata_dependencies(platform)
100
+ end.flatten
101
+ end
102
+
103
+ def partitioned_dependency_names_for(platforms)
104
+ return @dependencies[platforms].map(&:name), [] if platforms.size == 1
105
+
106
+ @dependencies[platforms].partition do |dep_proxy|
107
+ @dependencies[platforms].count {|dp| dp.dep == dep_proxy.dep } == platforms.size
108
+ end.map {|deps| deps.map(&:name) }
109
+ end
110
+
111
+ def __dependencies(platform)
112
+ dependencies = []
113
+ @specs[platform].first.dependencies.each do |dep|
114
+ next if dep.type == :development
115
+ dependencies << DepProxy.get_proxy(dep, platform)
106
116
  end
117
+ dependencies
107
118
  end
108
119
 
109
- def metadata_dependencies(spec, platform)
110
- return [] unless spec && spec.is_a?(Gem::Specification)
120
+ def metadata_dependencies(platform)
121
+ spec = @specs[platform].first
122
+ return [] unless spec.is_a?(Gem::Specification)
111
123
  dependencies = []
112
124
  if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none?
113
- dependencies << DepProxy.new(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
125
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
114
126
  end
115
127
  if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none?
116
- dependencies << DepProxy.new(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
128
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
117
129
  end
118
130
  dependencies
119
131
  end