rubygems-update 1.8.30 → 2.0.0.preview2

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.

Potentially problematic release.


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

Files changed (241) hide show
  1. checksums.yaml +6 -6
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +3 -0
  4. data/.autotest +6 -3
  5. data/History.txt +137 -63
  6. data/LICENSE.txt +1 -5
  7. data/Manifest.txt +69 -32
  8. data/README.rdoc +11 -9
  9. data/Rakefile +24 -38
  10. data/bin/gem +0 -9
  11. data/bin/update_rubygems +1 -0
  12. data/lib/rubygems.rb +193 -405
  13. data/lib/rubygems/available_set.rb +95 -0
  14. data/lib/rubygems/command.rb +88 -45
  15. data/lib/rubygems/command_manager.rb +67 -40
  16. data/lib/rubygems/commands/build_command.rb +5 -23
  17. data/lib/rubygems/commands/cert_command.rb +199 -57
  18. data/lib/rubygems/commands/check_command.rb +14 -39
  19. data/lib/rubygems/commands/cleanup_command.rb +9 -1
  20. data/lib/rubygems/commands/contents_command.rb +30 -12
  21. data/lib/rubygems/commands/dependency_command.rb +3 -8
  22. data/lib/rubygems/commands/environment_command.rb +13 -8
  23. data/lib/rubygems/commands/fetch_command.rb +3 -16
  24. data/lib/rubygems/commands/generate_index_command.rb +7 -47
  25. data/lib/rubygems/commands/help_command.rb +1 -1
  26. data/lib/rubygems/commands/install_command.rb +69 -36
  27. data/lib/rubygems/commands/list_command.rb +6 -4
  28. data/lib/rubygems/commands/lock_command.rb +1 -1
  29. data/lib/rubygems/commands/mirror_command.rb +17 -0
  30. data/lib/rubygems/commands/outdated_command.rb +6 -3
  31. data/lib/rubygems/commands/owner_command.rb +13 -5
  32. data/lib/rubygems/commands/pristine_command.rb +19 -4
  33. data/lib/rubygems/commands/push_command.rb +12 -1
  34. data/lib/rubygems/commands/query_command.rb +43 -27
  35. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  36. data/lib/rubygems/commands/search_command.rb +4 -18
  37. data/lib/rubygems/commands/server_command.rb +1 -1
  38. data/lib/rubygems/commands/setup_command.rb +124 -38
  39. data/lib/rubygems/commands/sources_command.rb +16 -16
  40. data/lib/rubygems/commands/specification_command.rb +11 -13
  41. data/lib/rubygems/commands/uninstall_command.rb +24 -7
  42. data/lib/rubygems/commands/unpack_command.rb +7 -3
  43. data/lib/rubygems/commands/update_command.rb +22 -36
  44. data/lib/rubygems/commands/yank_command.rb +98 -0
  45. data/lib/rubygems/compatibility.rb +51 -0
  46. data/lib/rubygems/config_file.rb +82 -54
  47. data/lib/rubygems/core_ext/kernel_gem.rb +53 -0
  48. data/lib/rubygems/core_ext/kernel_require.rb +119 -0
  49. data/lib/rubygems/defaults.rb +10 -21
  50. data/lib/rubygems/dependency.rb +61 -10
  51. data/lib/rubygems/dependency_installer.rb +157 -69
  52. data/lib/rubygems/dependency_list.rb +11 -19
  53. data/lib/rubygems/dependency_resolver.rb +562 -0
  54. data/lib/rubygems/deprecate.rb +40 -40
  55. data/lib/rubygems/errors.rb +77 -24
  56. data/lib/rubygems/exceptions.rb +25 -7
  57. data/lib/rubygems/ext/builder.rb +20 -23
  58. data/lib/rubygems/ext/configure_builder.rb +2 -2
  59. data/lib/rubygems/ext/ext_conf_builder.rb +5 -45
  60. data/lib/rubygems/ext/rake_builder.rb +2 -2
  61. data/lib/rubygems/gem_runner.rb +3 -16
  62. data/lib/rubygems/gemcutter_utilities.rb +22 -7
  63. data/lib/rubygems/indexer.rb +6 -159
  64. data/lib/rubygems/install_message.rb +12 -0
  65. data/lib/rubygems/install_update_options.rb +56 -18
  66. data/lib/rubygems/installer.rb +244 -134
  67. data/lib/rubygems/installer_test_case.rb +71 -19
  68. data/lib/rubygems/mock_gem_ui.rb +17 -0
  69. data/lib/rubygems/name_tuple.rb +110 -0
  70. data/lib/rubygems/package.rb +514 -43
  71. data/lib/rubygems/package/digest_io.rb +64 -0
  72. data/lib/rubygems/package/old.rb +147 -0
  73. data/lib/rubygems/package/tar_header.rb +18 -55
  74. data/lib/rubygems/package/tar_reader.rb +20 -3
  75. data/lib/rubygems/package/tar_writer.rb +63 -7
  76. data/lib/rubygems/package_task.rb +3 -4
  77. data/lib/rubygems/path_support.rb +14 -7
  78. data/lib/rubygems/platform.rb +19 -26
  79. data/lib/rubygems/rdoc.rb +316 -0
  80. data/lib/rubygems/remote_fetcher.rb +117 -54
  81. data/lib/rubygems/request_set.rb +182 -0
  82. data/lib/rubygems/requirement.rb +63 -26
  83. data/lib/rubygems/security.rb +295 -555
  84. data/lib/rubygems/security/policies.rb +115 -0
  85. data/lib/rubygems/security/policy.rb +227 -0
  86. data/lib/rubygems/security/signer.rb +136 -0
  87. data/lib/rubygems/security/trust_dir.rb +104 -0
  88. data/lib/rubygems/server.rb +45 -55
  89. data/lib/rubygems/source.rb +144 -0
  90. data/lib/rubygems/source_list.rb +87 -0
  91. data/lib/rubygems/source_local.rb +92 -0
  92. data/lib/rubygems/source_specific_file.rb +28 -0
  93. data/lib/rubygems/spec_fetcher.rb +116 -184
  94. data/lib/rubygems/specification.rb +731 -335
  95. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +88 -30
  96. data/lib/rubygems/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem +90 -0
  97. data/lib/rubygems/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem +57 -0
  98. data/lib/rubygems/syck_hack.rb +2 -0
  99. data/lib/rubygems/test_case.rb +199 -109
  100. data/lib/rubygems/test_utilities.rb +25 -5
  101. data/lib/rubygems/uninstaller.rb +62 -20
  102. data/lib/rubygems/user_interaction.rb +10 -0
  103. data/lib/rubygems/validator.rb +33 -40
  104. data/lib/rubygems/version.rb +19 -8
  105. data/setup.rb +8 -1
  106. data/test/rubygems/alternate_cert.pem +9 -0
  107. data/test/rubygems/alternate_cert_32.pem +9 -0
  108. data/test/rubygems/alternate_key.pem +9 -0
  109. data/test/rubygems/bad_rake.rb +1 -0
  110. data/test/rubygems/child_cert.pem +9 -0
  111. data/test/rubygems/child_cert_32.pem +9 -0
  112. data/test/rubygems/child_key.pem +9 -0
  113. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  114. data/test/rubygems/expired_cert.pem +9 -0
  115. data/test/rubygems/future_cert.pem +9 -0
  116. data/test/rubygems/future_cert_32.pem +9 -0
  117. data/test/rubygems/good_rake.rb +1 -0
  118. data/test/rubygems/grandchild_cert.pem +9 -0
  119. data/test/rubygems/grandchild_cert_32.pem +9 -0
  120. data/test/rubygems/grandchild_key.pem +9 -0
  121. data/test/rubygems/invalid_issuer_cert.pem +9 -0
  122. data/test/rubygems/invalid_issuer_cert_32.pem +9 -0
  123. data/test/rubygems/invalid_key.pem +9 -0
  124. data/test/rubygems/invalid_signer_cert.pem +9 -0
  125. data/test/rubygems/invalid_signer_cert_32.pem +9 -0
  126. data/test/rubygems/invalidchild_cert.pem +9 -0
  127. data/test/rubygems/invalidchild_cert_32.pem +9 -0
  128. data/test/rubygems/invalidchild_key.pem +9 -0
  129. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -1
  130. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -1
  131. data/test/rubygems/private_key.pem +7 -25
  132. data/test/rubygems/public_cert.pem +8 -18
  133. data/test/rubygems/public_cert_32.pem +10 -0
  134. data/test/rubygems/public_key.pem +4 -0
  135. data/test/rubygems/rubygems/commands/crash_command.rb +1 -1
  136. data/test/rubygems/test_config.rb +4 -6
  137. data/test/rubygems/test_deprecate.rb +76 -0
  138. data/test/rubygems/test_gem.rb +318 -83
  139. data/test/rubygems/test_gem_available_set.rb +106 -0
  140. data/test/rubygems/test_gem_command.rb +10 -0
  141. data/test/rubygems/test_gem_command_manager.rb +55 -9
  142. data/test/rubygems/test_gem_commands_build_command.rb +11 -19
  143. data/test/rubygems/test_gem_commands_cert_command.rb +441 -42
  144. data/test/rubygems/test_gem_commands_cleanup_command.rb +29 -1
  145. data/test/rubygems/test_gem_commands_contents_command.rb +23 -0
  146. data/test/rubygems/test_gem_commands_dependency_command.rb +5 -0
  147. data/test/rubygems/test_gem_commands_fetch_command.rb +19 -20
  148. data/test/rubygems/test_gem_commands_generate_index_command.rb +2 -83
  149. data/test/rubygems/test_gem_commands_help_command.rb +2 -1
  150. data/test/rubygems/test_gem_commands_install_command.rb +647 -48
  151. data/test/rubygems/test_gem_commands_mirror.rb +32 -0
  152. data/test/rubygems/test_gem_commands_owner_command.rb +4 -8
  153. data/test/rubygems/test_gem_commands_pristine_command.rb +99 -4
  154. data/test/rubygems/test_gem_commands_push_command.rb +62 -8
  155. data/test/rubygems/test_gem_commands_query_command.rb +51 -0
  156. data/test/rubygems/test_gem_commands_search_command.rb +25 -0
  157. data/test/rubygems/test_gem_commands_setup_command.rb +45 -0
  158. data/test/rubygems/test_gem_commands_sources_command.rb +21 -6
  159. data/test/rubygems/test_gem_commands_specification_command.rb +33 -1
  160. data/test/rubygems/test_gem_commands_uninstall_command.rb +91 -31
  161. data/test/rubygems/test_gem_commands_unpack_command.rb +3 -3
  162. data/test/rubygems/test_gem_commands_update_command.rb +56 -38
  163. data/test/rubygems/test_gem_commands_which_command.rb +4 -4
  164. data/test/rubygems/test_gem_commands_yank_command.rb +97 -0
  165. data/test/rubygems/test_gem_config_file.rb +66 -21
  166. data/test/rubygems/test_gem_dependency.rb +46 -0
  167. data/test/rubygems/test_gem_dependency_installer.rb +228 -18
  168. data/test/rubygems/test_gem_dependency_list.rb +0 -9
  169. data/test/rubygems/test_gem_dependency_resolver.rb +327 -0
  170. data/test/rubygems/test_gem_ext_configure_builder.rb +4 -4
  171. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +21 -49
  172. data/test/rubygems/test_gem_ext_rake_builder.rb +13 -13
  173. data/test/rubygems/test_gem_gem_runner.rb +27 -5
  174. data/test/rubygems/test_gem_gemcutter_utilities.rb +19 -0
  175. data/test/rubygems/test_gem_indexer.rb +14 -227
  176. data/test/rubygems/test_gem_install_update_options.rb +83 -3
  177. data/test/rubygems/test_gem_installer.rb +211 -236
  178. data/test/rubygems/test_gem_local_remote_options.rb +8 -2
  179. data/test/rubygems/test_gem_name_tuple.rb +15 -0
  180. data/test/rubygems/test_gem_package.rb +547 -0
  181. data/test/rubygems/test_gem_package_old.rb +37 -0
  182. data/test/rubygems/test_gem_package_tar_reader.rb +32 -0
  183. data/test/rubygems/test_gem_package_tar_writer.rb +84 -1
  184. data/test/rubygems/test_gem_path_support.rb +4 -30
  185. data/test/rubygems/test_gem_platform.rb +3 -6
  186. data/test/rubygems/test_gem_rdoc.rb +245 -0
  187. data/test/rubygems/test_gem_remote_fetcher.rb +51 -5
  188. data/test/rubygems/test_gem_request_set.rb +70 -0
  189. data/test/rubygems/test_gem_requirement.rb +53 -24
  190. data/test/rubygems/test_gem_security.rb +189 -43
  191. data/test/rubygems/test_gem_security_policy.rb +376 -0
  192. data/test/rubygems/test_gem_security_signer.rb +184 -0
  193. data/test/rubygems/test_gem_security_trust_dir.rb +94 -0
  194. data/test/rubygems/test_gem_server.rb +31 -36
  195. data/test/rubygems/test_gem_silent_ui.rb +2 -2
  196. data/test/rubygems/test_gem_source.rb +188 -0
  197. data/test/rubygems/test_gem_source_list.rb +87 -0
  198. data/test/rubygems/test_gem_source_local.rb +83 -0
  199. data/test/rubygems/test_gem_source_specific_file.rb +33 -0
  200. data/test/rubygems/test_gem_spec_fetcher.rb +91 -255
  201. data/test/rubygems/test_gem_specification.rb +293 -39
  202. data/test/rubygems/test_gem_uninstaller.rb +136 -13
  203. data/test/rubygems/test_gem_validator.rb +14 -41
  204. data/test/rubygems/test_gem_version.rb +15 -21
  205. data/test/rubygems/test_require.rb +193 -0
  206. data/test/rubygems/wrong_key_cert.pem +9 -0
  207. data/test/rubygems/wrong_key_cert_32.pem +9 -0
  208. metadata +171 -83
  209. metadata.gz.sig +1 -0
  210. data/CVE-2013-4287.txt +0 -36
  211. data/CVE-2013-4363.txt +0 -45
  212. data/ci_build.sh +0 -27
  213. data/cruise_config.rb +0 -32
  214. data/lib/rbconfig/datadir.rb +0 -13
  215. data/lib/rubygems/builder.rb +0 -99
  216. data/lib/rubygems/custom_require.rb +0 -69
  217. data/lib/rubygems/doc_manager.rb +0 -243
  218. data/lib/rubygems/format.rb +0 -82
  219. data/lib/rubygems/gem_openssl.rb +0 -90
  220. data/lib/rubygems/gem_path_searcher.rb +0 -172
  221. data/lib/rubygems/old_format.rb +0 -153
  222. data/lib/rubygems/package/f_sync_dir.rb +0 -23
  223. data/lib/rubygems/package/tar_input.rb +0 -234
  224. data/lib/rubygems/package/tar_output.rb +0 -146
  225. data/lib/rubygems/require_paths_builder.rb +0 -18
  226. data/lib/rubygems/source_index.rb +0 -406
  227. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  228. data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  229. data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
  230. data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  231. data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  232. data/test/rubygems/test_bundled_ca.rb +0 -59
  233. data/test/rubygems/test_gem_builder.rb +0 -44
  234. data/test/rubygems/test_gem_doc_manager.rb +0 -32
  235. data/test/rubygems/test_gem_ext_builder.rb +0 -58
  236. data/test/rubygems/test_gem_format.rb +0 -88
  237. data/test/rubygems/test_gem_gem_path_searcher.rb +0 -94
  238. data/test/rubygems/test_gem_package_tar_input.rb +0 -129
  239. data/test/rubygems/test_gem_package_tar_output.rb +0 -101
  240. data/test/rubygems/test_gem_source_index.rb +0 -250
  241. data/util/update_bundled_ca_certificates.rb +0 -103
@@ -0,0 +1,94 @@
1
+ require 'rubygems/test_case'
2
+
3
+ class TestGemSecurityTrustDir < Gem::TestCase
4
+
5
+ CHILD_CERT = load_cert 'child'
6
+
7
+ def setup
8
+ super
9
+
10
+ @dest_dir = File.join @tempdir, 'trust'
11
+
12
+ @trust_dir = Gem::Security::TrustDir.new @dest_dir
13
+ end
14
+
15
+ def test_cert_path
16
+ digest = OpenSSL::Digest::SHA1.hexdigest PUBLIC_CERT.subject.to_s
17
+
18
+ expected = File.join @dest_dir, "cert-#{digest}.pem"
19
+
20
+ assert_equal expected, @trust_dir.cert_path(PUBLIC_CERT)
21
+ end
22
+
23
+ def test_issuer_of
24
+ assert_nil @trust_dir.issuer_of(CHILD_CERT)
25
+
26
+ @trust_dir.trust_cert PUBLIC_CERT
27
+
28
+ assert_equal PUBLIC_CERT.to_pem, @trust_dir.issuer_of(CHILD_CERT).to_pem
29
+ end
30
+
31
+ def test_load_certificate
32
+ @trust_dir.trust_cert PUBLIC_CERT
33
+
34
+ path = @trust_dir.cert_path PUBLIC_CERT
35
+
36
+ assert_equal PUBLIC_CERT.to_pem, @trust_dir.load_certificate(path).to_pem
37
+ end
38
+
39
+ def test_name_path
40
+ digest = OpenSSL::Digest::SHA1.hexdigest PUBLIC_CERT.subject.to_s
41
+
42
+ expected = File.join @dest_dir, "cert-#{digest}.pem"
43
+
44
+ assert_equal expected, @trust_dir.name_path(PUBLIC_CERT.subject)
45
+ end
46
+
47
+ def test_trust_cert
48
+ @trust_dir.trust_cert PUBLIC_CERT
49
+
50
+ trusted = @trust_dir.cert_path PUBLIC_CERT
51
+
52
+ assert_path_exists trusted
53
+
54
+ mask = 0100600 & (~File.umask)
55
+
56
+ assert_equal mask, File.stat(trusted).mode unless win_platform?
57
+
58
+ assert_equal PUBLIC_CERT.to_pem, File.read(trusted)
59
+ end
60
+
61
+ def test_verify
62
+ refute_path_exists @dest_dir
63
+
64
+ @trust_dir.verify
65
+
66
+ assert_path_exists @dest_dir
67
+
68
+ mask = 040700 & (~File.umask)
69
+
70
+ assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
71
+ end
72
+
73
+ def test_verify_file
74
+ FileUtils.touch @dest_dir
75
+
76
+ e = assert_raises Gem::Security::Exception do
77
+ @trust_dir.verify
78
+ end
79
+
80
+ assert_equal "trust directory #{@dest_dir} is not a directory", e.message
81
+ end
82
+
83
+ def test_verify_wrong_permissions
84
+ FileUtils.mkdir_p @dest_dir, :mode => 0777
85
+
86
+ @trust_dir.verify
87
+
88
+ mask = 040700 & (~File.umask)
89
+
90
+ assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
91
+ end
92
+
93
+ end
94
+
@@ -18,55 +18,50 @@ class TestGemServer < Gem::TestCase
18
18
  @res = WEBrick::HTTPResponse.new :HTTPVersion => '1.0'
19
19
  end
20
20
 
21
- def test_spec_dirs
22
- s = Gem::Server.new Gem.dir, process_based_port, false
21
+ def test_doc_root_3
22
+ orig_rdoc_version = Gem::RDoc.rdoc_version
23
+ Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('3.12')
23
24
 
24
- assert_equal [File.join(Gem.dir, 'specifications')], s.spec_dirs
25
-
26
- s = Gem::Server.new [Gem.dir, Gem.dir], process_based_port, false
25
+ assert_equal '/doc_root/X-1/rdoc/index.html', @server.doc_root('X-1')
27
26
 
28
- assert_equal [File.join(Gem.dir, 'specifications'),
29
- File.join(Gem.dir, 'specifications')], s.spec_dirs
27
+ ensure
28
+ Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
30
29
  end
31
30
 
32
- def test_Marshal
33
- data = StringIO.new "GET /Marshal.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
34
- @req.parse data
31
+ def test_doc_root_4
32
+ orig_rdoc_version = Gem::RDoc.rdoc_version
33
+ Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('4.0')
35
34
 
36
- Gem::Deprecate.skip_during do
37
- @server.Marshal @req, @res
38
- end
35
+ assert_equal '/doc_root/X-1/', @server.doc_root('X-1')
39
36
 
40
- assert_equal 200, @res.status, @res.body
41
- assert_match %r| \d\d:\d\d:\d\d |, @res['date']
42
- assert_equal 'application/octet-stream', @res['content-type']
37
+ ensure
38
+ Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
39
+ end
43
40
 
44
- Gem::Deprecate.skip_during do
45
- si = Gem::SourceIndex.new
46
- si.add_specs @a1, @a2
41
+ def test_have_rdoc_4_plus_eh
42
+ orig_rdoc_version = Gem::RDoc.rdoc_version
43
+ Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('4.0')
47
44
 
48
- assert_equal si, Marshal.load(@res.body)
49
- end
50
- end
45
+ server = Gem::Server.new Gem.dir, 0, false
46
+ assert server.have_rdoc_4_plus?
51
47
 
52
- def test_Marshal_Z
53
- data = StringIO.new "GET /Marshal.#{Gem.marshal_version}.Z HTTP/1.0\r\n\r\n"
54
- @req.parse data
48
+ Gem::RDoc.instance_variable_set :@rdoc_version, Gem::Version.new('3.12')
55
49
 
56
- Gem::Deprecate.skip_during do
57
- @server.Marshal @req, @res
58
- end
50
+ server = Gem::Server.new Gem.dir, 0, false
51
+ refute server.have_rdoc_4_plus?
52
+ ensure
53
+ Gem::RDoc.instance_variable_set :@rdoc_version, orig_rdoc_version
54
+ end
59
55
 
60
- assert_equal 200, @res.status, @res.body
61
- assert_match %r| \d\d:\d\d:\d\d |, @res['date']
62
- assert_equal 'application/x-deflate', @res['content-type']
56
+ def test_spec_dirs
57
+ s = Gem::Server.new Gem.dir, process_based_port, false
63
58
 
64
- Gem::Deprecate.skip_during do
65
- si = Gem::SourceIndex.new
66
- si.add_specs @a1, @a2
59
+ assert_equal [File.join(Gem.dir, 'specifications')], s.spec_dirs
67
60
 
68
- assert_equal si, Marshal.load(Gem.inflate(@res.body))
69
- end
61
+ s = Gem::Server.new [Gem.dir, Gem.dir], process_based_port, false
62
+
63
+ assert_equal [File.join(Gem.dir, 'specifications'),
64
+ File.join(Gem.dir, 'specifications')], s.spec_dirs
70
65
  end
71
66
 
72
67
  def test_latest_specs
@@ -49,7 +49,7 @@ class TestGemSilentUI < Gem::TestCase
49
49
 
50
50
  assert_empty out, 'No output'
51
51
  assert_empty err, 'No output'
52
-
52
+
53
53
  out, err = capture_io do
54
54
  use_ui @sui do
55
55
  value = @sui.ask_yes_no 'Problem?', true
@@ -60,7 +60,7 @@ class TestGemSilentUI < Gem::TestCase
60
60
  assert_empty err, 'No output'
61
61
 
62
62
  assert value, 'Value is true'
63
-
63
+
64
64
  out, err = capture_io do
65
65
  use_ui @sui do
66
66
  value = @sui.ask_yes_no 'Problem?', false
@@ -0,0 +1,188 @@
1
+ require 'rubygems/test_case'
2
+ require 'rubygems/source'
3
+
4
+ class TestGemSource < Gem::TestCase
5
+
6
+ def tuple(*args)
7
+ Gem::NameTuple.new(*args)
8
+ end
9
+
10
+ def setup
11
+ super
12
+
13
+ util_setup_fake_fetcher
14
+
15
+ @a_pre = new_spec 'a', '1.a'
16
+
17
+ install_specs @a_pre
18
+
19
+ @source = Gem::Source.new(@gem_repo)
20
+
21
+ Gem::Specification.remove_spec @b2
22
+
23
+ all = Gem::Specification.map { |spec|
24
+ Gem::NameTuple.new(spec.name, spec.version, spec.original_platform)
25
+ }.sort
26
+
27
+ @prerelease_specs, @specs = all.partition { |g| g.prerelease? }
28
+
29
+ # TODO: couldn't all of this come from the fake spec fetcher?
30
+ @latest_specs = Gem::Specification.latest_specs.sort.map { |spec|
31
+ Gem::NameTuple.new(spec.name, spec.version, spec.original_platform)
32
+ }
33
+
34
+ v = Gem.marshal_version
35
+ s_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@specs)))
36
+ l_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@latest_specs)))
37
+ p_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@prerelease_specs)))
38
+ @fetcher.data["#{@gem_repo}specs.#{v}.gz"] = s_zip
39
+ @fetcher.data["#{@gem_repo}latest_specs.#{v}.gz"] = l_zip
40
+ @fetcher.data["#{@gem_repo}prerelease_specs.#{v}.gz"] = p_zip
41
+
42
+ @released = Gem::NameTuple.from_list \
43
+ [["a", Gem::Version.new("1"), "ruby"],
44
+ ["a", Gem::Version.new("2"), "ruby"],
45
+ ["a_evil", Gem::Version.new("9"), "ruby"],
46
+ ["c", Gem::Version.new("1.2"), "ruby"],
47
+ ['dep_x', Gem::Version.new(1), 'ruby'],
48
+ ["pl", Gem::Version.new("1"), "i386-linux"],
49
+ ['x', Gem::Version.new(1), 'ruby']]
50
+ end
51
+
52
+ def test_api_uri
53
+ assert_equal @source.api_uri, @source.uri
54
+ end
55
+
56
+ def test_api_uri_resolved_from_remote_fetcher
57
+ uri = URI.parse "http://gem.example/foo"
58
+ @fetcher.api_endpoints[uri] = URI.parse "http://api.blah"
59
+
60
+ src = Gem::Source.new uri
61
+ assert_equal URI.parse("http://api.blah"), src.api_uri
62
+ end
63
+
64
+ def test_cache_dir_escapes_windows_paths
65
+ uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo")
66
+ root = File.join Gem.user_home, '.gem', 'specs'
67
+ cache_dir = @source.cache_dir(uri).gsub(root, '')
68
+ assert cache_dir !~ /:/, "#{cache_dir} should not contain a :"
69
+ end
70
+
71
+ def test_fetch_spec
72
+ spec_uri = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}"
73
+ @fetcher.data["#{spec_uri}.rz"] = util_zip(Marshal.dump(@a1))
74
+
75
+ spec = @source.fetch_spec tuple('a', Gem::Version.new(1), 'ruby')
76
+ assert_equal @a1.full_name, spec.full_name
77
+
78
+ cache_dir = @source.cache_dir URI.parse(spec_uri)
79
+
80
+ cache_file = File.join cache_dir, @a1.spec_name
81
+
82
+ assert File.exist?(cache_file)
83
+ end
84
+
85
+ def test_fetch_spec_cached
86
+ spec_uri = "#{@gem_repo}/#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}"
87
+ @fetcher.data["#{spec_uri}.rz"] = nil
88
+
89
+ cache_dir = @source.cache_dir URI.parse(spec_uri)
90
+ FileUtils.mkdir_p cache_dir
91
+
92
+ cache_file = File.join cache_dir, @a1.spec_name
93
+
94
+ open cache_file, 'wb' do |io|
95
+ Marshal.dump @a1, io
96
+ end
97
+
98
+ spec = @source.fetch_spec tuple('a', Gem::Version.new(1), 'ruby')
99
+ assert_equal @a1.full_name, spec.full_name
100
+ end
101
+
102
+ def test_fetch_spec_platform
103
+ @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] =
104
+ util_zip(Marshal.dump(@pl1))
105
+
106
+ spec = @source.fetch_spec tuple('pl', Gem::Version.new(1), 'i386-linux')
107
+
108
+ assert_equal @pl1.full_name, spec.full_name
109
+ end
110
+
111
+ def test_fetch_spec_platform_ruby
112
+ @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}.rz"] =
113
+ util_zip(Marshal.dump(@a1))
114
+
115
+ spec = @source.fetch_spec tuple('a', Gem::Version.new(1), nil)
116
+ assert_equal @a1.full_name, spec.full_name
117
+
118
+ spec = @source.fetch_spec tuple('a', Gem::Version.new(1), '')
119
+ assert_equal @a1.full_name, spec.full_name
120
+ end
121
+
122
+ def test_load_specs
123
+ expected = @released
124
+ assert_equal expected, @source.load_specs(:released)
125
+
126
+ cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80'
127
+ assert File.exist?(cache_dir), "#{cache_dir} does not exist"
128
+
129
+ cache_file = File.join cache_dir, "specs.#{Gem.marshal_version}"
130
+ assert File.exist?(cache_file)
131
+ end
132
+
133
+ def test_load_specs_cached
134
+ # Make sure the cached version is actually different:
135
+ @latest_specs << Gem::NameTuple.new('cached', Gem::Version.new('1.0.0'), 'ruby')
136
+
137
+ @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
138
+ @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] =
139
+ ' ' * Marshal.dump(@latest_specs).length
140
+
141
+ cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80'
142
+
143
+ FileUtils.mkdir_p cache_dir
144
+
145
+ cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
146
+
147
+ open cache_file, 'wb' do |io|
148
+ Marshal.dump @latest_specs, io
149
+ end
150
+
151
+ latest_specs = @source.load_specs :latest
152
+
153
+ assert_equal @latest_specs, latest_specs
154
+ end
155
+
156
+ def test_load_specs_cached_empty
157
+ # Make sure the cached version is actually different:
158
+ @latest_specs << Gem::NameTuple.new('fixed', Gem::Version.new('1.0.0'), 'ruby')
159
+ # Setup valid data on the 'remote'
160
+ @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] =
161
+ util_gzip(Marshal.dump(@latest_specs))
162
+
163
+ cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80'
164
+
165
+ FileUtils.mkdir_p cache_dir
166
+
167
+ cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
168
+
169
+ open cache_file, 'wb' do |io|
170
+ # Setup invalid data in the cache:
171
+ io.write Marshal.dump(@latest_specs)[0, 10]
172
+ end
173
+
174
+ latest_specs = @source.load_specs :latest
175
+
176
+ assert_equal @latest_specs, latest_specs
177
+ end
178
+
179
+ def test_load_specs_from_unavailable_uri
180
+ src = Gem::Source.new("http://not-there.nothing")
181
+
182
+ assert_raises Gem::RemoteFetcher::FetchError do
183
+ src.load_specs :latest
184
+ end
185
+ end
186
+
187
+ end
188
+
@@ -0,0 +1,87 @@
1
+ require 'rubygems/source_list'
2
+ require 'rubygems/test_case'
3
+
4
+ class TestGemSourceList < Gem::TestCase
5
+ def setup
6
+ super
7
+
8
+ @uri = "http://blah.com"
9
+ @source = Gem::Source.new(@uri)
10
+
11
+ @sl = Gem::SourceList.new
12
+ @sl << @source
13
+ end
14
+
15
+ def test_self_from
16
+ sl = Gem::SourceList.from [@uri]
17
+
18
+ assert_equal [Gem::Source.new(@uri)], sl.sources
19
+ end
20
+
21
+ def test_append
22
+ sl = Gem::SourceList.new
23
+ source = (sl << @uri)
24
+
25
+ assert_kind_of Gem::Source, source
26
+
27
+ assert_kind_of URI, source.uri
28
+ assert_equal source.uri.to_s, @uri
29
+
30
+ assert_equal [source], sl.sources
31
+ end
32
+
33
+ def test_replace
34
+ sl = Gem::SourceList.new
35
+ sl.replace [@uri]
36
+
37
+ assert_equal [@source], sl.sources
38
+ end
39
+
40
+ def test_each
41
+ @sl.each do |x|
42
+ assert_equal @uri, x
43
+ end
44
+ end
45
+
46
+ def test_each_source
47
+ @sl.each_source do |x|
48
+ assert_equal @source, x
49
+ end
50
+ end
51
+
52
+ def test_equal_to_another_list
53
+ sl2 = Gem::SourceList.new
54
+ sl2 << Gem::Source.new(@uri)
55
+
56
+ assert @sl == sl2, "lists not equal"
57
+ end
58
+
59
+ def test_equal_to_array
60
+ assert @sl == [@uri], "lists not equal"
61
+ end
62
+
63
+ def test_to_a
64
+ assert_equal @sl.to_a, [@uri]
65
+ end
66
+
67
+ def test_include_eh
68
+ assert @sl.include?(@uri), "string comparison not working"
69
+ assert @sl.include?(URI.parse(@uri)), "uri comparison not working"
70
+ end
71
+
72
+ def test_include_matches_a_source
73
+ assert @sl.include?(@source), "source comparison not working"
74
+ assert @sl.include?(Gem::Source.new(@uri)), "source comparison not working"
75
+ end
76
+
77
+ def test_delete
78
+ @sl.delete @uri
79
+ assert_equal @sl.sources, []
80
+ end
81
+
82
+ def test_delete_a_source
83
+ @sl.delete Gem::Source.new(@uri)
84
+ assert_equal @sl.sources, []
85
+ end
86
+
87
+ end