rubygems-update 3.3.18 → 3.6.2

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.
Files changed (832) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2182 -1067
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +184 -290
  5. data/README.md +35 -19
  6. data/bundler/CHANGELOG.md +1003 -3
  7. data/bundler/README.md +3 -7
  8. data/bundler/bundler.gemspec +11 -11
  9. data/bundler/exe/bundle +5 -25
  10. data/bundler/lib/bundler/build_metadata.rb +3 -3
  11. data/bundler/lib/bundler/capistrano.rb +1 -1
  12. data/bundler/lib/bundler/checksum.rb +254 -0
  13. data/bundler/lib/bundler/ci_detector.rb +75 -0
  14. data/bundler/lib/bundler/cli/add.rb +7 -5
  15. data/bundler/lib/bundler/cli/binstubs.rb +10 -6
  16. data/bundler/lib/bundler/cli/cache.rb +1 -1
  17. data/bundler/lib/bundler/cli/check.rb +4 -4
  18. data/bundler/lib/bundler/cli/common.rb +11 -1
  19. data/bundler/lib/bundler/cli/config.rb +8 -7
  20. data/bundler/lib/bundler/cli/console.rb +2 -5
  21. data/bundler/lib/bundler/cli/doctor.rb +10 -12
  22. data/bundler/lib/bundler/cli/exec.rb +2 -1
  23. data/bundler/lib/bundler/cli/fund.rb +1 -1
  24. data/bundler/lib/bundler/cli/gem.rb +77 -53
  25. data/bundler/lib/bundler/cli/info.rb +4 -15
  26. data/bundler/lib/bundler/cli/init.rb +6 -2
  27. data/bundler/lib/bundler/cli/inject.rb +1 -1
  28. data/bundler/lib/bundler/cli/install.rb +27 -15
  29. data/bundler/lib/bundler/cli/issue.rb +1 -1
  30. data/bundler/lib/bundler/cli/lock.rb +54 -28
  31. data/bundler/lib/bundler/cli/open.rb +9 -9
  32. data/bundler/lib/bundler/cli/outdated.rb +34 -29
  33. data/bundler/lib/bundler/cli/platform.rb +7 -5
  34. data/bundler/lib/bundler/cli/plugin.rb +9 -15
  35. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  36. data/bundler/lib/bundler/cli/show.rb +4 -4
  37. data/bundler/lib/bundler/cli/update.rb +6 -5
  38. data/bundler/lib/bundler/cli/viz.rb +1 -1
  39. data/bundler/lib/bundler/cli.rb +258 -307
  40. data/bundler/lib/bundler/compact_index_client/cache.rb +55 -60
  41. data/bundler/lib/bundler/compact_index_client/cache_file.rb +148 -0
  42. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  43. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  44. data/bundler/lib/bundler/compact_index_client/updater.rb +71 -83
  45. data/bundler/lib/bundler/compact_index_client.rb +58 -80
  46. data/bundler/lib/bundler/constants.rb +9 -2
  47. data/bundler/lib/bundler/current_ruby.rb +11 -16
  48. data/bundler/lib/bundler/definition.rb +547 -228
  49. data/bundler/lib/bundler/dependency.rb +30 -87
  50. data/bundler/lib/bundler/digest.rb +3 -3
  51. data/bundler/lib/bundler/dsl.rb +115 -65
  52. data/bundler/lib/bundler/endpoint_specification.rb +27 -14
  53. data/bundler/lib/bundler/env.rb +5 -7
  54. data/bundler/lib/bundler/environment_preserver.rb +8 -25
  55. data/bundler/lib/bundler/errors.rb +85 -11
  56. data/bundler/lib/bundler/feature_flag.rb +1 -2
  57. data/bundler/lib/bundler/fetcher/base.rb +5 -3
  58. data/bundler/lib/bundler/fetcher/compact_index.rb +28 -43
  59. data/bundler/lib/bundler/fetcher/dependency.rb +3 -7
  60. data/bundler/lib/bundler/fetcher/downloader.rb +17 -16
  61. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  62. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  63. data/bundler/lib/bundler/fetcher.rb +91 -74
  64. data/bundler/lib/bundler/force_platform.rb +16 -0
  65. data/bundler/lib/bundler/friendly_errors.rb +6 -9
  66. data/bundler/lib/bundler/gem_helper.rb +5 -6
  67. data/bundler/lib/bundler/gem_helpers.rb +45 -7
  68. data/bundler/lib/bundler/gem_version_promoter.rb +68 -109
  69. data/bundler/lib/bundler/graph.rb +9 -9
  70. data/bundler/lib/bundler/index.rb +69 -73
  71. data/bundler/lib/bundler/injector.rb +12 -13
  72. data/bundler/lib/bundler/inline.rb +40 -17
  73. data/bundler/lib/bundler/installer/gem_installer.rb +13 -12
  74. data/bundler/lib/bundler/installer/parallel_installer.rb +19 -66
  75. data/bundler/lib/bundler/installer/standalone.rb +29 -15
  76. data/bundler/lib/bundler/installer.rb +27 -77
  77. data/bundler/lib/bundler/lazy_specification.rb +134 -71
  78. data/bundler/lib/bundler/lockfile_generator.rb +13 -4
  79. data/bundler/lib/bundler/lockfile_parser.rb +134 -61
  80. data/bundler/lib/bundler/man/bundle-add.1 +46 -48
  81. data/bundler/lib/bundler/man/bundle-add.1.ronn +54 -22
  82. data/bundler/lib/bundler/man/bundle-binstubs.1 +10 -19
  83. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  84. data/bundler/lib/bundler/man/bundle-cache.1 +38 -25
  85. data/bundler/lib/bundler/man/bundle-cache.1.ronn +40 -4
  86. data/bundler/lib/bundler/man/bundle-check.1 +7 -14
  87. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  88. data/bundler/lib/bundler/man/bundle-clean.1 +4 -11
  89. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  90. data/bundler/lib/bundler/man/bundle-config.1 +41 -220
  91. data/bundler/lib/bundler/man/bundle-config.1.ronn +27 -22
  92. data/bundler/lib/bundler/man/bundle-console.1 +33 -0
  93. data/bundler/lib/bundler/man/bundle-console.1.ronn +39 -0
  94. data/bundler/lib/bundler/man/bundle-doctor.1 +5 -19
  95. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  96. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  97. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  98. data/bundler/lib/bundler/man/bundle-exec.1 +20 -78
  99. data/bundler/lib/bundler/man/bundle-exec.1.ronn +12 -10
  100. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  102. data/bundler/lib/bundler/man/bundle-gem.1 +53 -81
  103. data/bundler/lib/bundler/man/bundle-gem.1.ronn +41 -9
  104. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  105. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  106. data/bundler/lib/bundler/man/bundle-info.1 +8 -11
  107. data/bundler/lib/bundler/man/bundle-info.1.ronn +9 -5
  108. data/bundler/lib/bundler/man/bundle-init.1 +7 -12
  109. data/bundler/lib/bundler/man/bundle-init.1.ronn +4 -1
  110. data/bundler/lib/bundler/man/bundle-inject.1 +17 -19
  111. data/bundler/lib/bundler/man/bundle-inject.1.ronn +12 -2
  112. data/bundler/lib/bundler/man/bundle-install.1 +42 -162
  113. data/bundler/lib/bundler/man/bundle-install.1.ronn +31 -49
  114. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  115. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  116. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  117. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  118. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  119. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  120. data/bundler/lib/bundler/man/bundle-lock.1 +25 -34
  121. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  122. data/bundler/lib/bundler/man/bundle-open.1 +18 -18
  123. data/bundler/lib/bundler/man/bundle-open.1.ronn +10 -1
  124. data/bundler/lib/bundler/man/bundle-outdated.1 +22 -67
  125. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +20 -12
  126. data/bundler/lib/bundler/man/bundle-platform.1 +16 -28
  127. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  128. data/bundler/lib/bundler/man/bundle-plugin.1 +58 -0
  129. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  130. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  131. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  132. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  133. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  134. data/bundler/lib/bundler/man/bundle-show.1 +7 -11
  135. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  136. data/bundler/lib/bundler/man/bundle-update.1 +30 -143
  137. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  138. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  139. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  140. data/bundler/lib/bundler/man/bundle-viz.1 +9 -18
  141. data/bundler/lib/bundler/man/bundle-viz.1.ronn +9 -3
  142. data/bundler/lib/bundler/man/bundle.1 +17 -51
  143. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  144. data/bundler/lib/bundler/man/gemfile.5 +77 -341
  145. data/bundler/lib/bundler/man/gemfile.5.ronn +73 -54
  146. data/bundler/lib/bundler/man/index.txt +8 -0
  147. data/bundler/lib/bundler/match_metadata.rb +17 -0
  148. data/bundler/lib/bundler/match_platform.rb +1 -1
  149. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  150. data/bundler/lib/bundler/materialization.rb +59 -0
  151. data/bundler/lib/bundler/mirror.rb +8 -10
  152. data/bundler/lib/bundler/plugin/api/source.rb +7 -5
  153. data/bundler/lib/bundler/plugin/events.rb +24 -0
  154. data/bundler/lib/bundler/plugin/index.rb +13 -5
  155. data/bundler/lib/bundler/plugin/installer/path.rb +18 -0
  156. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  157. data/bundler/lib/bundler/plugin/installer.rb +42 -19
  158. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  159. data/bundler/lib/bundler/plugin.rb +35 -7
  160. data/bundler/lib/bundler/process_lock.rb +10 -14
  161. data/bundler/lib/bundler/remote_specification.rb +17 -13
  162. data/bundler/lib/bundler/resolver/base.rb +117 -0
  163. data/bundler/lib/bundler/resolver/candidate.rb +82 -0
  164. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  165. data/bundler/lib/bundler/resolver/package.rb +90 -0
  166. data/bundler/lib/bundler/resolver/root.rb +25 -0
  167. data/bundler/lib/bundler/resolver/spec_group.rb +54 -67
  168. data/bundler/lib/bundler/resolver.rb +432 -329
  169. data/bundler/lib/bundler/retry.rb +2 -2
  170. data/bundler/lib/bundler/ruby_dsl.rb +42 -7
  171. data/bundler/lib/bundler/ruby_version.rb +23 -10
  172. data/bundler/lib/bundler/rubygems_ext.rb +286 -81
  173. data/bundler/lib/bundler/rubygems_gem_installer.rb +77 -68
  174. data/bundler/lib/bundler/rubygems_integration.rb +57 -155
  175. data/bundler/lib/bundler/runtime.rb +28 -17
  176. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  177. data/bundler/lib/bundler/self_manager.rb +50 -12
  178. data/bundler/lib/bundler/settings.rb +144 -58
  179. data/bundler/lib/bundler/setup.rb +13 -1
  180. data/bundler/lib/bundler/shared_helpers.rb +87 -36
  181. data/bundler/lib/bundler/source/git/git_proxy.rb +278 -80
  182. data/bundler/lib/bundler/source/git.rb +161 -68
  183. data/bundler/lib/bundler/source/metadata.rb +16 -16
  184. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  185. data/bundler/lib/bundler/source/path.rb +16 -26
  186. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  187. data/bundler/lib/bundler/source/rubygems.rb +94 -154
  188. data/bundler/lib/bundler/source.rb +3 -1
  189. data/bundler/lib/bundler/source_list.rb +34 -4
  190. data/bundler/lib/bundler/spec_set.rb +195 -65
  191. data/bundler/lib/bundler/stub_specification.rb +34 -4
  192. data/bundler/lib/bundler/templates/Executable +1 -1
  193. data/bundler/lib/bundler/templates/Executable.bundler +6 -11
  194. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  195. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  196. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  197. data/bundler/lib/bundler/templates/newgem/README.md.tt +11 -5
  198. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +19 -8
  199. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  200. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  201. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  202. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  203. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  204. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  205. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  206. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -8
  207. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  208. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  209. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -4
  210. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  211. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  212. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  213. data/bundler/lib/bundler/ui/shell.rb +60 -15
  214. data/bundler/lib/bundler/ui/silent.rb +33 -6
  215. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  216. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  217. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  218. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  219. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  220. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +56 -7
  221. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -418
  222. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  223. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  224. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  225. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  226. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  227. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  228. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  229. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  230. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  231. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  232. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  233. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  234. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  235. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  236. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  237. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  238. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  239. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  240. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  241. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  242. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  243. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  244. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  245. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  246. data/bundler/lib/bundler/vendor/securerandom/.document +1 -0
  247. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  248. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  249. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  250. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  251. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  252. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  253. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -15
  254. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  255. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  256. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  257. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  258. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  259. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  260. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +12 -1
  261. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  262. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  263. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +17 -1
  264. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  265. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +28 -9
  266. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +46 -7
  267. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  268. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  269. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +35 -159
  270. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  271. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  272. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -46
  273. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  274. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  275. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  276. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  277. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  278. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  279. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +166 -8
  280. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  281. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  282. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  283. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +343 -148
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +10 -4
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +3 -2
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +44 -33
  288. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  289. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  290. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  291. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  292. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  293. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +25 -12
  294. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +130 -38
  295. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  296. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  297. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  298. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +12 -11
  299. data/bundler/lib/bundler/vendored_net_http.rb +23 -0
  300. data/bundler/lib/bundler/vendored_persistent.rb +0 -36
  301. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  302. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  303. data/bundler/lib/bundler/vendored_timeout.rb +12 -0
  304. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  305. data/bundler/lib/bundler/version.rb +5 -1
  306. data/bundler/lib/bundler/vlad.rb +1 -1
  307. data/bundler/lib/bundler/worker.rb +5 -7
  308. data/bundler/lib/bundler/yaml_serializer.rb +22 -13
  309. data/bundler/lib/bundler.rb +155 -148
  310. data/{bundler → doc/bundler}/UPGRADING.md +11 -4
  311. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +40 -17
  312. data/doc/rubygems/POLICIES.md +204 -0
  313. data/{test/rubygems/fake_certlib/openssl.rb → exe/gem} +5 -1
  314. data/{bin → exe}/update_rubygems +12 -10
  315. data/lib/rubygems/available_set.rb +8 -7
  316. data/lib/rubygems/basic_specification.rb +90 -52
  317. data/lib/rubygems/bundler_version_finder.rb +6 -6
  318. data/lib/rubygems/ci_detector.rb +75 -0
  319. data/lib/rubygems/command.rb +68 -64
  320. data/lib/rubygems/command_manager.rb +39 -24
  321. data/lib/rubygems/commands/build_command.rb +14 -19
  322. data/lib/rubygems/commands/cert_command.rb +39 -39
  323. data/lib/rubygems/commands/check_command.rb +30 -25
  324. data/lib/rubygems/commands/cleanup_command.rb +32 -43
  325. data/lib/rubygems/commands/contents_command.rb +33 -25
  326. data/lib/rubygems/commands/dependency_command.rb +22 -23
  327. data/lib/rubygems/commands/environment_command.rb +8 -9
  328. data/lib/rubygems/commands/exec_command.rb +247 -0
  329. data/lib/rubygems/commands/fetch_command.rb +25 -10
  330. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  331. data/lib/rubygems/commands/help_command.rb +15 -14
  332. data/lib/rubygems/commands/info_command.rb +5 -5
  333. data/lib/rubygems/commands/install_command.rb +31 -38
  334. data/lib/rubygems/commands/list_command.rb +6 -5
  335. data/lib/rubygems/commands/lock_command.rb +6 -5
  336. data/lib/rubygems/commands/mirror_command.rb +4 -3
  337. data/lib/rubygems/commands/open_command.rb +11 -12
  338. data/lib/rubygems/commands/outdated_command.rb +6 -5
  339. data/lib/rubygems/commands/owner_command.rb +23 -22
  340. data/lib/rubygems/commands/pristine_command.rb +83 -62
  341. data/lib/rubygems/commands/push_command.rb +38 -13
  342. data/lib/rubygems/commands/query_command.rb +11 -11
  343. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  344. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  345. data/lib/rubygems/commands/search_command.rb +6 -5
  346. data/lib/rubygems/commands/server_command.rb +4 -3
  347. data/lib/rubygems/commands/setup_command.rb +137 -154
  348. data/lib/rubygems/commands/signin_command.rb +10 -9
  349. data/lib/rubygems/commands/signout_command.rb +8 -7
  350. data/lib/rubygems/commands/sources_command.rb +34 -33
  351. data/lib/rubygems/commands/specification_command.rb +25 -20
  352. data/lib/rubygems/commands/stale_command.rb +5 -4
  353. data/lib/rubygems/commands/uninstall_command.rb +66 -59
  354. data/lib/rubygems/commands/unpack_command.rb +23 -30
  355. data/lib/rubygems/commands/update_command.rb +62 -94
  356. data/lib/rubygems/commands/which_command.rb +9 -8
  357. data/lib/rubygems/commands/yank_command.rb +14 -13
  358. data/lib/rubygems/compatibility.rb +5 -6
  359. data/lib/rubygems/config_file.rb +160 -50
  360. data/lib/rubygems/core_ext/kernel_gem.rb +3 -10
  361. data/lib/rubygems/core_ext/kernel_require.rb +88 -114
  362. data/lib/rubygems/core_ext/kernel_warn.rb +30 -39
  363. data/lib/rubygems/core_ext/tcpsocket_init.rb +4 -2
  364. data/lib/rubygems/defaults.rb +53 -22
  365. data/lib/rubygems/dependency.rb +34 -36
  366. data/lib/rubygems/dependency_installer.rb +52 -56
  367. data/lib/rubygems/dependency_list.rb +8 -7
  368. data/lib/rubygems/deprecate.rb +80 -75
  369. data/lib/rubygems/doctor.rb +23 -22
  370. data/lib/rubygems/errors.rb +6 -8
  371. data/lib/rubygems/exceptions.rb +20 -18
  372. data/lib/rubygems/ext/build_error.rb +2 -1
  373. data/lib/rubygems/ext/builder.rb +56 -32
  374. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  375. data/lib/rubygems/ext/cargo_builder.rb +158 -131
  376. data/lib/rubygems/ext/cmake_builder.rb +9 -4
  377. data/lib/rubygems/ext/configure_builder.rb +9 -3
  378. data/lib/rubygems/ext/ext_conf_builder.rb +19 -15
  379. data/lib/rubygems/ext/rake_builder.rb +14 -7
  380. data/lib/rubygems/ext.rb +8 -7
  381. data/lib/rubygems/gem_runner.rb +23 -9
  382. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  383. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  384. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +80 -0
  385. data/lib/rubygems/gemcutter_utilities.rb +141 -63
  386. data/lib/rubygems/gemspec_helpers.rb +19 -0
  387. data/lib/rubygems/install_default_message.rb +3 -2
  388. data/lib/rubygems/install_message.rb +3 -2
  389. data/lib/rubygems/install_update_options.rb +72 -67
  390. data/lib/rubygems/installer.rb +148 -130
  391. data/lib/rubygems/installer_uninstaller_utils.rb +2 -4
  392. data/lib/rubygems/local_remote_options.rb +24 -28
  393. data/lib/rubygems/name_tuple.rb +10 -11
  394. data/lib/rubygems/package/digest_io.rb +2 -1
  395. data/lib/rubygems/package/file_source.rb +3 -2
  396. data/lib/rubygems/package/io_source.rb +1 -0
  397. data/lib/rubygems/package/old.rb +11 -10
  398. data/lib/rubygems/package/source.rb +1 -0
  399. data/lib/rubygems/package/tar_header.rb +125 -91
  400. data/lib/rubygems/package/tar_reader/entry.rb +106 -29
  401. data/lib/rubygems/package/tar_reader.rb +16 -39
  402. data/lib/rubygems/package/tar_writer.rb +29 -26
  403. data/lib/rubygems/package.rb +122 -84
  404. data/lib/rubygems/package_task.rb +7 -6
  405. data/lib/rubygems/path_support.rb +11 -11
  406. data/lib/rubygems/platform.rb +119 -70
  407. data/lib/rubygems/psych_tree.rb +6 -1
  408. data/lib/rubygems/query_utils.rb +46 -48
  409. data/lib/rubygems/rdoc.rb +13 -3
  410. data/lib/rubygems/remote_fetcher.rb +47 -39
  411. data/lib/rubygems/request/connection_pools.rb +6 -6
  412. data/lib/rubygems/request/http_pool.rb +2 -1
  413. data/lib/rubygems/request/https_pool.rb +1 -0
  414. data/lib/rubygems/request.rb +48 -44
  415. data/lib/rubygems/request_set/gem_dependency_api.rb +141 -144
  416. data/lib/rubygems/request_set/lockfile/parser.rb +31 -30
  417. data/lib/rubygems/request_set/lockfile/tokenizer.rb +24 -14
  418. data/lib/rubygems/request_set/lockfile.rb +11 -15
  419. data/lib/rubygems/request_set.rb +25 -23
  420. data/lib/rubygems/requirement.rb +30 -27
  421. data/lib/rubygems/resolver/activation_request.rb +7 -10
  422. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  423. data/lib/rubygems/resolver/api_set.rb +20 -13
  424. data/lib/rubygems/resolver/api_specification.rb +8 -7
  425. data/lib/rubygems/resolver/best_set.rb +5 -32
  426. data/lib/rubygems/resolver/composed_set.rb +4 -3
  427. data/lib/rubygems/resolver/conflict.rb +14 -21
  428. data/lib/rubygems/resolver/current_set.rb +1 -0
  429. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  430. data/lib/rubygems/resolver/git_set.rb +2 -2
  431. data/lib/rubygems/resolver/git_specification.rb +7 -6
  432. data/lib/rubygems/resolver/index_set.rb +10 -9
  433. data/lib/rubygems/resolver/index_specification.rb +8 -6
  434. data/lib/rubygems/resolver/installed_specification.rb +6 -5
  435. data/lib/rubygems/resolver/installer_set.rb +19 -22
  436. data/lib/rubygems/resolver/local_specification.rb +4 -3
  437. data/lib/rubygems/resolver/lock_set.rb +6 -5
  438. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  439. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  440. data/lib/rubygems/resolver/set.rb +1 -0
  441. data/lib/rubygems/resolver/source_set.rb +2 -0
  442. data/lib/rubygems/resolver/spec_specification.rb +8 -0
  443. data/lib/rubygems/resolver/specification.rb +2 -1
  444. data/lib/rubygems/resolver/stats.rb +2 -1
  445. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  446. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  447. data/lib/rubygems/resolver.rb +51 -57
  448. data/lib/rubygems/s3_uri_signer.rb +18 -16
  449. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  450. data/lib/rubygems/safe_marshal/reader.rb +325 -0
  451. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  452. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +428 -0
  453. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  454. data/lib/rubygems/safe_marshal.rb +74 -0
  455. data/lib/rubygems/safe_yaml.rb +14 -26
  456. data/lib/rubygems/security/policies.rb +48 -49
  457. data/lib/rubygems/security/policy.rb +25 -28
  458. data/lib/rubygems/security/signer.rb +16 -7
  459. data/lib/rubygems/security/trust_dir.rb +12 -13
  460. data/lib/rubygems/security.rb +40 -66
  461. data/lib/rubygems/security_option.rb +7 -6
  462. data/lib/rubygems/shellwords.rb +3 -0
  463. data/lib/rubygems/source/git.rb +34 -31
  464. data/lib/rubygems/source/installed.rb +4 -3
  465. data/lib/rubygems/source/local.rb +49 -49
  466. data/lib/rubygems/source/lock.rb +2 -3
  467. data/lib/rubygems/source/specific_file.rb +6 -4
  468. data/lib/rubygems/source/vendor.rb +1 -2
  469. data/lib/rubygems/source.rb +37 -31
  470. data/lib/rubygems/source_list.rb +8 -8
  471. data/lib/rubygems/spec_fetcher.rb +95 -66
  472. data/lib/rubygems/specification.rb +342 -404
  473. data/lib/rubygems/specification_policy.rb +147 -75
  474. data/lib/rubygems/specification_record.rb +212 -0
  475. data/lib/rubygems/stub_specification.rb +56 -30
  476. data/lib/rubygems/target_rbconfig.rb +50 -0
  477. data/lib/rubygems/text.rb +3 -4
  478. data/lib/rubygems/uninstaller.rb +67 -48
  479. data/lib/rubygems/update_suggestion.rb +56 -0
  480. data/lib/rubygems/uri.rb +10 -10
  481. data/lib/rubygems/uri_formatter.rb +2 -2
  482. data/lib/rubygems/user_interaction.rb +50 -40
  483. data/lib/rubygems/util/licenses.rb +310 -39
  484. data/lib/rubygems/util/list.rb +4 -1
  485. data/lib/rubygems/util.rb +19 -20
  486. data/lib/rubygems/validator.rb +15 -14
  487. data/lib/rubygems/vendor/molinillo/.document +1 -0
  488. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  489. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  490. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  491. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  492. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  493. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  494. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  495. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  496. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  497. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  498. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  499. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -3
  500. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  501. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  502. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  503. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/ui.rb +1 -1
  504. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  505. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolver.rb +1 -1
  506. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/state.rb +1 -1
  507. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo.rb +2 -2
  508. data/lib/rubygems/vendor/net-http/.document +1 -0
  509. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  510. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +34 -0
  511. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +414 -0
  512. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +981 -0
  513. data/lib/rubygems/vendor/net-http/lib/net/http/proxy_delta.rb +17 -0
  514. data/lib/rubygems/vendor/net-http/lib/net/http/request.rb +88 -0
  515. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +430 -0
  516. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +738 -0
  517. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +1174 -0
  518. data/lib/rubygems/vendor/net-http/lib/net/http/status.rb +84 -0
  519. data/lib/rubygems/vendor/net-http/lib/net/http.rb +2580 -0
  520. data/lib/rubygems/vendor/net-http/lib/net/https.rb +23 -0
  521. data/lib/rubygems/vendor/net-protocol/.document +1 -0
  522. data/lib/rubygems/vendor/net-protocol/lib/net/protocol.rb +544 -0
  523. data/lib/rubygems/vendor/optparse/.document +1 -0
  524. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  525. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  526. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  527. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  528. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  529. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +206 -83
  530. data/lib/rubygems/vendor/resolv/.document +1 -0
  531. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  532. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3455 -0
  533. data/lib/rubygems/vendor/securerandom/.document +1 -0
  534. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  535. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  536. data/lib/rubygems/vendor/timeout/.document +1 -0
  537. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  538. data/lib/rubygems/vendor/timeout/lib/timeout.rb +198 -0
  539. data/lib/rubygems/vendor/tsort/.document +1 -0
  540. data/lib/rubygems/vendor/tsort/lib/tsort.rb +455 -0
  541. data/lib/rubygems/vendor/uri/.document +1 -0
  542. data/lib/rubygems/vendor/uri/COPYING +56 -0
  543. data/lib/rubygems/vendor/uri/lib/uri/common.rb +876 -0
  544. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  545. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  546. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1578 -0
  547. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  548. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  549. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  550. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  551. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  552. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  553. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  554. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  555. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  556. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  557. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  558. data/{bundler/lib/bundler → lib/rubygems}/vendored_molinillo.rb +0 -1
  559. data/lib/rubygems/vendored_net_http.rb +5 -0
  560. data/lib/rubygems/vendored_optparse.rb +3 -0
  561. data/lib/rubygems/vendored_securerandom.rb +3 -0
  562. data/lib/rubygems/vendored_timeout.rb +5 -0
  563. data/lib/rubygems/vendored_tsort.rb +3 -0
  564. data/lib/rubygems/version.rb +57 -45
  565. data/lib/rubygems/version_option.rb +6 -8
  566. data/lib/rubygems/yaml_serializer.rb +98 -0
  567. data/lib/rubygems.rb +191 -133
  568. data/rubygems-update.gemspec +16 -9
  569. data/setup.rb +12 -9
  570. metadata +233 -307
  571. data/POLICIES.md +0 -100
  572. data/bin/gem +0 -13
  573. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  574. data/bundler/lib/bundler/templates/gems.rb +0 -5
  575. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  576. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  577. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  578. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  579. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  580. data/bundler/lib/bundler/version_ranges.rb +0 -122
  581. data/lib/rubygems/indexer.rb +0 -427
  582. data/lib/rubygems/mock_gem_ui.rb +0 -85
  583. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  584. data/lib/rubygems/optparse.rb +0 -3
  585. data/lib/rubygems/resolver/molinillo/LICENSE +0 -9
  586. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  587. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  588. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  589. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  590. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  591. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  592. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  593. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  594. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  595. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  596. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  597. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  598. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +0 -143
  599. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  600. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  601. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +0 -67
  602. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +0 -839
  603. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +0 -46
  604. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +0 -58
  605. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +0 -11
  606. data/lib/rubygems/resolver/molinillo.rb +0 -2
  607. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  608. data/lib/rubygems/tsort/lib/tsort.rb +0 -454
  609. data/lib/rubygems/tsort.rb +0 -3
  610. data/test/rubygems/alternate_cert.pem +0 -19
  611. data/test/rubygems/alternate_cert_32.pem +0 -19
  612. data/test/rubygems/alternate_key.pem +0 -27
  613. data/test/rubygems/bad_rake.rb +0 -2
  614. data/test/rubygems/ca_cert.pem +0 -77
  615. data/test/rubygems/child_cert.pem +0 -20
  616. data/test/rubygems/child_cert_32.pem +0 -20
  617. data/test/rubygems/child_key.pem +0 -27
  618. data/test/rubygems/client.pem +0 -107
  619. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  620. data/test/rubygems/data/gem-private_key.pem +0 -27
  621. data/test/rubygems/data/gem-public_cert.pem +0 -20
  622. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  623. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  624. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  625. data/test/rubygems/encrypted_private_key.pem +0 -30
  626. data/test/rubygems/expired_cert.pem +0 -19
  627. data/test/rubygems/foo/discover.rb +0 -1
  628. data/test/rubygems/future_cert.pem +0 -19
  629. data/test/rubygems/future_cert_32.pem +0 -19
  630. data/test/rubygems/good_rake.rb +0 -2
  631. data/test/rubygems/grandchild_cert.pem +0 -20
  632. data/test/rubygems/grandchild_cert_32.pem +0 -20
  633. data/test/rubygems/grandchild_key.pem +0 -27
  634. data/test/rubygems/helper.rb +0 -1622
  635. data/test/rubygems/installer_test_case.rb +0 -247
  636. data/test/rubygems/invalid_client.pem +0 -49
  637. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  638. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  639. data/test/rubygems/invalid_key.pem +0 -27
  640. data/test/rubygems/invalid_signer_cert.pem +0 -19
  641. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  642. data/test/rubygems/invalidchild_cert.pem +0 -20
  643. data/test/rubygems/invalidchild_cert_32.pem +0 -20
  644. data/test/rubygems/invalidchild_key.pem +0 -27
  645. data/test/rubygems/package/tar_test_case.rb +0 -139
  646. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  647. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  648. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  649. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  650. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  651. data/test/rubygems/private3072_key.pem +0 -40
  652. data/test/rubygems/private_ec_key.pem +0 -9
  653. data/test/rubygems/private_key.pem +0 -27
  654. data/test/rubygems/public3072_cert.pem +0 -25
  655. data/test/rubygems/public_cert.pem +0 -20
  656. data/test/rubygems/public_cert_32.pem +0 -19
  657. data/test/rubygems/public_key.pem +0 -9
  658. data/test/rubygems/rubygems/commands/crash_command.rb +0 -4
  659. data/test/rubygems/rubygems_plugin.rb +0 -23
  660. data/test/rubygems/sff/discover.rb +0 -1
  661. data/test/rubygems/simple_gem.rb +0 -67
  662. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -7
  663. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  664. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -12
  665. data/test/rubygems/ssl_cert.pem +0 -80
  666. data/test/rubygems/ssl_key.pem +0 -27
  667. data/test/rubygems/test_bundled_ca.rb +0 -60
  668. data/test/rubygems/test_config.rb +0 -27
  669. data/test/rubygems/test_deprecate.rb +0 -157
  670. data/test/rubygems/test_exit.rb +0 -11
  671. data/test/rubygems/test_gem.rb +0 -2112
  672. data/test/rubygems/test_gem_available_set.rb +0 -129
  673. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -125
  674. data/test/rubygems/test_gem_command.rb +0 -400
  675. data/test/rubygems/test_gem_command_manager.rb +0 -334
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -727
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -867
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -67
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -291
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -270
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -227
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -167
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -257
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -80
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -93
  686. data/test/rubygems/test_gem_commands_info_command.rb +0 -43
  687. data/test/rubygems/test_gem_commands_install_command.rb +0 -1553
  688. data/test/rubygems/test_gem_commands_list_command.rb +0 -32
  689. data/test/rubygems/test_gem_commands_lock_command.rb +0 -66
  690. data/test/rubygems/test_gem_commands_mirror.rb +0 -19
  691. data/test/rubygems/test_gem_commands_open_command.rb +0 -97
  692. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -49
  693. data/test/rubygems/test_gem_commands_owner_command.rb +0 -326
  694. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -659
  695. data/test/rubygems/test_gem_commands_push_command.rb +0 -477
  696. data/test/rubygems/test_gem_commands_query_command.rb +0 -857
  697. data/test/rubygems/test_gem_commands_search_command.rb +0 -15
  698. data/test/rubygems/test_gem_commands_server_command.rb +0 -19
  699. data/test/rubygems/test_gem_commands_setup_command.rb +0 -447
  700. data/test/rubygems/test_gem_commands_signin_command.rb +0 -219
  701. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  702. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  703. data/test/rubygems/test_gem_commands_specification_command.rb +0 -276
  704. data/test/rubygems/test_gem_commands_stale_command.rb +0 -42
  705. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -504
  706. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -223
  707. data/test/rubygems/test_gem_commands_update_command.rb +0 -835
  708. data/test/rubygems/test_gem_commands_which_command.rb +0 -84
  709. data/test/rubygems/test_gem_commands_yank_command.rb +0 -180
  710. data/test/rubygems/test_gem_config_file.rb +0 -504
  711. data/test/rubygems/test_gem_dependency.rb +0 -395
  712. data/test/rubygems/test_gem_dependency_installer.rb +0 -1155
  713. data/test/rubygems/test_gem_dependency_list.rb +0 -264
  714. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -26
  715. data/test/rubygems/test_gem_doctor.rb +0 -194
  716. data/test/rubygems/test_gem_ext_builder.rb +0 -338
  717. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  718. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +0 -243
  719. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +0 -10
  720. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  721. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  722. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +0 -27
  723. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  724. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -243
  725. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  726. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
  727. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -8
  728. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -39
  729. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -178
  730. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -33
  731. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -75
  732. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -83
  733. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -79
  734. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -230
  735. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -112
  736. data/test/rubygems/test_gem_gem_runner.rb +0 -113
  737. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -272
  738. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -59
  739. data/test/rubygems/test_gem_indexer.rb +0 -361
  740. data/test/rubygems/test_gem_install_update_options.rb +0 -207
  741. data/test/rubygems/test_gem_installer.rb +0 -2394
  742. data/test/rubygems/test_gem_local_remote_options.rb +0 -132
  743. data/test/rubygems/test_gem_name_tuple.rb +0 -42
  744. data/test/rubygems/test_gem_package.rb +0 -1178
  745. data/test/rubygems/test_gem_package_old.rb +0 -90
  746. data/test/rubygems/test_gem_package_tar_header.rb +0 -225
  747. data/test/rubygems/test_gem_package_tar_reader.rb +0 -87
  748. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -152
  749. data/test/rubygems/test_gem_package_tar_writer.rb +0 -330
  750. data/test/rubygems/test_gem_package_task.rb +0 -117
  751. data/test/rubygems/test_gem_path_support.rb +0 -138
  752. data/test/rubygems/test_gem_platform.rb +0 -391
  753. data/test/rubygems/test_gem_rdoc.rb +0 -136
  754. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1226
  755. data/test/rubygems/test_gem_request.rb +0 -541
  756. data/test/rubygems/test_gem_request_connection_pools.rb +0 -150
  757. data/test/rubygems/test_gem_request_set.rb +0 -671
  758. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -847
  759. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -468
  760. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -543
  761. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  762. data/test/rubygems/test_gem_requirement.rb +0 -498
  763. data/test/rubygems/test_gem_resolver.rb +0 -791
  764. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -42
  765. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  766. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -166
  767. data/test/rubygems/test_gem_resolver_best_set.rb +0 -158
  768. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -43
  769. data/test/rubygems/test_gem_resolver_conflict.rb +0 -81
  770. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -82
  771. data/test/rubygems/test_gem_resolver_git_set.rb +0 -187
  772. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -113
  773. data/test/rubygems/test_gem_resolver_index_set.rb +0 -87
  774. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -92
  775. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -46
  776. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -275
  777. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -43
  778. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -61
  779. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -97
  780. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -18
  781. data/test/rubygems/test_gem_resolver_specification.rb +0 -62
  782. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -81
  783. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -81
  784. data/test/rubygems/test_gem_security.rb +0 -340
  785. data/test/rubygems/test_gem_security_policy.rb +0 -535
  786. data/test/rubygems/test_gem_security_signer.rb +0 -217
  787. data/test/rubygems/test_gem_security_trust_dir.rb +0 -98
  788. data/test/rubygems/test_gem_silent_ui.rb +0 -116
  789. data/test/rubygems/test_gem_source.rb +0 -253
  790. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -36
  791. data/test/rubygems/test_gem_source_git.rb +0 -303
  792. data/test/rubygems/test_gem_source_installed.rb +0 -34
  793. data/test/rubygems/test_gem_source_list.rb +0 -118
  794. data/test/rubygems/test_gem_source_local.rb +0 -106
  795. data/test/rubygems/test_gem_source_lock.rb +0 -112
  796. data/test/rubygems/test_gem_source_specific_file.rb +0 -75
  797. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -49
  798. data/test/rubygems/test_gem_source_vendor.rb +0 -29
  799. data/test/rubygems/test_gem_spec_fetcher.rb +0 -337
  800. data/test/rubygems/test_gem_specification.rb +0 -3756
  801. data/test/rubygems/test_gem_stream_ui.rb +0 -224
  802. data/test/rubygems/test_gem_stub_specification.rb +0 -277
  803. data/test/rubygems/test_gem_text.rb +0 -102
  804. data/test/rubygems/test_gem_uninstaller.rb +0 -674
  805. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -30
  806. data/test/rubygems/test_gem_uri.rb +0 -39
  807. data/test/rubygems/test_gem_uri_formatter.rb +0 -26
  808. data/test/rubygems/test_gem_util.rb +0 -90
  809. data/test/rubygems/test_gem_validator.rb +0 -42
  810. data/test/rubygems/test_gem_version.rb +0 -295
  811. data/test/rubygems/test_gem_version_option.rb +0 -164
  812. data/test/rubygems/test_kernel.rb +0 -129
  813. data/test/rubygems/test_project_sanity.rb +0 -20
  814. data/test/rubygems/test_remote_fetch_error.rb +0 -19
  815. data/test/rubygems/test_require.rb +0 -719
  816. data/test/rubygems/test_rubygems.rb +0 -74
  817. data/test/rubygems/utilities.rb +0 -371
  818. data/test/rubygems/wrong_key_cert.pem +0 -19
  819. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  820. data/test/test_changelog_generator.rb +0 -17
  821. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/connection_pool}/.document +0 -0
  822. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/fileutils}/.document +0 -0
  823. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  824. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  825. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  826. /data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/LICENSE +0 -0
  827. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  828. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  829. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  830. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  831. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  832. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -1,3756 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'benchmark'
3
- require_relative 'helper'
4
- require 'date'
5
- require 'pathname'
6
- require 'stringio'
7
- require 'rubygems/ext'
8
- require 'rubygems/specification'
9
- require 'rubygems/installer'
10
- require 'rubygems/platform'
11
-
12
- class TestGemSpecification < Gem::TestCase
13
- LEGACY_YAML_SPEC = <<-EOF.freeze
14
- --- !ruby/object:Gem::Specification
15
- rubygems_version: "1.0"
16
- name: keyedlist
17
- version: !ruby/object:Gem::Version
18
- version: 0.4.0
19
- date: 2004-03-28 15:37:49.828000 +02:00
20
- platform:
21
- summary: A Hash which automatically computes keys.
22
- require_paths:
23
- - lib
24
- files:
25
- - lib/keyedlist.rb
26
- autorequire: keyedlist
27
- author: Florian Gross
28
- email: flgr@ccan.de
29
- has_rdoc: true
30
- EOF
31
-
32
- LEGACY_RUBY_SPEC = <<-EOF.freeze
33
- Gem::Specification.new do |s|
34
- s.name = %q{keyedlist}
35
- s.version = %q{0.4.0}
36
- s.has_rdoc = true
37
- s.summary = %q{A Hash which automatically computes keys.}
38
- s.files = [%q{lib/keyedlist.rb}]
39
- s.require_paths = [%q{lib}]
40
- s.autorequire = %q{keyedlist}
41
- s.author = %q{Florian Gross}
42
- s.email = %q{flgr@ccan.de}
43
- end
44
- EOF
45
-
46
- def make_spec_c1
47
- @c1 = util_spec 'a', '1' do |s|
48
- s.executable = 'exec'
49
- s.extensions << 'ext/a/extconf.rb'
50
- s.test_file = 'test/suite.rb'
51
- s.requirements << 'A working computer'
52
- s.license = 'MIT'
53
-
54
- s.add_dependency 'rake', '> 0.4'
55
- s.add_dependency 'jabber4r', '> 0.0.0'
56
- s.add_dependency 'pqa', ['> 0.4', '<= 0.6']
57
-
58
- s.mark_version
59
- s.files = %w[lib/code.rb]
60
- end
61
- end
62
-
63
- def ext_spec(platform: Gem::Platform::RUBY)
64
- @ext = util_spec 'ext', '1' do |s|
65
- s.executable = 'exec'
66
- s.test_file = 'test/suite.rb'
67
- s.extensions = %w[ext/extconf.rb]
68
- s.license = 'MIT'
69
- s.platform = platform
70
-
71
- s.mark_version
72
- s.files = %w[lib/code.rb]
73
- s.installed_by_version = v('2.2')
74
- end
75
- end
76
-
77
- def assert_date(date)
78
- assert_kind_of Time, date
79
- assert_equal [0, 0, 0], [date.hour, date.min, date.sec]
80
- assert_operator (Gem::Specification::TODAY..Time.now), :cover?, date
81
- end
82
-
83
- def setup
84
- super
85
-
86
- # Setting `@default_source_date_epoch` to `nil` effectively resets the
87
- # value used for `Gem.source_date_epoch` whenever `$SOURCE_DATE_EPOCH`
88
- # is not set.
89
- Gem.instance_variable_set(:'@default_source_date_epoch', nil)
90
-
91
- @a1 = util_spec 'a', '1' do |s|
92
- s.executable = 'exec'
93
- s.test_file = 'test/suite.rb'
94
- s.requirements << 'A working computer'
95
- s.license = 'MIT'
96
-
97
- s.mark_version
98
- s.files = %w[lib/code.rb]
99
- end
100
-
101
- @a2 = util_spec 'a', '2' do |s|
102
- s.files = %w[lib/code.rb]
103
- end
104
-
105
- @a3 = util_spec 'a', '3' do |s|
106
- s.metadata['allowed_push_host'] = "https://privategemserver.com"
107
- end
108
-
109
- @current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
110
- end
111
-
112
- def test_self_find_active_stub_by_path
113
- spec = util_spec('a', '1', nil, 'lib/foo.rb')
114
- spec.activated = true
115
-
116
- # There used to be a bug (introduced in a9c1aaf) when Gem::Specification
117
- # objects are present in the @stubs collection. This test verifies that
118
- # this scenario works correctly.
119
- Gem::Specification.all = [spec]
120
- assert_equal spec, Gem::Specification.find_active_stub_by_path('foo')
121
- end
122
-
123
- def test_self_activate
124
- foo = util_spec 'foo', '1'
125
-
126
- assert_activate %w[foo-1], foo
127
- end
128
-
129
- def test_self_activate_ambiguous_direct
130
- a1 = util_spec "a", "1", "b" => "> 0"
131
- b1 = util_spec("b", "1", { "c" => ">= 1" }, "lib/d#{$$}.rb")
132
- b2 = util_spec("b", "2", { "c" => ">= 2" }, "lib/d#{$$}.rb")
133
- c1 = util_spec "c", "1"
134
- c2 = util_spec "c", "2"
135
-
136
- Gem::Specification.reset
137
- install_specs c1, c2, b1, b2, a1
138
-
139
- a1.activate
140
- assert_equal %w[a-1], loaded_spec_names
141
- assert_equal ["b (> 0)"], unresolved_names
142
-
143
- require "d#{$$}"
144
-
145
- assert_equal %w[a-1 b-2 c-2], loaded_spec_names
146
- assert_equal [], unresolved_names
147
- end
148
-
149
- def test_find_in_unresolved_tree_is_not_exponentiental
150
- pend "currently slower in CI on TruffleRuby" if RUBY_ENGINE == 'truffleruby'
151
- num_of_pkg = 7
152
- num_of_version_per_pkg = 3
153
- packages = (0..num_of_pkg).map do |pkgi|
154
- (0..num_of_version_per_pkg).map do |pkg_version|
155
- deps = Hash[((pkgi + 1)..num_of_pkg).map do |deppkgi|
156
- ["pkg#{deppkgi}", ">= 0"]
157
- end]
158
- util_spec "pkg#{pkgi}", pkg_version.to_s, deps
159
- end
160
- end
161
- base = util_spec "pkg_base", "1", { "pkg0" => ">= 0" }
162
-
163
- Gem::Specification.reset
164
- install_specs(*packages.flatten.reverse)
165
- install_specs base
166
- base.activate
167
-
168
- tms = Benchmark.measure do
169
- assert_raise(LoadError) { require 'no_such_file_foo' }
170
- end
171
- assert_operator tms.total, :<=, 10
172
- end
173
-
174
- def test_self_activate_ambiguous_indirect
175
- a1 = util_spec "a", "1", "b" => "> 0"
176
- b1 = util_spec "b", "1", "c" => ">= 1"
177
- b2 = util_spec "b", "2", "c" => ">= 2"
178
- c1 = util_spec "c", "1", nil, "lib/d#{$$}.rb"
179
- c2 = util_spec "c", "2", nil, "lib/d#{$$}.rb"
180
-
181
- install_specs c1, c2, b1, b2, a1
182
-
183
- a1.activate
184
- assert_equal %w[a-1], loaded_spec_names
185
- assert_equal ["b (> 0)"], unresolved_names
186
-
187
- require "d#{$$}"
188
-
189
- assert_equal %w[a-1 b-2 c-2], loaded_spec_names
190
- assert_equal [], unresolved_names
191
- end
192
-
193
- def test_self_activate_ambiguous_indirect_conflict
194
- a1 = util_spec "a", "1", "b" => "> 0"
195
- a2 = util_spec "a", "2", "b" => "> 0"
196
- b1 = util_spec "b", "1", "c" => ">= 1"
197
- b2 = util_spec "b", "2", "c" => ">= 2"
198
- c1 = util_spec "c", "1", nil, "lib/d#{$$}.rb"
199
- c2 = util_spec("c", "2", { "a" => "1" }, "lib/d#{$$}.rb") # conflicts with a-2
200
-
201
- install_specs c1, b1, a1, a2, c2, b2
202
-
203
- a2.activate
204
- assert_equal %w[a-2], loaded_spec_names
205
- assert_equal ["b (> 0)"], unresolved_names
206
-
207
- require "d#{$$}"
208
-
209
- assert_equal %w[a-2 b-1 c-1], loaded_spec_names
210
- assert_equal [], unresolved_names
211
- end
212
-
213
- def test_self_activate_ambiguous_unrelated
214
- a1 = util_spec "a", "1", "b" => "> 0"
215
- b1 = util_spec "b", "1", "c" => ">= 1"
216
- b2 = util_spec "b", "2", "c" => ">= 2"
217
- c1 = util_spec "c", "1"
218
- c2 = util_spec "c", "2"
219
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb"
220
-
221
- install_specs d1, c1, c2, b1, b2, a1
222
-
223
- a1.activate
224
- assert_equal %w[a-1], loaded_spec_names
225
- assert_equal ["b (> 0)"], unresolved_names
226
-
227
- require "d#{$$}"
228
-
229
- assert_equal %w[a-1 d-1], loaded_spec_names
230
- assert_equal ["b (> 0)"], unresolved_names
231
- end
232
-
233
- def test_require_should_prefer_latest_gem_level1
234
- a1 = util_spec "a", "1", "b" => "> 0"
235
- b1 = util_spec "b", "1", "c" => ">= 0" # unresolved
236
- b2 = util_spec "b", "2", "c" => ">= 0"
237
- c1 = util_spec "c", "1", nil, "lib/c#{$$}.rb" # 1st level
238
- c2 = util_spec "c", "2", nil, "lib/c#{$$}.rb"
239
-
240
- install_specs c1, c2, b1, b2, a1
241
-
242
- a1.activate
243
-
244
- require "c#{$$}"
245
-
246
- assert_equal %w[a-1 b-2 c-2], loaded_spec_names
247
- end
248
-
249
- def test_require_should_prefer_latest_gem_level2
250
- a1 = util_spec "a", "1", "b" => "> 0"
251
- b1 = util_spec "b", "1", "c" => ">= 0" # unresolved
252
- b2 = util_spec "b", "2", "c" => ">= 0"
253
- c1 = util_spec "c", "1", "d" => ">= 0" # 1st level
254
- c2 = util_spec "c", "2", "d" => ">= 0"
255
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb" # 2nd level
256
- d2 = util_spec "d", "2", nil, "lib/d#{$$}.rb"
257
-
258
- install_specs d1, d2, c1, c2, b1, b2, a1
259
-
260
- a1.activate
261
-
262
- require "d#{$$}"
263
-
264
- assert_equal %w[a-1 b-2 c-2 d-2], loaded_spec_names
265
- end
266
-
267
- def test_require_finds_in_2nd_level_indirect
268
- a1 = util_spec "a", "1", "b" => "> 0"
269
- b1 = util_spec "b", "1", "c" => ">= 0" # unresolved
270
- b2 = util_spec "b", "2", "c" => ">= 0"
271
- c1 = util_spec "c", "1", "d" => "<= 2" # 1st level
272
- c2 = util_spec "c", "2", "d" => "<= 2"
273
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb" # 2nd level
274
- d2 = util_spec "d", "2", nil, "lib/d#{$$}.rb"
275
- d3 = util_spec "d", "3", nil, "lib/d#{$$}.rb"
276
-
277
- install_specs d1, d2, d3, c1, c2, b1, b2, a1
278
-
279
- a1.activate
280
-
281
- require "d#{$$}"
282
-
283
- assert_equal %w[a-1 b-2 c-2 d-2], loaded_spec_names
284
- end
285
-
286
- def test_require_should_prefer_reachable_gems
287
- a1 = util_spec "a", "1", "b" => "> 0"
288
- b1 = util_spec "b", "1", "c" => ">= 0" # unresolved
289
- b2 = util_spec "b", "2", "c" => ">= 0"
290
- c1 = util_spec "c", "1", "d" => "<= 2" # 1st level
291
- c2 = util_spec "c", "2", "d" => "<= 2"
292
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb" # 2nd level
293
- d2 = util_spec "d", "2", nil, "lib/d#{$$}.rb"
294
- d3 = util_spec "d", "3", nil, "lib/d#{$$}.rb"
295
- e = util_spec "anti_d", "1", nil, "lib/d#{$$}.rb"
296
-
297
- install_specs d1, d2, d3, e, c1, c2, b1, b2, a1
298
-
299
- a1.activate
300
-
301
- require "d#{$$}"
302
-
303
- assert_equal %w[a-1 b-2 c-2 d-2], loaded_spec_names
304
- end
305
-
306
- def test_require_should_not_conflict
307
- base = util_spec "0", "1", "A" => ">= 1"
308
- a1 = util_spec "A", "1", { "c" => ">= 2", "b" => "> 0" }, "lib/a.rb"
309
- a2 = util_spec "A", "2", { "c" => ">= 2", "b" => "> 0" }, "lib/a.rb"
310
- b1 = util_spec "b", "1", { "c" => "= 1" }, "lib/d#{$$}.rb"
311
- b2 = util_spec "b", "2", { "c" => "= 2" }, "lib/d#{$$}.rb"
312
- c1 = util_spec "c", "1", {}, "lib/c.rb"
313
- c2 = util_spec "c", "2", {}, "lib/c.rb"
314
- c3 = util_spec "c", "3", {}, "lib/c.rb"
315
-
316
- install_specs c1, c2, c3, b1, b2, a1, a2, base
317
-
318
- base.activate
319
- assert_equal %w[0-1], loaded_spec_names
320
- assert_equal ["A (>= 1)"], unresolved_names
321
-
322
- require "d#{$$}"
323
-
324
- assert_equal %w[0-1 A-2 b-2 c-2], loaded_spec_names
325
- assert_equal [], unresolved_names
326
- end
327
-
328
- def test_inner_clonflict_in_indirect_gems
329
- a1 = util_spec "a", "1", "b" => "> 0"
330
- b1 = util_spec "b", "1", "c" => ">= 1" # unresolved
331
- b2 = util_spec "b", "2", "c" => ">= 1", "d" => "< 3"
332
- c1 = util_spec "c", "1", "d" => "<= 2" # 1st level
333
- c2 = util_spec "c", "2", "d" => "<= 2"
334
- c3 = util_spec "c", "3", "d" => "<= 3"
335
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb" # 2nd level
336
- d2 = util_spec "d", "2", nil, "lib/d#{$$}.rb"
337
- d3 = util_spec "d", "3", nil, "lib/d#{$$}.rb"
338
-
339
- install_specs d1, d2, d3, c1, c2, c3, b1, b2, a1
340
-
341
- a1.activate
342
-
343
- require "d#{$$}"
344
-
345
- assert_includes [%w[a-1 b-2 c-3 d-2],%w[a-1 b-2 d-2]], loaded_spec_names
346
- end
347
-
348
- def test_inner_clonflict_in_indirect_gems_reversed
349
- a1 = util_spec "a", "1", "b" => "> 0"
350
- b1 = util_spec "b", "1", "xc" => ">= 1" # unresolved
351
- b2 = util_spec "b", "2", "xc" => ">= 1", "d" => "< 3"
352
- c1 = util_spec "xc", "1", "d" => "<= 3" # 1st level
353
- c2 = util_spec "xc", "2", "d" => "<= 2"
354
- c3 = util_spec "xc", "3", "d" => "<= 3"
355
- d1 = util_spec "d", "1", nil, "lib/d#{$$}.rb" # 2nd level
356
- d2 = util_spec "d", "2", nil, "lib/d#{$$}.rb"
357
- d3 = util_spec "d", "3", nil, "lib/d#{$$}.rb"
358
-
359
- install_specs d1, d2, d3, c1, c2, c3, b1, b2, a1
360
-
361
- a1.activate
362
-
363
- require "d#{$$}"
364
-
365
- assert_includes [%w[a-1 b-2 d-2 xc-3], %w[a-1 b-2 d-2]], loaded_spec_names
366
- end
367
-
368
- ##
369
- # [A] depends on
370
- # [C] = 1.0 depends on
371
- # [B] = 2.0
372
- # [B] ~> 1.0 (satisfied by 1.0)
373
-
374
- def test_self_activate_checks_dependencies
375
- a = util_spec 'a', '1.0'
376
- a.add_dependency 'c', '= 1.0'
377
- a.add_dependency 'b', '~> 1.0'
378
-
379
- b1 = util_spec 'b', '1.0'
380
- b2 = util_spec 'b', '2.0'
381
- c = util_spec 'c', '1.0', 'b' => '= 2.0'
382
- install_specs b1, b2, c, a
383
-
384
- e = assert_raise Gem::LoadError do
385
- assert_activate nil, a, c, "b"
386
- end
387
-
388
- expected = "can't satisfy 'b (~> 1.0)', already activated 'b-2.0'"
389
- assert_equal expected, e.message
390
- end
391
-
392
- ##
393
- # [A] depends on
394
- # [B] ~> 1.0 (satisfied by 1.0)
395
- # [C] = 1.0 depends on
396
- # [B] = 2.0
397
-
398
- def test_self_activate_divergent
399
- a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
400
- b1 = util_spec 'b', '1.0'
401
- b2 = util_spec 'b', '2.0'
402
- c = util_spec 'c', '1.0', 'b' => '= 2.0'
403
-
404
- install_specs b1, b2, c, a
405
-
406
- e = assert_raise Gem::ConflictError do
407
- assert_activate nil, a, c, "b"
408
- end
409
-
410
- assert_match(/Unable to activate c-1.0,/, e.message)
411
- assert_match(/because b-1.0 conflicts with b .= 2.0/, e.message)
412
- end
413
-
414
- ##
415
- # DOC
416
-
417
- def test_self_activate_old_required
418
- e1, = util_spec 'e', '1', 'd' => '= 1'
419
- @d1 = util_spec 'd', '1'
420
- @d2 = util_spec 'd', '2'
421
-
422
- install_specs @d1, @d2, e1
423
-
424
- assert_activate %w[d-1 e-1], e1, "d"
425
- end
426
-
427
- ##
428
- # DOC
429
-
430
- def test_self_activate_platform_alternate
431
- @x1_m = util_spec 'x', '1' do |s|
432
- s.platform = Gem::Platform.new %w[cpu my_platform 1]
433
- end
434
-
435
- @x1_o = util_spec 'x', '1' do |s|
436
- s.platform = Gem::Platform.new %w[cpu other_platform 1]
437
- end
438
-
439
- @w1 = util_spec 'w', '1', 'x' => nil
440
-
441
- util_set_arch 'cpu-my_platform1'
442
- install_specs @x1_m, @x1_o, @w1
443
-
444
- assert_activate %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m
445
- end
446
-
447
- ##
448
- # DOC
449
-
450
- def test_self_activate_platform_bump
451
- @y1 = util_spec 'y', '1'
452
-
453
- @y1_1_p = util_spec 'y', '1.1' do |s|
454
- s.platform = Gem::Platform.new %w[cpu my_platform 1]
455
- end
456
-
457
- @z1 = util_spec 'z', '1', 'y' => nil
458
- install_specs @y1, @y1_1_p, @z1
459
-
460
- assert_activate %w[y-1 z-1], @z1, @y1
461
- end
462
-
463
- ##
464
- # [C] depends on
465
- # [A] = 1.a
466
- # [B] = 1.0 depends on
467
- # [A] >= 0 (satisfied by 1.a)
468
-
469
- def test_self_activate_prerelease
470
- @c1_pre = util_spec 'c', '1.a', "a" => "1.a", "b" => "1"
471
- @a1_pre = util_spec 'a', '1.a'
472
- @b1 = util_spec 'b', '1' do |s|
473
- s.add_dependency 'a'
474
- s.add_development_dependency 'aa'
475
- end
476
- install_specs @a1_pre, @b1, @c1_pre
477
-
478
- assert_activate %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1
479
- end
480
-
481
- def test_self_activate_via_require
482
- a1 = util_spec "a", "1", "b" => "= 1"
483
- b1 = util_spec "b", "1", nil, "lib/b/c.rb"
484
- b2 = util_spec "b", "2", nil, "lib/b/c.rb"
485
-
486
- install_specs b1, b2, a1
487
-
488
- a1.activate
489
- require "b/c"
490
-
491
- assert_equal %w[a-1 b-1], loaded_spec_names
492
- end
493
-
494
- def test_self_activate_via_require_wtf
495
- a1 = util_spec "a", "1", "b" => "> 0", "d" => "> 0" # this
496
- b1 = util_spec "b", "1", { "c" => ">= 1" }, "lib/b#{$$}.rb"
497
- b2 = util_spec "b", "2", { "c" => ">= 2" }, "lib/b#{$$}.rb" # this
498
- c1 = util_spec "c", "1"
499
- c2 = util_spec "c", "2" # this
500
- d1 = util_spec "d", "1", { "c" => "< 2" }, "lib/d#{$$}.rb"
501
- d2 = util_spec "d", "2", { "c" => "< 2" }, "lib/d#{$$}.rb" # this
502
-
503
- install_specs c1, c2, b1, b2, d1, d2, a1
504
-
505
- a1.activate
506
-
507
- assert_equal %w[a-1], loaded_spec_names
508
- assert_equal ["b (> 0)", "d (> 0)"], unresolved_names
509
-
510
- require "b#{$$}"
511
-
512
- e = assert_raise Gem::LoadError do
513
- require "d#{$$}"
514
- end
515
-
516
- assert_equal "unable to find a version of 'd' to activate", e.message
517
-
518
- assert_equal %w[a-1 b-2 c-2], loaded_spec_names
519
- assert_equal ["d (> 0)"], unresolved_names
520
- end
521
-
522
- def test_self_activate_deep_unambiguous
523
- a1 = util_spec "a", "1", "b" => "= 1"
524
- b1 = util_spec "b", "1", "c" => "= 1"
525
- b2 = util_spec "b", "2", "c" => "= 2"
526
- c1 = util_spec "c", "1"
527
- c2 = util_spec "c", "2"
528
-
529
- install_specs c1, c2, b1, b2, a1
530
-
531
- a1.activate
532
- assert_equal %w[a-1 b-1 c-1], loaded_spec_names
533
- end
534
-
535
- def test_self_activate_loaded
536
- foo = util_spec 'foo', '1'
537
-
538
- assert foo.activate
539
- refute foo.activate
540
- end
541
-
542
- ##
543
- # [A] depends on
544
- # [B] >= 1.0 (satisfied by 2.0)
545
- # [C] depends on nothing
546
-
547
- def test_self_activate_unrelated
548
- a = util_spec 'a', '1.0', 'b' => '>= 1.0'
549
- b = util_spec 'b', '1.0'
550
- c = util_spec 'c', '1.0'
551
- install_specs b, c, a
552
-
553
- assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
554
- end
555
-
556
- ##
557
- # [A] depends on
558
- # [B] >= 1.0 (satisfied by 2.0)
559
- # [C] = 1.0 depends on
560
- # [B] ~> 1.0
561
- #
562
- # and should resolve using b-1.0
563
- # TODO: move these to specification
564
-
565
- def test_self_activate_over
566
- a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0'
567
- install_specs util_spec 'b', '1.0'
568
- install_specs util_spec 'b', '1.1'
569
- install_specs util_spec 'b', '2.0'
570
- install_specs util_spec 'c', '1.0', 'b' => '~> 1.0'
571
- install_specs a
572
-
573
- a.activate
574
-
575
- assert_equal %w[a-1.0 c-1.0], loaded_spec_names
576
- assert_equal ["b (>= 1.0, ~> 1.0)"], unresolved_names
577
- end
578
-
579
- ##
580
- # [A] depends on
581
- # [B] ~> 1.0 (satisfied by 1.1)
582
- # [C] = 1.0 depends on
583
- # [B] = 1.0
584
- #
585
- # and should resolve using b-1.0
586
- #
587
- # TODO: this is not under, but over... under would require depth
588
- # first resolve through a dependency that is later pruned.
589
-
590
- def test_self_activate_under
591
- a = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
592
- b1 = util_spec 'b', '1.0'
593
- b1_1 = util_spec 'b', '1.1'
594
- c = util_spec 'c', '1.0', 'b' => '= 1.0'
595
-
596
- install_specs b1, b1_1, c, a
597
-
598
- assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
599
- end
600
-
601
- ##
602
- # [A1] depends on
603
- # [B] > 0 (satisfied by 2.0)
604
- # [B1] depends on
605
- # [C] > 0 (satisfied by 1.0)
606
- # [B2] depends on nothing!
607
- # [C1] depends on nothing
608
-
609
- def test_self_activate_dropped
610
- a1 = util_spec 'a', '1', 'b' => nil
611
- b1 = util_spec 'b', '1', 'c' => nil
612
- b2 = util_spec 'b', '2'
613
- c1 = util_spec 'c', '1'
614
- install_specs c1, b1, b2, a1
615
-
616
- assert_activate %w[b-2 a-1], a1, "b"
617
- end
618
-
619
- ##
620
- # [A] depends on
621
- # [B] >= 1.0 (satisfied by 1.1) depends on
622
- # [Z]
623
- # [C] >= 1.0 depends on
624
- # [B] = 1.0
625
- #
626
- # and should backtrack to resolve using b-1.0, pruning Z from the
627
- # resolve.
628
-
629
- def test_self_activate_raggi_the_edgecase_generator
630
- a = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0'
631
- b1 = util_spec 'b', '1.0'
632
- b1_0 = util_spec 'b', '1.1', 'z' => '>= 1.0'
633
- c = util_spec 'c', '1.0', 'b' => '= 1.0'
634
- z = util_spec 'z', '1'
635
-
636
- install_specs z, b1, b1_0, c, z
637
-
638
- assert_activate %w[b-1.0 c-1.0 a-1.0], a, c, "b"
639
- end
640
-
641
- def test_self_activate_conflict
642
- install_specs util_spec 'b', '1.0'
643
- install_specs util_spec 'b', '2.0'
644
-
645
- gem "b", "= 1.0"
646
-
647
- assert_raise Gem::LoadError do
648
- gem "b", "= 2.0"
649
- end
650
- end
651
-
652
- def test_self_all_equals
653
- a = util_spec "foo", "1", nil, "lib/foo.rb"
654
-
655
- install_specs a
656
- Gem::Specification.all = [a]
657
-
658
- assert_equal a, Gem::Specification.find_inactive_by_path('foo')
659
- end
660
-
661
- def test_self_attribute_names
662
- expected_value = %w[
663
- authors
664
- autorequire
665
- bindir
666
- cert_chain
667
- date
668
- dependencies
669
- description
670
- email
671
- executables
672
- extensions
673
- extra_rdoc_files
674
- files
675
- homepage
676
- licenses
677
- metadata
678
- name
679
- platform
680
- post_install_message
681
- rdoc_options
682
- require_paths
683
- required_ruby_version
684
- required_rubygems_version
685
- requirements
686
- rubygems_version
687
- signing_key
688
- specification_version
689
- summary
690
- test_files
691
- version
692
- ]
693
-
694
- actual_value = Gem::Specification.attribute_names.map {|a| a.to_s }.sort
695
-
696
- assert_equal expected_value, actual_value
697
- end
698
-
699
- def test_self__load_future
700
- spec = Gem::Specification.new
701
- spec.name = 'a'
702
- spec.version = '1'
703
- spec.specification_version = @current_version + 1
704
-
705
- load_spec = Marshal.load Marshal.dump(spec)
706
-
707
- assert_equal 'a', load_spec.name
708
- assert_equal Gem::Version.new(1), load_spec.version
709
- assert_equal @current_version, load_spec.specification_version
710
- end
711
-
712
- def test_self_from_yaml
713
- @a1.instance_variable_set :@specification_version, nil
714
-
715
- spec = Gem::Specification.from_yaml @a1.to_yaml
716
-
717
- assert_equal Gem::Specification::NONEXISTENT_SPECIFICATION_VERSION,
718
- spec.specification_version
719
- end
720
-
721
- def test_self_from_yaml_cleans_up_Date_objects
722
- yaml = <<-YAML
723
- --- !ruby/object:Gem::Specification
724
- rubygems_version: 0.8.1
725
- specification_version: 1
726
- name: diff-lcs
727
- version: !ruby/object:Gem::Version
728
- version: 1.1.2
729
- date: 2004-10-20
730
- summary: Provides a list of changes that represent the difference between two sequenced collections.
731
- require_paths:
732
- - lib
733
- author: Austin Ziegler
734
- email: diff-lcs@halostatue.ca
735
- homepage: http://rubyforge.org/projects/ruwiki/
736
- description: "Test"
737
- bindir: bin
738
- has_rdoc: true
739
- required_ruby_version: !ruby/object:Gem::Version::Requirement
740
- requirements:
741
- -
742
- - ">="
743
- - !ruby/object:Gem::Version
744
- version: 1.8.1
745
- version:
746
- platform: ruby
747
- files:
748
- - tests/00test.rb
749
- rdoc_options:
750
- - "--title"
751
- - "Diff::LCS -- A Diff Algorithm"
752
- - "--main"
753
- - README
754
- - "--line-numbers"
755
- extra_rdoc_files:
756
- - README
757
- - ChangeLog
758
- - Install
759
- executables:
760
- - ldiff
761
- - htmldiff
762
- extensions: []
763
- requirements: []
764
- dependencies: []
765
- YAML
766
-
767
- spec = Gem::Specification.from_yaml yaml
768
-
769
- assert_kind_of Time, spec.date
770
- end
771
-
772
- def test_self_load
773
- full_path = @a2.spec_file
774
- write_file full_path do |io|
775
- io.write @a2.to_ruby_for_cache
776
- end
777
-
778
- spec = Gem::Specification.load full_path
779
-
780
- @a2.files.clear
781
-
782
- assert_equal @a2, spec
783
- end
784
-
785
- def test_self_load_relative
786
- File.open 'a-2.gemspec', 'w' do |io|
787
- io.write @a2.to_ruby_for_cache
788
- end
789
-
790
- spec = Gem::Specification.load 'a-2.gemspec'
791
-
792
- @a2.files.clear
793
-
794
- assert_equal @a2, spec
795
-
796
- assert_equal File.join(@tempdir, 'a-2.gemspec'), spec.loaded_from
797
- end
798
-
799
- if RUBY_ENGINE == 'ruby' and RUBY_VERSION < '2.7'
800
- def test_self_load_tainted
801
- full_path = @a2.spec_file
802
- write_file full_path do |io|
803
- io.write @a2.to_ruby_for_cache
804
- end
805
-
806
- full_path.taint
807
- loader = Thread.new { $SAFE = 1; Gem::Specification.load full_path }
808
- spec = loader.value
809
-
810
- @a2.files.clear
811
-
812
- assert_equal @a2, spec
813
-
814
- ensure
815
- $SAFE = 0
816
- end
817
- end
818
-
819
- def test_self_load_escape_curly
820
- @a2.name = 'a};raise "improper escaping";%q{'
821
-
822
- full_path = @a2.spec_file
823
- begin
824
- write_file full_path do |io|
825
- io.write @a2.to_ruby_for_cache
826
- end
827
- rescue Errno::EINVAL
828
- pend "cannot create '#{full_path}' on this platform"
829
- end
830
-
831
- spec = Gem::Specification.load full_path
832
-
833
- @a2.files.clear
834
-
835
- assert_equal @a2, spec
836
- end
837
-
838
- def test_self_load_escape_interpolation
839
- @a2.name = 'a#{raise %<improper escaping>}'
840
-
841
- full_path = @a2.spec_file
842
- begin
843
- write_file full_path do |io|
844
- io.write @a2.to_ruby_for_cache
845
- end
846
- rescue Errno::EINVAL
847
- pend "cannot create '#{full_path}' on this platform"
848
- end
849
-
850
- spec = Gem::Specification.load full_path
851
-
852
- @a2.files.clear
853
-
854
- assert_equal @a2, spec
855
- end
856
-
857
- def test_self_load_escape_quote
858
- @a2.name = 'a";raise "improper escaping";"'
859
-
860
- full_path = @a2.spec_file
861
- begin
862
- write_file full_path do |io|
863
- io.write @a2.to_ruby_for_cache
864
- end
865
- rescue Errno::EINVAL
866
- pend "cannot create '#{full_path}' on this platform"
867
- end
868
-
869
- spec = Gem::Specification.load full_path
870
-
871
- @a2.files.clear
872
-
873
- assert_equal @a2, spec
874
- end
875
-
876
- def test_self_load_utf8_with_ascii_encoding
877
- with_internal_encoding('US-ASCII') do
878
- spec2 = @a2.dup
879
- bin = "\u5678".dup
880
- spec2.authors = [bin]
881
- full_path = spec2.spec_file
882
- write_file full_path do |io|
883
- io.write spec2.to_ruby_for_cache.force_encoding('BINARY').sub("\\u{5678}", bin.force_encoding('BINARY'))
884
- end
885
-
886
- spec = Gem::Specification.load full_path
887
-
888
- spec2.files.clear
889
-
890
- assert_equal spec2, spec
891
- end
892
- end
893
-
894
- def test_self_load_legacy_ruby
895
- spec = Gem::Deprecate.skip_during do
896
- eval LEGACY_RUBY_SPEC
897
- end
898
- assert_equal 'keyedlist', spec.name
899
- assert_equal '0.4.0', spec.version.to_s
900
- assert_kind_of Time, spec.date
901
- assert spec.required_ruby_version.satisfied_by?(Gem::Version.new('1'))
902
- assert_equal false, spec.has_unit_tests?
903
- end
904
-
905
- def test_self_normalize_yaml_input_with_183_yaml
906
- input = "!ruby/object:Gem::Specification "
907
- assert_equal "--- #{input}", Gem::Specification.normalize_yaml_input(input)
908
- end
909
-
910
- def test_self_normalize_yaml_input_with_non_183_yaml
911
- input = "--- !ruby/object:Gem::Specification "
912
- assert_equal input, Gem::Specification.normalize_yaml_input(input)
913
- end
914
-
915
- def test_self_normalize_yaml_input_with_183_io
916
- input = "!ruby/object:Gem::Specification "
917
- assert_equal "--- #{input}",
918
- Gem::Specification.normalize_yaml_input(StringIO.new(input))
919
- end
920
-
921
- def test_self_normalize_yaml_input_with_non_183_io
922
- input = "--- !ruby/object:Gem::Specification "
923
- assert_equal input,
924
- Gem::Specification.normalize_yaml_input(StringIO.new(input))
925
- end
926
-
927
- def test_self_normalize_yaml_input_with_192_yaml
928
- input = "--- !ruby/object:Gem::Specification \nblah: !!null \n"
929
- expected = "--- !ruby/object:Gem::Specification \nblah: \n"
930
-
931
- assert_equal expected, Gem::Specification.normalize_yaml_input(input)
932
- end
933
-
934
- def test_self_outdated
935
- spec_fetcher do |fetcher|
936
- fetcher.download 'a', 4
937
-
938
- fetcher.spec 'a', 3
939
- end
940
-
941
- assert_equal %w[a], Gem::Specification.outdated
942
- end
943
-
944
- def test_self_outdated_and_latest_remotes
945
- spec_fetcher do |fetcher|
946
- fetcher.download 'a', 4
947
- fetcher.download 'b', 3
948
-
949
- fetcher.spec 'a', '3.a'
950
- fetcher.spec 'b', 2
951
- end
952
-
953
- expected = [
954
- [Gem::Specification.stubs.find {|s| s.full_name == 'a-3.a' }, v(4)],
955
- [Gem::Specification.stubs.find {|s| s.full_name == 'b-2' }, v(3)],
956
- ]
957
-
958
- assert_equal expected, Gem::Specification.outdated_and_latest_version.to_a
959
- end
960
-
961
- def test_self_remove_spec
962
- install_specs @a1
963
-
964
- assert_includes Gem::Specification.all_names, 'a-1'
965
- assert_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1'
966
-
967
- uninstall_gem @a1
968
- Gem::Specification.reset
969
-
970
- refute_includes Gem::Specification.all_names, 'a-1'
971
- refute_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1'
972
- end
973
-
974
- def test_self_remove_spec_removed
975
- File.open @a1.spec_file, 'w' do |io|
976
- io.write @a1.to_ruby
977
- end
978
-
979
- Gem::Specification.reset
980
-
981
- FileUtils.rm @a1.spec_file # bug #698
982
-
983
- Gem::Specification.reset
984
-
985
- refute_includes Gem::Specification.all_names, 'a-1'
986
- refute_includes Gem::Specification.stubs.map {|s| s.full_name }, 'a-1'
987
- end
988
-
989
- def test_self_stubs_for_lazy_loading
990
- Gem.loaded_specs.clear
991
- Gem::Specification.class_variable_set(:@@stubs, nil)
992
-
993
- dir_standard_specs = File.join Gem.dir, 'specifications'
994
-
995
- save_gemspec('a-1', '1', dir_standard_specs) {|s| s.name = 'a' }
996
- save_gemspec('b-1', '1', dir_standard_specs) {|s| s.name = 'b' }
997
-
998
- assert_equal ['a-1'], Gem::Specification.stubs_for('a').map {|s| s.full_name }
999
- assert_equal 1, Gem::Specification.class_variable_get(:@@stubs_by_name).length
1000
- assert_equal ['b-1'], Gem::Specification.stubs_for('b').map {|s| s.full_name }
1001
- assert_equal 2, Gem::Specification.class_variable_get(:@@stubs_by_name).length
1002
-
1003
- assert_equal(
1004
- Gem::Specification.stubs_for('a').map {|s| s.object_id },
1005
- Gem::Specification.stubs_for('a').map {|s| s.object_id }
1006
- )
1007
-
1008
- Gem.loaded_specs.delete 'a'
1009
- Gem.loaded_specs.delete 'b'
1010
- Gem::Specification.class_variable_set(:@@stubs, nil)
1011
- end
1012
-
1013
- def test_self_stubs_for_no_lazy_loading_after_all_specs_setup
1014
- Gem::Specification.all = [util_spec('a', '1')]
1015
-
1016
- save_gemspec('b-1', '1', File.join(Gem.dir, 'specifications')) {|s| s.name = 'b' }
1017
-
1018
- assert_equal [], Gem::Specification.stubs_for('b').map {|s| s.full_name }
1019
- end
1020
-
1021
- def test_self_stubs_for_mult_platforms
1022
- # gems for two different platforms are installed with --user-install
1023
- # the correct one should be returned in the array
1024
-
1025
- orig_platform = Gem.platforms.dup
1026
-
1027
- # create user spec
1028
- user_spec_dir = File.join Gem.user_dir, 'specifications'
1029
- FileUtils.mkdir_p(user_spec_dir) unless Dir.exist? user_spec_dir
1030
- # dirs doesn't include user ?
1031
- Gem::Specification.dirs << user_spec_dir
1032
-
1033
- gem = 'mingw'
1034
- v = '1.1.1'
1035
- platforms = ['x86-mingw32', 'x64-mingw32']
1036
-
1037
- #create specs
1038
- platforms.each do |plat|
1039
- spec = Gem::Specification.new(gem, v) {|s| s.platform = plat }
1040
- File.open File.join(user_spec_dir, "#{gem}-#{v}-#{plat}.gemspec"), 'w' do |io|
1041
- io.write spec.to_ruby
1042
- end
1043
- end
1044
-
1045
- platforms.each do |plat|
1046
- cur_plat = Gem::Platform.new plat
1047
- Gem.platforms = ['ruby', cur_plat]
1048
-
1049
- Gem::Specification.class_variable_set :@@stubs, nil
1050
- Gem::Specification.stubs if plat == platforms.last # test loading via stubs
1051
- t = Gem::Specification.stubs_for 'mingw'
1052
-
1053
- assert_equal 1, t.length
1054
- assert_equal cur_plat, t.first.platform
1055
- end
1056
-
1057
- Gem.platforms = orig_platform
1058
- end
1059
-
1060
- def test_self_stubs_returns_only_specified_named_specs
1061
- dir_standard_specs = File.join Gem.dir, 'specifications'
1062
-
1063
- save_gemspec('a-1', '1', dir_standard_specs) {|s| s.name = 'a' }
1064
- save_gemspec('a-2', '2', dir_standard_specs) {|s| s.name = 'a' }
1065
- save_gemspec('a-a', '3', dir_standard_specs) {|s| s.name = 'a-a' }
1066
-
1067
- assert_equal ['a-1', 'a-2'], Gem::Specification.stubs_for('a').map(&:full_name).sort
1068
- end
1069
-
1070
- def test_handles_private_null_type
1071
- path = File.expand_path 'data/pry-0.4.7.gemspec.rz', __dir__
1072
-
1073
- data = Marshal.load Gem::Util.inflate(Gem.read_binary(path))
1074
-
1075
- assert_instance_of Gem::Specification, data
1076
- end
1077
-
1078
- def test_handles_dependencies_with_syck_requirements_bug
1079
- path = File.expand_path 'data/excon-0.7.7.gemspec.rz', __dir__
1080
-
1081
- data = Marshal.load Gem::Util.inflate(Gem.read_binary(path))
1082
-
1083
- assert_instance_of Gem::Specification, data
1084
- end
1085
-
1086
- def test_initialize
1087
- spec = Gem::Specification.new do |s|
1088
- s.name = "blah"
1089
- s.version = "1.3.5"
1090
- end
1091
-
1092
- assert_equal "blah", spec.name
1093
- assert_equal "1.3.5", spec.version.to_s
1094
- assert_equal Gem::Platform::RUBY, spec.platform
1095
- assert_nil spec.summary
1096
- assert_equal [], spec.files
1097
-
1098
- assert_equal [], spec.test_files
1099
- assert_equal [], spec.rdoc_options
1100
- assert_equal [], spec.extra_rdoc_files
1101
- assert_equal [], spec.executables
1102
- assert_equal [], spec.extensions
1103
- assert_equal [], spec.requirements
1104
- assert_equal [], spec.dependencies
1105
- assert_equal 'bin', spec.bindir
1106
- assert_equal '>= 0', spec.required_ruby_version.to_s
1107
- assert_equal '>= 0', spec.required_rubygems_version.to_s
1108
- end
1109
-
1110
- def test_initialize_future
1111
- version = Gem::Specification::CURRENT_SPECIFICATION_VERSION + 1
1112
- spec = Gem::Specification.new do |s|
1113
- s.name = "blah"
1114
- s.version = "1.3.5"
1115
-
1116
- s.specification_version = version
1117
-
1118
- s.new_unknown_attribute = "a value"
1119
- end
1120
-
1121
- assert_equal "blah", spec.name
1122
- assert_equal "1.3.5", spec.version.to_s
1123
- end
1124
-
1125
- def test_initialize_copy
1126
- spec = Gem::Specification.new do |s|
1127
- s.name = "blah"
1128
- s.version = "1.3.5"
1129
- s.summary = 'summary'
1130
- s.description = 'description'
1131
- s.authors = 'author a', 'author b'
1132
- s.licenses = 'BSD-2-Clause'
1133
- s.files = 'lib/file.rb'
1134
- s.test_files = 'test/file.rb'
1135
- s.rdoc_options = '--foo'
1136
- s.extra_rdoc_files = 'README.txt'
1137
- s.executables = 'exec'
1138
- s.extensions = 'ext/extconf.rb'
1139
- s.requirements = 'requirement'
1140
- s.add_dependency 'some_gem'
1141
- end
1142
-
1143
- dup_spec = spec.dup
1144
-
1145
- assert_equal "blah", spec.name
1146
- assert_same spec.name, dup_spec.name
1147
-
1148
- assert_equal "1.3.5", spec.version.to_s
1149
- assert_same spec.version, dup_spec.version
1150
-
1151
- assert_equal Gem::Platform::RUBY, spec.platform
1152
- assert_same spec.platform, dup_spec.platform
1153
-
1154
- assert_equal 'summary', spec.summary
1155
- assert_same spec.summary, dup_spec.summary
1156
-
1157
- assert_equal %w[README.txt bin/exec ext/extconf.rb lib/file.rb
1158
- test/file.rb].sort,
1159
- spec.files
1160
- refute_same spec.files, dup_spec.files, 'files'
1161
-
1162
- assert_equal %w[test/file.rb], spec.test_files
1163
- refute_same spec.test_files, dup_spec.test_files, 'test_files'
1164
-
1165
- assert_equal %w[--foo], spec.rdoc_options
1166
- refute_same spec.rdoc_options, dup_spec.rdoc_options, 'rdoc_options'
1167
-
1168
- assert_equal %w[README.txt], spec.extra_rdoc_files
1169
- refute_same spec.extra_rdoc_files, dup_spec.extra_rdoc_files,
1170
- 'extra_rdoc_files'
1171
-
1172
- assert_equal %w[exec], spec.executables
1173
- refute_same spec.executables, dup_spec.executables, 'executables'
1174
-
1175
- assert_equal %w[ext/extconf.rb], spec.extensions
1176
- refute_same spec.extensions, dup_spec.extensions, 'extensions'
1177
-
1178
- assert_equal %w[requirement], spec.requirements
1179
- refute_same spec.requirements, dup_spec.requirements, 'requirements'
1180
-
1181
- assert_equal [Gem::Dependency.new('some_gem', Gem::Requirement.default)],
1182
- spec.dependencies
1183
- refute_same spec.dependencies, dup_spec.dependencies, 'dependencies'
1184
-
1185
- assert_equal 'bin', spec.bindir
1186
- assert_same spec.bindir, dup_spec.bindir
1187
-
1188
- assert_equal '>= 0', spec.required_ruby_version.to_s
1189
- assert_same spec.required_ruby_version, dup_spec.required_ruby_version
1190
-
1191
- assert_equal '>= 0', spec.required_rubygems_version.to_s
1192
- assert_same spec.required_rubygems_version,
1193
- dup_spec.required_rubygems_version
1194
- end
1195
-
1196
- def test_initialize_copy_broken
1197
- spec = Gem::Specification.new do |s|
1198
- s.name = 'a'
1199
- s.version = '1'
1200
- end
1201
-
1202
- spec.instance_variable_set :@licenses, (class << (Object.new);self;end)
1203
- spec.loaded_from = '/path/to/file'
1204
-
1205
- e = assert_raise Gem::FormatException do
1206
- spec.dup
1207
- end
1208
-
1209
- assert_equal 'a-1 has an invalid value for @licenses', e.message
1210
- assert_equal '/path/to/file', e.file_path
1211
- end
1212
-
1213
- def test_initialize_prerelease_version_before_name
1214
- spec = Gem::Specification.new do |s|
1215
- s.version = '1.0.0.dev'
1216
- s.name = 'a'
1217
- end
1218
-
1219
- assert_equal "a", spec.name
1220
- assert_equal "1.0.0.dev", spec.version.to_s
1221
- end
1222
-
1223
- def test__dump
1224
- @a2.platform = Gem::Platform.local
1225
- @a2.instance_variable_set :@original_platform, 'old_platform'
1226
-
1227
- data = Marshal.dump @a2
1228
-
1229
- same_spec = Marshal.load data
1230
-
1231
- assert_equal 'old_platform', same_spec.original_platform
1232
- end
1233
-
1234
- def test_activate
1235
- @a2.activate
1236
-
1237
- assert @a2.activated?
1238
- end
1239
-
1240
- def test_add_dependency_with_type
1241
- gem = util_spec "awesome", "1.0" do |awesome|
1242
- awesome.add_dependency true
1243
- awesome.add_dependency :gem_name
1244
- end
1245
-
1246
- assert_equal %w[true gem_name], gem.dependencies.map {|dep| dep.name }
1247
- end
1248
-
1249
- def test_add_dependency_from_existing_dependency
1250
- dep = Gem::Dependency.new("existing_dep", Gem::Requirement.new('> 1'), :runtime)
1251
- spec = Gem::Specification.new {|s| s.add_dependency dep }
1252
- assert_equal dep, spec.dependencies.first
1253
- end
1254
-
1255
- def test_add_dependency_with_type_explicit
1256
- gem = util_spec "awesome", "1.0" do |awesome|
1257
- awesome.add_development_dependency "monkey"
1258
- end
1259
-
1260
- monkey = gem.dependencies.detect {|d| d.name == "monkey" }
1261
- assert_equal(:development, monkey.type)
1262
- end
1263
-
1264
- def test_author
1265
- assert_equal 'A User', @a1.author
1266
- end
1267
-
1268
- def test_authors
1269
- assert_equal ['A User'], @a1.authors
1270
- end
1271
-
1272
- def test_bindir_equals
1273
- @a1.bindir = 'apps'
1274
-
1275
- assert_equal 'apps', @a1.bindir
1276
- end
1277
-
1278
- def test_bindir_equals_nil
1279
- @a2.bindir = nil
1280
- @a2.executable = 'app'
1281
-
1282
- assert_nil @a2.bindir
1283
- assert_equal %w[app lib/code.rb].sort, @a2.files
1284
- end
1285
-
1286
- def test_extensions_equals_nil
1287
- @a2.instance_variable_set(:@extensions, nil)
1288
- assert_nil @a2.instance_variable_get(:@extensions)
1289
- assert_equal %w[lib/code.rb], @a2.files
1290
- end
1291
-
1292
- def test_test_files_equals_nil
1293
- @a2.instance_variable_set(:@test_files, nil)
1294
- assert_nil @a2.instance_variable_get(:@test_files)
1295
- assert_equal %w[lib/code.rb], @a2.files
1296
- end
1297
-
1298
- def test_executables_equals_nil
1299
- @a2.instance_variable_set(:@executables, nil)
1300
- assert_nil @a2.instance_variable_get(:@executables)
1301
- assert_equal %w[lib/code.rb], @a2.files
1302
- end
1303
-
1304
- def test_extra_rdoc_files_equals_nil
1305
- @a2.instance_variable_set(:@extra_rdoc_files, nil)
1306
- assert_nil @a2.instance_variable_get(:@extra_rdoc_files)
1307
- assert_equal %w[lib/code.rb], @a2.files
1308
- end
1309
-
1310
- def test_build_args
1311
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1312
- ext_spec
1313
-
1314
- assert_empty @ext.build_args
1315
-
1316
- File.open @ext.build_info_file, 'w' do |io|
1317
- io.puts
1318
- end
1319
-
1320
- assert_empty @ext.build_args
1321
-
1322
- File.open @ext.build_info_file, 'w' do |io|
1323
- io.puts '--with-foo-dir=wherever'
1324
- end
1325
-
1326
- assert_equal %w[--with-foo-dir=wherever], @ext.build_args
1327
- end
1328
-
1329
- def test_build_extensions
1330
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1331
- ext_spec
1332
-
1333
- assert_path_not_exist @ext.extension_dir, 'sanity check'
1334
- refute_empty @ext.extensions, 'sanity check'
1335
-
1336
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
1337
- FileUtils.mkdir_p File.dirname extconf_rb
1338
-
1339
- File.open extconf_rb, 'w' do |f|
1340
- f.write <<-'RUBY'
1341
- File.open 'Makefile', 'w' do |f|
1342
- f.puts "clean:\n\techo clean"
1343
- f.puts "default:\n\techo built"
1344
- f.puts "install:\n\techo installed"
1345
- end
1346
- RUBY
1347
- end
1348
-
1349
- @ext.build_extensions
1350
-
1351
- assert_path_exist @ext.extension_dir
1352
- end
1353
-
1354
- def test_default_spec_stub_is_marked_default
1355
- default = new_default_spec 'default', 2
1356
- install_default_gems default
1357
-
1358
- stub = Gem::Specification.stubs.find {|s| s.name == 'default' }
1359
- assert_predicate stub, :default_gem?
1360
-
1361
- stub = Gem::Specification.find_all_by_name('default').first
1362
- assert_predicate stub, :default_gem?
1363
- end
1364
-
1365
- def test_build_extensions_built
1366
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1367
- ext_spec
1368
-
1369
- refute_empty @ext.extensions, 'sanity check'
1370
-
1371
- gem_build_complete =
1372
- File.join @ext.extension_dir, 'gem.build_complete'
1373
-
1374
- FileUtils.mkdir_p @ext.extension_dir
1375
- FileUtils.touch gem_build_complete
1376
-
1377
- @ext.build_extensions
1378
-
1379
- gem_make_out = File.join @ext.extension_dir, 'gem_make.out'
1380
- assert_path_not_exist gem_make_out
1381
- end
1382
-
1383
- def test_build_extensions_default_gem
1384
- spec = new_default_spec 'default', 1
1385
- spec.extensions << 'extconf.rb'
1386
-
1387
- extconf_rb = File.join spec.gem_dir, spec.extensions.first
1388
- FileUtils.mkdir_p File.dirname extconf_rb
1389
-
1390
- File.open extconf_rb, 'w' do |f|
1391
- f.write <<-'RUBY'
1392
- File.open 'Makefile', 'w' do |f|
1393
- f.puts "default:\n\techo built"
1394
- f.puts "install:\n\techo installed"
1395
- end
1396
- RUBY
1397
- end
1398
-
1399
- spec.build_extensions
1400
-
1401
- assert_path_not_exist spec.extension_dir
1402
- end
1403
-
1404
- def test_build_extensions_error
1405
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1406
- ext_spec
1407
-
1408
- refute_empty @ext.extensions, 'sanity check'
1409
-
1410
- assert_raise Gem::Ext::BuildError do
1411
- @ext.build_extensions
1412
- end
1413
- end
1414
-
1415
- def test_build_extensions_extensions_dir_unwritable
1416
- pend 'chmod not supported' if Gem.win_platform?
1417
- pend 'skipped in root privilege' if Process.uid.zero?
1418
-
1419
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1420
- ext_spec
1421
-
1422
- refute_empty @ext.extensions, 'sanity check'
1423
-
1424
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
1425
- FileUtils.mkdir_p File.dirname extconf_rb
1426
-
1427
- File.open extconf_rb, 'w' do |f|
1428
- f.write <<-'RUBY'
1429
- File.open 'Makefile', 'w' do |f|
1430
- f.puts "clean:\n\techo clean"
1431
- f.puts "default:\n\techo built"
1432
- f.puts "install:\n\techo installed"
1433
- end
1434
- RUBY
1435
- end
1436
-
1437
- FileUtils.mkdir_p File.join @ext.base_dir, 'extensions'
1438
- FileUtils.chmod 0555, @ext.base_dir
1439
- FileUtils.chmod 0555, File.join(@ext.base_dir, 'extensions')
1440
-
1441
- @ext.build_extensions
1442
- assert_path_not_exist @ext.extension_dir
1443
- ensure
1444
- unless ($DEBUG or win_platform? or Process.uid.zero? or Gem.java_platform?)
1445
- FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions')
1446
- FileUtils.chmod 0755, @ext.base_dir
1447
- end
1448
- end
1449
-
1450
- def test_build_extensions_no_extensions_dir_unwritable
1451
- pend 'chmod not supported' if Gem.win_platform?
1452
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1453
- ext_spec
1454
-
1455
- refute_empty @ext.extensions, 'sanity check'
1456
-
1457
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
1458
- FileUtils.mkdir_p File.dirname extconf_rb
1459
-
1460
- File.open extconf_rb, 'w' do |f|
1461
- f.write <<-'RUBY'
1462
- File.open 'Makefile', 'w' do |f|
1463
- f.puts "clean:\n\techo clean"
1464
- f.puts "default:\n\techo built"
1465
- f.puts "install:\n\techo installed"
1466
- end
1467
- RUBY
1468
- end
1469
-
1470
- FileUtils.rm_r File.join @gemhome, 'extensions'
1471
- FileUtils.chmod 0555, @gemhome
1472
-
1473
- @ext.build_extensions
1474
-
1475
- gem_make_out = File.join @ext.extension_dir, 'gem_make.out'
1476
- assert_path_not_exist gem_make_out
1477
- ensure
1478
- FileUtils.chmod 0755, @gemhome
1479
- end
1480
-
1481
- def test_build_extensions_none
1482
- assert_path_not_exist @a1.extension_dir, 'sanity check'
1483
- assert_empty @a1.extensions, 'sanity check'
1484
-
1485
- @a1.build_extensions
1486
-
1487
- assert_path_not_exist @a1.extension_dir
1488
- end
1489
-
1490
- def test_build_extensions_preview
1491
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1492
- ext_spec
1493
-
1494
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
1495
- FileUtils.mkdir_p File.dirname extconf_rb
1496
-
1497
- File.open extconf_rb, 'w' do |f|
1498
- f.write <<-'RUBY'
1499
- File.open 'Makefile', 'w' do |f|
1500
- f.puts "clean:\n\techo clean"
1501
- f.puts "default:\n\techo built"
1502
- f.puts "install:\n\techo installed"
1503
- end
1504
- RUBY
1505
- end
1506
-
1507
- refute_empty @ext.extensions, 'sanity check'
1508
-
1509
- @ext.installed_by_version = v('2.2.0.preview.2')
1510
-
1511
- @ext.build_extensions
1512
-
1513
- gem_make_out = File.join @ext.extension_dir, 'gem_make.out'
1514
- assert_path_exist gem_make_out
1515
- end
1516
-
1517
- def test_contains_requirable_file_eh
1518
- code_rb = File.join @a1.gem_dir, 'lib', 'code.rb'
1519
- FileUtils.mkdir_p File.dirname code_rb
1520
- FileUtils.touch code_rb
1521
-
1522
- assert @a1.contains_requirable_file? 'code'
1523
- end
1524
-
1525
- def test_contains_requirable_file_eh_extension
1526
- pend "extensions don't quite work on jruby" if Gem.java_platform?
1527
- ext_spec
1528
-
1529
- _, err = capture_output do
1530
- refute @ext.contains_requirable_file? 'nonexistent'
1531
- end
1532
-
1533
- expected = "Ignoring ext-1 because its extensions are not built. " +
1534
- "Try: gem pristine ext --version 1\n"
1535
-
1536
- assert_equal expected, err
1537
- end
1538
-
1539
- def test_contains_requirable_file_eh_extension_java_platform
1540
- ext_spec(platform: Gem::Platform.new("java"))
1541
-
1542
- _, err = capture_output do
1543
- refute @ext.contains_requirable_file? 'nonexistent'
1544
- end
1545
-
1546
- assert_empty err
1547
- end
1548
-
1549
- def test_date
1550
- assert_date @a1.date
1551
- end
1552
-
1553
- def test_date_equals_date
1554
- @a1.date = Date.new(2003, 9, 17)
1555
- assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date
1556
- end
1557
-
1558
- def test_date_equals_string
1559
- @a1.date = '2003-09-17'
1560
- assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date
1561
- end
1562
-
1563
- def test_date_equals_string_bad
1564
- assert_raise Gem::InvalidSpecificationException do
1565
- @a1.date = '9/11/2003'
1566
- end
1567
- end
1568
-
1569
- def test_date_equals_time
1570
- @a1.date = Time.local(2003, 9, 17, 0,0,0)
1571
- assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date
1572
- end
1573
-
1574
- def test_date_equals_time_local
1575
- @a1.date = Time.local(2003, 9, 17, 19,50,0) # may not pass in utc >= +4
1576
- assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date
1577
- end
1578
-
1579
- def test_date_equals_time_utc
1580
- @a1.date = Time.utc(2003, 9, 17, 19,50,0)
1581
- assert_equal Time.utc(2003, 9, 17, 0,0,0), @a1.date
1582
- end
1583
-
1584
- def test_date_tolerates_hour_sec_zulu
1585
- @a1.date = "2012-01-12 11:22:33.4444444 Z"
1586
- assert_equal Time.utc(2012,01,12,0,0,0), @a1.date
1587
- end
1588
-
1589
- def test_date_tolerates_hour_sec_and_timezone
1590
- @a1.date = "2012-01-12 11:22:33.4444444 +02:33"
1591
- assert_equal Time.utc(2012,01,12,0,0,0), @a1.date
1592
- end
1593
-
1594
- def test_date_use_env_source_date_epoch
1595
- epoch = ENV["SOURCE_DATE_EPOCH"]
1596
- ENV["SOURCE_DATE_EPOCH"] = "123456789"
1597
- assert_equal Time.utc(1973,11,29,0,0,0), @a1.date
1598
- ensure
1599
- ENV["SOURCE_DATE_EPOCH"] = epoch
1600
- end
1601
-
1602
- def test_dependencies
1603
- util_setup_deps
1604
- assert_equal [@bonobo, @monkey], @gem.dependencies
1605
- end
1606
-
1607
- def test_dependent_gems
1608
- util_setup_deps
1609
-
1610
- assert_empty @gem.dependent_gems
1611
-
1612
- bonobo = util_spec 'bonobo', 1
1613
- install_gem bonobo
1614
- install_gem @gem
1615
-
1616
- expected = [
1617
- [@gem, @bonobo, [bonobo]],
1618
- ]
1619
-
1620
- assert_equal expected, bonobo.dependent_gems
1621
- end
1622
-
1623
- def test_doc_dir
1624
- assert_equal File.join(@gemhome, 'doc', 'a-1'), @a1.doc_dir
1625
- end
1626
-
1627
- def test_doc_dir_type
1628
- assert_equal File.join(@gemhome, 'doc', 'a-1', 'ri'), @a1.doc_dir('ri')
1629
- end
1630
-
1631
- def test_runtime_dependencies
1632
- util_setup_deps
1633
- assert_equal [@bonobo], @gem.runtime_dependencies
1634
- end
1635
-
1636
- def test_development_dependencies
1637
- util_setup_deps
1638
- assert_equal [@monkey], @gem.development_dependencies
1639
- end
1640
-
1641
- def test_description
1642
- assert_equal 'This is a test description', @a1.description
1643
- end
1644
-
1645
- def test_eql_eh
1646
- g1 = util_spec 'gem', 1
1647
- g2 = util_spec 'gem', 1
1648
-
1649
- assert_equal g1, g2
1650
- assert_equal g1.hash, g2.hash
1651
- assert_equal true, g1.eql?(g2)
1652
- end
1653
-
1654
- def test_eql_eh_extensions
1655
- spec = @a1.dup
1656
- spec.extensions = 'xx'
1657
-
1658
- refute_operator @a1, :eql?, spec
1659
- refute_operator spec, :eql?, @a1
1660
- end
1661
-
1662
- def test_executables
1663
- @a1.executable = 'app'
1664
- assert_equal %w[app], @a1.executables
1665
- end
1666
-
1667
- def test_executable_equals
1668
- @a2.executable = 'app'
1669
- assert_equal 'app', @a2.executable
1670
- assert_equal %w[bin/app lib/code.rb].sort, @a2.files
1671
- end
1672
-
1673
- def test_extensions
1674
- assert_equal ['ext/extconf.rb'], ext_spec.extensions
1675
- end
1676
-
1677
- def test_extension_dir
1678
- enable_shared, RbConfig::CONFIG['ENABLE_SHARED'] =
1679
- RbConfig::CONFIG['ENABLE_SHARED'], 'no'
1680
-
1681
- ext_spec
1682
-
1683
- refute_empty @ext.extensions
1684
-
1685
- expected =
1686
- File.join(@ext.base_dir, 'extensions', Gem::Platform.local.to_s,
1687
- "#{Gem.ruby_api_version}-static", @ext.full_name)
1688
-
1689
- assert_equal expected, @ext.extension_dir
1690
- ensure
1691
- RbConfig::CONFIG['ENABLE_SHARED'] = enable_shared
1692
- end
1693
-
1694
- def test_extension_dir_override
1695
- enable_shared, RbConfig::CONFIG['ENABLE_SHARED'] =
1696
- RbConfig::CONFIG['ENABLE_SHARED'], 'no'
1697
-
1698
- class << Gem
1699
- alias orig_default_ext_dir_for default_ext_dir_for
1700
-
1701
- remove_method :default_ext_dir_for
1702
-
1703
- def Gem.default_ext_dir_for(base_dir)
1704
- 'elsewhere'
1705
- end
1706
- end
1707
-
1708
- ext_spec
1709
-
1710
- refute_empty @ext.extensions
1711
-
1712
- expected = File.join @tempdir, 'elsewhere', @ext.full_name
1713
-
1714
- assert_equal expected, @ext.extension_dir
1715
- ensure
1716
- RbConfig::CONFIG['ENABLE_SHARED'] = enable_shared
1717
-
1718
- class << Gem
1719
- remove_method :default_ext_dir_for
1720
-
1721
- alias default_ext_dir_for orig_default_ext_dir_for
1722
- end
1723
- end
1724
-
1725
- def test_files
1726
- @a1.files = %w[files bin/common]
1727
- @a1.test_files = %w[test_files bin/common]
1728
- @a1.executables = %w[executables common]
1729
- @a1.extra_rdoc_files = %w[extra_rdoc_files bin/common]
1730
- @a1.extensions = %w[extensions bin/common]
1731
-
1732
- expected = %w[
1733
- bin/common
1734
- bin/executables
1735
- extensions
1736
- extra_rdoc_files
1737
- files
1738
- test_files
1739
- ]
1740
- assert_equal expected, @a1.files
1741
- end
1742
-
1743
- def test_files_append
1744
- @a1.files = %w[files bin/common]
1745
- @a1.test_files = %w[test_files bin/common]
1746
- @a1.executables = %w[executables common]
1747
- @a1.extra_rdoc_files = %w[extra_rdoc_files bin/common]
1748
- @a1.extensions = %w[extensions bin/common]
1749
-
1750
- expected = %w[
1751
- bin/common
1752
- bin/executables
1753
- extensions
1754
- extra_rdoc_files
1755
- files
1756
- test_files
1757
- ]
1758
- assert_equal expected, @a1.files
1759
-
1760
- @a1.files << "generated_file.c"
1761
-
1762
- expected << "generated_file.c"
1763
- expected.sort!
1764
-
1765
- assert_equal expected, @a1.files
1766
- end
1767
-
1768
- def test_files_duplicate
1769
- @a2.files = %w[a b c d b]
1770
- @a2.extra_rdoc_files = %w[x y z x]
1771
- @a2.normalize
1772
-
1773
- assert_equal %w[a b c d x y z], @a2.files
1774
- assert_equal %w[x y z], @a2.extra_rdoc_files
1775
- end
1776
-
1777
- def test_files_extra_rdoc_files
1778
- @a2.files = %w[a b c d]
1779
- @a2.extra_rdoc_files = %w[x y z]
1780
- @a2.normalize
1781
- assert_equal %w[a b c d x y z], @a2.files
1782
- end
1783
-
1784
- def test_files_non_array
1785
- @a1.files = "F"
1786
- @a1.test_files = "TF"
1787
- @a1.executables = "X"
1788
- @a1.extra_rdoc_files = "ERF"
1789
- @a1.extensions = "E"
1790
-
1791
- assert_equal %w[E ERF F TF bin/X], @a1.files
1792
- end
1793
-
1794
- def test_files_non_array_pathological
1795
- @a1.instance_variable_set :@files, "F"
1796
- @a1.instance_variable_set :@test_files, "TF"
1797
- @a1.instance_variable_set :@extra_rdoc_files, "ERF"
1798
- @a1.instance_variable_set :@extensions, "E"
1799
- @a1.instance_variable_set :@executables, "X"
1800
-
1801
- assert_equal %w[E ERF F TF bin/X], @a1.files
1802
- assert_kind_of Integer, @a1.hash
1803
- end
1804
-
1805
- def test_for_cache
1806
- @a2.add_runtime_dependency 'b', '1'
1807
- @a2.dependencies.first.instance_variable_set :@type, nil
1808
- @a2.required_rubygems_version = Gem::Requirement.new '> 0'
1809
- @a2.test_files = %w[test/test_b.rb]
1810
-
1811
- refute_empty @a2.files
1812
- refute_empty @a2.test_files
1813
-
1814
- spec = @a2.for_cache
1815
-
1816
- assert_empty spec.files
1817
- assert_empty spec.test_files
1818
-
1819
- refute_empty @a2.files
1820
- refute_empty @a2.test_files
1821
- end
1822
-
1823
- def test_full_gem_path
1824
- assert_equal File.join(@gemhome, 'gems', @a1.full_name), @a1.full_gem_path
1825
-
1826
- @a1.original_platform = 'mswin32'
1827
-
1828
- assert_equal File.join(@gemhome, 'gems', @a1.original_name),
1829
- @a1.full_gem_path
1830
- end
1831
-
1832
- def test_full_gem_path_double_slash
1833
- gemhome = @gemhome.to_s.sub(/\w\//, '\&/')
1834
- @a1.loaded_from = File.join gemhome, "specifications", @a1.spec_name
1835
-
1836
- expected = File.join @gemhome, "gems", @a1.full_name
1837
- assert_equal expected, @a1.full_gem_path
1838
- end
1839
-
1840
- def test_full_name
1841
- assert_equal 'a-1', @a1.full_name
1842
-
1843
- @a1 = Gem::Specification.new "a", 1
1844
- @a1.platform = Gem::Platform.new ['universal', 'darwin', nil]
1845
- assert_equal 'a-1-universal-darwin', @a1.full_name
1846
-
1847
- @a1 = Gem::Specification.new "a", 1
1848
- @a1.instance_variable_set :@new_platform, 'mswin32'
1849
- assert_equal 'a-1-mswin32', @a1.full_name, 'legacy'
1850
-
1851
- return if win_platform?
1852
-
1853
- @a1 = Gem::Specification.new "a", 1
1854
- @a1.platform = 'current'
1855
- assert_equal 'a-1-x86-darwin-8', @a1.full_name
1856
- end
1857
-
1858
- def test_full_name_windows
1859
- test_cases = {
1860
- 'i386-mswin32' => 'a-1-x86-mswin32-60',
1861
- 'i386-mswin32_80' => 'a-1-x86-mswin32-80',
1862
- 'i386-mingw32' => 'a-1-x86-mingw32',
1863
- }
1864
-
1865
- test_cases.each do |arch, expected|
1866
- @a1 = Gem::Specification.new "a", 1
1867
- util_set_arch arch
1868
- @a1.platform = 'current'
1869
- assert_equal expected, @a1.full_name
1870
- end
1871
- end
1872
-
1873
- def test_gem_build_complete_path
1874
- expected = File.join @a1.extension_dir, 'gem.build_complete'
1875
- assert_equal expected, @a1.gem_build_complete_path
1876
- end
1877
-
1878
- def test_hash
1879
- assert_equal @a1.hash, @a1.hash
1880
- assert_equal @a1.hash, @a1.dup.hash
1881
- refute_equal @a1.hash, @a2.hash
1882
- end
1883
-
1884
- def test_installed_by_version
1885
- assert_equal v(0), @a1.installed_by_version
1886
-
1887
- @a1.installed_by_version = Gem.rubygems_version
1888
-
1889
- assert_equal Gem.rubygems_version, @a1.installed_by_version
1890
- end
1891
-
1892
- def test_base_dir
1893
- assert_equal @gemhome, @a1.base_dir
1894
- end
1895
-
1896
- def test_base_dir_not_loaded
1897
- @a1.instance_variable_set :@loaded_from, nil
1898
-
1899
- assert_equal Gem.dir, @a1.base_dir
1900
- end
1901
-
1902
- def test_base_dir_default
1903
- default_dir =
1904
- File.join Gem.default_specifications_dir, @a1.spec_name
1905
-
1906
- @a1.instance_variable_set :@loaded_from, default_dir
1907
-
1908
- assert_equal Gem.default_dir, @a1.base_dir
1909
- end
1910
-
1911
- def test_lib_files
1912
- @a1.files = %w[lib/foo.rb Rakefile]
1913
-
1914
- assert_equal %w[lib/foo.rb], @a1.lib_files
1915
- end
1916
-
1917
- def test_license
1918
- assert_equal 'MIT', @a1.license
1919
- end
1920
-
1921
- def test_licenses
1922
- assert_equal ['MIT'], @a1.licenses
1923
- end
1924
-
1925
- def test_name
1926
- assert_equal 'a', @a1.name
1927
- end
1928
-
1929
- def test_original_name
1930
- assert_equal 'a-1', @a1.full_name
1931
-
1932
- @a1.platform = 'i386-linux'
1933
- @a1.instance_variable_set :@original_platform, 'i386-linux'
1934
- assert_equal 'a-1-i386-linux', @a1.original_name
1935
- end
1936
-
1937
- def test_platform
1938
- assert_equal Gem::Platform::RUBY, @a1.platform
1939
- end
1940
-
1941
- def test_platform_change_reset_full_name
1942
- orig_full_name = @a1.full_name
1943
-
1944
- @a1.platform = "universal-unknown"
1945
- refute_equal orig_full_name, @a1.full_name
1946
- end
1947
-
1948
- def test_platform_change_reset_cache_file
1949
- orig_cache_file = @a1.cache_file
1950
-
1951
- @a1.platform = "universal-unknown"
1952
- refute_equal orig_cache_file, @a1.cache_file
1953
- end
1954
-
1955
- def test_platform_equals
1956
- @a1.platform = nil
1957
- assert_equal Gem::Platform::RUBY, @a1.platform
1958
-
1959
- @a1.platform = Gem::Platform::RUBY
1960
- assert_equal Gem::Platform::RUBY, @a1.platform
1961
-
1962
- test_cases = {
1963
- 'i386-mswin32' => ['x86', 'mswin32', '60'],
1964
- 'i386-mswin32_80' => ['x86', 'mswin32', '80'],
1965
- 'i386-mingw32' => ['x86', 'mingw32', nil ],
1966
- 'x86-darwin8' => ['x86', 'darwin', '8' ],
1967
- }
1968
-
1969
- test_cases.each do |arch, expected|
1970
- util_set_arch arch
1971
- @a1.platform = Gem::Platform::CURRENT
1972
- assert_equal Gem::Platform.new(expected), @a1.platform
1973
- end
1974
- end
1975
-
1976
- def test_platform_equals_current
1977
- @a1.platform = Gem::Platform::CURRENT
1978
- assert_equal Gem::Platform.local, @a1.platform
1979
- assert_equal Gem::Platform.local.to_s, @a1.original_platform
1980
- end
1981
-
1982
- def test_platform_equals_legacy
1983
- @a1.platform = 'mswin32'
1984
- assert_equal Gem::Platform.new('x86-mswin32'), @a1.platform
1985
-
1986
- @a1.platform = 'i586-linux'
1987
- assert_equal Gem::Platform.new('x86-linux'), @a1.platform
1988
-
1989
- @a1.platform = 'powerpc-darwin'
1990
- assert_equal Gem::Platform.new('ppc-darwin'), @a1.platform
1991
- end
1992
-
1993
- def test_prerelease_spec_adds_required_rubygems_version
1994
- @prerelease = util_spec('tardis', '2.2.0.a')
1995
- refute @prerelease.required_rubygems_version.satisfied_by?(Gem::Version.new('1.3.1'))
1996
- assert @prerelease.required_rubygems_version.satisfied_by?(Gem::Version.new('1.4.0'))
1997
- end
1998
-
1999
- def test_require_paths
2000
- enable_shared 'no' do
2001
- ext_spec
2002
-
2003
- @ext.require_paths = 'lib'
2004
-
2005
- assert_equal [@ext.extension_dir, 'lib'], @ext.require_paths
2006
- end
2007
- end
2008
-
2009
- def test_require_paths_default_ext_dir_for
2010
- class << Gem
2011
- send :alias_method, :orig_default_ext_dir_for, :default_ext_dir_for
2012
-
2013
- remove_method :default_ext_dir_for
2014
- end
2015
-
2016
- def Gem.default_ext_dir_for(base_dir)
2017
- '/foo'
2018
- end
2019
-
2020
- enable_shared 'no' do
2021
- ext_spec
2022
-
2023
- @ext.require_paths = 'lib'
2024
-
2025
- assert_equal [File.expand_path('/foo/ext-1'), 'lib'], @ext.require_paths
2026
- end
2027
- ensure
2028
- class << Gem
2029
- send :remove_method, :default_ext_dir_for
2030
- send :alias_method, :default_ext_dir_for, :orig_default_ext_dir_for
2031
- send :remove_method, :orig_default_ext_dir_for
2032
- end
2033
- end
2034
-
2035
- def test_source
2036
- assert_kind_of Gem::Source::Installed, @a1.source
2037
- end
2038
-
2039
- def test_source_paths
2040
- ext_spec
2041
-
2042
- @ext.require_paths = %w[lib ext foo]
2043
- @ext.extensions << 'bar/baz'
2044
-
2045
- expected = %w[
2046
- lib
2047
- ext
2048
- foo
2049
- bar
2050
- ]
2051
-
2052
- assert_equal expected, @ext.source_paths
2053
- end
2054
-
2055
- def test_full_require_paths
2056
- ext_spec
2057
-
2058
- @ext.require_paths = 'lib'
2059
-
2060
- expected = [
2061
- File.join(@gemhome, 'gems', @ext.original_name, 'lib'),
2062
- @ext.extension_dir,
2063
- ]
2064
-
2065
- assert_equal expected, @ext.full_require_paths
2066
- end
2067
-
2068
- def test_to_fullpath
2069
- ext_spec
2070
-
2071
- @ext.require_paths = 'lib'
2072
-
2073
- dir = File.join(@gemhome, 'gems', @ext.original_name, 'lib')
2074
- expected_rb = File.join(dir, 'code.rb')
2075
- FileUtils.mkdir_p dir
2076
- FileUtils.touch expected_rb
2077
-
2078
- dir = @ext.extension_dir
2079
- ext = RbConfig::CONFIG["DLEXT"]
2080
- expected_so = File.join(dir, "ext.#{ext}")
2081
- FileUtils.mkdir_p dir
2082
- FileUtils.touch expected_so
2083
-
2084
- assert_nil @ext.to_fullpath("code")
2085
- assert_nil @ext.to_fullpath("code.rb")
2086
- assert_nil @ext.to_fullpath("code.#{ext}")
2087
-
2088
- assert_nil @ext.to_fullpath("ext")
2089
- assert_nil @ext.to_fullpath("ext.rb")
2090
- assert_nil @ext.to_fullpath("ext.#{ext}")
2091
-
2092
- @ext.activate
2093
-
2094
- assert_equal expected_rb, @ext.to_fullpath("code")
2095
- assert_equal expected_rb, @ext.to_fullpath("code.rb")
2096
- assert_nil @ext.to_fullpath("code.#{ext}")
2097
-
2098
- assert_equal expected_so, @ext.to_fullpath("ext")
2099
- assert_nil @ext.to_fullpath("ext.rb")
2100
- assert_equal expected_so, @ext.to_fullpath("ext.#{ext}")
2101
-
2102
- assert_nil @ext.to_fullpath("notexist")
2103
- end
2104
-
2105
- def test_fullpath_return_rb_extension_file_when_exist_the_same_name_file
2106
- ext_spec
2107
-
2108
- @ext.require_paths = 'lib'
2109
-
2110
- dir = File.join(@gemhome, 'gems', @ext.original_name, 'lib')
2111
- expected_rb = File.join(dir, 'code.rb')
2112
- FileUtils.mkdir_p dir
2113
- FileUtils.touch expected_rb
2114
-
2115
- dir = @ext.extension_dir
2116
- ext = RbConfig::CONFIG["DLEXT"]
2117
- expected_so = File.join(dir, "code.#{ext}")
2118
- FileUtils.mkdir_p dir
2119
- FileUtils.touch expected_so
2120
-
2121
- @ext.activate
2122
-
2123
- assert_equal expected_rb, @ext.to_fullpath("code")
2124
- end
2125
-
2126
- def test_require_already_activated
2127
- a1 = util_spec "a", "1", nil, "lib/d#{$$}.rb"
2128
-
2129
- install_specs a1 # , a2, b1, b2, c1, c2
2130
-
2131
- a1.activate
2132
- assert_equal %w[a-1], loaded_spec_names
2133
- assert_equal [], unresolved_names
2134
-
2135
- assert require "d#{$$}"
2136
-
2137
- assert_equal %w[a-1], loaded_spec_names
2138
- assert_equal [], unresolved_names
2139
- end
2140
-
2141
- def test_require_already_activated_indirect_conflict
2142
- a1 = util_spec "a", "1", "b" => "> 0"
2143
- a2 = util_spec "a", "2", "b" => "> 0"
2144
- b1 = util_spec "b", "1", "c" => ">= 1"
2145
- b2 = util_spec "b", "2", "c" => ">= 2"
2146
- c1 = util_spec "c", "1", nil, "lib/d#{$$}.rb"
2147
- c2 = util_spec("c", "2", { "a" => "1" }, "lib/d#{$$}.rb") # conflicts with a-2
2148
-
2149
- install_specs c1, b1, a1, a2, c2, b2
2150
-
2151
- a1.activate
2152
- c1.activate
2153
- assert_equal %w[a-1 c-1], loaded_spec_names
2154
- assert_equal ["b (> 0)"], unresolved_names
2155
-
2156
- assert require "d#{$$}"
2157
-
2158
- assert_equal %w[a-1 c-1], loaded_spec_names
2159
- assert_equal ["b (> 0)"], unresolved_names
2160
- end
2161
-
2162
- def test_requirements
2163
- assert_equal ['A working computer'], @a1.requirements
2164
- end
2165
-
2166
- def test_allowed_push_host
2167
- assert_nil @a1.metadata['allowed_push_host']
2168
- assert_equal 'https://privategemserver.com', @a3.metadata['allowed_push_host']
2169
- end
2170
-
2171
- def test_runtime_dependencies_legacy
2172
- make_spec_c1
2173
- # legacy gems don't have a type
2174
- @c1.runtime_dependencies.each do |dep|
2175
- dep.instance_variable_set :@type, nil
2176
- end
2177
-
2178
- expected = %w[rake jabber4r pqa]
2179
-
2180
- assert_equal expected, @c1.runtime_dependencies.map {|d| d.name }
2181
- end
2182
-
2183
- def test_spaceship_name
2184
- s1 = util_spec 'a', '1'
2185
- s2 = util_spec 'b', '1'
2186
-
2187
- assert_equal(-1, (s1 <=> s2))
2188
- assert_equal(0, (s1 <=> s1))
2189
- assert_equal(1, (s2 <=> s1))
2190
- end
2191
-
2192
- def test_spaceship_platform
2193
- s1 = util_spec 'a', '1'
2194
- s2 = util_spec 'a', '1' do |s|
2195
- s.platform = Gem::Platform.new 'x86-my_platform1'
2196
- end
2197
-
2198
- assert_equal(-1, (s1 <=> s2))
2199
- assert_equal(0, (s1 <=> s1))
2200
- assert_equal(1, (s2 <=> s1))
2201
- end
2202
-
2203
- def test_spaceship_version
2204
- s1 = util_spec 'a', '1'
2205
- s2 = util_spec 'a', '2'
2206
-
2207
- assert_equal(-1, (s1 <=> s2))
2208
- assert_equal(0, (s1 <=> s1))
2209
- assert_equal(1, (s2 <=> s1))
2210
- end
2211
-
2212
- def test_spec_file
2213
- assert_equal File.join(@gemhome, 'specifications', 'a-1.gemspec'),
2214
- @a1.spec_file
2215
- end
2216
-
2217
- def test_spec_name
2218
- assert_equal 'a-1.gemspec', @a1.spec_name
2219
- end
2220
-
2221
- def test_summary
2222
- assert_equal 'this is a summary', @a1.summary
2223
- end
2224
-
2225
- def test_test_files
2226
- @a1.test_file = 'test/suite.rb'
2227
- assert_equal ['test/suite.rb'], @a1.test_files
2228
- end
2229
-
2230
- def test_runtime_predicate_true
2231
- @a2.add_runtime_dependency 'b', '1'
2232
- assert_predicate @a2.dependencies.first, :runtime?
2233
-
2234
- @a2.dependencies.first.instance_variable_set :@type, nil
2235
- assert_predicate @a2.dependencies.first, :runtime?
2236
- end
2237
-
2238
- def test_runtime_predicate_false
2239
- @a2.add_development_dependency 'b', '1'
2240
- refute_predicate @a2.dependencies.first, :runtime?
2241
- end
2242
-
2243
- def test_to_ruby
2244
- @a2.add_runtime_dependency 'b', '1'
2245
- @a2.dependencies.first.instance_variable_set :@type, nil
2246
- @a2.required_rubygems_version = Gem::Requirement.new '> 0'
2247
- @a2.require_paths << 'other'
2248
-
2249
- ruby_code = @a2.to_ruby
2250
-
2251
- expected = <<-SPEC
2252
- # -*- encoding: utf-8 -*-
2253
- # stub: a 2 ruby lib\0other
2254
-
2255
- Gem::Specification.new do |s|
2256
- s.name = "a".freeze
2257
- s.version = "2"
2258
-
2259
- s.required_rubygems_version = Gem::Requirement.new(\"> 0\".freeze) if s.respond_to? :required_rubygems_version=
2260
- s.require_paths = ["lib".freeze, "other".freeze]
2261
- s.authors = ["A User".freeze]
2262
- s.date = "#{@a2.date.strftime("%Y-%m-%d")}"
2263
- s.description = "This is a test description".freeze
2264
- s.email = "example@example.com".freeze
2265
- s.files = ["lib/code.rb".freeze]
2266
- s.homepage = "http://example.com".freeze
2267
- s.rubygems_version = "#{Gem::VERSION}".freeze
2268
- s.summary = "this is a summary".freeze
2269
-
2270
- if s.respond_to? :specification_version then
2271
- s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION}
2272
- end
2273
-
2274
- if s.respond_to? :add_runtime_dependency then
2275
- s.add_runtime_dependency(%q<b>.freeze, [\"= 1\"])
2276
- else
2277
- s.add_dependency(%q<b>.freeze, [\"= 1\"])
2278
- end
2279
- end
2280
- SPEC
2281
-
2282
- assert_equal expected, ruby_code
2283
-
2284
- same_spec = eval ruby_code
2285
-
2286
- assert_equal @a2, same_spec
2287
- end
2288
-
2289
- def test_to_ruby_with_rsa_key
2290
- require 'rubygems/openssl'
2291
- pend 'openssl is missing' unless defined?(OpenSSL::PKey::RSA)
2292
-
2293
- rsa_key = OpenSSL::PKey::RSA.new(2048)
2294
- @a2.signing_key = rsa_key
2295
- ruby_code = @a2.to_ruby
2296
-
2297
- expected = <<-SPEC
2298
- # -*- encoding: utf-8 -*-
2299
- # stub: a 2 ruby lib
2300
-
2301
- Gem::Specification.new do |s|
2302
- s.name = "a".freeze
2303
- s.version = "2"
2304
-
2305
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
2306
- s.require_paths = ["lib".freeze]
2307
- s.authors = ["A User".freeze]
2308
- s.date = "#{@a2.date.strftime("%Y-%m-%d")}"
2309
- s.description = "This is a test description".freeze
2310
- s.email = "example@example.com".freeze
2311
- s.files = ["lib/code.rb".freeze]
2312
- s.homepage = "http://example.com".freeze
2313
- s.rubygems_version = "#{Gem::VERSION}".freeze
2314
- s.summary = "this is a summary".freeze
2315
- end
2316
- SPEC
2317
-
2318
- assert_equal expected, ruby_code
2319
- end
2320
-
2321
- def test_to_ruby_for_cache
2322
- @a2.add_runtime_dependency 'b', '1'
2323
- @a2.dependencies.first.instance_variable_set :@type, nil
2324
- @a2.required_rubygems_version = Gem::Requirement.new '> 0'
2325
- @a2.installed_by_version = Gem.rubygems_version
2326
-
2327
- # cached specs do not have spec.files populated:
2328
- ruby_code = @a2.to_ruby_for_cache
2329
-
2330
- expected = <<-SPEC
2331
- # -*- encoding: utf-8 -*-
2332
- # stub: a 2 ruby lib
2333
-
2334
- Gem::Specification.new do |s|
2335
- s.name = "a".freeze
2336
- s.version = "2"
2337
-
2338
- s.required_rubygems_version = Gem::Requirement.new(\"> 0\".freeze) if s.respond_to? :required_rubygems_version=
2339
- s.require_paths = ["lib".freeze]
2340
- s.authors = ["A User".freeze]
2341
- s.date = "#{@a2.date.strftime("%Y-%m-%d")}"
2342
- s.description = "This is a test description".freeze
2343
- s.email = "example@example.com".freeze
2344
- s.homepage = "http://example.com".freeze
2345
- s.rubygems_version = "#{Gem::VERSION}".freeze
2346
- s.summary = "this is a summary".freeze
2347
-
2348
- s.installed_by_version = "#{Gem::VERSION}" if s.respond_to? :installed_by_version
2349
-
2350
- if s.respond_to? :specification_version then
2351
- s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION}
2352
- end
2353
-
2354
- if s.respond_to? :add_runtime_dependency then
2355
- s.add_runtime_dependency(%q<b>.freeze, [\"= 1\"])
2356
- else
2357
- s.add_dependency(%q<b>.freeze, [\"= 1\"])
2358
- end
2359
- end
2360
- SPEC
2361
-
2362
- assert_equal expected, ruby_code
2363
-
2364
- same_spec = eval ruby_code
2365
-
2366
- # cached specs do not have spec.files populated:
2367
- @a2.files = []
2368
- assert_equal @a2, same_spec
2369
- end
2370
-
2371
- def test_to_ruby_fancy
2372
- make_spec_c1
2373
-
2374
- @c1.platform = Gem::Platform.local
2375
- ruby_code = @c1.to_ruby
2376
-
2377
- local = Gem::Platform.local
2378
- expected_platform = "[#{local.cpu.inspect}, #{local.os.inspect}, #{local.version.inspect}]"
2379
- stub_require_paths =
2380
- @c1.instance_variable_get(:@require_paths).join "\u0000"
2381
- extensions = @c1.extensions.join "\u0000"
2382
-
2383
- expected = <<-SPEC
2384
- # -*- encoding: utf-8 -*-
2385
- # stub: a 1 #{win_platform? ? "x86-mswin32-60" : "x86-darwin-8"} #{stub_require_paths}
2386
- # stub: #{extensions}
2387
-
2388
- Gem::Specification.new do |s|
2389
- s.name = "a".freeze
2390
- s.version = "1"
2391
- s.platform = Gem::Platform.new(#{expected_platform})
2392
-
2393
- s.required_rubygems_version = Gem::Requirement.new(\">= 0\".freeze) if s.respond_to? :required_rubygems_version=
2394
- s.require_paths = ["lib".freeze]
2395
- s.authors = ["A User".freeze]
2396
- s.date = "#{@c1.date.strftime("%Y-%m-%d")}"
2397
- s.description = "This is a test description".freeze
2398
- s.email = "example@example.com".freeze
2399
- s.executables = ["exec".freeze]
2400
- s.extensions = ["ext/a/extconf.rb".freeze]
2401
- s.files = ["bin/exec".freeze, "ext/a/extconf.rb".freeze, "lib/code.rb".freeze, "test/suite.rb".freeze]
2402
- s.homepage = "http://example.com".freeze
2403
- s.licenses = ["MIT".freeze]
2404
- s.requirements = ["A working computer".freeze]
2405
- s.rubygems_version = "#{Gem::VERSION}".freeze
2406
- s.summary = "this is a summary".freeze
2407
- s.test_files = ["test/suite.rb".freeze]
2408
-
2409
- if s.respond_to? :specification_version then
2410
- s.specification_version = 4
2411
- end
2412
-
2413
- if s.respond_to? :add_runtime_dependency then
2414
- s.add_runtime_dependency(%q<rake>.freeze, [\"> 0.4\"])
2415
- s.add_runtime_dependency(%q<jabber4r>.freeze, [\"> 0.0.0\"])
2416
- s.add_runtime_dependency(%q<pqa>.freeze, [\"> 0.4\", \"<= 0.6\"])
2417
- else
2418
- s.add_dependency(%q<rake>.freeze, [\"> 0.4\"])
2419
- s.add_dependency(%q<jabber4r>.freeze, [\"> 0.0.0\"])
2420
- s.add_dependency(%q<pqa>.freeze, [\"> 0.4\", \"<= 0.6\"])
2421
- end
2422
- end
2423
- SPEC
2424
-
2425
- assert_equal expected, ruby_code
2426
-
2427
- same_spec = eval ruby_code
2428
-
2429
- assert_equal @c1, same_spec
2430
- end
2431
-
2432
- def test_to_ruby_keeps_requirements_as_originally_specified
2433
- spec = util_spec 'a', '1' do |s|
2434
- s.add_dependency 'b', ['~> 1.0', '>= 1.0.0']
2435
- end
2436
-
2437
- assert_includes spec.to_ruby, '"~> 1.0", ">= 1.0.0"'
2438
- end
2439
-
2440
- def test_to_ruby_legacy
2441
- gemspec1 = Gem::Deprecate.skip_during do
2442
- eval LEGACY_RUBY_SPEC
2443
- end
2444
- ruby_code = gemspec1.to_ruby
2445
- gemspec2 = eval ruby_code
2446
-
2447
- assert_equal gemspec1, gemspec2
2448
- end
2449
-
2450
- def test_to_ruby_nested_hash
2451
- metadata = {}
2452
- metadata[metadata] = metadata
2453
-
2454
- @a2.metadata = metadata
2455
-
2456
- ruby = @a2.to_ruby
2457
-
2458
- assert_match %r%^ s\.metadata = \{ "%, ruby
2459
- end
2460
-
2461
- def test_to_ruby_platform
2462
- @a2.platform = Gem::Platform.local
2463
- @a2.instance_variable_set :@original_platform, 'old_platform'
2464
-
2465
- ruby_code = @a2.to_ruby
2466
-
2467
- same_spec = eval ruby_code
2468
-
2469
- assert_equal 'old_platform', same_spec.original_platform
2470
- end
2471
-
2472
- def test_to_yaml
2473
- yaml_str = @a1.to_yaml
2474
-
2475
- refute_match %r{!!null}, yaml_str
2476
-
2477
- same_spec = Gem::Specification.from_yaml(yaml_str)
2478
-
2479
- assert_equal @a1, same_spec
2480
- end
2481
-
2482
- def test_to_yaml_fancy
2483
- @a1.platform = Gem::Platform.local
2484
- yaml_str = @a1.to_yaml
2485
-
2486
- same_spec = Gem::Specification.from_yaml(yaml_str)
2487
-
2488
- assert_equal Gem::Platform.local, same_spec.platform
2489
-
2490
- assert_equal @a1, same_spec
2491
- end
2492
-
2493
- def test_to_yaml_platform_empty_string
2494
- @a1.instance_variable_set :@original_platform, ''
2495
-
2496
- assert_match %r{^platform: ruby$}, @a1.to_yaml
2497
- end
2498
-
2499
- def test_to_yaml_platform_legacy
2500
- @a1.platform = 'powerpc-darwin7.9.0'
2501
- @a1.instance_variable_set :@original_platform, 'powerpc-darwin7.9.0'
2502
-
2503
- yaml_str = @a1.to_yaml
2504
-
2505
- same_spec = load_yaml yaml_str
2506
-
2507
- assert_equal Gem::Platform.new('powerpc-darwin7'), same_spec.platform
2508
- assert_equal 'powerpc-darwin7.9.0', same_spec.original_platform
2509
- end
2510
-
2511
- def test_to_yaml_platform_nil
2512
- @a1.instance_variable_set :@original_platform, nil
2513
-
2514
- assert_match %r{^platform: ruby$}, @a1.to_yaml
2515
- end
2516
-
2517
- def test_validate
2518
- util_setup_validate
2519
-
2520
- Dir.chdir @tempdir do
2521
- assert @a1.validate
2522
- end
2523
- end
2524
-
2525
- def x(s); s.gsub(/xxx/, ''); end
2526
- def w; x "WARxxxNING"; end
2527
- def t; x "TOxxxDO"; end
2528
- def f; x "FxxxIXME"; end
2529
-
2530
- def test_validate_authors
2531
- util_setup_validate
2532
-
2533
- Dir.chdir @tempdir do
2534
- @a1.authors = [""]
2535
-
2536
- use_ui @ui do
2537
- @a1.validate
2538
- end
2539
-
2540
- assert_match "#{w}: no author specified\n", @ui.error, 'error'
2541
-
2542
- @a1.authors = [Object.new]
2543
-
2544
- assert_equal [], @a1.authors
2545
-
2546
- e = assert_raise Gem::InvalidSpecificationException do
2547
- @a1.validate
2548
- end
2549
-
2550
- assert_equal "authors may not be empty", e.message
2551
-
2552
- @a1.authors = ["#{f} (who is writing this software)"]
2553
-
2554
- e = assert_raise Gem::InvalidSpecificationException do
2555
- @a1.validate
2556
- end
2557
-
2558
- assert_equal %("#{f}" or "#{t}" is not an author), e.message
2559
-
2560
- @a1.authors = ["#{t} (who is writing this software)"]
2561
-
2562
- e = assert_raise Gem::InvalidSpecificationException do
2563
- @a1.validate
2564
- end
2565
-
2566
- assert_equal %("#{f}" or "#{t}" is not an author), e.message
2567
- end
2568
- end
2569
-
2570
- def test_validate_autorequire
2571
- util_setup_validate
2572
-
2573
- Dir.chdir @tempdir do
2574
- @a1.autorequire = 'code'
2575
-
2576
- use_ui @ui do
2577
- @a1.validate
2578
- end
2579
-
2580
- assert_match "#{w}: deprecated autorequire specified\n",
2581
- @ui.error, 'error'
2582
- end
2583
- end
2584
-
2585
- def test_validate_dependencies
2586
- util_setup_validate
2587
-
2588
- Dir.chdir @tempdir do
2589
- @a1.add_runtime_dependency 'b', '>= 1.0.rc1'
2590
- @a1.add_development_dependency 'c', '>= 2.0.rc2'
2591
- @a1.add_runtime_dependency 'd', '~> 1.2.3'
2592
- @a1.add_runtime_dependency 'e', '~> 1.2.3.4'
2593
- @a1.add_runtime_dependency 'g', '~> 1.2.3', '>= 1.2.3.4'
2594
- @a1.add_runtime_dependency 'h', '>= 1.2.3', '<= 2'
2595
- @a1.add_runtime_dependency 'i', '>= 1.2'
2596
- @a1.add_runtime_dependency 'j', '>= 1.2.3'
2597
- @a1.add_runtime_dependency 'k', '> 1.2'
2598
- @a1.add_runtime_dependency 'l', '> 1.2.3'
2599
- @a1.add_runtime_dependency 'm', '~> 2.1.0'
2600
- @a1.add_runtime_dependency 'n', '~> 0.1.0'
2601
- @a1.add_runtime_dependency 'o'
2602
-
2603
- use_ui @ui do
2604
- @a1.validate
2605
- end
2606
-
2607
- expected = <<-EXPECTED
2608
- #{w}: prerelease dependency on b (>= 1.0.rc1) is not recommended
2609
- #{w}: prerelease dependency on c (>= 2.0.rc2, development) is not recommended
2610
- #{w}: open-ended dependency on i (>= 1.2) is not recommended
2611
- if i is semantically versioned, use:
2612
- add_runtime_dependency 'i', '~> 1.2'
2613
- #{w}: open-ended dependency on j (>= 1.2.3) is not recommended
2614
- if j is semantically versioned, use:
2615
- add_runtime_dependency 'j', '~> 1.2', '>= 1.2.3'
2616
- #{w}: open-ended dependency on k (> 1.2) is not recommended
2617
- if k is semantically versioned, use:
2618
- add_runtime_dependency 'k', '~> 1.2', '> 1.2'
2619
- #{w}: open-ended dependency on l (> 1.2.3) is not recommended
2620
- if l is semantically versioned, use:
2621
- add_runtime_dependency 'l', '~> 1.2', '> 1.2.3'
2622
- #{w}: open-ended dependency on o (>= 0) is not recommended
2623
- use a bounded requirement, such as '~> x.y'
2624
- #{w}: See https://guides.rubygems.org/specification-reference/ for help
2625
- EXPECTED
2626
-
2627
- assert_equal expected, @ui.error, 'warning'
2628
- end
2629
- end
2630
-
2631
- def test_validate_dependencies_duplicates
2632
- util_setup_validate
2633
-
2634
- Dir.chdir @tempdir do
2635
- @a1.add_runtime_dependency 'b', '~> 1.2'
2636
- @a1.add_runtime_dependency 'b', '>= 1.2.3'
2637
- @a1.add_development_dependency 'c', '~> 1.2'
2638
- @a1.add_development_dependency 'c', '>= 1.2.3'
2639
-
2640
- use_ui @ui do
2641
- e = assert_raise Gem::InvalidSpecificationException do
2642
- @a1.validate
2643
- end
2644
-
2645
- expected = <<-EXPECTED
2646
- duplicate dependency on b (>= 1.2.3), (~> 1.2) use:
2647
- add_runtime_dependency 'b', '>= 1.2.3', '~> 1.2'
2648
- duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use:
2649
- add_development_dependency 'c', '>= 1.2.3', '~> 1.2'
2650
- EXPECTED
2651
-
2652
- assert_equal expected, e.message
2653
- end
2654
-
2655
- assert_equal <<-EXPECTED, @ui.error
2656
- #{w}: See https://guides.rubygems.org/specification-reference/ for help
2657
- EXPECTED
2658
- end
2659
- end
2660
-
2661
- def test_validate_dependencies_allowed_duplicates
2662
- util_setup_validate
2663
-
2664
- Dir.chdir @tempdir do
2665
- @a1.add_runtime_dependency 'b', '~> 1.2'
2666
- @a1.add_development_dependency 'b', '= 1.2.3'
2667
-
2668
- use_ui @ui do
2669
- @a1.validate
2670
- end
2671
-
2672
- assert_equal '', @ui.error, 'warning'
2673
- end
2674
- end
2675
-
2676
- def test_validate_prerelease_dependencies_with_prerelease_version
2677
- util_setup_validate
2678
-
2679
- Dir.chdir @tempdir do
2680
- @a1.version = '1.0.0.beta.1'
2681
- @a1.add_runtime_dependency 'b', '~> 1.2.0.beta.1'
2682
-
2683
- use_ui @ui do
2684
- @a1.validate
2685
- end
2686
-
2687
- assert_equal '', @ui.error, 'warning'
2688
- end
2689
- end
2690
-
2691
- def test_validate_rake_extension_have_rake_dependency_warning
2692
- util_setup_validate
2693
-
2694
- Dir.chdir @tempdir do
2695
- @a1.extensions = ['Rakefile']
2696
- File.write File.join(@tempdir, 'Rakefile'), ''
2697
-
2698
- use_ui @ui do
2699
- @a1.validate
2700
- end
2701
-
2702
- assert_match(/add rake as a dependency/, @ui.error)
2703
- end
2704
- end
2705
-
2706
- def test_validate_rake_extension_have_rake_dependency_no_warning
2707
- util_setup_validate
2708
-
2709
- Dir.chdir @tempdir do
2710
- @a1.extensions = ['Rakefile']
2711
- @a1.add_runtime_dependency 'rake'
2712
- File.write File.join(@tempdir, 'Rakefile'), ''
2713
-
2714
- use_ui @ui do
2715
- @a1.validate
2716
- end
2717
-
2718
- refute_match(/add rake as a dependency/, @ui.error)
2719
- end
2720
- end
2721
-
2722
- def test_validate_description
2723
- util_setup_validate
2724
-
2725
- Dir.chdir @tempdir do
2726
- @a1.description = ''
2727
-
2728
- use_ui @ui do
2729
- @a1.validate
2730
- end
2731
-
2732
- @ui = Gem::MockGemUi.new
2733
- @a1.summary = "this is my summary"
2734
- @a1.description = @a1.summary
2735
-
2736
- use_ui @ui do
2737
- @a1.validate
2738
- end
2739
-
2740
- assert_match "#{w}: description and summary are identical\n",
2741
- @ui.error, "error"
2742
-
2743
- @a1.description = "#{f} (describe your package)"
2744
-
2745
- e = assert_raise Gem::InvalidSpecificationException do
2746
- @a1.validate
2747
- end
2748
-
2749
- assert_equal %("#{f}" or "#{t}" is not a description), e.message
2750
-
2751
- @a1.description = "#{t} (describe your package)"
2752
-
2753
- e = assert_raise Gem::InvalidSpecificationException do
2754
- @a1.validate
2755
- end
2756
-
2757
- assert_equal %("#{f}" or "#{t}" is not a description), e.message
2758
-
2759
- # Adding #{f} anywhere after the start of the description should be fine.
2760
- @a1.description = "(some description) #{f}"
2761
-
2762
- assert_nothing_raised do
2763
- @a1.validate
2764
- end
2765
-
2766
- # Adding #{t} anywhere after the start of the description should be fine.
2767
- @a1.description = "(some description) #{t}"
2768
-
2769
- assert_nothing_raised do
2770
- @a1.validate
2771
- end
2772
-
2773
- # Adding #{f} at the start of the second or later line should be fine.
2774
- @a1.description = "(some description)\n#{f}"
2775
-
2776
- assert_nothing_raised do
2777
- @a1.validate
2778
- end
2779
-
2780
- # Adding #{t} at the start of the second or later line should be fine.
2781
- @a1.description = "(some description)\n#{t}"
2782
-
2783
- assert_nothing_raised do
2784
- @a1.validate
2785
- end
2786
- end
2787
- end
2788
-
2789
- def test_validate_email
2790
- util_setup_validate
2791
-
2792
- Dir.chdir @tempdir do
2793
- @a1.email = "FIxxxXME (your e-mail)".sub(/xxx/, "")
2794
-
2795
- e = assert_raise Gem::InvalidSpecificationException do
2796
- @a1.validate
2797
- end
2798
-
2799
- assert_equal %("#{f}" or "#{t}" is not an email), e.message
2800
-
2801
- @a1.email = "#{t} (your e-mail)"
2802
-
2803
- e = assert_raise Gem::InvalidSpecificationException do
2804
- @a1.validate
2805
- end
2806
-
2807
- assert_equal %("#{f}" or "#{t}" is not an email), e.message
2808
- end
2809
- end
2810
-
2811
- def test_validate_empty
2812
- e = assert_raise Gem::InvalidSpecificationException do
2813
- Gem::Specification.new.validate
2814
- end
2815
-
2816
- assert_equal 'missing value for attribute name', e.message
2817
- end
2818
-
2819
- def test_validate_error
2820
- assert_raise Gem::InvalidSpecificationException do
2821
- use_ui @ui do
2822
- Gem::Specification.new.validate
2823
- end
2824
- end
2825
-
2826
- assert_match 'See https://guides.rubygems.org/specification-reference/ for help', @ui.error
2827
- end
2828
-
2829
- def test_validate_executables
2830
- util_setup_validate
2831
-
2832
- FileUtils.mkdir_p File.join(@tempdir, 'bin')
2833
- File.write File.join(@tempdir, 'bin', 'exec'), ''
2834
- FileUtils.mkdir_p File.join(@tempdir, 'exec')
2835
-
2836
- use_ui @ui do
2837
- Dir.chdir @tempdir do
2838
- assert @a1.validate
2839
- end
2840
- end
2841
-
2842
- assert_equal %w[exec], @a1.executables
2843
-
2844
- assert_equal '', @ui.output, 'output'
2845
- assert_match "#{w}: bin/exec is missing #! line\n", @ui.error, 'error'
2846
- end
2847
-
2848
- def test_validate_empty_require_paths
2849
- if win_platform?
2850
- pend 'test_validate_empty_require_paths skipped on MS Windows (symlink)'
2851
- else
2852
- util_setup_validate
2853
-
2854
- @a1.require_paths = []
2855
- e = assert_raise Gem::InvalidSpecificationException do
2856
- @a1.validate
2857
- end
2858
-
2859
- assert_equal 'specification must have at least one require_path',
2860
- e.message
2861
- end
2862
- end
2863
-
2864
- def test_validate_files
2865
- pend 'test_validate_files skipped on MS Windows (symlink)' if win_platform?
2866
- util_setup_validate
2867
-
2868
- @a1.files += ['lib', 'lib2']
2869
- @a1.extensions << 'ext/a/extconf.rb'
2870
-
2871
- Dir.chdir @tempdir do
2872
- FileUtils.ln_s 'lib/code.rb', 'lib2' unless vc_windows?
2873
-
2874
- use_ui @ui do
2875
- @a1.validate
2876
- end
2877
-
2878
- assert_match 'WARNING: lib2 is a symlink, which is not supported on all platforms', @ui.error
2879
- end
2880
-
2881
- assert_equal %w[bin/exec ext/a/extconf.rb lib/code.rb lib2 test/suite.rb].sort,
2882
- @a1.files
2883
- end
2884
-
2885
- def test_unresolved_specs
2886
- specification = Gem::Specification.clone
2887
-
2888
- set_orig specification
2889
-
2890
- specification.define_singleton_method(:unresolved_deps) do
2891
- { b: Gem::Dependency.new("x","1") }
2892
- end
2893
-
2894
- specification.define_singleton_method(:find_all_by_name) do |dep_name|
2895
- []
2896
- end
2897
-
2898
- expected = <<-EXPECTED
2899
- WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
2900
- x (= 1)
2901
- WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
2902
- Please report a bug if this causes problems.
2903
- EXPECTED
2904
-
2905
- actual_stdout, actual_stderr = capture_output do
2906
- specification.reset
2907
- end
2908
- assert_empty actual_stdout
2909
- assert_equal(expected, actual_stderr)
2910
- end
2911
-
2912
- def test_unresolved_specs_with_versions
2913
- specification = Gem::Specification.clone
2914
-
2915
- set_orig specification
2916
-
2917
- specification.define_singleton_method(:unresolved_deps) do
2918
- { b: Gem::Dependency.new("x","1") }
2919
- end
2920
-
2921
- specification.define_singleton_method(:find_all_by_name) do |dep_name|
2922
- [
2923
- specification.new {|s| s.name = "z", s.version = Gem::Version.new("1") },
2924
- specification.new {|s| s.name = "z", s.version = Gem::Version.new("2") },
2925
- ]
2926
- end
2927
-
2928
- expected = <<-EXPECTED
2929
- WARN: Unresolved or ambiguous specs during Gem::Specification.reset:
2930
- x (= 1)
2931
- Available/installed versions of this gem:
2932
- - 1
2933
- - 2
2934
- WARN: Clearing out unresolved specs. Try 'gem cleanup <gem>'
2935
- Please report a bug if this causes problems.
2936
- EXPECTED
2937
-
2938
- actual_stdout, actual_stderr = capture_output do
2939
- specification.reset
2940
- end
2941
- assert_empty actual_stdout
2942
- assert_equal(expected, actual_stderr)
2943
- end
2944
-
2945
- def test_duplicate_runtime_dependency
2946
- expected = "WARNING: duplicated b dependency [\"~> 3.0\", \"~> 3.0\"]\n"
2947
- out, err = capture_output do
2948
- @a1.add_runtime_dependency "b", "~> 3.0", "~> 3.0"
2949
- end
2950
- assert_empty out
2951
- assert_equal(expected, err)
2952
- end
2953
-
2954
- def set_orig(cls)
2955
- s_cls = cls.singleton_class
2956
- s_cls.send :alias_method, :orig_unresolved_deps , :unresolved_deps
2957
- s_cls.send :alias_method, :orig_find_all_by_name, :find_all_by_name
2958
- end
2959
-
2960
- def test_validate_files_recursive
2961
- util_setup_validate
2962
- FileUtils.touch @a1.file_name
2963
-
2964
- @a1.files = [@a1.file_name]
2965
-
2966
- e = assert_raise Gem::InvalidSpecificationException do
2967
- @a1.validate
2968
- end
2969
-
2970
- assert_equal "#{@a1.full_name} contains itself (#{@a1.file_name}), check your files list",
2971
- e.message
2972
- end
2973
-
2974
- def test_validate_homepage
2975
- util_setup_validate
2976
-
2977
- Dir.chdir @tempdir do
2978
- @a1.homepage = nil
2979
-
2980
- use_ui @ui do
2981
- @a1.validate
2982
- end
2983
-
2984
- assert_match "#{w}: no homepage specified\n", @ui.error, 'error'
2985
-
2986
- @ui = Gem::MockGemUi.new
2987
-
2988
- @a1.homepage = ''
2989
-
2990
- use_ui @ui do
2991
- @a1.validate
2992
- end
2993
-
2994
- assert_match "#{w}: no homepage specified\n", @ui.error, 'error'
2995
-
2996
- @a1.homepage = 'over at my cool site'
2997
-
2998
- e = assert_raise Gem::InvalidSpecificationException do
2999
- @a1.validate
3000
- end
3001
-
3002
- assert_equal '"over at my cool site" is not a valid HTTP URI', e.message
3003
-
3004
- @a1.homepage = 'ftp://rubygems.org'
3005
-
3006
- e = assert_raise Gem::InvalidSpecificationException do
3007
- @a1.validate
3008
- end
3009
-
3010
- assert_equal '"ftp://rubygems.org" is not a valid HTTP URI', e.message
3011
-
3012
- @a1.homepage = 'https://rubygems.org/'
3013
- assert_equal true, @a1.validate
3014
-
3015
- @a1.homepage = 'https://rubygems.org'
3016
- assert_equal true, @a1.validate
3017
-
3018
- end
3019
- end
3020
-
3021
- def test_validate_license
3022
- util_setup_validate
3023
-
3024
- use_ui @ui do
3025
- @a1.licenses.clear
3026
- @a1.validate
3027
- end
3028
-
3029
- assert_match <<-WARNING, @ui.error
3030
- WARNING: licenses is empty, but is recommended. Use a license identifier from
3031
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3032
- WARNING
3033
- end
3034
-
3035
- def test_validate_license_in_a_non_packaging_context
3036
- util_setup_validate
3037
-
3038
- use_ui @ui do
3039
- @a1.licenses.clear
3040
- @a1.validate(false)
3041
- end
3042
-
3043
- assert_empty @ui.error
3044
- end
3045
-
3046
- def test_removed_methods
3047
- assert_equal Gem::Specification::REMOVED_METHODS, [:rubyforge_project=]
3048
- end
3049
-
3050
- def test_validate_removed_rubyforge_project
3051
- util_setup_validate
3052
-
3053
- use_ui @ui do
3054
- @a1.rubyforge_project = 'invalid-attribute'
3055
- @a1.validate
3056
- end
3057
-
3058
- assert_match "rubyforge_project= is deprecated", @ui.error
3059
- end
3060
-
3061
- def test_validate_license_values
3062
- util_setup_validate
3063
-
3064
- use_ui @ui do
3065
- @a1.licenses = ['BSD']
3066
- @a1.validate
3067
- end
3068
-
3069
- assert_match <<-WARNING, @ui.error
3070
- WARNING: license value 'BSD' is invalid. Use a license identifier from
3071
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3072
- WARNING
3073
- end
3074
-
3075
- def test_validate_license_ref
3076
- util_setup_validate
3077
-
3078
- use_ui @ui do
3079
- @a1.licenses = ['LicenseRef-LICENSE.md']
3080
- @a1.validate
3081
- end
3082
-
3083
- assert_empty @ui.error
3084
- end
3085
-
3086
- def test_validate_license_values_plus
3087
- util_setup_validate
3088
-
3089
- use_ui @ui do
3090
- @a1.licenses = ['GPL-2.0+']
3091
- @a1.validate
3092
- end
3093
-
3094
- assert_empty @ui.error
3095
- end
3096
-
3097
- def test_validate_license_values_or_later
3098
- util_setup_validate
3099
-
3100
- use_ui @ui do
3101
- @a1.licenses = ['GPL-2.0-or-later']
3102
- @a1.validate
3103
- end
3104
-
3105
- assert_empty @ui.error
3106
- end
3107
-
3108
- def test_validate_license_values_with
3109
- util_setup_validate
3110
-
3111
- use_ui @ui do
3112
- @a1.licenses = ['GPL-2.0+ WITH Autoconf-exception-2.0']
3113
- @a1.validate
3114
- end
3115
-
3116
- assert_empty @ui.error
3117
- end
3118
-
3119
- def test_validate_license_with_nonsense_suffix
3120
- util_setup_validate
3121
-
3122
- use_ui @ui do
3123
- @a1.licenses = ['GPL-2.0+ FOO', 'GPL-2.0 FOO']
3124
- @a1.validate
3125
- end
3126
-
3127
- assert_match <<-WARNING, @ui.error
3128
- WARNING: license value 'GPL-2.0+ FOO' is invalid. Use a license identifier from
3129
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3130
- WARNING
3131
- assert_match <<-WARNING, @ui.error
3132
- WARNING: license value 'GPL-2.0 FOO' is invalid. Use a license identifier from
3133
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3134
- WARNING
3135
- end
3136
-
3137
- def test_validate_license_with_invalid_exception
3138
- util_setup_validate
3139
-
3140
- use_ui @ui do
3141
- @a1.licenses = ['GPL-2.0+ WITH Autocofn-exception-2.0']
3142
- @a1.validate
3143
- end
3144
-
3145
- assert_match <<-WARNING, @ui.error
3146
- WARNING: license value 'GPL-2.0+ WITH Autocofn-exception-2.0' is invalid. Use a license identifier from
3147
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3148
- WARNING
3149
- end
3150
-
3151
- def test_validate_license_gives_suggestions
3152
- util_setup_validate
3153
-
3154
- use_ui @ui do
3155
- @a1.licenses = ['ruby']
3156
- @a1.validate
3157
- end
3158
-
3159
- assert_match <<-WARNING, @ui.error
3160
- WARNING: license value 'ruby' is invalid. Use a license identifier from
3161
- http://spdx.org/licenses or 'Nonstandard' for a nonstandard license.
3162
- Did you mean 'Ruby'?
3163
- WARNING
3164
- end
3165
-
3166
- def test_validate_empty_files
3167
- util_setup_validate
3168
-
3169
- use_ui @ui do
3170
- # we have to set all of these for #files to be empty
3171
- @a1.files = []
3172
- @a1.test_files = []
3173
- @a1.executables = []
3174
-
3175
- @a1.validate
3176
- end
3177
-
3178
- assert_match "no files specified", @ui.error
3179
- end
3180
-
3181
- def test_validate_empty_homepage
3182
- util_setup_validate
3183
-
3184
- use_ui @ui do
3185
- @a1.homepage = nil
3186
- @a1.validate
3187
- end
3188
-
3189
- assert_match "no homepage specified", @ui.error
3190
- end
3191
-
3192
- def test_validate_empty_summary
3193
- util_setup_validate
3194
-
3195
- use_ui @ui do
3196
- @a1.summary = nil
3197
- @a1.validate
3198
- end
3199
-
3200
- assert_match "no summary specified", @ui.error
3201
- end
3202
-
3203
- def test_validate_name
3204
- util_setup_validate
3205
-
3206
- e = assert_raise Gem::InvalidSpecificationException do
3207
- @a1.name = :json
3208
- @a1.validate
3209
- end
3210
-
3211
- assert_equal 'invalid value for attribute name: ":json" must be a string', e.message
3212
-
3213
- @a1.name = []
3214
- e = assert_raise Gem::InvalidSpecificationException do
3215
- @a1.validate
3216
- end
3217
- assert_equal "invalid value for attribute name: \"[]\" must be a string", e.message
3218
-
3219
- @a1.name = ""
3220
- e = assert_raise Gem::InvalidSpecificationException do
3221
- @a1.validate
3222
- end
3223
- assert_equal "invalid value for attribute name: \"\" must include at least one letter", e.message
3224
-
3225
- @a1.name = "12345"
3226
- e = assert_raise Gem::InvalidSpecificationException do
3227
- @a1.validate
3228
- end
3229
- assert_equal "invalid value for attribute name: \"12345\" must include at least one letter", e.message
3230
-
3231
- @a1.name = "../malicious"
3232
- e = assert_raise Gem::InvalidSpecificationException do
3233
- @a1.validate
3234
- end
3235
- assert_equal "invalid value for attribute name: \"../malicious\" can only include letters, numbers, dashes, and underscores", e.message
3236
-
3237
- @a1.name = "\ba\t"
3238
- e = assert_raise Gem::InvalidSpecificationException do
3239
- @a1.validate
3240
- end
3241
- assert_equal "invalid value for attribute name: \"\\ba\\t\" can only include letters, numbers, dashes, and underscores", e.message
3242
- end
3243
-
3244
- def test_validate_non_nil
3245
- util_setup_validate
3246
-
3247
- Dir.chdir @tempdir do
3248
- assert @a1.validate
3249
-
3250
- Gem::Specification.non_nil_attributes.each do |name|
3251
- next if name == :files # set by #normalize
3252
- spec = @a1.dup
3253
- spec.instance_variable_set "@#{name}", nil
3254
-
3255
- e = assert_raise Gem::InvalidSpecificationException do
3256
- spec.validate
3257
- end
3258
-
3259
- assert_match %r{^#{name}}, e.message
3260
- end
3261
- end
3262
- end
3263
-
3264
- def test_validate_permissions
3265
- pend 'chmod not supported' if Gem.win_platform?
3266
-
3267
- util_setup_validate
3268
-
3269
- Dir.chdir @tempdir do
3270
- File.chmod 0640, File.join('lib', 'code.rb')
3271
- File.chmod 0640, File.join('bin', 'exec')
3272
-
3273
- use_ui @ui do
3274
- @a1.validate
3275
- end
3276
-
3277
- assert_match "#{w}: lib/code.rb is not world-readable\n", @ui.error
3278
- assert_match "#{w}: bin/exec is not world-readable\n", @ui.error
3279
- assert_match "#{w}: bin/exec is not executable\n", @ui.error
3280
- end
3281
- end
3282
-
3283
- def test_validate_permissions_of_missing_file_non_packaging
3284
- pend 'chmod not supported' if Gem.win_platform?
3285
-
3286
- util_setup_validate
3287
-
3288
- Dir.chdir @tempdir do
3289
- File.delete File.join('lib', 'code.rb')
3290
-
3291
- use_ui @ui do
3292
- assert @a1.validate(false)
3293
- end
3294
- end
3295
- end
3296
-
3297
- def test_validate_platform_legacy
3298
- util_setup_validate
3299
-
3300
- Dir.chdir @tempdir do
3301
- @a1.platform = 'mswin32'
3302
- assert @a1.validate
3303
-
3304
- @a1.platform = 'i586-linux'
3305
- assert @a1.validate
3306
-
3307
- @a1.platform = 'powerpc-darwin'
3308
- assert @a1.validate
3309
- end
3310
- end
3311
-
3312
- def test_validate_rubygems_version
3313
- util_setup_validate
3314
-
3315
- @a1.rubygems_version = "3"
3316
- e = assert_raise Gem::InvalidSpecificationException do
3317
- @a1.validate
3318
- end
3319
-
3320
- assert_equal "expected RubyGems version #{Gem::VERSION}, was 3",
3321
- e.message
3322
- end
3323
-
3324
- def test_validate_specification_version
3325
- util_setup_validate
3326
-
3327
- Dir.chdir @tempdir do
3328
- @a1.specification_version = '1.0'
3329
-
3330
- e = assert_raise Gem::InvalidSpecificationException do
3331
- use_ui @ui do
3332
- @a1.validate
3333
- end
3334
- end
3335
-
3336
- err = 'specification_version must be an Integer (did you mean version?)'
3337
- assert_equal err, e.message
3338
- end
3339
- end
3340
-
3341
- def test_validate_summary
3342
- util_setup_validate
3343
-
3344
- Dir.chdir @tempdir do
3345
- @a1.summary = ''
3346
-
3347
- use_ui @ui do
3348
- @a1.validate
3349
- end
3350
-
3351
- assert_match "#{w}: no summary specified\n", @ui.error, 'error'
3352
-
3353
- @a1.summary = "#{f} (describe your package)"
3354
-
3355
- e = assert_raise Gem::InvalidSpecificationException do
3356
- @a1.validate
3357
- end
3358
-
3359
- assert_equal %("#{f}" or "#{t}" is not a summary), e.message
3360
-
3361
- @a1.summary = "#{t} (describe your package)"
3362
-
3363
- e = assert_raise Gem::InvalidSpecificationException do
3364
- @a1.validate
3365
- end
3366
-
3367
- assert_equal %("#{f}" or "#{t}" is not a summary), e.message
3368
- end
3369
- end
3370
-
3371
- def test_validate_warning
3372
- util_setup_validate
3373
-
3374
- use_ui @ui do
3375
- @a1.licenses.clear
3376
- @a1.validate
3377
- end
3378
-
3379
- assert_match 'See https://guides.rubygems.org/specification-reference/ for help', @ui.error
3380
- end
3381
-
3382
- def test_version
3383
- assert_equal Gem::Version.new('1'), @a1.version
3384
- end
3385
-
3386
- def test_version_change_reset_full_name
3387
- orig_full_name = @a1.full_name
3388
-
3389
- @a1.version = "2"
3390
-
3391
- refute_equal orig_full_name, @a1.full_name
3392
- end
3393
-
3394
- def test_version_change_reset_cache_file
3395
- orig_cache_file = @a1.cache_file
3396
-
3397
- @a1.version = "2"
3398
-
3399
- refute_equal orig_cache_file, @a1.cache_file
3400
- end
3401
-
3402
- def test__load_fixes_Date_objects
3403
- spec = util_spec "a", 1
3404
- spec.instance_variable_set :@date, Date.today
3405
-
3406
- spec = Marshal.load Marshal.dump(spec)
3407
-
3408
- assert_kind_of Time, spec.date
3409
- end
3410
-
3411
- def test_load_errors_contain_filename
3412
- specfile = Tempfile.new(self.class.name.downcase)
3413
- specfile.write "raise 'boom'"
3414
- specfile.close
3415
- begin
3416
- capture_output do
3417
- Gem::Specification.load(specfile.path)
3418
- end
3419
- rescue => e
3420
- name_rexp = Regexp.new(Regexp.escape(specfile.path))
3421
- assert e.backtrace.grep(name_rexp).any?
3422
- end
3423
- ensure
3424
- specfile.delete
3425
- end
3426
-
3427
- def test_latest_specs
3428
- spec_fetcher do |fetcher|
3429
- fetcher.spec 'a', 1 do |s|
3430
- s.platform = Gem::Platform.new 'x86-my_platform1'
3431
- end
3432
-
3433
- fetcher.spec 'a', 2
3434
-
3435
- fetcher.spec 'a', 2 do |s|
3436
- s.platform = Gem::Platform.new 'x86-my_platform1'
3437
- end
3438
-
3439
- fetcher.spec 'a', 2 do |s|
3440
- s.platform = Gem::Platform.new 'x86-other_platform1'
3441
- end
3442
-
3443
- fetcher.spec 'a', 3 do |s|
3444
- s.platform = Gem::Platform.new 'x86-other_platform1'
3445
- end
3446
- end
3447
-
3448
- expected = %W[
3449
- a-3-x86-other_platform-1
3450
- ]
3451
-
3452
- latest_specs = Gem::Specification.latest_specs.map(&:full_name).sort
3453
-
3454
- assert_equal expected, latest_specs
3455
- end
3456
-
3457
- def test_metadata_validates_ok
3458
- util_setup_validate
3459
-
3460
- Dir.chdir @tempdir do
3461
- @m1 = quick_gem 'm', '1' do |s|
3462
- s.files = %w[lib/code.rb]
3463
- s.metadata = {
3464
- "one" => "two",
3465
- "home" => "three",
3466
- "homepage_uri" => "https://example.com/user/repo",
3467
- "funding_uri" => "https://example.com/donate",
3468
- }
3469
- end
3470
-
3471
- use_ui @ui do
3472
- @m1.validate
3473
- end
3474
- end
3475
- end
3476
-
3477
- def test_metadata_key_type_validation_fails
3478
- util_setup_validate
3479
-
3480
- Dir.chdir @tempdir do
3481
- @m2 = quick_gem 'm', '2' do |s|
3482
- s.files = %w[lib/code.rb]
3483
- s.metadata = { 1 => "fail" }
3484
- end
3485
-
3486
- e = assert_raise Gem::InvalidSpecificationException do
3487
- @m2.validate
3488
- end
3489
-
3490
- assert_equal "metadata keys must be a String", e.message
3491
- end
3492
- end
3493
-
3494
- def test_metadata_key_size_validation_fails
3495
- util_setup_validate
3496
-
3497
- Dir.chdir @tempdir do
3498
- @m2 = quick_gem 'm', '2' do |s|
3499
- s.files = %w[lib/code.rb]
3500
- s.metadata = { ("x" * 129) => "fail" }
3501
- end
3502
-
3503
- e = assert_raise Gem::InvalidSpecificationException do
3504
- @m2.validate
3505
- end
3506
-
3507
- assert_equal "metadata key is too large (129 > 128)", e.message
3508
- end
3509
- end
3510
-
3511
- def test_metadata_value_type_validation_fails
3512
- util_setup_validate
3513
-
3514
- Dir.chdir @tempdir do
3515
- @m2 = quick_gem 'm', '2' do |s|
3516
- s.files = %w[lib/code.rb]
3517
- s.metadata = { 'fail' => [] }
3518
- end
3519
-
3520
- e = assert_raise Gem::InvalidSpecificationException do
3521
- @m2.validate
3522
- end
3523
-
3524
- assert_equal "metadata['fail'] value must be a String", e.message
3525
- end
3526
- end
3527
-
3528
- def test_metadata_value_size_validation_fails
3529
- util_setup_validate
3530
-
3531
- Dir.chdir @tempdir do
3532
- @m2 = quick_gem 'm', '2' do |s|
3533
- s.files = %w[lib/code.rb]
3534
- s.metadata = { 'fail' => ("x" * 1025) }
3535
- end
3536
-
3537
- e = assert_raise Gem::InvalidSpecificationException do
3538
- @m2.validate
3539
- end
3540
-
3541
- assert_equal "metadata['fail'] value is too large (1025 > 1024)", e.message
3542
- end
3543
- end
3544
-
3545
- def test_metadata_link_validation_fails
3546
- util_setup_validate
3547
-
3548
- Dir.chdir @tempdir do
3549
- @m2 = quick_gem 'm', '2' do |s|
3550
- s.files = %w[lib/code.rb]
3551
- s.metadata = { 'homepage_uri' => 'http:/example.com' }
3552
- end
3553
-
3554
- e = assert_raise Gem::InvalidSpecificationException do
3555
- @m2.validate
3556
- end
3557
-
3558
- assert_equal "metadata['homepage_uri'] has invalid link: \"http:/example.com\"", e.message
3559
- end
3560
- end
3561
-
3562
- def test_metadata_specs
3563
- @m1 = quick_gem 'm', '1' do |s|
3564
- s.files = %w[lib/code.rb]
3565
- s.metadata = { 'one' => "two", 'two' => "three" }
3566
- end
3567
-
3568
- valid_ruby_spec = <<-EOF
3569
- # -*- encoding: utf-8 -*-
3570
- # stub: m 1 ruby lib
3571
-
3572
- Gem::Specification.new do |s|
3573
- s.name = "m".freeze
3574
- s.version = "1"
3575
-
3576
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
3577
- s.metadata = { "one" => "two", "two" => "three" } if s.respond_to? :metadata=
3578
- s.require_paths = ["lib".freeze]
3579
- s.authors = ["A User".freeze]
3580
- s.date = "#{@m1.date.strftime("%Y-%m-%d")}"
3581
- s.description = "This is a test description".freeze
3582
- s.email = "example@example.com".freeze
3583
- s.files = ["lib/code.rb".freeze]
3584
- s.homepage = "http://example.com".freeze
3585
- s.rubygems_version = "#{Gem::VERSION}".freeze
3586
- s.summary = "this is a summary".freeze
3587
- end
3588
- EOF
3589
-
3590
- assert_equal @m1.to_ruby, valid_ruby_spec
3591
- end
3592
-
3593
- def test_missing_extensions_eh
3594
- pend "extensions don't quite work on jruby" if Gem.java_platform?
3595
- ext_spec
3596
-
3597
- assert @ext.missing_extensions?
3598
-
3599
- extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
3600
- FileUtils.mkdir_p File.dirname extconf_rb
3601
-
3602
- File.open extconf_rb, 'w' do |f|
3603
- f.write <<-'RUBY'
3604
- File.open 'Makefile', 'w' do |f|
3605
- f.puts "clean:\n\techo clean"
3606
- f.puts "default:\n\techo built"
3607
- f.puts "install:\n\techo installed"
3608
- end
3609
- RUBY
3610
- end
3611
-
3612
- @ext.build_extensions
3613
-
3614
- refute @ext.missing_extensions?
3615
- end
3616
-
3617
- def test_missing_extensions_eh_default_gem
3618
- spec = new_default_spec 'default', 1
3619
- spec.extensions << 'extconf.rb'
3620
-
3621
- refute spec.missing_extensions?
3622
- end
3623
-
3624
- def test_missing_extensions_eh_none
3625
- refute @a1.missing_extensions?
3626
- end
3627
-
3628
- def test_find_all_by_full_name
3629
- pl = Gem::Platform.new 'i386-linux'
3630
-
3631
- a1 = util_spec "a", "1"
3632
- a1_pre = util_spec "a", "1.0.0.pre.1"
3633
- a_1_platform = util_spec("a", "1") {|s| s.platform = pl }
3634
- a_b_1 = util_spec "a-b", "1"
3635
- a_b_1_platform = util_spec("a-b", "1") {|s| s.platform = pl }
3636
-
3637
- a_b_1_1 = util_spec "a-b-1", "1"
3638
- a_b_1_1_platform = util_spec("a-b-1", "1") {|s| s.platform = pl }
3639
-
3640
- install_specs(a1, a1_pre, a_1_platform, a_b_1, a_b_1_platform,
3641
- a_b_1_1, a_b_1_1_platform)
3642
-
3643
- assert_equal [a1], Gem::Specification.find_all_by_full_name("a-1")
3644
- assert_equal [a1_pre], Gem::Specification.find_all_by_full_name("a-1.0.0.pre.1")
3645
- assert_equal [a_1_platform], Gem::Specification.find_all_by_full_name("a-1-x86-linux")
3646
- assert_equal [a_b_1_1], Gem::Specification.find_all_by_full_name("a-b-1-1")
3647
- assert_equal [a_b_1_1_platform], Gem::Specification.find_all_by_full_name("a-b-1-1-x86-linux")
3648
-
3649
- assert_equal [], Gem::Specification.find_all_by_full_name("monkeys")
3650
- assert_equal [], Gem::Specification.find_all_by_full_name("a-1-foo")
3651
- end
3652
-
3653
- def test_find_by_name
3654
- install_specs util_spec "a"
3655
- install_specs util_spec "a", 1
3656
-
3657
- assert Gem::Specification.find_by_name "a"
3658
- assert Gem::Specification.find_by_name "a", "1"
3659
- assert Gem::Specification.find_by_name "a", ">1"
3660
-
3661
- assert_raise Gem::MissingSpecError do
3662
- Gem::Specification.find_by_name "monkeys"
3663
- end
3664
- end
3665
-
3666
- def test_find_by_name_with_only_prereleases
3667
- q = util_spec "q", "2.a"
3668
- install_specs q
3669
-
3670
- assert Gem::Specification.find_by_name "q"
3671
- end
3672
-
3673
- def test_find_by_name_prerelease
3674
- b = util_spec "b", "2.a"
3675
-
3676
- b.activate
3677
-
3678
- install_specs b
3679
-
3680
- Gem::Specification.reset
3681
-
3682
- assert Gem::Specification.find_by_name "b"
3683
-
3684
- assert_raise Gem::MissingSpecVersionError do
3685
- Gem::Specification.find_by_name "b", "1"
3686
- end
3687
-
3688
- assert Gem::Specification.find_by_name "b", ">1"
3689
- end
3690
-
3691
- def test_find_by_path
3692
- a = util_spec "foo", "1", nil, "lib/foo.rb"
3693
-
3694
- install_specs a
3695
-
3696
- assert_equal a, Gem::Specification.find_by_path('foo')
3697
- a.activate
3698
- assert_equal a, Gem::Specification.find_by_path('foo')
3699
- end
3700
-
3701
- def test_find_inactive_by_path
3702
- a = util_spec "foo", "1", nil, "lib/foo.rb"
3703
-
3704
- install_specs a
3705
-
3706
- assert_equal a, Gem::Specification.find_inactive_by_path('foo')
3707
- a.activate
3708
- assert_nil Gem::Specification.find_inactive_by_path('foo')
3709
- end
3710
-
3711
- def test_load_default_gem
3712
- Gem::Specification.reset
3713
- assert_equal [], Gem::Specification.map(&:full_name)
3714
-
3715
- default_gem_spec = new_default_spec("default", "2.0.0.0",
3716
- nil, "default/gem.rb")
3717
- spec_path = File.join(@gemhome, "specifications", "default", default_gem_spec.spec_name)
3718
- write_file(spec_path) do |file|
3719
- file.print(default_gem_spec.to_ruby)
3720
- end
3721
- Gem::Specification.reset
3722
- assert_equal ["default-2.0.0.0"], Gem::Specification.map(&:full_name)
3723
- end
3724
-
3725
- def util_setup_deps
3726
- @gem = util_spec "awesome", "1.0" do |awesome|
3727
- awesome.add_runtime_dependency "bonobo", []
3728
- awesome.add_development_dependency "monkey", []
3729
- end
3730
-
3731
- @bonobo = Gem::Dependency.new("bonobo", [])
3732
- @monkey = Gem::Dependency.new("monkey", [], :development)
3733
- end
3734
-
3735
- def util_setup_validate
3736
- Dir.chdir @tempdir do
3737
- FileUtils.mkdir_p File.join("ext", "a")
3738
- FileUtils.mkdir_p "lib"
3739
- FileUtils.mkdir_p "test"
3740
- FileUtils.mkdir_p "bin"
3741
-
3742
- begin
3743
- umask_orig = File.umask(2)
3744
- FileUtils.touch File.join("ext", "a", "extconf.rb")
3745
- FileUtils.touch File.join("lib", "code.rb")
3746
- FileUtils.touch File.join("test", "suite.rb")
3747
-
3748
- File.open "bin/exec", "w", 0755 do |fp|
3749
- fp.puts "#!#{Gem.ruby}"
3750
- end
3751
- ensure
3752
- File.umask(umask_orig)
3753
- end
3754
- end
3755
- end
3756
- end