rubygems-update 2.4.8 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CODE_OF_CONDUCT.md +40 -0
  5. data/CVE-2015-3900.txt +40 -0
  6. data/History.txt +173 -2
  7. data/Manifest.txt +14 -1
  8. data/Rakefile +36 -1
  9. data/lib/rubygems.rb +32 -14
  10. data/lib/rubygems/basic_specification.rb +31 -9
  11. data/lib/rubygems/commands/dependency_command.rb +25 -15
  12. data/lib/rubygems/commands/environment_command.rb +2 -0
  13. data/lib/rubygems/commands/help_command.rb +0 -10
  14. data/lib/rubygems/commands/install_command.rb +1 -1
  15. data/lib/rubygems/commands/list_command.rb +1 -1
  16. data/lib/rubygems/commands/pristine_command.rb +11 -1
  17. data/lib/rubygems/commands/query_command.rb +1 -1
  18. data/lib/rubygems/commands/sources_command.rb +1 -1
  19. data/lib/rubygems/commands/update_command.rb +2 -2
  20. data/lib/rubygems/config_file.rb +4 -4
  21. data/lib/rubygems/core_ext/kernel_require.rb +2 -2
  22. data/lib/rubygems/dependency.rb +9 -6
  23. data/lib/rubygems/dependency_list.rb +3 -0
  24. data/lib/rubygems/ext/builder.rb +2 -0
  25. data/lib/rubygems/ext/ext_conf_builder.rb +6 -1
  26. data/lib/rubygems/indexer.rb +26 -91
  27. data/lib/rubygems/installer.rb +58 -26
  28. data/lib/rubygems/installer_test_case.rb +2 -2
  29. data/lib/rubygems/package.rb +18 -6
  30. data/lib/rubygems/package/old.rb +2 -2
  31. data/lib/rubygems/package/tar_reader/entry.rb +7 -1
  32. data/lib/rubygems/package/tar_test_case.rb +12 -3
  33. data/lib/rubygems/package/tar_writer.rb +19 -1
  34. data/lib/rubygems/platform.rb +3 -2
  35. data/lib/rubygems/rdoc.rb +1 -2
  36. data/lib/rubygems/remote_fetcher.rb +25 -6
  37. data/lib/rubygems/request/connection_pools.rb +8 -4
  38. data/lib/rubygems/request_set.rb +3 -4
  39. data/lib/rubygems/request_set/gem_dependency_api.rb +2 -2
  40. data/lib/rubygems/request_set/lockfile.rb +1 -1
  41. data/lib/rubygems/request_set/lockfile/parser.rb +54 -43
  42. data/lib/rubygems/request_set/lockfile/tokenizer.rb +16 -13
  43. data/lib/rubygems/resolver.rb +47 -242
  44. data/lib/rubygems/resolver/activation_request.rb +2 -1
  45. data/lib/rubygems/resolver/conflict.rb +0 -1
  46. data/lib/rubygems/resolver/dependency_request.rb +4 -1
  47. data/lib/rubygems/resolver/git_specification.rb +1 -2
  48. data/lib/rubygems/resolver/molinillo.rb +1 -0
  49. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +5 -0
  50. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +266 -0
  51. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +69 -0
  52. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +3 -0
  53. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +99 -0
  54. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +63 -0
  55. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +430 -0
  56. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +43 -0
  57. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +51 -0
  58. data/lib/rubygems/resolver/specification.rb +1 -1
  59. data/lib/rubygems/specification.rb +256 -86
  60. data/lib/rubygems/stub_specification.rb +37 -29
  61. data/lib/rubygems/test_case.rb +65 -28
  62. data/lib/rubygems/test_utilities.rb +18 -18
  63. data/lib/rubygems/text.rb +0 -2
  64. data/lib/rubygems/uninstaller.rb +1 -1
  65. data/lib/rubygems/util.rb +4 -4
  66. data/lib/rubygems/util/licenses.rb +309 -0
  67. data/lib/rubygems/util/list.rb +9 -21
  68. data/lib/rubygems/version.rb +24 -14
  69. data/test/rubygems/simple_gem.rb +1 -1
  70. data/test/rubygems/test_config.rb +10 -1
  71. data/test/rubygems/test_gem.rb +58 -11
  72. data/test/rubygems/test_gem_available_set.rb +2 -1
  73. data/test/rubygems/test_gem_commands_cleanup_command.rb +6 -5
  74. data/test/rubygems/test_gem_commands_dependency_command.rb +9 -1
  75. data/test/rubygems/test_gem_commands_install_command.rb +17 -28
  76. data/test/rubygems/test_gem_commands_mirror.rb +0 -13
  77. data/test/rubygems/test_gem_commands_outdated_command.rb +2 -3
  78. data/test/rubygems/test_gem_commands_pristine_command.rb +33 -5
  79. data/test/rubygems/test_gem_commands_query_command.rb +123 -158
  80. data/test/rubygems/test_gem_commands_server_command.rb +2 -2
  81. data/test/rubygems/test_gem_commands_specification_command.rb +4 -4
  82. data/test/rubygems/test_gem_commands_stale_command.rb +2 -0
  83. data/test/rubygems/test_gem_commands_uninstall_command.rb +5 -4
  84. data/test/rubygems/test_gem_commands_unpack_command.rb +4 -6
  85. data/test/rubygems/test_gem_commands_update_command.rb +22 -52
  86. data/test/rubygems/test_gem_commands_which_command.rb +1 -0
  87. data/test/rubygems/test_gem_config_file.rb +1 -1
  88. data/test/rubygems/test_gem_dependency.rb +7 -3
  89. data/test/rubygems/test_gem_dependency_installer.rb +5 -5
  90. data/test/rubygems/test_gem_doctor.rb +1 -1
  91. data/test/rubygems/test_gem_ext_builder.rb +2 -0
  92. data/test/rubygems/test_gem_ext_configure_builder.rb +8 -4
  93. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +25 -21
  94. data/test/rubygems/test_gem_indexer.rb +4 -4
  95. data/test/rubygems/test_gem_install_update_options.rb +2 -2
  96. data/test/rubygems/test_gem_installer.rb +32 -26
  97. data/test/rubygems/test_gem_package.rb +46 -1
  98. data/test/rubygems/test_gem_package_tar_reader_entry.rb +8 -1
  99. data/test/rubygems/test_gem_package_tar_writer.rb +10 -1
  100. data/test/rubygems/test_gem_package_task.rb +5 -2
  101. data/test/rubygems/test_gem_platform.rb +11 -0
  102. data/test/rubygems/test_gem_remote_fetcher.rb +64 -3
  103. data/test/rubygems/test_gem_request.rb +1 -1
  104. data/test/rubygems/test_gem_request_connection_pools.rb +10 -1
  105. data/test/rubygems/test_gem_request_set.rb +5 -8
  106. data/test/rubygems/test_gem_request_set_lockfile.rb +2 -4
  107. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
  108. data/test/rubygems/test_gem_resolver.rb +12 -31
  109. data/test/rubygems/test_gem_resolver_git_specification.rb +1 -0
  110. data/test/rubygems/test_gem_resolver_installer_set.rb +7 -11
  111. data/test/rubygems/test_gem_resolver_lock_specification.rb +3 -2
  112. data/test/rubygems/test_gem_security_trust_dir.rb +2 -0
  113. data/test/rubygems/test_gem_server.rb +4 -0
  114. data/test/rubygems/test_gem_specification.rb +344 -61
  115. data/test/rubygems/test_gem_stream_ui.rb +6 -6
  116. data/test/rubygems/test_gem_stub_specification.rb +21 -6
  117. data/test/rubygems/test_gem_text.rb +2 -0
  118. data/test/rubygems/test_gem_uninstaller.rb +2 -1
  119. data/test/rubygems/test_gem_util.rb +8 -0
  120. data/test/rubygems/test_require.rb +156 -125
  121. data/util/generate_spdx_license_list.rb +21 -0
  122. data/util/update_bundled_ca_certificates.rb +2 -1
  123. metadata +42 -6
  124. metadata.gz.sig +0 -0
  125. data/lib/rubygems/util/stringio.rb +0 -34
@@ -16,7 +16,7 @@ class TestGemRequest < Gem::TestCase
16
16
  end
17
17
 
18
18
  def setup
19
- @proxies = %w[http_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY]
19
+ @proxies = %w[http_proxy https_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY]
20
20
  @old_proxies = @proxies.map {|k| ENV[k] }
21
21
  @proxies.each {|k| ENV[k] = nil }
22
22
 
@@ -80,6 +80,15 @@ class TestGemRequestConnectionPool < Gem::TestCase
80
80
  assert_equal ['example', 80], net_http_args
81
81
  end
82
82
 
83
+ def test_net_http_args_ipv6
84
+ pools = Gem::Request::ConnectionPools.new nil, []
85
+
86
+ net_http_args = pools.send :net_http_args, URI('http://[::1]'), nil
87
+
88
+ expected_host = RUBY_VERSION >= "1.9.3" ? "::1" : "[::1]"
89
+ assert_equal [expected_host, 80], net_http_args
90
+ end
91
+
83
92
  def test_net_http_args_proxy
84
93
  pools = Gem::Request::ConnectionPools.new nil, []
85
94
 
@@ -109,7 +118,7 @@ class TestGemRequestConnectionPool < Gem::TestCase
109
118
  pool.checkout
110
119
 
111
120
  t1 = Thread.new {
112
- timeout(1) do
121
+ Timeout.timeout(1) do
113
122
  pool.checkout
114
123
  end
115
124
  }
@@ -141,10 +141,9 @@ Gems to install:
141
141
 
142
142
  def test_install_from_gemdeps_lockfile
143
143
  spec_fetcher do |fetcher|
144
- fetcher.gem 'a', 1
145
- fetcher.gem 'a', 2
146
- fetcher.gem 'b', 1, 'a' => '>= 0'
147
- fetcher.clear
144
+ fetcher.download 'a', 1
145
+ fetcher.download 'a', 2
146
+ fetcher.download 'b', 1, 'a' => '>= 0'
148
147
  end
149
148
 
150
149
  rs = Gem::RequestSet.new
@@ -445,10 +444,8 @@ ruby "0"
445
444
  end
446
445
 
447
446
  spec_fetcher do |fetcher|
448
- fetcher.gem "a", "1", "b" => "= 1"
449
- fetcher.gem "b", "1"
450
-
451
- fetcher.clear
447
+ fetcher.download "a", "1", "b" => "= 1"
448
+ fetcher.download "b", "1"
452
449
  end
453
450
 
454
451
  rs = Gem::RequestSet.new
@@ -338,13 +338,11 @@ DEPENDENCIES
338
338
 
339
339
  def test_to_s_gem_source
340
340
  spec_fetcher do |fetcher|
341
- fetcher.spec 'a', 2
342
- fetcher.clear
341
+ fetcher.download 'a', 2
343
342
  end
344
343
 
345
344
  spec_fetcher 'http://other.example/' do |fetcher|
346
- fetcher.spec 'b', 2
347
- fetcher.clear
345
+ fetcher.download 'b', 2
348
346
  end
349
347
 
350
348
  Gem.sources << 'http://other.example/'
@@ -19,7 +19,7 @@ class TestGemRequestSetLockfileTokenizer < Gem::TestCase
19
19
 
20
20
  assert_equal :newline, tokenizer.next_token.first
21
21
 
22
- assert_equal [:EOF], tokenizer.peek
22
+ assert_equal :EOF, tokenizer.peek.first
23
23
  end
24
24
 
25
25
  def test_skip
@@ -95,24 +95,6 @@ class TestGemResolver < Gem::TestCase
95
95
  assert_same index_set, composed
96
96
  end
97
97
 
98
- def test_handle_conflict
99
- a1 = util_spec 'a', 1
100
-
101
- r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil
102
- r2 = Gem::Resolver::DependencyRequest.new dep('a', '= 2'), nil
103
- r3 = Gem::Resolver::DependencyRequest.new dep('a', '= 3'), nil
104
-
105
- existing = Gem::Resolver::ActivationRequest.new a1, r1, false
106
-
107
- res = Gem::Resolver.new [a1]
108
-
109
- res.handle_conflict r2, existing
110
- res.handle_conflict r2, existing
111
- res.handle_conflict r3, existing
112
-
113
- assert_equal 2, res.conflicts.length
114
- end
115
-
116
98
  def test_requests
117
99
  a1 = util_spec 'a', 1, 'b' => 2
118
100
 
@@ -122,11 +104,11 @@ class TestGemResolver < Gem::TestCase
122
104
 
123
105
  res = Gem::Resolver.new [a1]
124
106
 
125
- reqs = Gem::Resolver::RequirementList.new
107
+ reqs = []
126
108
 
127
109
  res.requests a1, act, reqs
128
110
 
129
- assert_equal ['b (= 2)'], reqs.to_a.map { |req| req.to_s }
111
+ assert_equal ['b (= 2)'], reqs.map { |req| req.to_s }
130
112
  end
131
113
 
132
114
  def test_requests_development
@@ -144,11 +126,11 @@ class TestGemResolver < Gem::TestCase
144
126
  res = Gem::Resolver.new [act]
145
127
  res.development = true
146
128
 
147
- reqs = Gem::Resolver::RequirementList.new
129
+ reqs = []
148
130
 
149
131
  res.requests spec, act, reqs
150
132
 
151
- assert_equal ['b (= 2)'], reqs.to_a.map { |req| req.to_s }
133
+ assert_equal ['b (= 2)'], reqs.map { |req| req.to_s }
152
134
 
153
135
  assert spec.instance_variable_defined? :@called
154
136
  end
@@ -163,7 +145,7 @@ class TestGemResolver < Gem::TestCase
163
145
  res = Gem::Resolver.new [a1]
164
146
  res.ignore_dependencies = true
165
147
 
166
- reqs = Gem::Resolver::RequirementList.new
148
+ reqs = []
167
149
 
168
150
  res.requests a1, act, reqs
169
151
 
@@ -438,19 +420,19 @@ class TestGemResolver < Gem::TestCase
438
420
  r.resolve
439
421
  end
440
422
 
441
- deps = [make_dep("c", "= 1"), make_dep("c", "= 2")]
423
+ deps = [make_dep("c", "= 2"), make_dep("c", "= 1")]
442
424
  assert_equal deps, e.conflicting_dependencies
443
425
 
444
426
  con = e.conflict
445
427
 
446
428
  act = con.activated
447
- assert_equal "c-2", act.spec.full_name
429
+ assert_equal "c-1", act.spec.full_name
448
430
 
449
431
  parent = act.parent
450
- assert_equal "b-1", parent.spec.full_name
432
+ assert_equal "a-1", parent.spec.full_name
451
433
 
452
434
  act = con.requester
453
- assert_equal "a-1", act.spec.full_name
435
+ assert_equal "b-1", act.spec.full_name
454
436
  end
455
437
 
456
438
  def test_raises_when_a_gem_is_missing
@@ -538,11 +520,11 @@ class TestGemResolver < Gem::TestCase
538
520
  assert_equal req('>= 0'), dependency.requirement
539
521
 
540
522
  activated = e.conflict.activated
541
- assert_equal 'c-1', activated.full_name
523
+ assert_equal 'c-2', activated.full_name
542
524
 
543
- assert_equal dep('c', '= 1'), activated.request.dependency
525
+ assert_equal dep('c', '>= 2'), activated.request.dependency
544
526
 
545
- assert_equal [dep('c', '>= 2'), dep('c', '= 1')],
527
+ assert_equal [dep('c', '= 1'), dep('c', '>= 2')],
546
528
  e.conflict.conflicting_dependencies
547
529
  end
548
530
 
@@ -730,4 +712,3 @@ class TestGemResolver < Gem::TestCase
730
712
  end
731
713
 
732
714
  end
733
-
@@ -1,4 +1,5 @@
1
1
  require 'rubygems/test_case'
2
+ require 'rubygems/installer'
2
3
 
3
4
  class TestGemResolverGitSpecification < Gem::TestCase
4
5
 
@@ -4,9 +4,8 @@ class TestGemResolverInstallerSet < Gem::TestCase
4
4
 
5
5
  def test_add_always_install
6
6
  spec_fetcher do |fetcher|
7
- fetcher.spec 'a', 1
8
- fetcher.spec 'a', 2
9
- fetcher.clear
7
+ fetcher.download 'a', 1
8
+ fetcher.download 'a', 2
10
9
  end
11
10
 
12
11
  util_gem 'a', 1
@@ -39,11 +38,10 @@ class TestGemResolverInstallerSet < Gem::TestCase
39
38
 
40
39
  def test_add_always_install_platform
41
40
  spec_fetcher do |fetcher|
42
- fetcher.spec 'a', 1
43
- fetcher.spec 'a', 2 do |s|
41
+ fetcher.download 'a', 1
42
+ fetcher.download 'a', 2 do |s|
44
43
  s.platform = Gem::Platform.new 'x86-freebsd-9'
45
44
  end
46
- fetcher.clear
47
45
  end
48
46
 
49
47
  set = Gem::Resolver::InstallerSet.new :both
@@ -139,8 +137,7 @@ class TestGemResolverInstallerSet < Gem::TestCase
139
137
 
140
138
  def test_find_all_always_install
141
139
  spec_fetcher do |fetcher|
142
- fetcher.spec 'a', 2
143
- fetcher.clear
140
+ fetcher.download 'a', 2
144
141
  end
145
142
 
146
143
  util_gem 'a', 1
@@ -156,9 +153,8 @@ class TestGemResolverInstallerSet < Gem::TestCase
156
153
 
157
154
  def test_find_all_prerelease
158
155
  spec_fetcher do |fetcher|
159
- fetcher.spec 'a', '1'
160
- fetcher.spec 'a', '1.a'
161
- fetcher.clear
156
+ fetcher.download 'a', '1'
157
+ fetcher.download 'a', '1.a'
162
158
  end
163
159
 
164
160
  set = Gem::Resolver::InstallerSet.new :both
@@ -1,4 +1,5 @@
1
1
  require 'rubygems/test_case'
2
+ require 'rubygems/installer'
2
3
  require 'rubygems/resolver'
3
4
 
4
5
  class TestGemResolverLockSpecification < Gem::TestCase
@@ -34,8 +35,7 @@ class TestGemResolverLockSpecification < Gem::TestCase
34
35
 
35
36
  def test_install
36
37
  spec_fetcher do |fetcher|
37
- fetcher.gem 'a', 2
38
- fetcher.clear
38
+ fetcher.download 'a', 2
39
39
  end
40
40
 
41
41
  spec = @LS.new @set, 'a', v(2), @source, Gem::Platform::RUBY
@@ -85,6 +85,7 @@ class TestGemResolverLockSpecification < Gem::TestCase
85
85
 
86
86
  def test_spec_loaded
87
87
  real_spec = util_spec 'a', 2
88
+ install_specs real_spec
88
89
  real_spec.activate
89
90
 
90
91
  version = v(2)
@@ -70,6 +70,7 @@ class TestGemSecurityTrustDir < Gem::TestCase
70
70
  assert_path_exists @dest_dir
71
71
 
72
72
  mask = 040700 & (~File.umask)
73
+ mask |= 0200000 if /aix/ =~ RUBY_PLATFORM
73
74
 
74
75
  assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
75
76
  end
@@ -90,6 +91,7 @@ class TestGemSecurityTrustDir < Gem::TestCase
90
91
  @trust_dir.verify
91
92
 
92
93
  mask = 040700 & (~File.umask)
94
+ mask |= 0200000 if /aix/ =~ RUBY_PLATFORM
93
95
 
94
96
  assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
95
97
  end
@@ -7,6 +7,10 @@ class Gem::Server
7
7
  end
8
8
 
9
9
  class TestGemServer < Gem::TestCase
10
+ def process_based_port
11
+ 0
12
+ end
13
+
10
14
  def setup
11
15
  super
12
16
 
@@ -1,8 +1,10 @@
1
+ require 'benchmark'
1
2
  require 'rubygems/test_case'
2
3
  require 'pathname'
3
4
  require 'stringio'
4
5
  require 'rubygems/ext'
5
6
  require 'rubygems/specification'
7
+ require 'rubygems/installer'
6
8
 
7
9
  class TestGemSpecification < Gem::TestCase
8
10
 
@@ -112,7 +114,7 @@ end
112
114
  c2 = new_spec "c", "2"
113
115
 
114
116
  Gem::Specification.reset
115
- install_specs a1, b1, b2, c1, c2
117
+ install_specs c1, c2, b1, b2, a1
116
118
 
117
119
  a1.activate
118
120
  assert_equal %w(a-1), loaded_spec_names
@@ -125,6 +127,32 @@ end
125
127
  end
126
128
  end
127
129
 
130
+ def test_find_in_unresolved_tree_is_not_exponentiental
131
+ save_loaded_features do
132
+ num_of_pkg = 7
133
+ num_of_version_per_pkg = 3
134
+ packages = (0..num_of_pkg).map do |pkgi|
135
+ (0..num_of_version_per_pkg).map do |pkg_version|
136
+ deps = Hash[((pkgi + 1)..num_of_pkg).map { |deppkgi|
137
+ ["pkg#{deppkgi}", ">= 0"]
138
+ }]
139
+ new_spec "pkg#{pkgi}", pkg_version.to_s, deps
140
+ end
141
+ end
142
+ base = new_spec "pkg_base", "1", {"pkg0" => ">= 0"}
143
+
144
+ Gem::Specification.reset
145
+ install_specs(*packages.flatten.reverse)
146
+ install_specs base
147
+ base.activate
148
+
149
+ tms = Benchmark.measure {
150
+ assert_raises(LoadError) { require 'no_such_file_foo' }
151
+ }
152
+ assert_operator tms.total, :<=, 10
153
+ end
154
+ end
155
+
128
156
  def test_self_activate_ambiguous_indirect
129
157
  save_loaded_features do
130
158
  a1 = new_spec "a", "1", "b" => "> 0"
@@ -133,7 +161,7 @@ end
133
161
  c1 = new_spec "c", "1", nil, "lib/d.rb"
134
162
  c2 = new_spec "c", "2", nil, "lib/d.rb"
135
163
 
136
- install_specs a1, b1, b2, c1, c2
164
+ install_specs c1, c2, b1, b2, a1
137
165
 
138
166
  a1.activate
139
167
  assert_equal %w(a-1), loaded_spec_names
@@ -155,7 +183,7 @@ end
155
183
  c1 = new_spec "c", "1", nil, "lib/d.rb"
156
184
  c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2
157
185
 
158
- install_specs a1, a2, b1, b2, c1, c2
186
+ install_specs c1, b1, a1, a2, c2, b2
159
187
 
160
188
  a2.activate
161
189
  assert_equal %w(a-2), loaded_spec_names
@@ -177,7 +205,7 @@ end
177
205
  c2 = new_spec "c", "2"
178
206
  d1 = new_spec "d", "1", nil, "lib/d.rb"
179
207
 
180
- install_specs a1, b1, b2, c1, c2, d1
208
+ install_specs d1, c1, c2, b1, b2, a1
181
209
 
182
210
  a1.activate
183
211
  assert_equal %w(a-1), loaded_spec_names
@@ -190,6 +218,155 @@ end
190
218
  end
191
219
  end
192
220
 
221
+ def test_require_should_prefer_latest_gem_level1
222
+ save_loaded_features do
223
+ a1 = new_spec "a", "1", "b" => "> 0"
224
+ b1 = new_spec "b", "1", "c" => ">= 0" # unresolved
225
+ b2 = new_spec "b", "2", "c" => ">= 0"
226
+ c1 = new_spec "c", "1", nil, "lib/c.rb" # 1st level
227
+ c2 = new_spec "c", "2", nil, "lib/c.rb"
228
+
229
+ install_specs c1, c2, b1, b2, a1
230
+
231
+ a1.activate
232
+
233
+ require "c"
234
+
235
+ assert_equal %w(a-1 b-2 c-2), loaded_spec_names
236
+ end
237
+ end
238
+
239
+ def test_require_should_prefer_latest_gem_level2
240
+ save_loaded_features do
241
+ a1 = new_spec "a", "1", "b" => "> 0"
242
+ b1 = new_spec "b", "1", "c" => ">= 0" # unresolved
243
+ b2 = new_spec "b", "2", "c" => ">= 0"
244
+ c1 = new_spec "c", "1", "d" => ">= 0" # 1st level
245
+ c2 = new_spec "c", "2", "d" => ">= 0"
246
+ d1 = new_spec "d", "1", nil, "lib/d.rb" # 2nd level
247
+ d2 = new_spec "d", "2", nil, "lib/d.rb"
248
+
249
+ install_specs d1, d2, c1, c2, b1, b2, a1
250
+
251
+ a1.activate
252
+
253
+ require "d"
254
+
255
+ assert_equal %w(a-1 b-2 c-2 d-2), loaded_spec_names
256
+ end
257
+ end
258
+
259
+ def test_require_finds_in_2nd_level_indirect
260
+ save_loaded_features do
261
+ a1 = new_spec "a", "1", "b" => "> 0"
262
+ b1 = new_spec "b", "1", "c" => ">= 0" # unresolved
263
+ b2 = new_spec "b", "2", "c" => ">= 0"
264
+ c1 = new_spec "c", "1", "d" => "<= 2" # 1st level
265
+ c2 = new_spec "c", "2", "d" => "<= 2"
266
+ d1 = new_spec "d", "1", nil, "lib/d.rb" # 2nd level
267
+ d2 = new_spec "d", "2", nil, "lib/d.rb"
268
+ d3 = new_spec "d", "3", nil, "lib/d.rb"
269
+
270
+ install_specs d1, d2, d3, c1, c2, b1, b2, a1
271
+
272
+ a1.activate
273
+
274
+ require "d"
275
+
276
+ assert_equal %w(a-1 b-2 c-2 d-2), loaded_spec_names
277
+ end
278
+ end
279
+
280
+ def test_require_should_prefer_reachable_gems
281
+ save_loaded_features do
282
+ a1 = new_spec "a", "1", "b" => "> 0"
283
+ b1 = new_spec "b", "1", "c" => ">= 0" # unresolved
284
+ b2 = new_spec "b", "2", "c" => ">= 0"
285
+ c1 = new_spec "c", "1", "d" => "<= 2" # 1st level
286
+ c2 = new_spec "c", "2", "d" => "<= 2"
287
+ d1 = new_spec "d", "1", nil, "lib/d.rb" # 2nd level
288
+ d2 = new_spec "d", "2", nil, "lib/d.rb"
289
+ d3 = new_spec "d", "3", nil, "lib/d.rb"
290
+ e = new_spec "anti_d", "1", nil, "lib/d.rb"
291
+
292
+ install_specs d1, d2, d3, e, c1, c2, b1, b2, a1
293
+
294
+ a1.activate
295
+
296
+ require "d"
297
+
298
+ assert_equal %w(a-1 b-2 c-2 d-2), loaded_spec_names
299
+ end
300
+ end
301
+
302
+ def test_require_should_not_conflict
303
+ save_loaded_features do
304
+ base = new_spec "0", "1", "A" => ">= 1"
305
+ a1 = new_spec "A", "1", {"c" => ">= 2", "b" => "> 0"}, "lib/a.rb"
306
+ a2 = new_spec "A", "2", {"c" => ">= 2", "b" => "> 0"}, "lib/a.rb"
307
+ b1 = new_spec "b", "1", {"c" => "= 1"}, "lib/d.rb"
308
+ b2 = new_spec "b", "2", {"c" => "= 2"}, "lib/d.rb"
309
+ c1 = new_spec "c", "1", {}, "lib/c.rb"
310
+ c2 = new_spec "c", "2", {}, "lib/c.rb"
311
+ c3 = new_spec "c", "3", {}, "lib/c.rb"
312
+
313
+ install_specs c1, c2, c3, b1, b2, a1, a2, base
314
+
315
+ base.activate
316
+ assert_equal %w(0-1), loaded_spec_names
317
+ assert_equal ["A (>= 1)"], unresolved_names
318
+
319
+ require "d"
320
+
321
+ assert_equal %w(0-1 A-2 b-2 c-2), loaded_spec_names
322
+ assert_equal [], unresolved_names
323
+ end
324
+ end
325
+
326
+ def test_inner_clonflict_in_indirect_gems
327
+ save_loaded_features do
328
+ a1 = new_spec "a", "1", "b" => "> 0"
329
+ b1 = new_spec "b", "1", "c" => ">= 1" # unresolved
330
+ b2 = new_spec "b", "2", "c" => ">= 1", "d" => "< 3"
331
+ c1 = new_spec "c", "1", "d" => "<= 2" # 1st level
332
+ c2 = new_spec "c", "2", "d" => "<= 2"
333
+ c3 = new_spec "c", "3", "d" => "<= 3"
334
+ d1 = new_spec "d", "1", nil, "lib/d.rb" # 2nd level
335
+ d2 = new_spec "d", "2", nil, "lib/d.rb"
336
+ d3 = new_spec "d", "3", nil, "lib/d.rb"
337
+
338
+ install_specs d1, d2, d3, c1, c2, c3, b1, b2, a1
339
+
340
+ a1.activate
341
+
342
+ require "d"
343
+
344
+ assert_includes [%w(a-1 b-2 c-3 d-2),%w(a-1 b-2 d-2)], loaded_spec_names
345
+ end
346
+ end
347
+
348
+ def test_inner_clonflict_in_indirect_gems_reversed
349
+ save_loaded_features do
350
+ a1 = new_spec "a", "1", "b" => "> 0"
351
+ b1 = new_spec "b", "1", "xc" => ">= 1" # unresolved
352
+ b2 = new_spec "b", "2", "xc" => ">= 1", "d" => "< 3"
353
+ c1 = new_spec "xc", "1", "d" => "<= 3" # 1st level
354
+ c2 = new_spec "xc", "2", "d" => "<= 2"
355
+ c3 = new_spec "xc", "3", "d" => "<= 3"
356
+ d1 = new_spec "d", "1", nil, "lib/d.rb" # 2nd level
357
+ d2 = new_spec "d", "2", nil, "lib/d.rb"
358
+ d3 = new_spec "d", "3", nil, "lib/d.rb"
359
+
360
+ install_specs d1, d2, d3, c1, c2, c3, b1, b2, a1
361
+
362
+ a1.activate
363
+
364
+ require "d"
365
+
366
+ assert_includes [%w(a-1 b-2 d-2 xc-3), %w(a-1 b-2 d-2)], loaded_spec_names
367
+ end
368
+ end
369
+
193
370
  ##
194
371
  # [A] depends on
195
372
  # [C] = 1.0 depends on
@@ -197,13 +374,14 @@ end
197
374
  # [B] ~> 1.0 (satisfied by 1.0)
198
375
 
199
376
  def test_self_activate_checks_dependencies
200
- a, _ = util_spec 'a', '1.0'
377
+ a = util_spec 'a', '1.0'
201
378
  a.add_dependency 'c', '= 1.0'
202
379
  a.add_dependency 'b', '~> 1.0'
203
380
 
204
- util_spec 'b', '1.0'
205
- util_spec 'b', '2.0'
206
- c, _ = util_spec 'c', '1.0', 'b' => '= 2.0'
381
+ b1 = util_spec 'b', '1.0'
382
+ b2 = util_spec 'b', '2.0'
383
+ c = util_spec 'c', '1.0', 'b' => '= 2.0'
384
+ install_specs b1, b2, c, a
207
385
 
208
386
  e = assert_raises Gem::LoadError do
209
387
  assert_activate nil, a, c, "b"
@@ -220,10 +398,12 @@ end
220
398
  # [B] = 2.0
221
399
 
222
400
  def test_self_activate_divergent
223
- a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
224
- util_spec 'b', '1.0'
225
- util_spec 'b', '2.0'
226
- c, _ = util_spec 'c', '1.0', 'b' => '= 2.0'
401
+ a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
402
+ b1 = util_spec 'b', '1.0'
403
+ b2 = util_spec 'b', '2.0'
404
+ c = util_spec 'c', '1.0', 'b' => '= 2.0'
405
+
406
+ install_specs b1, b2, c, a
227
407
 
228
408
  e = assert_raises Gem::ConflictError do
229
409
  assert_activate nil, a, c, "b"
@@ -241,6 +421,8 @@ end
241
421
  @d1 = util_spec 'd', '1'
242
422
  @d2 = util_spec 'd', '2'
243
423
 
424
+ install_specs @d1, @d2, e1
425
+
244
426
  assert_activate %w[d-1 e-1], e1, "d"
245
427
  end
246
428
 
@@ -259,6 +441,7 @@ end
259
441
  @w1 = util_spec 'w', '1', 'x' => nil
260
442
 
261
443
  util_set_arch 'cpu-my_platform1'
444
+ install_specs @x1_m, @x1_o, @w1
262
445
 
263
446
  assert_activate %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m
264
447
  end
@@ -274,6 +457,7 @@ end
274
457
  end
275
458
 
276
459
  @z1 = util_spec 'z', '1', 'y' => nil
460
+ install_specs @y1, @y1_1_p, @z1
277
461
 
278
462
  assert_activate %w[y-1 z-1], @z1, @y1
279
463
  end
@@ -291,6 +475,7 @@ end
291
475
  s.add_dependency 'a'
292
476
  s.add_development_dependency 'aa'
293
477
  end
478
+ install_specs @a1_pre, @b1, @c1_pre
294
479
 
295
480
  assert_activate %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1
296
481
  end
@@ -300,7 +485,7 @@ end
300
485
  b1 = new_spec "b", "1", nil, "lib/b/c.rb"
301
486
  b2 = new_spec "b", "2", nil, "lib/b/c.rb"
302
487
 
303
- install_specs a1, b1, b2
488
+ install_specs b1, b2, a1
304
489
 
305
490
  a1.activate
306
491
  save_loaded_features do
@@ -320,7 +505,7 @@ end
320
505
  d1 = new_spec "d", "1", { "c" => "< 2" }, "lib/d.rb"
321
506
  d2 = new_spec "d", "2", { "c" => "< 2" }, "lib/d.rb" # this
322
507
 
323
- install_specs a1, b1, b2, c1, c2, d1, d2
508
+ install_specs c1, c2, b1, b2, d1, d2, a1
324
509
 
325
510
  a1.activate
326
511
 
@@ -347,7 +532,7 @@ end
347
532
  c1 = new_spec "c", "1"
348
533
  c2 = new_spec "c", "2"
349
534
 
350
- install_specs a1, b1, b2, c1, c2
535
+ install_specs c1, c2, b1, b2, a1
351
536
 
352
537
  a1.activate
353
538
  assert_equal %w(a-1 b-1 c-1), loaded_spec_names
@@ -367,8 +552,9 @@ end
367
552
 
368
553
  def test_self_activate_unrelated
369
554
  a = util_spec 'a', '1.0', 'b' => '>= 1.0'
370
- util_spec 'b', '1.0'
555
+ b = util_spec 'b', '1.0'
371
556
  c = util_spec 'c', '1.0'
557
+ install_specs b, c, a
372
558
 
373
559
  assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
374
560
  end
@@ -384,10 +570,11 @@ end
384
570
 
385
571
  def test_self_activate_over
386
572
  a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0'
387
- util_spec 'b', '1.0'
388
- util_spec 'b', '1.1'
389
- util_spec 'b', '2.0'
390
- util_spec 'c', '1.0', 'b' => '~> 1.0'
573
+ install_specs util_spec 'b', '1.0'
574
+ install_specs util_spec 'b', '1.1'
575
+ install_specs util_spec 'b', '2.0'
576
+ install_specs util_spec 'c', '1.0', 'b' => '~> 1.0'
577
+ install_specs a
391
578
 
392
579
  a.activate
393
580
 
@@ -407,10 +594,12 @@ end
407
594
  # first resolve through a dependency that is later pruned.
408
595
 
409
596
  def test_self_activate_under
410
- a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
411
- util_spec 'b', '1.0'
412
- util_spec 'b', '1.1'
413
- c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
597
+ a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
598
+ b1 = util_spec 'b', '1.0'
599
+ b1_1 = util_spec 'b', '1.1'
600
+ c = util_spec 'c', '1.0', 'b' => '= 1.0'
601
+
602
+ install_specs b1, b1_1, c, a
414
603
 
415
604
  assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
416
605
  end
@@ -424,10 +613,11 @@ end
424
613
  # [C1] depends on nothing
425
614
 
426
615
  def test_self_activate_dropped
427
- a1, = util_spec 'a', '1', 'b' => nil
428
- util_spec 'b', '1', 'c' => nil
429
- util_spec 'b', '2'
430
- util_spec 'c', '1'
616
+ a1 = util_spec 'a', '1', 'b' => nil
617
+ b1 = util_spec 'b', '1', 'c' => nil
618
+ b2 = util_spec 'b', '2'
619
+ c1 = util_spec 'c', '1'
620
+ install_specs c1, b1, b2, a1
431
621
 
432
622
  assert_activate %w[b-2 a-1], a1, "b"
433
623
  end
@@ -443,17 +633,20 @@ end
443
633
  # resolve.
444
634
 
445
635
  def test_self_activate_raggi_the_edgecase_generator
446
- a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0'
447
- util_spec 'b', '1.0'
448
- util_spec 'b', '1.1', 'z' => '>= 1.0'
449
- c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
636
+ a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0'
637
+ b1 = util_spec 'b', '1.0'
638
+ b1_0 = util_spec 'b', '1.1', 'z' => '>= 1.0'
639
+ c = util_spec 'c', '1.0', 'b' => '= 1.0'
640
+ z = util_spec 'z', '1'
641
+
642
+ install_specs z, b1, b1_0, c, z
450
643
 
451
644
  assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
452
645
  end
453
646
 
454
647
  def test_self_activate_conflict
455
- util_spec 'b', '1.0'
456
- util_spec 'b', '2.0'
648
+ install_specs util_spec 'b', '1.0'
649
+ install_specs util_spec 'b', '2.0'
457
650
 
458
651
  gem "b", "= 1.0"
459
652
 
@@ -465,6 +658,7 @@ end
465
658
  def test_self_all_equals
466
659
  a = new_spec "foo", "1", nil, "lib/foo.rb"
467
660
 
661
+ install_specs a
468
662
  Gem::Specification.all = [a]
469
663
 
470
664
  assert_equal a, Gem::Specification.find_inactive_by_path('foo')
@@ -748,8 +942,12 @@ dependencies: []
748
942
  @a2.name = 'a};raise "improper escaping";%q{'
749
943
 
750
944
  full_path = @a2.spec_file
751
- write_file full_path do |io|
752
- io.write @a2.to_ruby_for_cache
945
+ begin
946
+ write_file full_path do |io|
947
+ io.write @a2.to_ruby_for_cache
948
+ end
949
+ rescue Errno::EINVAL
950
+ skip "cannot create '#{full_path}' on this platform"
753
951
  end
754
952
 
755
953
  spec = Gem::Specification.load full_path
@@ -763,8 +961,12 @@ dependencies: []
763
961
  @a2.name = 'a#{raise %<improper escaping>}'
764
962
 
765
963
  full_path = @a2.spec_file
766
- write_file full_path do |io|
767
- io.write @a2.to_ruby_for_cache
964
+ begin
965
+ write_file full_path do |io|
966
+ io.write @a2.to_ruby_for_cache
967
+ end
968
+ rescue Errno::EINVAL
969
+ skip "cannot create '#{full_path}' on this platform"
768
970
  end
769
971
 
770
972
  spec = Gem::Specification.load full_path
@@ -778,8 +980,12 @@ dependencies: []
778
980
  @a2.name = 'a";raise "improper escaping";"'
779
981
 
780
982
  full_path = @a2.spec_file
781
- write_file full_path do |io|
782
- io.write @a2.to_ruby_for_cache
983
+ begin
984
+ write_file full_path do |io|
985
+ io.write @a2.to_ruby_for_cache
986
+ end
987
+ rescue Errno::EINVAL
988
+ skip "cannot create '#{full_path}' on this platform"
783
989
  end
784
990
 
785
991
  spec = Gem::Specification.load full_path
@@ -854,9 +1060,7 @@ dependencies: []
854
1060
 
855
1061
  def test_self_outdated
856
1062
  spec_fetcher do |fetcher|
857
- fetcher.spec 'a', 4
858
-
859
- fetcher.clear
1063
+ fetcher.download 'a', 4
860
1064
 
861
1065
  fetcher.spec 'a', 3
862
1066
  end
@@ -866,10 +1070,8 @@ dependencies: []
866
1070
 
867
1071
  def test_self_outdated_and_latest_remotes
868
1072
  specs = spec_fetcher do |fetcher|
869
- fetcher.spec 'a', 4
870
- fetcher.spec 'b', 3
871
-
872
- fetcher.clear
1073
+ fetcher.download 'a', 4
1074
+ fetcher.download 'b', 3
873
1075
 
874
1076
  fetcher.spec 'a', '3.a'
875
1077
  fetcher.spec 'b', 2
@@ -884,10 +1086,13 @@ dependencies: []
884
1086
  end
885
1087
 
886
1088
  def test_self_remove_spec
1089
+ install_specs @a1
1090
+
887
1091
  assert_includes Gem::Specification.all_names, 'a-1'
888
1092
  assert_includes Gem::Specification.stubs.map { |s| s.full_name }, 'a-1'
889
1093
 
890
- Gem::Specification.remove_spec @a1
1094
+ uninstall_gem @a1
1095
+ Gem::Specification.reset
891
1096
 
892
1097
  refute_includes Gem::Specification.all_names, 'a-1'
893
1098
  refute_includes Gem::Specification.stubs.map { |s| s.full_name }, 'a-1'
@@ -902,7 +1107,7 @@ dependencies: []
902
1107
 
903
1108
  FileUtils.rm @a1.spec_file # bug #698
904
1109
 
905
- Gem::Specification.remove_spec @a1
1110
+ Gem::Specification.reset
906
1111
 
907
1112
  refute_includes Gem::Specification.all_names, 'a-1'
908
1113
  refute_includes Gem::Specification.stubs.map { |s| s.full_name }, 'a-1'
@@ -973,7 +1178,7 @@ dependencies: []
973
1178
  s.summary = 'summary'
974
1179
  s.description = 'description'
975
1180
  s.authors = 'author a', 'author b'
976
- s.licenses = 'BSD'
1181
+ s.licenses = 'BSD-2-Clause'
977
1182
  s.files = 'lib/file.rb'
978
1183
  s.test_files = 'test/file.rb'
979
1184
  s.rdoc_options = '--foo'
@@ -1183,6 +1388,17 @@ dependencies: []
1183
1388
  assert_path_exists @ext.extension_dir
1184
1389
  end
1185
1390
 
1391
+ def test_default_spec_stub_is_marked_default
1392
+ default = new_default_spec 'default', 2
1393
+ install_default_gems default
1394
+
1395
+ stub = Gem::Specification.stubs.find { |s| s.name == 'default' }
1396
+ assert_predicate stub, :default_gem?
1397
+
1398
+ stub = Gem::Specification.find_all_by_name('default').first
1399
+ assert_predicate stub, :default_gem?
1400
+ end
1401
+
1186
1402
  def test_build_extensions_built
1187
1403
  ext_spec
1188
1404
 
@@ -1419,7 +1635,9 @@ dependencies: []
1419
1635
 
1420
1636
  assert_empty @gem.dependent_gems
1421
1637
 
1422
- bonobo = util_spec 'bonobo'
1638
+ bonobo = util_spec 'bonobo', 1
1639
+ install_gem bonobo
1640
+ install_gem @gem
1423
1641
 
1424
1642
  expected = [
1425
1643
  [@gem, @bonobo, [bonobo]],
@@ -1506,6 +1724,8 @@ dependencies: []
1506
1724
  class << Gem
1507
1725
  alias orig_default_ext_dir_for default_ext_dir_for
1508
1726
 
1727
+ remove_method :default_ext_dir_for
1728
+
1509
1729
  def Gem.default_ext_dir_for(base_dir)
1510
1730
  'elsewhere'
1511
1731
  end
@@ -1815,6 +2035,8 @@ dependencies: []
1815
2035
  def test_require_paths_default_ext_dir_for
1816
2036
  class << Gem
1817
2037
  send :alias_method, :orig_default_ext_dir_for, :default_ext_dir_for
2038
+
2039
+ remove_method :default_ext_dir_for
1818
2040
  end
1819
2041
 
1820
2042
  def Gem.default_ext_dir_for base_dir
@@ -1932,7 +2154,7 @@ dependencies: []
1932
2154
  c1 = new_spec "c", "1", nil, "lib/d.rb"
1933
2155
  c2 = new_spec("c", "2", { "a" => "1" }, "lib/d.rb") # conflicts with a-2
1934
2156
 
1935
- install_specs a1, a2, b1, b2, c1, c2
2157
+ install_specs c1, b1, a1, a2, c2, b2
1936
2158
 
1937
2159
  a1.activate
1938
2160
  c1.activate
@@ -2014,6 +2236,19 @@ dependencies: []
2014
2236
  assert_equal ['test/suite.rb'], @a1.test_files
2015
2237
  end
2016
2238
 
2239
+ def test_runtime_predicate_true
2240
+ @a2.add_runtime_dependency 'b', '1'
2241
+ assert_predicate @a2.dependencies.first, :runtime?
2242
+
2243
+ @a2.dependencies.first.instance_variable_set :@type, nil
2244
+ assert_predicate @a2.dependencies.first, :runtime?
2245
+ end
2246
+
2247
+ def test_runtime_predicate_false
2248
+ @a2.add_development_dependency 'b', '1'
2249
+ refute_predicate @a2.dependencies.first, :runtime?
2250
+ end
2251
+
2017
2252
  def test_to_ruby
2018
2253
  @a2.add_runtime_dependency 'b', '1'
2019
2254
  @a2.dependencies.first.instance_variable_set :@type, nil
@@ -2377,12 +2612,14 @@ end
2377
2612
  end
2378
2613
  end
2379
2614
 
2380
- def test_validate_dependencies_open_ended
2615
+ def test_validate_dependencies_duplicates
2381
2616
  util_setup_validate
2382
2617
 
2383
2618
  Dir.chdir @tempdir do
2384
2619
  @a1.add_runtime_dependency 'b', '~> 1.2'
2385
2620
  @a1.add_runtime_dependency 'b', '>= 1.2.3'
2621
+ @a1.add_development_dependency 'c', '~> 1.2'
2622
+ @a1.add_development_dependency 'c', '>= 1.2.3'
2386
2623
 
2387
2624
  use_ui @ui do
2388
2625
  e = assert_raises Gem::InvalidSpecificationException do
@@ -2392,6 +2629,8 @@ end
2392
2629
  expected = <<-EXPECTED
2393
2630
  duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2394
2631
  add_runtime_dependency 'b', '>= 1.2.3', '~> 1.2'
2632
+ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use:
2633
+ add_development_dependency 'c', '>= 1.2.3', '~> 1.2'
2395
2634
  EXPECTED
2396
2635
 
2397
2636
  assert_equal expected, e.message
@@ -2403,6 +2642,21 @@ duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2403
2642
  end
2404
2643
  end
2405
2644
 
2645
+ def test_validate_dependencies_allowed_duplicates
2646
+ util_setup_validate
2647
+
2648
+ Dir.chdir @tempdir do
2649
+ @a1.add_runtime_dependency 'b', '~> 1.2'
2650
+ @a1.add_development_dependency 'b', '= 1.2.3'
2651
+
2652
+ use_ui @ui do
2653
+ @a1.validate
2654
+ end
2655
+
2656
+ assert_equal '', @ui.error, 'warning'
2657
+ end
2658
+ end
2659
+
2406
2660
  def test_validate_description
2407
2661
  util_setup_validate
2408
2662
 
@@ -2413,8 +2667,6 @@ duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2413
2667
  @a1.validate
2414
2668
  end
2415
2669
 
2416
- assert_match "#{w}: no description specified\n", @ui.error, "error"
2417
-
2418
2670
  @ui = Gem::MockGemUi.new
2419
2671
  @a1.summary = "this is my summary"
2420
2672
  @a1.description = @a1.summary
@@ -2535,13 +2787,13 @@ duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2535
2787
  @a1.extensions << 'ext/a/extconf.rb'
2536
2788
 
2537
2789
  Dir.chdir @tempdir do
2538
- FileUtils.ln_s '/root/path', 'lib2' unless vc_windows?
2790
+ FileUtils.ln_s 'lib/code.rb', 'lib2' unless vc_windows?
2539
2791
 
2540
- e = assert_raises Gem::InvalidSpecificationException do
2792
+ use_ui @ui do
2541
2793
  @a1.validate
2542
2794
  end
2543
2795
 
2544
- assert_equal '["lib2"] are not files', e.message
2796
+ assert_match 'WARNING: lib2 is a symlink, which is not supported on all platforms', @ui.error
2545
2797
  end
2546
2798
 
2547
2799
  assert_equal %w[bin/exec ext/a/extconf.rb lib/code.rb lib2 test/suite.rb].sort,
@@ -2603,8 +2855,22 @@ duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2603
2855
  end
2604
2856
 
2605
2857
  assert_match <<-warning, @ui.error
2606
- WARNING: licenses is empty, but is recommended. Use a license abbreviation from:
2607
- http://opensource.org/licenses/alphabetical
2858
+ WARNING: licenses is empty, but is recommended. Use a license identifier from
2859
+ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
2860
+ warning
2861
+ end
2862
+
2863
+ def test_validate_license_values
2864
+ util_setup_validate
2865
+
2866
+ use_ui @ui do
2867
+ @a1.licenses = ['BSD']
2868
+ @a1.validate
2869
+ end
2870
+
2871
+ assert_match <<-warning, @ui.error
2872
+ WARNING: license value 'BSD' is invalid. Use a license identifier from
2873
+ http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
2608
2874
  warning
2609
2875
  end
2610
2876
 
@@ -2658,6 +2924,20 @@ http://opensource.org/licenses/alphabetical
2658
2924
  end
2659
2925
  end
2660
2926
 
2927
+ def test_validate_permissions_of_missing_file_non_packaging
2928
+ skip 'chmod not supported' if Gem.win_platform?
2929
+
2930
+ util_setup_validate
2931
+
2932
+ Dir.chdir @tempdir do
2933
+ File.delete File.join('lib', 'code.rb')
2934
+
2935
+ use_ui @ui do
2936
+ assert @a1.validate(false)
2937
+ end
2938
+ end
2939
+ end
2940
+
2661
2941
  def test_validate_platform_legacy
2662
2942
  util_setup_validate
2663
2943
 
@@ -2994,7 +3274,8 @@ end
2994
3274
  end
2995
3275
 
2996
3276
  def test_find_by_name
2997
- util_spec "a"
3277
+ install_specs util_spec "a"
3278
+ install_specs util_spec "a", 1
2998
3279
 
2999
3280
  assert Gem::Specification.find_by_name "a"
3000
3281
  assert Gem::Specification.find_by_name "a", "1"
@@ -3010,6 +3291,8 @@ end
3010
3291
 
3011
3292
  b.activate
3012
3293
 
3294
+ install_specs b
3295
+
3013
3296
  assert Gem::Specification.find_by_name "b"
3014
3297
 
3015
3298
  assert_raises Gem::LoadError do